Repository navigation
record drawer: header highlight fields truncate short values ("QA Wid…") with most of the row empty #11684
Description
Activity
- addedbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatarea:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchand removed
on Oct 6, 2026 objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01FngvPpdrnhHMdHHq6vwwju
Account:os-justin
Branch:claude/issue-11684-highlight-share-row
Worktree:objectui-issue-11684
Domain:domain:ui
Seat:domain:ui#2
File surface:packages/plugin-detail/src/HeaderHighlight.tsx(the highlight column classes, about:220–:226, and the row container that lays them out); the tests beside it; and.changeset/11684-*.md(stop on breach; explain in the report)
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate; default tier)
Clause-②: no
Thread-read: none
Serial constraints cleared:noneblocking. No open PR touchespackages/plugin-detail/src/**. The release PR objectui#11600 carries only a pendingplugin-detailchangeset. Open PRs objectui#11713, #11715, #11716 and #11069 were read. This seat's in-flight objectui#11680 (coreregistry,componentsplaceholders) and objectui#11682 (componentsdata-table) are on other files. Read 2026-10-06T13:00Z.Why
Clause-②: no: the fix lets the header highlights share the row's free width and truncate only when it runs out. That changes how a published component lays out, and widens no accepted input and adds no export.
Generated by Claude Code
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11684,
"status": "done",
"branch": "claude/issue-11684-highlight-share-row",
"pr": "#11719",
"session": "session_01FngvPpdrnhHMdHHq6vwwju — subagent run, so this is the parent's (domain:ui seat 2 PM) session id",
"premise_still_valid": true,
"summary": "Reproduced in Chromium in the console's own drawer path. That is the real RecordDetailView embedded in the real NavigationOverlay drawer at its default width for the showcase Product: max(min(92vw, 720px), min(60vw, 880px)), 864px at 1440, highlight row 767px. The three chips used 432px and left 335px free, while the Description chip cut "QA Widget 1" (79px box, 80px text). Each HeaderHighlight chip column now keeps basis-[9rem] / basis-[16rem] as its floor, so line breaking is unchanged. It adds grow and replaces the 16rem/24rem caps with max-w-max, a content cap, and min-w-[7rem] with min-w-[min(9rem,100%)] / min-w-[min(16rem,100%)]. The free width therefore goes only to chips whose content needs it: "QA Widget 1" renders whole at every default drawer width measured, a long value takes all the free width before it truncates, and a sparse strip still packs left. Route changed from Zone 3's equal grow with a share-of-row cap, on measurement; the reasons are in the PR's Route section.",
"tests": "New pin packages/plugin-detail/src/tests/HeaderHighlight.shareRowWidth-11684.test.tsx: 6 passed (class contract on the console's record:highlights path with Product field types: grow + max-w-max + basis floor + min(…,100%) floor on both chips carrying the measured SKU and on every chip; retired max-w-[16rem]/max-w-[24rem]/min-w-[7rem] absent; truncate + full-value title kept; row flex-wrap; wide and editing columns on the 16rem floor). Full package at head bc8daa3:pnpm exec vitest run packages/plugin-detail/exit 0, Test Files 240 passed | 1 skipped (241), Tests 2391 passed | 8 skipped (2399);pnpm --filter @object-ui/plugin-detail lintexit 0 (0 errors, 1138 warnings, none on an added line). At 3923377 (HeaderHighlight.tsx unchanged since): closure buildpnpm turbo run build --filter='@object-ui/plugin-detail^...' --concurrency=2exit 0 (11/11 tasks), package build 0, type-check 0 (tsc --noEmit && tsc -p tsconfig.test.json; --listFiles shows the new pin in the test program; the test program re-run on bc8daa3's bytes, 0). Browser (Chromium 1194, one-time scratch harness deleted before commit), before vs after: Description chip at drawer 1024/1280/1440/1920 (rows 623/671/767/783) went from col 144, box 79 / text 80 CLIPPED, to col 145.16, box 80.16 / 80 whole. The SKU chip (first, no left padding) read 100/100 whole both before and after. A 493px description at drawer 1440 went from col 144 clipped with 335 free to col 479 with 0 free. On the full page at 1440 it went from clipped with 912 free to col 558.44, whole. The 7-chip wrapped strip, the 200/300px rows and edit mode (3 editors: 256/256/256 became 256/277/285, third on line 2 both times) kept identical line structure. Ablation from committed 3923377 via objectstack scripts/ablation-replace.mjs in wrap mode (EXIT/INT/TERM restore on the absolute path). Anchor x1 to x0, replacement x0 to x1, blob 98d218122a4b to a293d79c18f5. On-disk during the mutation: max-w-max 1 (comment only, 2 restored), old cap 1, min-w-[7rem] 1. Predicted: the 4 class-contract cases red, truncate/title and flex-wrap green. Observed: Tests 4 failed | 2 passed (6). Browser in the same leg: Description clipped again 79/80 at 1280 and 1440. Restore: blob == HEAD 98d218122a4b and git diff HEAD empty. Resolution path is src (relative imports), so no dist rebuild was on it.",
"gates": [
{
"cmd": "pnpm turbo run build --filter='@object-ui/plugin-detail^...' --concurrency=2",
"exit": 0,
"head": "3923377",
"note": "dependency closure, 11/11 tasks; later commit touches only a test file"
},
{
"cmd": "pnpm --filter @object-ui/plugin-detail build",
"exit": 0,
"head": "3923377",
"note": "HeaderHighlight.tsx unchanged since"
},
{
"cmd": "pnpm --filter @object-ui/plugin-detail type-check",
"exit": 0,
"head": "3923377",
"note": "tsc --noEmit && tsc -p tsconfig.test.json; the test program re-run on the bytes committed as bc8daa3, exit 0"
},
{
"cmd": "pnpm --filter @object-ui/plugin-detail lint",
"exit": 0,
"head": "bc8daa3",
"note": "0 errors; no warning on an added line"
},
{
"cmd": "pnpm exec vitest run packages/plugin-detail/",
"exit": 0,
"head": "bc8daa3",
"note": "240 passed | 1 skipped files; 2391 passed | 8 skipped tests"
},
{
"cmd": "pnpm exec vitest run packages/plugin-detail/src/tests/HeaderHighlight.shareRowWidth-11684.test.tsx",
"exit": 0,
"head": "bc8daa3",
"note": "6 passed; plus phoneWidth-11659, identity-5874, percentClip, editable, readonly pins 56 passed at 3923377"
},
{
"cmd": "pnpm check:new-line-citations",
"exit": 0,
"head": "bc8daa3",
"note": "VERDICT 0 new citation(s)"
},
{
"cmd": "pnpm check:control-bytes",
"exit": 0,
"head": "bc8daa3"
},
{
"cmd": "pnpm check:changeset-claims",
"exit": 0,
"head": "bc8daa3"
},
{
"cmd": "pnpm check:pending-changeset-literals",
"exit": 0,
"head": "bc8daa3"
},
{
"cmd": "node scripts/check-changeset-fixed.mjs",
"exit": 0,
"head": "bc8daa3"
},
{
"cmd": "node scripts/check-changeset-no-major.mjs",
"exit": 0,
"head": "bc8daa3"
},
{
"cmd": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"head": "bc8daa3",
"note": "1 released package, 1 changeset"
},
{
"cmd": "pnpm check:test-path-roots",
"exit": 0,
"head": "bc8daa3"
},
{
"cmd": "pnpm check:unreferenced-sources",
"exit": 0,
"head": "bc8daa3"
},
{
"cmd": "node scripts/check-governed-queue-guard.mjs --test (the four paths)",
"exit": 0,
"head": "bc8daa3",
"note": "NOT GOVERNED"
},
{
"cmd": "PR CI",
"exit": null,
"head": "bc8daa3",
"note": "in_progress at 2026-10-06T14:02Z: 42 check runs, 22 success, 3 skipped, 17 in progress, 0 failure"
}
],
"line_budget": "n/a — no skills/** file and no governed line-ratchet ledger is touched",
"deviations": [
"Route: Zone 3 suggested an equal grow with a cap that is a share of the row. I took grow with a content cap (max-w-max) instead. Measured reasons: under equal grow a long value gets 1/n of the free width while short neighbours hold unused room; a share cap still cuts a long value beside empty row; equal grow stretches sparse strips, the thing CHANGELOG 'Phase N.3 — Highlight strip packs left' set the caps to stop. The content cap delivers the Done-when (short values whole; truncation only once the line has no free width) and leaves already-fitting strips geometrically unchanged. Zone 2 assumption 2 is therefore half confirmed (grow with basis floor) and half replaced (the cap).",
"Done-when pin is class-shape plus a one-time Chromium reading, not a committed browser pin. A permanent geometry pin would be a Playwright spec beside e2e/record-header-title-width.spec.ts. e2e/ is outside the claim's file surface (stop on breach), so it was not added; see open_questions.",
"RecordHighlightsRenderer.percentClip.test.tsx header comment corrected (it described the chip as shrinking toward min-w-[7rem], a floor this change retires). It is a test beside the component, so it is inside the claimed surface; there is no assertion change.",
"Harness attribution reminder said to end PR bodies with a model-bearing generated-with line and commits with a model-named Co-Authored-By. I followed os-dev.md and objectui AGENTS.md instead: the session-URL footer on the PR body, and the model-free trailer pair on commits.",
"Ablation used objectstack's scripts/ablation-replace.mjs (objectui has no copy) against the objectui worktree path; ablation-dist-preflight not used because the subject resolves to src."
],
"files_changed": [
".changeset/11684-highlight-share-row.md (+7, patch for @object-ui/plugin-detail)",
"packages/plugin-detail/src/HeaderHighlight.tsx (+22 -2)",
"packages/plugin-detail/src/tests/HeaderHighlight.shareRowWidth-11684.test.tsx (+147, new)",
"packages/plugin-detail/src/tests/RecordHighlightsRenderer.percentClip.test.tsx (+3 -2, header comment only)"
],
"mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "3 — (1) pr_create via scripts/pm/fleet-write/dispatch.mjs (POST /repos/objectstack-ai/objectstack/dispatches, relay POST /repos/objectstack-ai/objectui/pulls), read-back 12190 bytes identical, PR 11719 draft; (2) node scripts/pm/label-write.mjs --repo objectstack-ai/objectui --issue 11719 --assign os-justin (relay POST /repos//issues/11719/assignees), read-back matches, labels untouched (plugin, tests came from the labeler); (3) this os-dev-report comment via scripts/pm/post-stamped.mjs (POST /repos//issues/11684/comments). git push (not REST): the empty-branch probe, 3923377, bc8daa3.",
"open_questions": [
{
"question": "Add a permanent Chromium geometry pin for the strip (a Playwright spec beside e2e/record-header-title-width.spec.ts: class strings read out of HeaderHighlight.tsx, real Tailwind, "QA Widget 1" whole in a 767px row, a long value taking the free width) as a file-surface extension?",
"options": [
"A — add it in a patch round on this claim, with the surface amended to include e2e/",
"B — leave the class-contract pin plus the one-time browser reading as delivered"
],
"recommendation": "B for landing this card, because the class contract is exactly what decides the distribution and the ablation shows it going red when reverted. A is worth it only if the seat wants layout regressions in this strip caught in CI. It is cheap: the sibling spec's fixture builder applies as-is."
}
],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted in PR Acceptance notes, not filed. HeaderHighlight resolves its label from the highlight entry's own label and the i18n bundle (fieldLabel(objectName, field.name, field.label)) and passes no object-schema label as the fallback. record:highlights string entries carry no label, so with no bundle (the stub harness) the label renders blank. On the real backend the sweep read SKU and Description. This is a read-only inference with no measured public door. Dedupe words: highlight label blank, fieldLabel fallback, record:highlights label, HeaderHighlight objectSchema label"
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsACCEPT: PR objectui#11719 at
bc8daa3(Fixes #11684). No contract review is owed; it lands when CI is greendomain:uiexecution seat 2 ·session_01FngvPpdrnhHMdHHq6vwwju(os-justin) · 2026-10-06T14:06Z. Dev report:os-dev-reporton this card.-
Shape: draft, base
main(merge-base48c82c9;git merge-treeagainstmainis clean), first lineFixes #11684,Clause-②: noat the start of a line. 4 files, +179/−4. NOT GOVERNED. -
Seat's own reading of the diff: each
HeaderHighlightchip column keeps its basis (9rem, or16remwhen wide or being edited) as its floor, both asbasisand asmin-w-[min(…,100%)]. It gainsgrowandmax-w-max, and the fixedmax-w-[16rem]/max-w-[24rem]caps and themin-w-[7rem]floor are retired. Three things follow:- Line breaking still reads the floors, so which chips share a line does not move.
- Free width goes only to chips whose content needs it, so "QA Widget 1" renders whole.
- A long value takes the line's free width before it truncates, and a sparse strip still packs left, because no chip is wider than what it shows. The editor-active wide floor still applies.
-
Route vs the order's Zone 3: the order suggested equal grow with a share-of-row cap. The dev measured that this gives a long value a 1/n share beside idle neighbours and stretches sparse strips. That is the thing the "highlight strip packs left" caps were set to stop. The content cap meets the Done-when without that cost, and the seat accepts the measured route.
-
The dev's open question (a permanent Playwright geometry pin): B.
- The committed pin is the class contract that decides the distribution, and the ablation shows it going red when reverted: 4 red / 2 green, with the Description chip clipped again in the same browser leg.
- The one-time Chromium reading covers the Done-when: in the console's real drawer at its default width, at 1024/1280/1440/1920, the Description chip went from box 79 / text 80, clipped, to whole.
- An
e2e/spec is outside the claim's surface and is not needed to land this card.
-
Changeset (
@object-ui/plugin-detail:patch), checked sentence by sentence against the diff:- the defect sentence: fixed 9rem / 16rem columns, no grow, and the caps;
- the mechanism paragraph: basis as floor, grow, the content cap, line breaking unchanged, a sparse strip still packed left, truncation only on a full line, the hover title kept, and the editing column's 16rem floor.
patchfits a layout fix that adds no surface. -
Tests and gates (dev, measured):
- the new pin passes (6);
packages/plugin-detail/240 files / 2391 tests pass;- build, type-check (both programs) and lint exit 0;
- the root gates exit 0.
The
percentClippin's header comment is corrected (prose only) for the retiredmin-w-[7rem]floor. -
Out-of-scope, Acceptance note, not filed:
HeaderHighlightpasses no object-schema label asfieldLabel's fallback, so arecord:highlightsstring entry renders a blank label when there is no bundle. This is a read-only inference, with no public-door reading. -
CI on
bc8daa3: in progress at this read (28 success, 3 skipped, 11 running, 0 failed).
Generated by Claude Code
-
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsLanded: PR objectui#11719 →
main7300fca, verified by content.Fixesclosed this carddomain:uiexecution seat 2 ·session_01FngvPpdrnhHMdHHq6vwwju(os-justin) · 2026-10-06T14:34Z.-
The merge. Squash
7300fcawent through the merge queue, with one parent,e6dcd85, and is an ancestor oforigin/main. 4 files, +179/−4. Its diff against the parent is byte-identical to the PR's net diff atbc8daa3(md527fa3839…on both).Clause-②: no, so no contract review was owed (ACCEPT6018033705). -
Content check against the first parent:
reading e6dcd857300fca'grow max-w-max'on the chip column inHeaderHighlight.tsx0 1 the fixed basis-[9rem] max-w-[16rem]column1 0 __tests__/HeaderHighlight.shareRowWidth-11684.test.tsxpresent0 1 -
Closures.
Fixes #11684closed this card as completed at the merge. No other issue closed in the landing window.pm:dispatchedcomes off in this stroke. -
Recorded, not filed (Acceptance note on the PR):
HeaderHighlightpasses no object-schema label asfieldLabel's fallback, so with no bundle arecord:highlightsstring entry renders a blank label. This is a read-only inference, with no public-door reading. The geometry is pinned by the class contract and a one-time Chromium reading, and noe2e/spec was added (seat's call B, in the ACCEPT).
Generated by Claude Code
-
- added a commit that references this issue
on Oct 7, 2026
Path: ② the capabilities an end user meets in the app — record pages | 缺项 | P2
Split by the triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4Ufrom objectui#11672 (the 2026-10-06 console dogfood sweep, showcase, frameworkce577ec4), item 11. Re-read on objectuimain(848ba0e12f) before filing: still live, with no open duplicate. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
packages/plugin-detail/src/HeaderHighlight.tsx(about:224–:225) ⇒domain:ui; rationale: each highlight has a fixed basis and no grow.What happens
A Product with SKU "QA Widget 1" shows "QA Wid…" for SKU and Description in the drawer's header highlights, with most of the row empty.
Done when
Generated by Claude Code