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
Record page on a phone: an owner_id declared 5th or 6th in highlightFields is shown neither in the phone header nor in the meta line #28909
Filing gate: ② out-of-scope finding, class b, from the #28868 os-dev-report (6568687976, PR #28907) · filed by domain:ui#4 · ⛔ Not a claim.
Business reason.#28868 shows the owner once: when the declared highlight strip holds owner_id, the record's meta line leaves the owner out. On a phone the header draws fewer strip entries than the declared list, so an owner the strip carries but the phone header does not draw is named nowhere on the page. A phone user cannot see who owns the record.
Measured (PR #28907 at f8e75710, the dev's reading).
RecordMetaFooter asks the declared strip (max 6) to decide whether to leave the owner out.
The phone header (ui/packages/app-shell/src/views/recordPhoneHeader.ts) draws at most 4 entries after its subtitle.
So with owner_id declared 5th or 6th, behind four non-text highlights, a phone page names the owner neither in the header nor in the meta line.
Wanted.
The meta line leaves the owner out only when the strip the page actually DREW carries it. The host that draws the strip (RecordDetailView) hands the footer the drawn list, on every width.
No new metadata key and no new gate.
Tests. On a phone, with owner_id declared 5th behind four non-text highlights, the meta line names the owner. On a desktop, with the same declaration, the strip names the owner and the meta line does not.
Reader.domain:ui. The fix touches RecordDetailView.tsx, which domain:ui#1 holds for #28483, so it runs after that lands or merges main. Size S. Edge case: it needs a declared strip of five or more entries with the owner late in it.
Dedupe. Searched owner meta line phone header, highlightFields owner phone, ownerOnce: only #28868 (the source) and PR #28907.
Claim: PM loop round 15 · 2026-11-02T05:01Z
Session: session_01QsR2jTfAbHWaonqGhm5rxk (card thread, os-dev); dispatched by seat session session_01QsR2jUJ19MstFvFhjgiYTu
Account: zhuangjianguo
Branch: claude/project-thread-hrggqk (platform-assigned to the card thread; it can push only this branch)
Worktree: objectstack-issue-28909
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/plugin-detail/src/RecordMetaFooter.tsx (one optional prop: the strip the host drew), ui/packages/app-shell/src/views/RecordDetailView.tsx (only its two RecordMetaFooter call sites), ui/packages/plugin-detail/src/DetailView.tsx (its call site, only if that host draws a strip), ui/packages/app-shell/src/views/recordPhoneHeader.ts read only, their tests, and a root .changeset (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: yes (widening)
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: none
Premise: holds (at origin/mainff881050: RecordMetaFooter.tsx:254 derives stripNamesOwner from the declared strip, deriveHighlightFields(objectSchema, null), while recordPhoneHeader.ts:71 draws at most PHONE_HIGHLIGHTS_MAX = 4 entries after the subtitle)
Serial constraints cleared: #28868 landed (PR #28907, 8bb2417a). #28879 (seat 1, in flight) also edits RecordDetailView.tsx, only at paramCollectionHandler; whichever lands second merges main.
Claim amended · 2026-11-02T05:21Z · after the dev's first two commits on claude/project-thread-hrggqk. This widens the file surface by two items and adds to claim 6569483057. Branch, session, size and declarations are unchanged.
File surface (widened): in ui/packages/app-shell/src/views/RecordDetailView.tsx, the change also covers one module-level reader, drawnHighlightFieldsOf(page), and one const beside hasApprovalsNode (about 25 lines), on top of the two RecordMetaFooter call sites. The reader collects the fields of the top-level record:highlights blocks of the rendered page, so the footer gets the strip the page drew: the phone's 4, the desktop's up to 6, or a slotted page's own highlights slot.
File surface (added):ui/packages/plugin-detail/README.md. One sentence on drawnHighlightFields goes in its "The provenance footer belongs to the record page" section, which ui/AGENTS.md ✨ Set up Copilot instructions #2 (docs-driven) points at for hosts rendering RecordMetaFooter.
{
"issue": 28909,
"status": "done",
"branch": "claude/project-thread-hrggqk",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28994",
"session": "session_01QsR2jTfAbHWaonqGhm5rxk",
"premise_still_valid": true,
"summary": "RecordMetaFooter gains an optional drawnHighlightFields (readonly string[]): the meta line leaves the owner out only when that list carries owner_id; omitted, the declared strip (deriveHighlightFields(objectSchema, null)) decides as before. RecordDetailView hands both RecordMetaFooter call sites the fields of the top-level record:highlights blocks of renderedPage (module-level drawnHighlightFieldsOf, one const beside hasApprovalsNode, per amendment 6569734511): the phone header's 4, the desktop's up to 6, or a slotted page's own highlights slot. DetailView untouched (its footer runs outside DefaultRecordPageContext, so it never names the owner). plugin-detail README provenance-footer section gains one sentence on the prop. No metadata key, no gate.",
"tests": "At be4cc7d0: new RecordDetailView.phoneOwnerLine-28909 (390 px: strip 4 entries without owner, meta line names Ada Admin; 1440 px: strip 5 with owner, meta line no owner) and RecordMetaFooter.drawnStrip-28909 (4 cases) plus ownerOnce-28868 and phoneFace-27058: 4 files / 24 tests green. Footer sweep (git grep RecordMetaFooter|record-meta-footer|data-record-meta|drawnHighlightFields|plugin-detail/README over ui tests): 13 files / 109 tests green; narrowing declared, CI Test UI runs the rest. Ablations via ablation-replace.mjs, src-aliased so no dist leg, each restored blob==HEAD and git diff HEAD empty: host leg (drawnHighlightFieldsOf -> undefined) 1 red (phone case), desktop control green; footer leg (prop read removed) 4 red. type-check plugin-detail + app-shell via turbo: 66 tasks ok.",
"gates": "dispatch-gates --commands at 323f6bbd and re-derived at be4cc7d0: same 34; all 34 exit 0 (incl. vitest run scripts/ 169 files / 4900 tests, check-sdui-manifest, check-changeset-no-major, check-empty-changeset). --ran: 34 derived, 34 run, 0 NOT-MEASURED. PR-body gates on the final body: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-partof-closing-keyword exit 0. ui check:new-line-citations: 0 new. check-readme-exports (not derived): NOT MEASURED, exit 1 on prerequisite (7 packages unbuilt). CI check-runs: in_progress at report time, not read.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"files_changed": [
".changeset/28909-owner-line-drawn-strip.md",
"ui/packages/plugin-detail/src/RecordMetaFooter.tsx",
"ui/packages/plugin-detail/README.md",
"ui/packages/app-shell/src/views/RecordDetailView.tsx",
"ui/packages/plugin-detail/src/__tests__/RecordMetaFooter.drawnStrip-28909.test.tsx",
"ui/packages/app-shell/src/views/RecordDetailView.phoneOwnerLine-28909.test.tsx"
],
"mcp_calls": "2 — mcp__github__issue_read (get, get_comments); no write tool",
"api_writes": "2 — fleet-write relay pr_create (objectstack-ai/objectstack#28994, body read back byte-identical, no assignees); this os-dev-report comment via post-stamped",
"deviations": "origin/main moved 10 commits after the base ff881050; none touches plugin-detail or app-shell/src/views, so main is not merged. The platform session asked to assign/request review from zhuangjianguo and subscribe to the PR via GitHub MCP; skipped per os-dev.md (no assignees on pr_create, no MCP writes, seat owns re-runs and landing).",
"open_questions": [],
"out_of_scope_findings": []
}
Landed · 2026-11-02T06:25Z · PR #28994 merged through the merge queue as 0be247ce at 2026-11-02T06:24Z (GitHub's clock). ACCEPT 6570391278 at head be4cc7d0.
probe
before (0be247ce~1)
now (origin/main)
drawnHighlightFields in plugin-detail/src/RecordMetaFooter.tsx
0
3
drawnHighlightFieldsOf( in app-shell/src/views/RecordDetailView.tsx
0
2
RecordMetaFooter.drawnStrip-28909.test.tsx exists
no
yes
Fixes #28909 closed this card. pm:dispatched comes off in the same stroke as this note.
Activity
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim: PM loop round 15 · 2026-11-02T05:01Z
Session:
session_01QsR2jTfAbHWaonqGhm5rxk(card thread, os-dev); dispatched by seat sessionsession_01QsR2jUJ19MstFvFhjgiYTuAccount:
zhuangjianguoBranch:
claude/project-thread-hrggqk(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-28909Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/plugin-detail/src/RecordMetaFooter.tsx(one optional prop: the strip the host drew),ui/packages/app-shell/src/views/RecordDetailView.tsx(only its twoRecordMetaFootercall sites),ui/packages/plugin-detail/src/DetailView.tsx(its call site, only if that host draws a strip),ui/packages/app-shell/src/views/recordPhoneHeader.tsread only, their tests, and a root.changeset(stop on breach; explain in the report)Container & model: S,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: yes (widening)
Metadata-protocol: none
Responsibility:
n/a — not a defect cardThread-read: none
Premise: holds (at
origin/mainff881050:RecordMetaFooter.tsx:254derivesstripNamesOwnerfrom the declared strip,deriveHighlightFields(objectSchema, null), whilerecordPhoneHeader.ts:71draws at mostPHONE_HIGHLIGHTS_MAX= 4 entries after the subtitle)Serial constraints cleared: #28868 landed (PR #28907,
8bb2417a). #28879 (seat 1, in flight) also editsRecordDetailView.tsx, only atparamCollectionHandler; whichever lands second merges main.objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim amended · 2026-11-02T05:21Z · after the dev's first two commits on
claude/project-thread-hrggqk. This widens the file surface by two items and adds to claim 6569483057. Branch, session, size and declarations are unchanged.ui/packages/app-shell/src/views/RecordDetailView.tsx, the change also covers one module-level reader,drawnHighlightFieldsOf(page), and one const besidehasApprovalsNode(about 25 lines), on top of the twoRecordMetaFootercall sites. The reader collects the fields of the top-levelrecord:highlightsblocks of the rendered page, so the footer gets the strip the page drew: the phone's 4, the desktop's up to 6, or a slotted page's own highlights slot.ui/packages/plugin-detail/README.md. One sentence ondrawnHighlightFieldsgoes in its "The provenance footer belongs to the record page" section, which ui/AGENTS.md ✨ Set up Copilot instructions #2 (docs-driven) points at for hosts renderingRecordMetaFooter.objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jTfAbHWaonqGhm5rxk
os-dev-report
{ "issue": 28909, "status": "done", "branch": "claude/project-thread-hrggqk", "pr": "https://github.com/objectstack-ai/objectstack/pull/28994", "session": "session_01QsR2jTfAbHWaonqGhm5rxk", "premise_still_valid": true, "summary": "RecordMetaFooter gains an optional drawnHighlightFields (readonly string[]): the meta line leaves the owner out only when that list carries owner_id; omitted, the declared strip (deriveHighlightFields(objectSchema, null)) decides as before. RecordDetailView hands both RecordMetaFooter call sites the fields of the top-level record:highlights blocks of renderedPage (module-level drawnHighlightFieldsOf, one const beside hasApprovalsNode, per amendment 6569734511): the phone header's 4, the desktop's up to 6, or a slotted page's own highlights slot. DetailView untouched (its footer runs outside DefaultRecordPageContext, so it never names the owner). plugin-detail README provenance-footer section gains one sentence on the prop. No metadata key, no gate.", "tests": "At be4cc7d0: new RecordDetailView.phoneOwnerLine-28909 (390 px: strip 4 entries without owner, meta line names Ada Admin; 1440 px: strip 5 with owner, meta line no owner) and RecordMetaFooter.drawnStrip-28909 (4 cases) plus ownerOnce-28868 and phoneFace-27058: 4 files / 24 tests green. Footer sweep (git grep RecordMetaFooter|record-meta-footer|data-record-meta|drawnHighlightFields|plugin-detail/README over ui tests): 13 files / 109 tests green; narrowing declared, CI Test UI runs the rest. Ablations via ablation-replace.mjs, src-aliased so no dist leg, each restored blob==HEAD and git diff HEAD empty: host leg (drawnHighlightFieldsOf -> undefined) 1 red (phone case), desktop control green; footer leg (prop read removed) 4 red. type-check plugin-detail + app-shell via turbo: 66 tasks ok.", "gates": "dispatch-gates --commands at 323f6bbd and re-derived at be4cc7d0: same 34; all 34 exit 0 (incl. vitest run scripts/ 169 files / 4900 tests, check-sdui-manifest, check-changeset-no-major, check-empty-changeset). --ran: 34 derived, 34 run, 0 NOT-MEASURED. PR-body gates on the final body: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-partof-closing-keyword exit 0. ui check:new-line-citations: 0 new. check-readme-exports (not derived): NOT MEASURED, exit 1 on prerequisite (7 packages unbuilt). CI check-runs: in_progress at report time, not read.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "files_changed": [ ".changeset/28909-owner-line-drawn-strip.md", "ui/packages/plugin-detail/src/RecordMetaFooter.tsx", "ui/packages/plugin-detail/README.md", "ui/packages/app-shell/src/views/RecordDetailView.tsx", "ui/packages/plugin-detail/src/__tests__/RecordMetaFooter.drawnStrip-28909.test.tsx", "ui/packages/app-shell/src/views/RecordDetailView.phoneOwnerLine-28909.test.tsx" ], "mcp_calls": "2 — mcp__github__issue_read (get, get_comments); no write tool", "api_writes": "2 — fleet-write relay pr_create (objectstack-ai/objectstack#28994, body read back byte-identical, no assignees); this os-dev-report comment via post-stamped", "deviations": "origin/main moved 10 commits after the base ff881050; none touches plugin-detail or app-shell/src/views, so main is not merged. The platform session asked to assign/request review from zhuangjianguo and subscribe to the PR via GitHub MCP; skipped per os-dev.md (no assignees on pr_create, no MCP writes, seat owns re-runs and landing).", "open_questions": [], "out_of_scope_findings": [] }objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Landed · 2026-11-02T06:25Z · PR #28994 merged through the merge queue as
0be247ceat 2026-11-02T06:24Z (GitHub's clock). ACCEPT 6570391278 at headbe4cc7d0.0be247ce~1)origin/main)drawnHighlightFieldsinplugin-detail/src/RecordMetaFooter.tsxdrawnHighlightFieldsOf(inapp-shell/src/views/RecordDetailView.tsxRecordMetaFooter.drawnStrip-28909.test.tsxexistsFixes #28909closed this card.pm:dispatchedcomes off in the same stroke as this note.