Repository navigation
Studio Interfaces item header at 1010 px: the item title is drawn with no visible text beside the 只读·用覆盖定制 chip and 在「数据」中打开 #12897
Description
Class a · reach: public door. Studio › 界面 (Interfaces), an object view leaf at a 1010 px window: the item header draws the icon, the 视图 kind chip, the 只读·用覆盖定制 chip, 在「数据」中打开 and ⋯, and the item's title has no visible text. At 1280 px the same header reads 任务看板(看板视图).
Where it was seen
The seat recorded this while reviewing objectui#12725 phase 4. The dev session session_01HRnFN6Rtqk2WxPiK6qBhwq reproduced it live on main 26323c4 and on that branch alike, so that PR does not cause it:
- Backend:
e2e/live/ci/start-backend.sh, published@objectstack/*@18.0.0-next.3. - Display: Chromium, light, zh-CN, 1010 × 900, with the copilot slot open (300 px).
- Leaf: 界面 › 数据模型 › 任务看板(看板视图). This is
showcase_task'sboardkanban view. Its nav entry was added in the browser, because no showcase nav entry lands on a kanban view; the README lists every stub.
Evidence (never-merged evidence branch claude/issue-12725d-evidence @ 1f37ce5):
main, 1010 px: https://github.com/objectstack-ai/objectui/blob/1f37ce51ae5ebe171a21af2b7e7285e546b1dfba/docs/design/findings/12725d/before-1010-open.png?raw=truemain, 1280 px (the title shown): https://github.com/objectstack-ai/objectui/blob/1f37ce51ae5ebe171a21af2b7e7285e546b1dfba/docs/design/findings/12725d/before-1280-open.png?raw=true- README with the stubs: https://github.com/objectstack-ai/objectui/blob/1f37ce51ae5ebe171a21af2b7e7285e546b1dfba/docs/design/findings/12725d/README.md
Related, and not a duplicate
- objectui#12791 (closed) made a long api-name chip give way before the title on a Data item, against objectui#12611's 200 px floor.
- objectui#12707 (closed) folds the flow item header's Read-only chip.
Here the title gets no room at all on an Interfaces leaf. The width goes to the header's actions, not to an api-name chip.
Cause: not measured
A lead, unverified: StudioItemHeader's actions slot is ml-auto flex shrink-0 (packages/app-shell/src/views/studio-design/StudioItemHeader.tsx:291 on main). On this leaf it holds the 只读·用覆盖定制 chip and the 在「数据」中打开 button, so nothing in it yields before the title does.
Done when
- At a 1010 px window with the copilot slot open, an Interfaces view leaf's header shows the title, truncated with its full text in a tooltip if need be, and never empty.
- The actions stay reachable.
- A test pins the title's visible width on that header.
- Live before and after screenshots at 1010 px and 1280 px are on an evidence branch.
Filed by seat domain:ui#4 (session session_01SJn1GEkrbbBQkhGC26wEDw) as the carrier for an out-of-scope finding of objectui#12725 phase 4. Dedupe words: Studio item header title hidden 1010, StudioItemHeader actions shrink-0, interfaces item header narrow.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 17, 2026
Triage: p2 ·
area:studio·domain:uiconfirmed ·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-17T16:57ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
main044f231930:StudioItemHeader.tsx:291still wraps the actions slot inml-auto flex shrink-0, the card's unverified lead. The filer's grade and lane stand; this adds the state label.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Claim: PM loop round 18, serial (
priority:p2bug; triage6237135928)Session:
session_011K9g23W67dy2zwnyzaoB6oAccount:
os-teslaBranch:
claude/issue-12897-item-header-titleWorktree:
objectui-issue-12897(in the cloud session's own container)Domain:
domain:uiSeat:
domain:ui#1File surface: the card's "Done when", at objectui
mainc83e3fe.packages/app-shell/src/views/studio-design/StudioItemHeader.tsx: the header row (:280–:291), whose actions slot isml-auto flex shrink-0; the titleh1(STUDIO_ITEM_TITLE) and the identity / status / meta pieces beside it. The title stays visible, truncated with its full text in a tooltip if it must, never empty, and the actions stay reachable. The cause is the dev's to measure first; the triage note names theshrink-0lead as unverified.STUDIO_ITEM_TITLE,STUDIO_ITEM_META_FOLDand their neighbours), if the fix lives there.actionscontent (the 只读·用覆盖定制 chip and 在「数据」中打开) only if the measurement shows the fix belongs there rather than in the header..changeset/12897-*.mdfor@object-ui/app-shell.Outside the surface:
A route outside the surface stops and reports (stop on breach; explain in the report).
Container & model:
S,mode:cloud,model: opus(default tier; no path-derived mandate)Clause-②: no
Clause-② reason:
StudioItemHeaderis Studio-internal layout; the fix changes how the existing header row shares its width, with no prop, export or pack key moving.Responsibility: (1) objectui's own code: at a 1010 px window with the copilot slot open, an Interfaces view leaf's header gives its title no visible width | (2) no platform path covers it | (3) every Studio author on a narrow window or with the copilot slot open, on an Interfaces leaf whose header carries a read-only chip and the open-in-Data action; reproduced live on
main26323c4(the card's evidence branch1f37ce5)Thread-read: 6237135928
Serial constraints cleared: read at objectui
mainc83e3fe. No open PR namesStudioItemHeader.tsx. The seat holds no other card in flight (serial mode); objectui#12842 landed in6238910120. Skipped above it: objectui#12724 (p2 bug, older; its remainder needs cloud envelope keys this seat cannot read).Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
os-dev-report
{ "issue": 12897, "status": "done", "branch": "claude/issue-12897-item-header-title", "pr": 12917, "session": "session_01QSySfzdFhb9AjnZKJ93vNx", "premise_still_valid": true, "summary": "H1 measured and confirmed, live at objectui main c83e3fe (zh-CN, 1010 x 900, copilot 300 px, kanban leaf showcase_task/board): the title row is 422 px. The icon takes 32 px, the kind chip 37.7 px, the actions slot (ml-auto flex shrink-0) 316.9 px (read-only link 132.3 + Open in Data 136.6 + more 32 + 2 x 8 px gaps), and three 12 px gaps take 36 px. That sums to the whole row, so the title (min-w-0, flex-shrink 1, the row's only shrinkable piece) went to 0 px and the row did not overflow. Fix (H2), one rule in StudioItemHeader for every item kind: the read-only link's existing fold (the hook useStudioTabRowFold from objectui#12707) now also holds in the title row. A chip that uses the hook folds to its glyph when the room the row leaves the title, with the chip whole, is less than the title's whole text, and unfolds when the title fits beside it whole. The header also puts a cut title's whole text in its native tooltip, before the pillar's own tooltip. Live after: at 1010 px the title is 103.8 px of 178 px, cut with an ellipsis, the link is folded to 28 px, all three actions are in the row, and the row holds exactly 422 px. At 1280 px nothing changes: title 178.2 px whole, link whole. H4 holds: no new prop, slot or export, no change to the copilot slot or the Studio shell, and no call-site change in StudioDesignSurface.", "tests": "All runs at HEAD 92f50f3 unless stated. (1) Geometry pin, real Chromium layout (H3: the header family's width pin is the Playwright spec e2e/studio-item-header-title-width.spec.ts, so it was extended): a new describe block 'an Interfaces view leaf keeps its title beside the actions (objectui#12897)' with 3 tests. The main test at a 422 px row asserts title width >= 64 px and equal to the room the row leaves it (within 1 px); measured 120.53 px with English labels and the lane's fallback font. It also asserts the link is folded, the tooltip is the whole title then the internal id, every action is inside the row, and nothing overflows. The other two are controls (wide row whole; the rule at 632 px; following the row). Run with a temp no-webServer config: `pnpm exec playwright test --config=playwright.12897.config.ts e2e/studio-item-header-title-width.spec.ts` => EXIT=0, 11 passed (the 7 objectui#12791 tests and 4 new). Ablation: replaced the title-row fold context Provider wrapped around the actions slot with bare actions (anchor grep -c 1 -> 0), giving EXIT=1 with 3 failed / 8 passed: 'title 0px; actions [...if-open-in-data inside:false, if-item-more inside:false]', row scrollWidth 534 for 422 px. Restore: `git checkout HEAD -- REL`, anchor count back to 1, blob 3475e82d03452dbc36e3a691eb59a9470ecc00b2 == HEAD blob, `git diff HEAD` empty. The first ablation run went red by a waitForSelector timeout (a 0 px title is not 'visible'); the spec now waits for 'attached' (commit 2), and the run above is the re-run after that change. (2) jsdom pin StudioItemHeader.titleRowFold-12897.test.tsx with stubbed geometry: 5 passed. Fold ablation (same anchor): 3 failed / 2 passed, restored blob == HEAD. Tooltip ablation (title={titleTooltip} -> title={titleProps?.title}): 2 failed / 3 passed, restored blob == HEAD, `git diff HEAD` empty. (3) Every test family naming StudioItemHeader / STUDIO_ITEM_* / StudioApiChip / StudioStatusChip / useStudioTabRowFold / studio-readonly-link / if-item-header: 10 files, 69 tests passed. That includes the objectui#12791 api-chip pin, the objectui#12611 narrow-width pin and the objectui#12707 read-only fold pin, all green. (4) `pnpm exec vitest run packages/app-shell/` in 6 foreground shards: 258+259+259+260+260+260 files (1556), tests 2388+2316+2780+2380+2300+2477 = 14641; 0 failed, 9 skipped (1 file skipped).", "gates": "Everything ran through `bash /home/user/objectstack/scripts/pm/os-verify-lock.sh` where it was heavy. Each exit code was captured to a file before any pipe. `pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build` => VERDICT command-exit 0. `pnpm --filter @object-ui/app-shell type-check` (tsc --noEmit && tsc -p tsconfig.test.json) => VERDICT command-exit 0. Family vitest => VERDICT command-exit 0. App-shell shards 1/6 to 6/6 => each VERDICT command-exit 0 (one earlier --shard=1/2 attempt hit the 590 s cap, exit 124, and was redone as 6 shards). `pnpm check:changeset-claims` => 0. `pnpm changeset:check` => 0. `pnpm check:test-path-roots` => 0. `pnpm check:new-line-citations` => 0 ('0 new citation(s)'). `node scripts/check-changeset-presence.mjs` => 0 ('3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'). eslint on the 4 changed code files => 0 (0 errors, 1 react-refresh/only-export-components warning on the exported hook, also present on main). Control-character self-scan over the changed files => no hits. `node scripts/check-nul-bytes.mjs` => MODULE_NOT_FOUND: the script exists only in objectstack, so this is not a reading. NOT MEASURED: test:repo; the full e2e farm (CI runs `pnpm test:e2e --project=chromium`); the CI check-runs (no PR yet). objectui has no dispatch-gates.mjs, so the local set was derived by hand per the brief.", "mcp_calls": "2 — mcp__github__issue_read (get, get_comments); read-only", "api_writes": "0 — the only GitHub writes were git push of claude/issue-12897-item-header-title (twice: probe/first commit, then head 92f50f3) and of the evidence branch claude/issue-12897-evidence (38ea44a)", "open_questions": [ { "question": "The objectui#12707 jsdom CONTROL was named 'the same chip in a title row's actions slot never folds, however narrow'. This change makes that sentence false (it folds when the title would be cut), although its assertion stays green. I renamed it to 'does not fold by the tab row's width' and added a comment pointing at the new pin. That touches the pin's text, not its assertion. Is that acceptable?", "options": ["A keep the rename (the name tells the truth; the assertion is unchanged)", "B revert the name and leave a stale test title"], "recommendation": "A, because a pin whose name states a rule the code no longer has misleads the next reader (AGENTS.md #9), and the assertion is byte-identical." }, { "question": "At 1010 px the title shows about 104 px of its 178 (cut, with its full text in the tooltip), because only the read-only link folds. Should 'Open in Data' (136.6 px) also fold to its glyph so the title fits whole?", "options": ["A no, ship as is: the card's bar ('visible, truncated with its full text in a tooltip') is met", "B a follow-up card making if-open-in-data use the same fold hook (a call-site change in StudioDesignSurface)"], "recommendation": "A, because the claim scoped the leaf's own actions out unless the measurement required it, and the measurement meets the bar without it." } ], "out_of_scope_findings": [ "carrier: none · noted, not filed. useStudioTabRowFold reads a chip's whole width once per text. A chip that first rendered before its stylesheet applied keeps the unstyled width and can stay folded with room to spare. Seen only in the e2e harness, which mounted before compiling its CSS (fixed in the spec by mounting on a styled page). Not reproduced in the console, whose stylesheet loads first. Recorded in the PR's Acceptance notes." ] }Posted by the
domain:uiseat 1 PM (session_011K9g23W67dy2zwnyzaoB6o) verbatim from the cloud session's final message, because a cloud session cannot comment from its container. The seat filledprwith the draft PR it opened, #12917.The seat's answers:
92f50f3: 5 files, all on the claimed surface (StudioItemHeader.tsx, the geometry spec, a new jsdom pin, the renamed 12707 CONTROL, one changeset).shrink-0) was right.38ea44a.92f50f3(it includesBuild & E2E, which runs the extended geometry spec), then the ACCEPT.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Landed ·
domain:uiseat 1 ·session_011K9g23W67dy2zwnyzaoB6o· 2026-10-17T20:43Zmain7bee002d29, with one parent,54e79f9896(fix(plugin-form): record:line_items hydrates an untyped column from the child field #12914, which touches none of this card's files). It is an ancestor oforigin/main.c83e3fe538to the reviewed head92f50f3, changed line for changed line in each of the 5 files (+502/−22).StudioItemHeader.titleRowFold-12897.test.tsxis present andStudioItemHeader.tsxdefines and usesuseCutTitle(2 lines). At the parent54e79f9896the pin is absent and the header has nouseCutTitle.completedbyFixes #12897. At a 1010 px window with the copilot slot open, an Interfaces view leaf's title now keeps its visible width beside the actions: the read-only link folds to its glyph when the title would otherwise be cut, and a cut title carries its whole text in its tooltip. The 1280 px header is unchanged. This note precedes the strip ofpm:dispatched, and the cloud session is archived.Generated by Claude Code