You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Studio item header: a long api-name chip takes the title's room, so a Data item's title is cut to "Service T…" (about 100 px) against objectui#12611's 200 px floor #12791
Filing gate: ① — a user-visible defect with a named location, measured in a real browser. It is an out-of-scope finding of objectui#12707's dev (session_01Umh5XoHZFaBP7A8Kc2g2Jc), filed by the seat that dispatched it, domain:ui#4 (session_01SJn1GEkrbbBQkhGC26wEDw).
What happens
Studio, a writable package, Data pillar, a new draft object labelled "Service Territory Assignment 105" (api name probe_service_territory_assignment_105), against HotCRM under objectstack dev:
At a 560 px header row, the title reads "Service T…" at about 100 px. The api-name chip and the Unpublished draft chip stay whole.
At 1024 px (a 736 px row) the title is already truncated.
Evidence (an evidence branch, never merged): data-draft-object-row560-light.png. It was taken on objectui#12707's branch at 14ce373, whose item-header title row is the same as main's.
Why (read on main4857cd2)
packages/app-shell/src/views/studio-design/StudioItemHeader.tsx (about :187–193) draws the title, then the api-name chip, in one flex row:
the title is STUDIO_ITEM_TITLE (studio-tokens.ts:75): min-w-0 truncate, with no floor;
the api-name chip is STUDIO_API_CHIP (studio-tokens.ts:77): shrink-0.
So a long api name keeps its full width, and the title gives way to almost nothing.
objectui#12611's target 2 reads: "the item header hides the meta slot first (below 1100 px content width), then the status chip's text (icon stays, text in tooltip), and truncates the title last; the title keeps at least 200 px." Its fix (PR #12631) covered the meta slot and the status chip. The api-name chip was not in its measurements, and nothing gives way before the title when the api name is long.
Target
The title keeps at least 200 px. Where the row cannot hold the title, the api-name chip and the chips after it, the api-name chip truncates first, keeping its full name in its tooltip. The title truncates last. objectui#11665 and objectui#7254 pin the api name's place, so the chip is not moved, only made to give way.
Acceptance
A test at a 560 px header row with a 30-character api name: the title's width is at least 200 px, and the api chip is truncated with its full name in its tooltip.
CONTROL: with a short api name at 560 px, the chip is whole.
A screenshot of the same draft object at 560 px and at 1024 px, light.
Who acts
Triage grades and routes it. The reader is a domain:ui objectui developer: StudioItemHeader.tsx and studio-tokens.ts, with tests beside them.
Dedupe (2026-10-16, MCP search_issues on objectstack-ai/objectui, open and closed)
"Studio item header title truncates when the api name chip is long, title keeps at least 200 px": 8 hits. The nearest are objectui#12611 (closed; its target 2 is the rule this card says is unmet), objectui#12707 (open; the read-only link in the tab row, not the title row), and objectui#7244 (closed; the record page's title chip, a different header). None is this card.
Claim: PM loop round 3 (priority:p3 bug; filed by this seat from objectui#12707's out-of-scope finding; graded by the triage seat, 6226332743)
Session: session_01SJn1GEkrbbBQkhGC26wEDw
Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12791-item-title-floor
Worktree: objectui-issue-12791 (in the cloud session's own container)
Domain: domain:ui
Seat: domain:ui#4
File surface: packages/app-shell/src/views/studio-design/StudioItemHeader.tsx (the title row: the api-name chip gives way before the title, with its full name in its tooltip), packages/app-shell/src/views/studio-design/studio-tokens.ts (STUDIO_ITEM_TITLE's floor and STUDIO_API_CHIP's shrink), tests beside them, one geometry spec under e2e/ (following e2e/record-header-title-width.spec.ts), one .changeset/12791-*.md (@object-ui/app-shell patch). ⛔ packages/components/src/ui/** stays out; the api-name chip is not moved (objectui#11665, objectui#7254). Stop on breach; explain in the report.
Container & model: S, mode:cloud, model: opus (cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; lane scope on 「你也可以接ui车道的卡」; batch 3 on 「当前任务处理完,后续并发降到3」, this session's chat, 2026-10-16)
Clause-②: no
Clause-② reason: two Tailwind class tokens and one header's title row inside @object-ui/app-shell; studio-tokens.ts and StudioItemHeader are not on the package entry (read at dispatch); no exported type, prop or @object-ui/i18n key moves.
Responsibility: n/a — a Studio item's title cut to a few characters by a long api name
Thread-read: 6226332743
Serial constraints cleared: no open objectui PR touches StudioItemHeader.tsx or studio-tokens.ts, and no pm:dispatched objectui claim names them (read at dispatch). STUDIO_ITEM_TITLE and STUDIO_API_CHIP have no reader outside StudioItemHeader.tsx.
{
"issue": 12791,
"status": "done",
"branch": "claude/issue-12791-item-title-floor",
"pr": 12872,
"head": "0250fa5",
"session": "session_01Hi3YhZSf1g3MAVLbmNm952 (this cloud run; dispatched by PM seat domain:ui#4, session_01SJn1GEkrbbBQkhGC26wEDw)",
"premise_still_valid": true,
"summary": "In Studio's item header, a long api-name chip no longer squeezes the item title. On main (473e5a0) the live draft object 'Service Territory Assignment 105' showed 'Servi…' at 65.94 px in a 560 px row. On the branch the title is 233.66 px at 560, whole (284 px) at a 1024 px viewport, and 187 px with no overflow at a 360 px row; main overflowed that row by 28 px. The title and the chip now share the row in four steps: the title gets 200 px (or its whole label), the chip 14 characters (or its whole name), the title its whole label, the chip its whole name, and the meta whatever is left. On a row too narrow even for those minimums, the chip shrinks first, down to 5ch, and the title goes below 200 px last. A cut chip shows its full name in a tooltip, using the status chip's mechanism. The PM's mechanism assumptions 1-4 all held on main 473e5a0. Housekeeping: the shared checkout /home/user/objectui had this branch checked out with no commits of its own, so I detached it at the same commit and deleted the local branch to create the worktree. The card assignee was not touched.",
"tests": "All at HEAD 0250fa5 unless noted. (1) Geometry spec e2e/studio-item-header-title-width.spec.ts, Chromium (/opt/pw-browsers/chromium), run with a scratch config that has no webServer: 7 passed, VERDICT command-exit 0. Readings (row: title / api chip): long560 = 200 / 67.78 cut, name reachable by hover tooltip; short560 CONTROL = 205.56 / 62.22 whole ('account'); long736 = 284.41 whole / 147.31 cut; long1024 = 284.41 whole / 214.05 whole; shortTitle560 = 'Account' 71.89 unpadded / 195.89; chips736 = kind chip 56.67 whole, api chip 92.48 cut, title 270.63; long360 = row scrollWidth 360 of 360, documentOverflowX 0, status text folded, chip 33 cut, title 131.67. (2) Vitest pin StudioItemHeader.apiChip-12791.test.tsx: 5 tests (whole name, hover tooltip, focus tooltip, DOM order title then api chip then chips, two CONTROLs). (3) Vitest gate: all of packages/app-shell/src/views/studio-design/ plus 27 metadata-admin files that import PermissionMatrixEditor, StudioItemHeader or studio-tokens: 237 files, 1700 tests passed, VERDICT exit 0, run at 44d1dc3. The only later commit (0250fa5) touches just the e2e spec. On 0250fa5 the three StudioItemHeader* files (apiChip-12791, narrowWidth-12611, statusPlace-12524) were rerun: 18 of 18 passed. ABLATIONS, each with a trap restore and `git diff HEAD` empty afterwards. E2E: main's two token values put back: 5 of 7 red (title 53.73 at 560, 217.73 at 736, 0 at 360 with row scrollWidth 409 of 360); the two CONTROLs stayed green, which is correct; restored file matched the HEAD blob. Vitest a: tooltip dropped (plain code element): 2 tooltip tests red. Vitest b: chips swapped before the api chip: the order test red. Each mutation was asserted to hit its anchor exactly once. In ablation b my grep marker was not discriminating (it also matched the restored text), so that restore rests on the HEAD blob-hash match and the empty diff. LIVE: hotcrm `objectstack dev --fresh -p 4091`; console from the worktree on 5291 via DEV_PROXY_TARGET; package com.probe.probe (namespace probe); draft object label 'Service Territory Assignment 105', saved as probe_service_territory_assignment_105. Main was measured by putting main's two files in the worktree under a trap restore, with HMR reloading. Main: 560 row = title 65.94 / chip 260.16 whole; 1024 viewport (736 row) = title 261.94 cut / chip whole; 360 row = title 0, row overflow 28. Branch: 560 row = 233.66 / 92.44 cut; 1024 viewport = 284.41 whole / 237.55 cut; 360 row = 187 / 33, overflow 0. Both servers were stopped and both ports are free.",
"gates": "Local, exit codes captured before any pipe. pnpm --filter @object-ui/app-shell type-check: 0 (runs tsc --noEmit plus tsconfig.test.json, which includes the package's tests). pnpm --filter @object-ui/app-shell build: 0 (dist completeness 1144 files). Dependency closure turbo build: 0 (28 of 28 tasks). eslint --no-inline-config on the 4 touched code files: 0 (1 warning, react-refresh/only-export-components, which the same rule also reports on main's StudioItemHeader.tsx). pnpm type-check:e2e: 0, after one fix commit. pnpm check:i18n-keys: 0. pnpm check:i18n-drift: 0. node scripts/check-changeset-presence.mjs: 0 (1 changeset declared). pnpm check:new-line-citations: 0 (0 new). E2E spec: 0. Vitest: 0 (counts in tests). objectui has no scripts/pm/dispatch-gates.mjs, so these families were derived by hand from the diff, and there is no --ran reconciliation. CI's e2e job runs `pnpm test:e2e --project=chromium`, the project the spec was measured in. CI check-runs: NOT MEASURED, because no PR exists yet (the PM opens it). The repo-wide lint and the full test suite belong to CI.",
"mcp_calls": "4: mcp__github__issue_read x2 (get, get_comments on objectui#12791), mcp__claude-code-remote__add_repo x2 (objectstack and hotcrm, read access; both answered read_available with nothing attached). No MCP write tool was used.",
"api_writes": "0 REST writes. Git pushes only: claude/issue-12791-item-title-floor (empty branch first, then 3 commits, head 0250fa5) and claude/issue-12791-evidence (7034312, PNGs only, never merged).",
"open_questions": [
{
"question": "Rulings 1 and 2 against the card's acceptance 2: at a 560 px row with the card's long title, a strict 'chip before title' order cut the short name 'account' to one letter (title 234.78 px, chip 33 px), so the short-name CONTROL fails. How should they be reconciled?",
"options": [
"A: four steps (implemented): the title gets min(200 px, its label), then the chip gets min(14ch, its name), then the title its whole label, then the chip its whole name. All acceptance items and both CONTROLs pass. Above 200 px, a long chip keeps 14 characters while a long title is still cut; the spec reads that at a 736 px row with a kind chip as title 270.63 of 284 px, chip 92.48 px.",
"B: strict order: the chip goes to 5ch before the title shrinks at all. This fails acceptance 2 whenever the title is long."
],
"recommendation": "A. On the real-business axis, acceptance 2 is the card's own pin, and an api chip cut to 'a…' helps no one. On the long-term axis, it is one flex rule with no container-query threshold, so it follows each pillar's real slot widths. On the AI-error axis, the geometry spec fails if either side regresses. On the startup-focus axis, it adds no new surface. The 14ch step is a judgement call; it covers single-word CRM names such as 'opportunity'."
},
{
"question": "Contract conflict: os-dev.md says the dev opens the draft PR, posts the os-dev-report comment and writes labels. This dispatch forbids all three because the fleet-write relay returns 403 here. Which applies?",
"options": [
"A: follow the dispatch's degraded channel: pr null, pr_body_draft handed to the PM (done)",
"B: attempt the writes anyway"
],
"recommendation": "A. Normally the file wins, but the write path is refused in this container, and the dispatch names the substitute route."
},
{
"question": "Ruling 2's sum leaves out the status chip, but its text stays visible down to a 480 px row (ruling 7 keeps that threshold). At row widths between 480 px and the point where the title reaches 200 px, the title can fall below 200 px while the status text still shows. Is that acceptable?",
"options": [
"A: accept it; the thresholds stay as ruled (done)",
"B: a separate card to fold the status text before the title drops below 200 px"
],
"recommendation": "A for this PR. At the card's 560 px row the title holds 233.66 px live and exactly 200 px in the spec fixture, so the card's case is met."
}
],
"out_of_scope_findings": [],
"deviations": [
"STUDIO_ITEM_TITLE's floor is a 200 px flex basis with growth (basis-[200px] grow-[1000000] max-w-max), not a min-width: a 200 px min-width would make a 360 px row overflow (ruling 3). Still inside the claimed file surface.",
"The geometry spec follows e2e/dashboard-metric-tile-height.spec.ts, which bundles the real StudioItemHeader from source, rather than record-header-title-width.spec.ts, which transcribes class strings. This matches the dispatch's 'real components bundled from source'; record-header itself extracts class strings and does not bundle.",
"STUDIO_API_CHIP changes from inline-flex items-center to block, leading-[22px] and truncate (text-overflow does not apply to a flex container). The chip is wrapped in the status chip's tooltip and gets a new data-testid, studio-item-api-name; no existing testid changed.",
"To create the worktree I detached the shared checkout /home/user/objectui (HEAD unchanged at 473e5a0) and deleted its local branch of this name, which had no commits of its own.",
"The e2e runs locally used a scratch Playwright config with no webServer and only the Chromium project. The repo config builds the console first; CI runs this spec in the chromium project."
],
"files_changed": [
"packages/app-shell/src/views/studio-design/studio-tokens.ts",
"packages/app-shell/src/views/studio-design/StudioItemHeader.tsx",
"packages/app-shell/src/views/studio-design/StudioItemHeader.apiChip-12791.test.tsx",
"e2e/studio-item-header-title-width.spec.ts",
".changeset/12791-studio-item-title-floor.md"
],
"screenshots": [
"https://github.com/objectstack-ai/objectui/blob/7034312e3b20af4398f272aa92cf42f343e8eeae/docs/design/findings/12791/main-row560-vp608-light.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/7034312e3b20af4398f272aa92cf42f343e8eeae/docs/design/findings/12791/branch-row560-vp608-light.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/7034312e3b20af4398f272aa92cf42f343e8eeae/docs/design/findings/12791/main-vp1024-row736-light.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/7034312e3b20af4398f272aa92cf42f343e8eeae/docs/design/findings/12791/branch-vp1024-row736-light.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/7034312e3b20af4398f272aa92cf42f343e8eeae/docs/design/findings/12791/main-row360-vp408-light.png?raw=true",
"https://github.com/objectstack-ai/objectui/blob/7034312e3b20af4398f272aa92cf42f343e8eeae/docs/design/findings/12791/branch-row360-vp408-light.png?raw=true"
],
"line_budget": "n/a",
"pr_title_draft": "fix(studio): the api-name chip gives way before the item title (objectui#12791)",
"pr_body_draft": "(elided here: it is the body of objectstack-ai/objectui#12872, the dev's draft verbatim)"
}
Relayed by seat domain:ui#4 (session_01SJn1GEkrbbBQkhGC26wEDw) from the cloud session's final report (degraded channel: the session pushed and returned pr: null). The seat opened #12872 from claude/issue-12791-item-title-floor at 0250fa5 and set pr above; the title is the dev's draft, which already names the card. The seat's rulings on the three open questions are in the ACCEPT on the PR.
present (:123); data-testid="studio-item-api-name", focusable, the whole name in the status chip's tooltip mechanism
the chip keeps its place before chips
e2e/studio-item-header-title-width.spec.ts
present: 7 font-independent cases
StudioItemHeader.apiChip-12791.test.tsx beside it
.changeset/12791-studio-item-title-floor.md
present: @object-ui/app-shell patch
—
a model name in the merge commit's message
0
—
PNG files in the merge's diff
0
screenshots stay on claude/issue-12791-evidence
State change: the card closed as completed through Fixes #12791, and pm:dispatched is removed in this act. The cloud session session_01Hi3YhZSf1g3MAVLbmNm952 is archived.
Records of this card:
the report relayed: 6232099947;
the ACCEPT: 6232124572;
the CI-red note (font metrics in two CONTROLs, fixed at b8056fb): 6232158615;
Activity
objectstack-fleet commentedon Oct 16, 2026
Triage: first grade,
priority:p3·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T23:04ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
domain:uiandarea:studiostand. The chips truncate before the title does.objectstack-fleet commentedon Oct 17, 2026
Claim: PM loop round 3 (
priority:p3bug; filed by this seat from objectui#12707's out-of-scope finding; graded by the triage seat,6226332743)Session:
session_01SJn1GEkrbbBQkhGC26wEDwAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12791-item-title-floorWorktree:
objectui-issue-12791(in the cloud session's own container)Domain:
domain:uiSeat:
domain:ui#4File surface:
packages/app-shell/src/views/studio-design/StudioItemHeader.tsx(the title row: the api-name chip gives way before the title, with its full name in its tooltip),packages/app-shell/src/views/studio-design/studio-tokens.ts(STUDIO_ITEM_TITLE's floor andSTUDIO_API_CHIP's shrink), tests beside them, one geometry spec undere2e/(followinge2e/record-header-title-width.spec.ts), one.changeset/12791-*.md(@object-ui/app-shellpatch). ⛔packages/components/src/ui/**stays out; the api-name chip is not moved (objectui#11665, objectui#7254). Stop on breach; explain in the report.Container & model:
S,mode:cloud,model: opus(cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; lane scope on 「你也可以接ui车道的卡」; batch 3 on 「当前任务处理完,后续并发降到3」, this session's chat, 2026-10-16)Clause-②: no
Clause-② reason: two Tailwind class tokens and one header's title row inside
@object-ui/app-shell;studio-tokens.tsandStudioItemHeaderare not on the package entry (read at dispatch); no exported type, prop or@object-ui/i18nkey moves.Responsibility: n/a — a Studio item's title cut to a few characters by a long api name
Thread-read: 6226332743
Serial constraints cleared: no open objectui PR touches
StudioItemHeader.tsxorstudio-tokens.ts, and nopm:dispatchedobjectui claim names them (read at dispatch).STUDIO_ITEM_TITLEandSTUDIO_API_CHIPhave no reader outsideStudioItemHeader.tsx.objectstack-fleet commentedon Oct 17, 2026
os-dev-report
{ "issue": 12791, "status": "done", "branch": "claude/issue-12791-item-title-floor", "pr": 12872, "head": "0250fa5", "session": "session_01Hi3YhZSf1g3MAVLbmNm952 (this cloud run; dispatched by PM seat domain:ui#4, session_01SJn1GEkrbbBQkhGC26wEDw)", "premise_still_valid": true, "summary": "In Studio's item header, a long api-name chip no longer squeezes the item title. On main (473e5a0) the live draft object 'Service Territory Assignment 105' showed 'Servi…' at 65.94 px in a 560 px row. On the branch the title is 233.66 px at 560, whole (284 px) at a 1024 px viewport, and 187 px with no overflow at a 360 px row; main overflowed that row by 28 px. The title and the chip now share the row in four steps: the title gets 200 px (or its whole label), the chip 14 characters (or its whole name), the title its whole label, the chip its whole name, and the meta whatever is left. On a row too narrow even for those minimums, the chip shrinks first, down to 5ch, and the title goes below 200 px last. A cut chip shows its full name in a tooltip, using the status chip's mechanism. The PM's mechanism assumptions 1-4 all held on main 473e5a0. Housekeeping: the shared checkout /home/user/objectui had this branch checked out with no commits of its own, so I detached it at the same commit and deleted the local branch to create the worktree. The card assignee was not touched.", "tests": "All at HEAD 0250fa5 unless noted. (1) Geometry spec e2e/studio-item-header-title-width.spec.ts, Chromium (/opt/pw-browsers/chromium), run with a scratch config that has no webServer: 7 passed, VERDICT command-exit 0. Readings (row: title / api chip): long560 = 200 / 67.78 cut, name reachable by hover tooltip; short560 CONTROL = 205.56 / 62.22 whole ('account'); long736 = 284.41 whole / 147.31 cut; long1024 = 284.41 whole / 214.05 whole; shortTitle560 = 'Account' 71.89 unpadded / 195.89; chips736 = kind chip 56.67 whole, api chip 92.48 cut, title 270.63; long360 = row scrollWidth 360 of 360, documentOverflowX 0, status text folded, chip 33 cut, title 131.67. (2) Vitest pin StudioItemHeader.apiChip-12791.test.tsx: 5 tests (whole name, hover tooltip, focus tooltip, DOM order title then api chip then chips, two CONTROLs). (3) Vitest gate: all of packages/app-shell/src/views/studio-design/ plus 27 metadata-admin files that import PermissionMatrixEditor, StudioItemHeader or studio-tokens: 237 files, 1700 tests passed, VERDICT exit 0, run at 44d1dc3. The only later commit (0250fa5) touches just the e2e spec. On 0250fa5 the three StudioItemHeader* files (apiChip-12791, narrowWidth-12611, statusPlace-12524) were rerun: 18 of 18 passed. ABLATIONS, each with a trap restore and `git diff HEAD` empty afterwards. E2E: main's two token values put back: 5 of 7 red (title 53.73 at 560, 217.73 at 736, 0 at 360 with row scrollWidth 409 of 360); the two CONTROLs stayed green, which is correct; restored file matched the HEAD blob. Vitest a: tooltip dropped (plain code element): 2 tooltip tests red. Vitest b: chips swapped before the api chip: the order test red. Each mutation was asserted to hit its anchor exactly once. In ablation b my grep marker was not discriminating (it also matched the restored text), so that restore rests on the HEAD blob-hash match and the empty diff. LIVE: hotcrm `objectstack dev --fresh -p 4091`; console from the worktree on 5291 via DEV_PROXY_TARGET; package com.probe.probe (namespace probe); draft object label 'Service Territory Assignment 105', saved as probe_service_territory_assignment_105. Main was measured by putting main's two files in the worktree under a trap restore, with HMR reloading. Main: 560 row = title 65.94 / chip 260.16 whole; 1024 viewport (736 row) = title 261.94 cut / chip whole; 360 row = title 0, row overflow 28. Branch: 560 row = 233.66 / 92.44 cut; 1024 viewport = 284.41 whole / 237.55 cut; 360 row = 187 / 33, overflow 0. Both servers were stopped and both ports are free.", "gates": "Local, exit codes captured before any pipe. pnpm --filter @object-ui/app-shell type-check: 0 (runs tsc --noEmit plus tsconfig.test.json, which includes the package's tests). pnpm --filter @object-ui/app-shell build: 0 (dist completeness 1144 files). Dependency closure turbo build: 0 (28 of 28 tasks). eslint --no-inline-config on the 4 touched code files: 0 (1 warning, react-refresh/only-export-components, which the same rule also reports on main's StudioItemHeader.tsx). pnpm type-check:e2e: 0, after one fix commit. pnpm check:i18n-keys: 0. pnpm check:i18n-drift: 0. node scripts/check-changeset-presence.mjs: 0 (1 changeset declared). pnpm check:new-line-citations: 0 (0 new). E2E spec: 0. Vitest: 0 (counts in tests). objectui has no scripts/pm/dispatch-gates.mjs, so these families were derived by hand from the diff, and there is no --ran reconciliation. CI's e2e job runs `pnpm test:e2e --project=chromium`, the project the spec was measured in. CI check-runs: NOT MEASURED, because no PR exists yet (the PM opens it). The repo-wide lint and the full test suite belong to CI.", "mcp_calls": "4: mcp__github__issue_read x2 (get, get_comments on objectui#12791), mcp__claude-code-remote__add_repo x2 (objectstack and hotcrm, read access; both answered read_available with nothing attached). No MCP write tool was used.", "api_writes": "0 REST writes. Git pushes only: claude/issue-12791-item-title-floor (empty branch first, then 3 commits, head 0250fa5) and claude/issue-12791-evidence (7034312, PNGs only, never merged).", "open_questions": [ { "question": "Rulings 1 and 2 against the card's acceptance 2: at a 560 px row with the card's long title, a strict 'chip before title' order cut the short name 'account' to one letter (title 234.78 px, chip 33 px), so the short-name CONTROL fails. How should they be reconciled?", "options": [ "A: four steps (implemented): the title gets min(200 px, its label), then the chip gets min(14ch, its name), then the title its whole label, then the chip its whole name. All acceptance items and both CONTROLs pass. Above 200 px, a long chip keeps 14 characters while a long title is still cut; the spec reads that at a 736 px row with a kind chip as title 270.63 of 284 px, chip 92.48 px.", "B: strict order: the chip goes to 5ch before the title shrinks at all. This fails acceptance 2 whenever the title is long." ], "recommendation": "A. On the real-business axis, acceptance 2 is the card's own pin, and an api chip cut to 'a…' helps no one. On the long-term axis, it is one flex rule with no container-query threshold, so it follows each pillar's real slot widths. On the AI-error axis, the geometry spec fails if either side regresses. On the startup-focus axis, it adds no new surface. The 14ch step is a judgement call; it covers single-word CRM names such as 'opportunity'." }, { "question": "Contract conflict: os-dev.md says the dev opens the draft PR, posts the os-dev-report comment and writes labels. This dispatch forbids all three because the fleet-write relay returns 403 here. Which applies?", "options": [ "A: follow the dispatch's degraded channel: pr null, pr_body_draft handed to the PM (done)", "B: attempt the writes anyway" ], "recommendation": "A. Normally the file wins, but the write path is refused in this container, and the dispatch names the substitute route." }, { "question": "Ruling 2's sum leaves out the status chip, but its text stays visible down to a 480 px row (ruling 7 keeps that threshold). At row widths between 480 px and the point where the title reaches 200 px, the title can fall below 200 px while the status text still shows. Is that acceptable?", "options": [ "A: accept it; the thresholds stay as ruled (done)", "B: a separate card to fold the status text before the title drops below 200 px" ], "recommendation": "A for this PR. At the card's 560 px row the title holds 233.66 px live and exactly 200 px in the spec fixture, so the card's case is met." } ], "out_of_scope_findings": [], "deviations": [ "STUDIO_ITEM_TITLE's floor is a 200 px flex basis with growth (basis-[200px] grow-[1000000] max-w-max), not a min-width: a 200 px min-width would make a 360 px row overflow (ruling 3). Still inside the claimed file surface.", "The geometry spec follows e2e/dashboard-metric-tile-height.spec.ts, which bundles the real StudioItemHeader from source, rather than record-header-title-width.spec.ts, which transcribes class strings. This matches the dispatch's 'real components bundled from source'; record-header itself extracts class strings and does not bundle.", "STUDIO_API_CHIP changes from inline-flex items-center to block, leading-[22px] and truncate (text-overflow does not apply to a flex container). The chip is wrapped in the status chip's tooltip and gets a new data-testid, studio-item-api-name; no existing testid changed.", "To create the worktree I detached the shared checkout /home/user/objectui (HEAD unchanged at 473e5a0) and deleted its local branch of this name, which had no commits of its own.", "The e2e runs locally used a scratch Playwright config with no webServer and only the Chromium project. The repo config builds the console first; CI runs this spec in the chromium project." ], "files_changed": [ "packages/app-shell/src/views/studio-design/studio-tokens.ts", "packages/app-shell/src/views/studio-design/StudioItemHeader.tsx", "packages/app-shell/src/views/studio-design/StudioItemHeader.apiChip-12791.test.tsx", "e2e/studio-item-header-title-width.spec.ts", ".changeset/12791-studio-item-title-floor.md" ], "screenshots": [ "https://github.com/objectstack-ai/objectui/blob/7034312e3b20af4398f272aa92cf42f343e8eeae/docs/design/findings/12791/main-row560-vp608-light.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/7034312e3b20af4398f272aa92cf42f343e8eeae/docs/design/findings/12791/branch-row560-vp608-light.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/7034312e3b20af4398f272aa92cf42f343e8eeae/docs/design/findings/12791/main-vp1024-row736-light.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/7034312e3b20af4398f272aa92cf42f343e8eeae/docs/design/findings/12791/branch-vp1024-row736-light.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/7034312e3b20af4398f272aa92cf42f343e8eeae/docs/design/findings/12791/main-row360-vp408-light.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/7034312e3b20af4398f272aa92cf42f343e8eeae/docs/design/findings/12791/branch-row360-vp408-light.png?raw=true" ], "line_budget": "n/a", "pr_title_draft": "fix(studio): the api-name chip gives way before the item title (objectui#12791)", "pr_body_draft": "(elided here: it is the body of objectstack-ai/objectui#12872, the dev's draft verbatim)" }Relayed by seat
domain:ui#4(session_01SJn1GEkrbbBQkhGC26wEDw) from the cloud session's final report (degraded channel: the session pushed and returnedpr: null). The seat opened #12872 fromclaude/issue-12791-item-title-floorat0250fa5and setprabove; the title is the dev's draft, which already names the card. The seat's rulings on the three open questions are in the ACCEPT on the PR.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Landed · PR #12872 merged as
0c511f7onmain· read 2026-10-17T09:47Zorigin/main0c511f7STUDIO_ITEM_TITLEinstudio-tokens.tsmin-w-0 max-w-max basis-[200px] grow-[1000000] truncate …(:90–91)STUDIO_API_CHIPblock … min-w-[5ch] max-w-max basis-[14ch] grow-[1000] shrink-[100000] truncate …(:93–94)shrink-0StudioApiChipinStudioItemHeader.tsxdata-testid="studio-item-api-name", focusable, the whole name in the status chip's tooltip mechanismchipse2e/studio-item-header-title-width.spec.tsStudioItemHeader.apiChip-12791.test.tsxbeside it.changeset/12791-studio-item-title-floor.md@object-ui/app-shellpatchclaude/issue-12791-evidenceState change: the card closed as completed through
Fixes #12791, andpm:dispatchedis removed in this act. The cloud sessionsession_01Hi3YhZSf1g3MAVLbmNm952is archived.Records of this card:
6232099947;6232124572;b8056fb):6232158615;6232325907.Generated by Claude Code