Skip to content

fix(platform-objects): System Overview's six metric tiles declare layout.h 1, one row tall, where they declared 2 - #24209

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-24126-system-overview-metric-height
Oct 17, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-24126-system-overview-metric-height

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #24126

Clause-②: no

What changed

The system_overview dashboard that @objectstack/platform-objects ships (SystemOverviewDashboard, the Setup app's landing board) authored its six type: 'metric' tiles at layout.h: 2. They now declare layout.h: 1.

  • packages/platform-objects/src/apps/dashboards/system_overview.dashboard.ts: 6 lines, +6/-6. Only h moved. Every x, y and w, the chart and table widgets (h: 4), the widget ids, filters and bindings are untouched.
  • packages/platform-objects/src/apps/dashboards/system-overview-tile-layout.test.ts (new, +72): a pin beside the existing tile-semantics test. Every type: 'metric' widget on the board declares layout.h of 1, read off type rather than a list of ids so a later KPI tile is held to it too. It carries its opposite direction: the read must find exactly the six tiles, and the chart and table widgets must stay taller than a tile.
  • .changeset/24126-system-overview-metric-height.md (new): patch for @objectstack/platform-objects.

Why: the maintainer's ruling B on objectstack-ai/objectui#12704. The console draws a widget over the grid rows its h names, each row floors at 5rem and grows to its content, and a metric card fills its box, so an h: 2 tile drew a box about twice the height of its content. The platform draws what the metadata declares (ADR-0078 forbids an h that is read and not honoured), so the authored size is corrected, not the renderer. No packages/spec change, no renderer change, no other dashboard.

Evidence

  • pnpm --filter @objectstack/platform-objects exec vitest run --maxWorkers=2 at b66de4d25: 74 files, 1139 tests, all passed (lock verdict command-exit 0).
  • pnpm --filter @objectstack/platform-objects typecheck: exit 0. The new test file is inside the tsconfig.test.json program (--listFiles names it); the three test-layer errors that program reports are all in feature-gate-guard.test.ts and are the pinned debt in test-typecheck-debt.json, which this PR leaves byte-identical to origin/main.
  • One-shot reverse verification of the new pin, run on the committed change: all six h: 1 }, mutated back to h: 2 }, through scripts/ablation-replace.mjs (anchor 6 to 0, blob changed on disk), the new test file run: 1 failed, 2 passed. The failure names all six tiles (widget_total_users through widget_config_changes, each layout.h=2); both controls stayed green. Direction: red, as expected. The test imports the dashboard by relative source path, so no rebuild stands between the mutation and the run. Restore proven: blob equal to the HEAD blob (53aa021f4618) and git diff HEAD empty.
  • Gate derivation with no paths (node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, merge base f792290df, 3 changed paths): 63 families. --ran reconciliation: 62 run with exit 0, 1 NOT MEASURED, 0 unrun. The one: node scripts/check-plugin-teardown-shape.mjs --self-test exits 3, PREREQUISITE NOT MET, because its pinned positive control is a commit this shallow clone cannot reach; deepening would mutate the .git shared by every agent in the container, and the gate does not read any file this PR touches. Three build-gated gates (check:i18n, check:lean-entry-closure, check:dual-build-cjs-loads) first exited 3 for missing dist/, then exited 0 after their prerequisite builds (check:i18n: "all bundles in sync, no undeclared authoring keys").

Acceptance notes

  • Empty-row hypothesis, falsified. I expected that keeping every y while h drops to 1 would leave rows 1 and 3 empty (tiles at y: 0 and y: 2, charts at y: 4, y: 8). It does not. The console mounts DashboardRenderer (packages/app-shell/src/views/DashboardView.tsx), which places widgets by span only: gridColumn: span w and gridRow: span h with no explicit row or column start, over gridAutoRows: 'minmax(5rem, auto)'; its own comment reads "Widgets are auto-placed by span only", and array order is visual order. layout.y is read nowhere in that path; layout.x only feeds column-count inference when columns is absent (here columns: 12 is declared). Read at objectui 97538115b (HEAD when measured) and at 5e15928b4, the pin this repo ships (.objectui-sha): the placement lines are identical. The only reader of x and y as positions is DashboardGridLayout (react-grid-layout), a component a host mounts directly; its dashboard-grid node key is retired and the console does not mount it. So with h: 1 the six tiles auto-flow into two content-height rows, then the charts, then the table: no empty band. Measured by reading, not by a browser run.
  • Pin hypothesis. No existing platform-objects test asserted these widgets' layout, so nothing flipped. The only other h: 2 copy is the inline fixture in packages/objectql/src/protocol-packaged-dashboard-base.test.ts; it builds its own body and never imports the shipped board, so it is untouched.
  • Overlay. An org that already published an overlay of system_overview is served that overlay as stored (ADR-0126 Regime O), so it keeps the tile heights it was saved with; the changeset says so.
  • Not measured here: the rendered tile height (the card's 88 to 96 px at 1024 and 1280 px) needs the console at the objectui pin plus objectui's regression pin from Dashboard metric tiles size to their content: a single-number tile is not 135 px tall with an empty lower half objectui#12704, which the card places after this change. This PR does not claim it.
  • Observation, not filed: because y is not a placement input on the console's view path, the spec's required layout.y is only honoured by DashboardGridLayout. Read-only, no wrong answer reproduced; carrier: none.

Labels: none requested for this card; the diff publishes @objectstack/platform-objects, so no skip-changeset.


Generated by Claude Code

…out.h 1, one row tall, where they declared 2

The console draws a widget over the grid rows its `h` names; each row floors
at 5rem and grows to its content, and a metric card fills its box. So the
six KPI tiles authored at `h: 2` drew a box about twice the height of their
content, with the lower half empty. The platform draws what the metadata
declares, so the authored size is corrected, not the renderer. Only `h`
changes; every x, y and w and the chart and table widgets are untouched.

Adds a pin beside the existing tile-semantics test: every type metric widget
on the board declares h 1, with the opposite-direction controls that the
read finds the six tiles and the chart and table widgets stay taller.

Claude-Session: https://claude.ai/code/session_01JtSQQ3EWsbNPzyYMug1tXy
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tests tooling labels Oct 17, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs.

What this run could not see

Coarse fallback — 3 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json a237d7f496a6c83ed6e13edf5b8fe3b6e42b6924 → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · domain:engine seat 1 · session_01JtSQQ3EWsbNPzyYMug1tXy · 2026-10-17T18:56Z · ACCEPT

Head: b66de4d254.

Item Reading
Shape Draft PR → main. The body opens Fixes #24126, its only closing keyword.
Scope 3 files (+92 / −6): the six metric tiles' layout.h 2 → 1 in system_overview.dashboard.ts (every x, y, w and the h: 4 widgets byte-identical), a new pin system-overview-tile-layout.test.ts, and the changeset. That is the claim's surface (6238376907). Not governed (check-governed-merges.mjs --pr 24209: 0 of 3).
Ruling Ruling B on objectstack-ai/objectui#12704, applied literally: the authored size is corrected, not the renderer.
H1 (empty rows) Falsified by the dev, and the seat re-read it. objectui origin/main's packages/plugin-dashboard/src/DashboardRenderer.tsx places a widget by gridColumn: span W / gridRow: span H only (its lines 77 and 1114–1115), and its own comment says "no explicit x/y, array order is visual order". So with h: 1 the tiles flow into two content-height rows, and no empty band appears. No y moved.
Review face None of the four contract faces (no published schema, no governed rule text, Clause-②: no with no narrowing arm). This is the seat's review of record at TIER_DEFAULT; no second agent.
Prose face Changeset, sentence by sentence. "draws a widget over the grid rows its h names, each row floors at 5rem and grows to its content" matches the renderer (gridAutoRows: 'minmax(5rem, auto)', span placement). FROM, TO and Unchanged match the diff. "each now draws at content height" follows from that placement; the rendered pixel height is not measured in a browser (below).
Pins and ablation The new pin asserts all six tiles at h: 1, plus two controls. One ablation (all six back to h: 2) turns it red, naming every widget, and both controls stay green. The restore is clean.
Clause-② no, at a line start in the PR body and the changeset; patch for @objectstack/platform-objects.
Gates Dev union: 63 derived, 62 run, 1 NOT MEASURED (check-plugin-teardown-shape --self-test, whose pinned control commit sits below the shallow clone; it reads no file this PR touches). CI on this head at this read: 37 check-runs, 16 success, 6 skipped, 15 in progress, 0 failed. Landing waits for every check to finish green.

Disposition:

  • open_questions: none.
  • out_of_scope_findings[0] (layout.y is not a placement input on the console's view path, while the spec declares it required): Acceptance notes, noted, not filed. It is a declared ≠ honoured reading, an inference with no wrong answer reproduced. It is passed to domain:spec seat 1 on [PM seat] domain:spec — 🟢 os-tesla · session_013odhA26dvzy7pQmevdTTvy #6017, where the enforce-or-remove call is made.
  • deviations: accepted (the full pnpm install after a scoped one; the prerequisite builds for three derived gates; the shallow-clone NOT MEASURED; the read-only objectui clone).
  • Done-when 3 (each tile at 88–96 px at 1024 and 1280 px) is measured by objectui#12704's own regression pin, which the card places after this change. This PR closes the objectstack half entirely, so Fixes is correct.

Landing: ordinary queue (pr_ready + automerge_enable through the relay) once every check on this head is green.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

platform-objects: System Overview's six metric tiles declare layout.h: 2 and draw a half-empty box; set them to h: 1 (ruling B on objectui#12704)

2 participants