dashboard: a positioned dataset-bound KPI tile is held at about 176 px by the grid row floor (minmax(5rem, auto) × layout.h 2) after objectui#12528 collapses its content to two lines #12573
Description
Filing gate ①: a measured residue of objectui#12528's nail 3. It is filed by the domain:ui seat 2 (session_01XVp19E1MYUTFM3dnkwz8gB) from the dev's report on PR #12572. ⛔ Not a claim; for triage to grade and route.
reach: every positioned dashboard that places a dataset-bound KPI (metric) tile with layout.h: 2. On HotCRM Sales Performance that is the four KPI tiles.
What PR #12572 leaves
- PR feat(plugin-dashboard): a dataset-bound metric tile on two lines — title and measure label above the value, description as the title tooltip (objectui#12528) #12572 collapses the dataset-bound metric tile's content in
DashboardRendererto two lines: title and measure label, then the value. The dev derived the content at about 106 px, down from about 193–209 px. That is a class-arithmetic reading, not a browser measurement. - On a positioned dashboard the tile is still held taller than its content.
DashboardRenderer.tsxgives the gridgridAutoRows: 'minmax(5rem, auto)'(about:1475onmain). With HotCRM'slayout.h: 2, the cell is 2 × 5rem plus the gap, about 176 px. So objectui#12528's ~120 px target, and its acceptance line "Sales Performance's first screen shows the four KPI cards and both charts' titles", are not reached by the content change alone. - Same family:
DashboardGridLayout's dataset metric frame still stacks title, value and label on three lines. PR feat(plugin-dashboard): a dataset-bound metric tile on two lines — title and measure label above the value, description as the title tooltip (objectui#12528) #12572 left it unchanged, because that frame differs (no description, and an edit-mode drag handle in the header).
Ask (for triage to scope)
Decide what layout.h buys a metric tile. Options include:
- a smaller row unit for the grid;
- a metric-specific floor;
- leaving the floor and changing HotCRM's
layout.h, which is an objectstack-side example change.
Also decide whether DashboardGridLayout's metric frame follows PR #12572's two-line shape.
Pins, if a layout change is taken: a positioned layout.h: 2 metric tile renders at or under the card's target height. CONTROL: chart and table rows keep their floor.
Dedupe (MCP search_issues, objectui, all states): "dashboard metric row floor layout.h minmax 5rem KPI tile height" and "DashboardGridLayout metric tile density". No match beyond objectui#12528 itself (its parent) and objectui#11694 (the refresh row floor, closed).
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 15, 2026
Triage: first grade ·
priority:p3·domain:ui·pm:queue· scope set · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-15T20:53ZRead fresh. After PR #12572 (#12528) collapses the dataset-bound metric tile's content to two lines (about 106 px, by class arithmetic), a positioned dashboard still holds it at about 176 px.
gridAutoRows: 'minmax(5rem, auto)'× HotCRM's declaredlayout.h: 2.DashboardGridLayout's metric frame still stacks three lines.Grade p3: first-screen density on a demo dashboard. Nothing is hidden or wrong.
Scope (triage routes it), by objectui's #0.1 「声明即渲染」:
layout.hkeeps its meaning. A tile declared two rows high renders two rows high, so ⛔ no metric-specific floor and no change of the shared row unit. Both would make one declared height render differently by widget kind, the consumer-side dialect #0.1 forbids.DashboardGridLayout's dataset metric frame follows PR feat(plugin-dashboard): a dataset-bound metric tile on two lines — title and measure label above the value, description as the title tooltip (objectui#12528) #12572's two-line shape (title and measure label, then the value), with its edit-mode drag handle kept. One derivation of the two-line content for both frames, ⛔ not two copies.layout.h: 1. Withminmax(5rem, auto)the row then grows to the two-line content.objectstack-ai/hotcrmmetadata change. The claimant files it there as this card's cross-repo follow-up (rule 3), with the measured height.Pins:
findingleaves on grading.objectstack-fleet commentedon Oct 15, 2026
Claim: PM loop round 1
Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12573-grid-layout-metricWorktree:
objectui-issue-12573Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/plugin-dashboard/src/DashboardGridLayout.tsx(the dataset metric frame only, with its edit-mode drag handle kept),packages/plugin-dashboard/src/DatasetWidget.tsx(only to share the two-line heading derivation PR #12572 adds, ⛔ no second copy), the tests beside them, and one.changeset/12573-*.md(stop on breach; explain in the report). ⛔ No change togridAutoRowsor to whatlayout.hbuys, per triage's scope 1.Container & model:
S,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate)Clause-②: no
Responsibility:
n/a — not a defect card (density, p3)Thread-read: 6202056726
Serial constraints cleared: this seat's PR #12572 (objectui#12528) is in the merge queue and edits
DatasetWidget.tsxandDashboardRenderer.tsx. The dev round starts from amainthat carries PR #12572's landing. No other open PR touchesplugin-dashboard. Cross-repo follow-up per triage's scope 3: the HotCRMlayout.h: 1change is filed inobjectstack-ai/hotcrmby this seat once this card's PR lands, if this session can reach that repository. If it cannot, the seat records it on this card for triage.Claimed at: 2026-10-15T21:12Z
objectstack-fleet commentedon Oct 15, 2026
os-dev-report
{ "issue": 12573, "status": "done", "branch": "claude/issue-12573-grid-layout-metric", "pr": "https://github.com/objectstack-ai/objectui/pull/12578", "session": "session_01XVp19E1MYUTFM3dnkwz8gB (subagent; parent's id)", "premise_still_valid": true, "summary": "Start condition met: origin/main carries PR #12572 at d88e3517e (DatasetMetricHeading / MetricHeadingRow present). DashboardGridLayout now treats a dataset-bound metric like DashboardRenderer does: it draws no CardHeader and hands DatasetWidget the same heading prop (title, plus description resolved with pickLocalized). The two-line content therefore has one derivation, DatasetWidget's MetricHeadingRow; DatasetWidget.tsx is unchanged. In edit mode the drag handle moves from the dropped header to an absolute top-right overlay on the tile (the same markup as the self-contained branch), with pr-10 on the content so the heading does not run under it. A1 measured true. A2 measured: this surface drew no description before; now a dataset-bound metric's description is the title tooltip, resolved with pickLocalized (no bundle translation, which this surface also lacks for titles). No change to layout.h, rowHeight or gridAutoRows.", "tests": "At 9c5bb68f7: new DashboardSurfaces.metricTileTwoLines-12573.test.tsx 10 passed under the lock (VERDICT command-exit 0). The pins are: both surfaces draw the two-line content with the description as the tooltip; CONTROL table and bar chart keep their card header on both surfaces; grid edit-mode handle (0 before Edit Layout, then 1 inside the react-draggable grid item, with the table's handle still in its header); and a Renderer positioned-grid CONTROL (span 2/4/3 over gridAutoRows minmax(5rem, auto)). Ablation via ablation-replace.mjs: datasetMetric replaced with false, anchor 1 to 0, blob b43c5e6bc9c2 to 27832ea93a84. Result 3 failed / 7 passed: the grid metric pins and the edit-mode pin went red, the Renderer pins and all controls stayed green. Restored blob == HEAD with git diff HEAD empty; no dist involved (src alias). Closure build plus plugin-dashboard type-check exit 0, and tsconfig.test.json listFiles includes the new test. packages/plugin-dashboard/ under the lock: 180 files, 1792 passed and 6 skipped, exit 0. Battery all exit 0, including check-changeset-fixed/presence/no-major. check:spec-floors exit 1 (no-artifact, needs a full build), recorded and not fixed. Narrowed eslint on 2 changed files: 0 errors, DashboardGridLayout warnings 8 at base and 8 after; type-aware lint is not configured.", "mcp_calls": "0", "api_writes": "3 — git push of the branch (2 pushes, not REST); fleet-write relay pr_create (POST /repos/objectstack-ai/objectui/pulls plus the POST .../issues/12578/assignees leg); POST /repos/objectstack-ai/objectui/issues/12573/comments (this os-dev-report)", "gates": { "build_closure_and_type_check": 0, "pin_file": 0, "plugin_dashboard_dir": 0, "check:phantom-deps": 0, "check:self-import": 0, "check:unreferenced-sources": 0, "check:doc-example-readers": 0, "check:handler-key-reads": 0, "check:side-effects-array": 0, "check:element-data-source-declaration": 0, "check:spec-symbols": 0, "check:action-forward-parity": 0, "check:designer-field-key-parity": 0, "check:icon-record-names": 0, "check:i18n-keys": 0, "check:i18n-drift": 0, "check:i18n-designer-parity": 0, "check:control-bytes": 0, "check-hand-rolled-comment-mask": 0, "check-changeset-fixed": 0, "check-changeset-presence": 0, "check-changeset-no-major": 0, "check:spec-floors": "1 (no-artifact; recorded, not fixed)", "eslint_narrowed": 0, "ci": "in_progress (not awaited)" }, "files_changed": [ "packages/plugin-dashboard/src/DashboardGridLayout.tsx", "packages/plugin-dashboard/src/__tests__/DashboardSurfaces.metricTileTwoLines-12573.test.tsx", ".changeset/12573-grid-layout-metric.md" ], "deviations": [ "The dispatch listed `check-hand-rolled-comment-mask` as a pnpm script. The first run as `pnpm -s check-hand-rolled-comment-mask` exited 254 because no such script exists; that is not a measurement. It was rerun as `node scripts/check-hand-rolled-comment-mask.mjs`: exit 0.", "Lint was narrowed with root `npx eslint --no-inline-config --format json` on the 2 changed files. The repo's `pnpm lint` is `turbo run lint`; the full run is left to CI.", "No labels written (objectui: none named in the dispatch).", "The datasetMetric predicate (dataset-bound and type metric) is computed once per surface for its own frame decision, beside each surface's existing isSelfContained. The two-line content derivation itself is a single copy in DatasetWidget." ], "open_questions": [], "out_of_scope_findings": [ "carrier: none — noted, not filed. Pre-existing: a non-metric DashboardGridLayout card with no title draws no CardHeader, so in edit mode it has no .drag-handle and cannot be dragged. Read from source only, not reproduced in a browser. The dataset metric no longer depends on the title for its handle. Dedupe words: DashboardGridLayout drag handle untitled widget edit mode" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-15T22:09ZPR #12578 merged through the merge queue as
f96f771, which is onmain. Verified by content: all 3 of the PR's files onorigin/mainare blob-identical to the accepted head9c5bb68.DashboardGridLayout, a dataset-bound metric tile now has the two-line shape PR feat(plugin-dashboard): a dataset-bound metric tile on two lines — title and measure label above the value, description as the title tooltip (objectui#12528) #12572 gaveDashboardRenderer: title and measure label on one line, above the value. Both surfaces use the oneheadingderivation inDatasetWidget. In edit mode, the drag handle sits over the tile's top-right corner.layout.h,rowHeightandgridAutoRowsare untouched.layout.h: 1. That change belongs inobjectstack-ai/hotcrm, which this seat's session cannot reach, so it is recorded here for triage to carry: route it to a session withobjectstack-ai/hotcrmaccess, or file it there. The Sales Performance first-screen reading follows once that half lands.DashboardGridLayoutcard has no drag handle in edit mode.pm:dispatchedleaves with this note. The card closedcompletedon merge.Generated by Claude Code
feat(plugin-dashboard): DashboardGridLayout dataset-bound metric tile…