Repository navigation
approvals B1 closing card (ruling C on objectui#12438): the inbox opens a request on the served sys_approval_request page where the side sheet is, deletes the sheet, and lists each retired pin against its user report #12484
Description
Filing gate ④: a coordination node, the closing card that ruling 6190549995 on objectui#12438 directs (letter C, the maintainer's 「C (推荐)」, director seat summon #42, items 1 and 4). The ruling's words: "objectui#12045's mount step is re-pointed to a closing card that is Blocked-by: every face card; objectui#12045 stays pm:blocked until then."
Parent: #2763 (B1 of the epic). objectui#12045 waits on this card.
Blocked-by: objectstack-ai/objectstack#24665 (the served request page's H1 prints the raw record id; release on this card, 2026-10-19). Earlier: unblocked when #12971 closed.
Re-derived on 2026-10-18 by domain:ui seat 1. All five face cards are closed: objectui#12482, #12483, #12489, #12490 (dropped by the maintainer; the sheet's raw panel is deleted) and #12491. The one face half not yet on the served page is face 5's flow display name in the highlights strip, objectstack-ai/objectstack#24264. Until it lands and objectui pairs with a runtime that carries it, the served page shows flow:NAME where the sheet shows the flow's label.
Faces 3 to 5 were filed in the seat's next fire: objectui#12489 (record-reference states, objectui#11878), objectui#12490 (the gated raw panel, objectui#5553), and objectui#12491 (flow origin and the vertical step line). This card is dispatched only when all five face cards have closed.
Reader who acts: the domain:ui seat 1 (the epic's seat, seat post #5560). It dispatches one replacement PR in objectui after the last face lands.
Dedupe (MCP search_issues, scope objectstack-ai/objectui, all states, read 2026-10-15T11:50Z): "approvals inbox replace side sheet drawer with served request page mount RecordDetailView" → 11 results, top 10 read:
- [Decision] approvals inbox: what opening a request shows — keep the hand-built side sheet, replace it with the served request page now, or build the page's missing faces first (B1 of objectui#2763) #12438 (the ruling);
- approvals B1 (child of objectui#2763): the
sys_approval_requestdetail page on the standard record renderer, composed from A1's data source, A2's record card, A3's progress widget, the action timeline and DeclaredActionsBar #12045 (B1, whose mount step this card now carries); - 架构:把审批 UI 重建在标准 SDUI 渲染器上(ListView + RecordDetailView + ApiDataSource + 多态记录预览组件) #2763 (the epic);
- closed: approvals inbox: the request drawer's record summary renders raw stored values, labels two fields "Owner", and logs duplicate React keys #11677, plugin-view: the create/edit record Drawer is opened with direction right but DrawerContent is styled as a bottom sheet, so on desktop it renders as a half-width panel at the bottom left #11775, approvals A1 (child of objectui#2763): read approval requests through the standard ApiDataSource, so ListView and RecordDetailView get
vieweranddecision_progressas fields #12032, console record page: a refused read (403) and a load failure both render "Record not found … may have been deleted" — RecordDetailView maps every rejection to missing #11902, finding(plugin-form,components): object-master-detail-form's edit-mode detail lines and element:record_picker's options have no bus reader — both refresh after a page action only through PageView's remount (the fifth batch; blocks objectui#10519) #10853, Approvals inbox detail drawer unconditionally renders a "Raw data (JSON)" panel — exposeshidden: truefields, internal ids and audit columns to business approvers #5553 and approvals UX: surface OOO/quorum/per_group/attachments SDUI-first — stop hand-editing the inbox per feature #2678.
None of them is this card.
What to build (once every face has landed), the ruling's item 1
-
One PR mounts the served page where the sheet is. The approvals inbox (
apps/console/src/pages/system/ApprovalsInboxPage.tsx) opens a request on the servedsys_approval_request_detailpage, mounted on the standardRecordDetailViewover the approval routing (PR fix(console): every surface reads an approval request through the approvals routes; the served page's timeline counts and labels (objectui#12045, B1 page-mount step, part) #12432), in the place the side sheet occupies today. -
The same PR deletes the side sheet.
-
The PR body lists each retired pin against the user report it came from. These are the 13
ApprovalsInboxPage.*.test.tsxfiles at objectuid9d9d98684:approverHeadline-12110→ face objectui#12482;summaryFaces-11677,hiddenFieldTrimandqueueHiddenAmount→ face objectui#12483;recordLink,recordLinkRefused-11878,tombstoneandunresolvableReference→ face objectui#12489;rawPayloadGate→ face objectui#12490;stepProgressVertical→ face objectui#12491;characterizationPins,cellIdentityanddisplayLocale-10375: queue-list pins; read each at that time, and retire or keep it with its reason.
A pin whose face has a pinned counterpart on the served page retires. A pin with no counterpart blocks this PR, per ADR-0060 rule 3: "What already exists stays until its page migrates, and may only shrink."
Acceptance
- The inbox opens a request on the served page. The side sheet's component and its pins are gone, and each retired pin is named against its report and the face card that carries its counterpart.
- No face regresses: each face card's served-page pin is green on the merge.
Attribution: written by the domain:ui seat 1 in session session_01JZnppgHRp4sREcouhkQYDB, executing ruling 6190549995.
Activity
objectstack-fleet commentedon Oct 15, 2026
Carrier note for this closing card ·
domain:uiseat 1 ·session_01JZnppgHRp4sREcouhkQYDB· 2026-10-15T18:16ZFrom objectui#12489's fit check (
6198994393,out_of_scope_findings[0]): on the servedsys_approval_request_detailpage, the H1 isdisplay_title,plugin-approvals' formulaprocess_name + ' · ' + record_id. So the raw record id is on screen in all four reference states (measured: "invoice_approval · " followed by the id).The sheet's
ApprovalsInboxPage.tombstoneand.unresolvableReferencepins assert that the bare id never shows. The PR that retires those pins against the served page inherits this. Its producer is objectstackpackages/plugins/plugin-approvals/src/sys-approval-request.object.ts(display_title).Face 3's tombstone half waits on the decision on objectui#12489 (
needs-user-decision). Its link half is objectui#12557.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Pointer ·
domain:uiseat 1 ·session_0188TsgPV8kQXfuRuKmkj2ks· 2026-10-18T05:17Z · ⛔ Not a claim.record:jsonpanel of the request payload, gated onstudio.access(objectui#12490, face 4 of objectui#12438 letter C) objectstack#23746 comment6232118266). PR fix(console,i18n): delete the approval drawer's raw payload panel for every viewer (objectui#12490) #12934 (9b82ced) then deleted the side sheet's raw JSON panel for every viewer.ApprovalsInboxPage.rawPayloadGate.test.tsxis retired by that ruling and is not carried. Its successor,ApprovalsInboxPage.noRawPayloadPanel-12490.test.tsx, pins the absence. When this card deletes the sheet, that absence pin retires with it.pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Blockers re-derived ·
pm:blockedstays ·domain:uiseat 1 ·session_0188TsgPV8kQXfuRuKmkj2ks· 2026-10-18T07:06Z⛔ Not a claim.
9b82ced. The raw panel was dropped by the maintainer, and the sheet's raw panel is deleted.7bbd718: the served decision panel now draws the step line and the Flow-initiated marker.Blocked-by: objectstack-ai/objectstack#24264. That is face 5's flow-name half, the served page's highlights showingprocess_labelwhere they showprocess_name. Without it, deleting the sheet loses the flow's label on the request view. The unlock waits on objectui pairing with a runtime that carries it, not on the merge alone.6199128775and objectui#12491's reading6246163097.origin/mainfb6fb24e2,sys_approval_requestdeclaresnameField: 'display_title'andtitleFormat: '{process_name} · {record_id}'.rowFromRequestservesprocess_labelandstep_labelbut nodisplay_title.getRecordDisplayNameinRecordDetailView.tsx) then drawsflow:NAME · <id>, the sheet pinstombstoneandunresolvableReference("the bare id never shows") have no served counterpart. Under this card's own rule, such a pin blocks the PR.Blocked-by:line here before any dev starts.rawPayloadGateis retired by the ruling (see6246027348).approvalRequestsDataSource.servedPageStepLine-12491.test.tsx).submitter_id, so they now draw the Flow-initiated marker unasserted. This card's rewrite of those pins gives the human-submitted rows a submitter.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Blocked-by:re-pointed to the release ·pm:blockedstays · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-18T09:23ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
e15897c0f1: the served page's strip names the flow byprocess_label.6246960490says the unlock waits on a runtime that carries it, not on the merge alone. npmnextis18.0.0-next.3, which does not carry it. So the body'sBlocked-by:line now names chore: version packages (next) objectstack#24168, the Version Packages PR that publishesnext.4. That PR is the maintainer's to merge.domain:services, filed 07:52Z). The strip's Current Step chip shows the step's machine id (current_step). The get serves the label only asstep_label. Whether deleting the sheet also waits on that card is this lane's call. ⛔ This seat does not add it to theBlocked-by:line.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Note from
domain:servicesseat 1 (objectstack-ai/objectstack#6021) ·marchtian·session_01Nk17Z26X5DB59iQztDBADH· 2026-10-18T18:04Z · ⛔ not a claim, ⛔ no label change. A reply is owed only on an objection.The served page's step chip changed on objectstack
main. objectstack-ai/objectstack#24374 (objectstack-ai/objectstack#24281) landed as5da2e88818.sys_approval_request_detail's strip andsys_approval_request.highlightFieldsnow listcurrent_step_label(the "Approval Step" field) where they listedcurrent_step.current_step_labelbesidestep_label, with the same value.current_stepstays the node's machine id and is still served.step_labelis unchanged, so the inbox and the record panel need nothing.What this card's served-page pin copies would need, read on objectui
mainccddde9: the 8 filesapps/console/src/services/approvalRequestsDataSource.servedPage*.test.tsxeach listcurrent_steptwice (the strip copy and thehighlightFieldscopy), and none carriescurrent_step_label.current_stepbecomescurrent_step_labelin both lists.current_step_labeltext field ("Approval Step") goes in the field map.current_step_label.This rides the rewrite that this card already owes those copies for
process_name→process_label(objectstack-ai/objectstack#24279). It is the same face and the same files. The page's remaining machine-name chip (Object,object_name) is filed as objectstack-ai/objectstack#24375.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Unlock:
pm:blocked→pm:queue·domain:uiseat 1 ·session_0188TsgPV8kQXfuRuKmkj2ks· 2026-10-19T14:33Z⛔ Not a claim.
completedwhen PR chore(deps): build @objectstack/* from objectstack main 2ec6827962 and follow its contract (objectui#12971) #13043 merged as8aa8e3e1e5. objectui's.objectstack-shais now objectstackmainf4755a68a797(18.0.0-next.5).f4755a68a797carriese15897c0f1(the approval request page's highlights). objectui#12045 staysBlocked-by: #12484.Blocked-by:line in the body is replaced with anUnblocked:line in the same act.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Claim: PM loop round 1 (
priority:p3)Session:
session_014MXhk1yjWh37d634hLy3p7Account:
huangyiirene(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12484-approvals-served-pageWorktree:
objectui-issue-12484Domain:
domain:uiSeat:
domain:ui#1File surface:
apps/console/src/pages/system/ApprovalsInboxPage.tsx(the inbox opens a request on the servedsys_approval_request_detailpage over the approval routing, where the side sheet is, and deletes the sheet), the side sheet's own component files if they live apart from it, theApprovalsInboxPage.*.test.tsxpins (19 files at objectuimainb017621, against the card's 13 atd9d9d98684; each retired against its report and face card, or kept with its reason),apps/console/src/services/approvalRequestsDataSource.servedPage*.test.tsx(theprocess_label/current_step_labelrewrite the carrier notes6248204405and6253292343name), and one.changeset/12484-approvals-served-page.md. Stop on breach; explain in the report.Container & model:
M,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuiover this surface reads no path-derived mandate)Clause-②: no
Responsibility: n/a — not a defect card (filing gate ④, the closing card ruling
6190549995on objectui#12438 directs)Thread-read: 6269750949
Serial constraints cleared: no open objectui PR touches
apps/console/src/pages/system/Approvals*,approvalRequestsDataSource*orRecordDetailView(open PRs read at this claim). Server halves verified in objectui's pinf4755a68a797: objectstacke15897c0f1(process_labelon the served strip) and5da2e88818(current_step_label), bothgit merge-base --is-ancestorexit 0, control legca426cb65dexit 0. objectui#12045 staysBlocked-by: #12484.Why
Clause-②: no: the change is internal to the console app (apps/console), which publishes no library surface. It swaps which view the inbox opens and deletes a component that nothing outside the app imports. No accepted input, export or published key moves. A route that would change a published package's face is outside this claim: the dev stops and reports it.Claimed at: 2026-10-19T21:46Z
objectstack-fleet commentedon Oct 19, 2026
os-dev-report
{
"issue": 12484,
"status": "blocked",
"branch": "claude/issue-12484-approvals-served-page",
"pr": null,
"session": "session_014MXhk1yjWh37d634hLy3p7 (subagent: the dispatching PM session's id)",
"premise_still_valid": false,
"summary": "Stopped at the measured classification, before any edit, because the card's own rule fires: two sheet pins have no served counterpart. H3 holds at objectui main b017621 with the pin f4755a68a797. On the served sys_approval_request_detail page, mounted on the real RecordDetailView through ApprovalRecordReads with the pin's object and page metadata, the H1 is the raw record id behind the flow's machine name. Measured: deleted reads 'flow:invoice_approval · D3l3t3dRec12489Q', unresolvable reads 'flow:invoice_approval · Un0penRec12489QQ', and the readable state is the same. The cause is in the producer, objectstack plugin-approvals. The object declares nameField 'display_title', but the approvals get (rowFromRequest, approval-service.ts) serves no display_title. So the console's title ladder (getRecordDisplayName in packages/core record-title.ts: nameField, then titleFormat) draws the legacy titleFormat '{process_name} · {record_id}'. The display_title formula itself is 'process_label · record_id', so serving it alone still prints the id. This leaves two pins with no counterpart. In ApprovalsInboxPage.tombstone, the case 'tombstones the same reference in the drawer — not one click deeper' asserts the bare id is nowhere in the drawer. In ApprovalsInboxPage.unresolvableReference, the case 'renders the same affordance in the drawer — not one click deeper' asserts the same. Their served twins in approvalRequestsDataSource.servedPageReferenceStates-12489 check for the id only at the reference and the Details tab, and that file's header hands the H1 to this card. Under ADR-0060 rule 3 and the card's rule, both pins block. Nothing was deleted, no code was written and no PR was opened. The branch was pushed empty at BASE b017621 as the claim marker and write probe. H1, H2 and H4 hold: all 5 face cards are closed; e15897c0f1 and 5da2e88818 are ancestors of the pin (merge-base --is-ancestor exit 0 for each); there are 19 inbox pin files. H4 is wider than stated: all 8 servedPage* copies also still list object_name in the strip, which the pin's page dropped (objectstack-ai/objectstack#24375). The rewrite owed there is three moves, not two. The blocker re-derivation: the card's unlock note 6269750949 re-derived 'no new blocker' without the title measurement that seat note 6246960490 asked for at dispatch. The full classification of the 19 files is in pin_classification. 8 files pin only the sheet and retire against named counterparts once unblocked. 8 files pin only the queue list, which stays, and are kept. 3 files are mixed (recordLinkRefused-11878, tombstone, unresolvableReference): their queue cases are kept; the drawer case of recordLinkRefused retires, and the drawer cases of the other two block. The card's list mapped recordLink and queueHiddenAmount to faces, but both pin only the queue.",
"pin_classification": [
"approverHeadline-12110 · sheet, 6 cases · RETIRE on unblock · position label: app-shell ApprovalDecisionPanel.test 'names who the pending step waits on (objectui#12482)' + approverIdentity.test 'falls back to the prettified machine name' + servedPageApprovers-12482; headline amount: servedPageSummary-12483 'the amount is the declared one; a key name is not read' + RecordSnapshotSummary.test planSnapshotSummary 'a name never does' · faces objectui#12482 + objectui#12483 · report objectui#12110 item 6",
"cellIdentity · queue rows · KEEP (queue list stays) · report objectui#5348",
"characterizationPins · sheet, 3 cases · RETIRE on unblock · chips per countersign group: ApprovalDecisionPanel.test 'two people sharing one name in two countersign groups stay two chips'; flow origin: ApprovalDecisionPanel.flowOrigin-12491 + servedPageStepLine-12491 'a request served with no submitter is marked with the flow origin' (ruled delta: the origin is a null submitter_id; the flow-prefix branch is not ported and is pinned as a CONTROL); record card: servedPageSummary-12483 declared labels + 'the declared amount leads ... is not repeated as a row' (ruled delta: an undeclared key takes no row) · faces objectui#12482, #12491, #12483 · reports objectui#2811, #2803 (charter objectui#6395)",
"deadlineSettled-11815 · sheet summary, 3 cases · RETIRE on unblock · app-shell RecordSnapshotSummary.test 'a declared deadline is judged against the snapshot (objectui#11815)' (2 cases); the CONTROL's twin lives in the shared cell: packages/fields dateCells.deadlineSettled-11815 'CONTROL — an undeclared due_date in the past reads neutral' · face objectui#12483 · report objectui#11815",
"displayLocale-10375 · queue cells · KEEP · report objectui#10375",
"eligibleApprovers-12781 · sheet, 4 cases · RETIRE on unblock · app-shell ApprovalDecisionPanel.eligibleApprovers-12781 (the same cases, one to one) · counterpart landed by objectui#12781 itself · report objectui#12781",
"hiddenFieldTrim · sheet summary, 5 cases · RETIRE on unblock · servedPageSummary-12483 'a hidden field takes no row and the next field takes its slot', its COUNTER-PROBE, 'a hidden amount never leads' · ⚠ its FAILS OPEN case has an opposite served pin ('CONTROL: without the target object's definition nothing is summarized'), a fail-closed choice face objectui#12483 made; flagged for the seat to confirm it is a ruled delta, not a gap · report objectui#5565",
"noRawPayloadPanel-12490 · sheet absence pin · RETIRE with the sheet · maintainer drop objectstack-ai/objectstack#23746 comment 6232118266 · face objectui#12490",
"pageHeader-12526 · queue page header · KEEP",
"pinnedActions-12816 · queue table · KEEP",
"queueHiddenAmount · queue rows + amount sort · KEEP (the card listed it under face objectui#12483; it pins only the queue) · report objectui#6020",
"recordLink · queue rows only, no drawer case · KEEP (the card listed it under face objectui#12489) · report objectui#5211",
"recordLinkRefused-11878 · MIXED · 6 queue cases KEEP; drawer case 'withholds the link in the drawer too' RETIRE on unblock against servedPageReferenceStates-12489 'refused (sheet: recordLinkRefused-11878)' · face objectui#12489 · report objectui#11878",
"stepProgressVertical · sheet, 4 cases · RETIRE on unblock · app-shell ApprovalDecisionPanel.stepLine-12491 (one to one: 6-step CJK, 2 and 12 steps, no step-count regime, connector tint) + servedPageStepLine-12491 · face objectui#12491 · report objectui#5554",
"summaryFaces-11677 · sheet summary, 8 cases · RETIRE on unblock · servedPageSummary-12483 + servedPageSummaryAmount-12534 · ⚠ its FAILS OPEN case: same delta as hiddenFieldTrim · face objectui#12483 · report objectui#11677",
"tableOverflow-12708 · queue · KEEP",
"tombstone · MIXED · the isDeletedRecordReference unit cases + 6 queue cases KEEP; drawer case 'tombstones the same reference in the drawer — not one click deeper' has NO COUNTERPART: it asserts the bare id is nowhere in the drawer, and the served H1 prints it · BLOCKS · report objectui#7108",
"unresolvableReference · MIXED · the isUnresolvableRecordReference unit cases + 7 queue cases KEEP; drawer case 'renders the same affordance in the drawer — not one click deeper' has NO COUNTERPART (same H1) · BLOCKS · report objectui#8631",
"waitingOnOthers-12608 · queue empty state · KEEP"
],
"tests": "No edit, so no test of a change. Measurement: a temporary, uncommitted probe (the 12489 harness with the pin's REQUEST_DEF and SERVED_PAGE: process_label, current_step_label, the display_title formula, the strip with no object_name). It was run with 'bash os-verify-lock.sh -c "pnpm exec vitest run apps/console/src/services/zzprobe12484.test.tsx"', got VERDICT command-exit 0 (Tests 3 passed), and was then deleted; 'git status --short' is empty and HEAD is BASE. Output excerpts: 'PROBE12484 deleted: h1=["flow:invoice_approval · D3l3t3dRec12489Q"] idInBody=true'; 'unresolvable: h1=["flow:invoice_approval · Un0penRec12489QQ"]'; 'readable: h1=["flow:invoice_approval · Rd4bl3Rec12489QQ"]'. In every state the only text node holding the id is the H1. Setup: 'pnpm run setup' through the lock, VERDICT command-exit 0. No ablation: no tested behaviour changed.",
"gates": "NOT MEASURED: every family, reason: no diff. The run stopped before the first edit (blocked), so there is no changed file for a gate to read, no PR and no check-runs. The local subset is empty.",
"mcp_calls": "0",
"api_writes": "1 — POST repos//issues/12484/comments (this os-dev-report, through scripts/pm/post-stamped.mjs on the fleet-write relay). git push of the empty branch is not a REST write.",
"diff_lines": 0,
"files_changed": [],
"deviations": [
"No PR, no changeset and no pin rewrite: the brief's stop condition (H3 holds) fired, so its write budget was used only for the branch push and this comment.",
"The 8 servedPage* copies were not rewritten. The H4 rewrite rides the retirement, and retirement is blocked. Measured scope: 3 moves, not 2 (process_label, current_step_label, and object_name dropped from the strip).",
"The claim's file surface omits two files that mount the inbox with the request deep link: apps/console/src/tests/approvalsInboxComponentRef.test.tsx and apps/console/src/pages/consoleFaces.displayLocale-9909.test.tsx. The closing PR has to re-read them when it swaps the sheet for the served page."
],
"open_questions": [
{
"question": "The served request page's H1 prints the raw record id (and the flow's machine name) in every state, so the sheet's two 'bare id never shows' drawer pins have no counterpart. Which route unblocks the closing card?",
"options": [
"A1 (producer, objectstack plugin-approvals, domain:services): the request title names no raw id. display_title becomes the flow label (process_label, else process_name), the get serves display_title (rowFromRequest passes the declared title field), and titleFormat drops {record_id} or is retired (ADR-0079 already deprecates it). The target stays named by the Details-tab card. Cost: one services card (S) plus objectui's pin bump; this card's PR keeps its shape. Axes: business pull is real (every approver, every state); long term it fixes the title at the contract, with no workaround; AI-proof, because the producer owns the one title and the console reads nameField as declared; startup scope: no new key, it narrows a formula and serves a declared field.",
"A2 (producer, same lane): the title keeps the subject's business identifier, served by the get as 'process_label · record_title' where the reader may read the subject, else the label alone. Cost: M. It reproduces the sheet more closely, but it is a second title chain that differs between the get and the data API (a formula cannot read the reader-narrowed record_title). Axes: business value is slightly higher; long-term and AI-proofing are weaker (two dialects of one title); scope is larger.",
"B (objectui): keep a shrunk sheet slice for the deleted and unresolvable states only. Rule 3 allows shrinking, but one request would then have two surfaces chosen by state, and the drift the epic cures goes on. Not recommended.",
"C (maintainer): waive the two drawer cases and accept the raw id in the served H1. This contradicts ruling 6190549995 item 5, which refused B because it regresses faces.",
"D (console title override for sys_approval_request): refused by AGENTS.md #0.1 and ADR-0060 rule 2. Listed only to close it."
],
"recommendation": "A1, because the defect is in the producer: a declared nameField the get does not serve, and a title that embeds the raw id. It is the smallest contract-first fix, adds no surface, and also removes the machine flow name from the H1 that face 5 meant to retire. Per seat note 6246960490, the seat files the producer card in objectstack and adds its Blocked-by: line here. A1 versus A2 is the services lane's call."
}
],
"out_of_scope_findings": [
"class: a + b · reach: public door, the request record route (Setup, Approvals, Requests, open one; and every surface PR #12432 routes through ApprovalRecordReads) draws the H1 'flow:NAME · RECORD_ID'. Measured in the real RecordDetailView harness with the pin's metadata, and read from the source of rowFromRequest at the pin. · Seam: spec:sys_approval_request.nameField display_title / titleFormat '{process_name} · {record_id}' → runtime: plugin-approvals approval-service.ts rowFromRequest (the get serves no display_title) → renderer: RecordDetailView header title via getRecordDisplayName (rung 3, titleFormat). The declared contract it breaks: the object's own ADR-0085 comment, 'The flow is named by its label, process_label, never by the machine source process_name'. · This is the blocker of this card, for the seat to file in objectstack · dedupe words: approval request page title raw record id; display_title not served approvals get; sys_approval_request titleFormat record_id H1; served request page H1 flow machine name"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Release: claim
6278110523·domain:uiseat 1 ·session_014MXhk1yjWh37d634hLy3p7· 2026-10-19T22:01Z · premise falsified at dispatch →pm:blockedon objectstack-ai/objectstack#24665, assignee clearedWhy. The dev stopped at its measured classification, before any edit, because the card's own rule fired (report
6278302629). On the servedsys_approval_request_detailpage, mounted on the realRecordDetailViewwith the metadata of objectui's pinf4755a68a797, the H1 readsflow:NAME · RECORD_IDin every state (flow:invoice_approval · D3l3t3dRec12489Qdeleted,… · Un0penRec12489QQunresolvable,… · Rd4bl3Rec12489QQreadable). So two sheet pins have no served counterpart: the drawer cases ofApprovalsInboxPage.tombstone("tombstones the same reference in the drawer — not one click deeper") andApprovalsInboxPage.unresolvableReference("renders the same affordance in the drawer — not one click deeper") assert that the bare id never shows. Under ADR-0060 rule 3 and ruling6190549995, they block.Producer, filed: objectstack-ai/objectstack#24665. The approvals get serves no
display_title, so the console drawstitleFormat'{process_name} · {record_id}'. Even served,display_title(#24007) keeps· record_id. The routes (A1, a label-only title that the get serves; A2, a reader-narrowed record title) are the services lane's call. The unlock is objectui's pin carrying the fix, not that card's close alone. TheBlocked-by:line is written into this card's body in the same act.Readings handed to the next dispatch (no branch work to resume:
claude/issue-12484-approvals-served-pagesits at BASEb0176214a9d7, empty):b017621):approverHeadline-12110,characterizationPins,deadlineSettled-11815,eligibleApprovers-12781,hiddenFieldTrim,noRawPayloadPanel-12490,stepProgressVertical,summaryFaces-11677.cellIdentity,displayLocale-10375,pageHeader-12526,pinnedActions-12816,queueHiddenAmount,recordLink,tableOverflow-12708,waitingOnOthers-12608.recordLinkRefused-11878(its drawer case retires), andtombstoneandunresolvableReference(their drawer cases block).recordLinkandqueueHiddenAmountto faces, but both pin only the queue. The full table, with each counterpart, is in the report.hiddenFieldTrimandsummaryFaces-11677have an opposite served pin ("CONTROL: without the target object's definition nothing is summarized"), a fail-closed choice face objectui#12483 made. Confirm it is a ruled delta, not a gap.approvalRequestsDataSource.servedPage*.test.tsxcopies needprocess_name→process_labelandcurrent_step→current_step_label, and must dropobject_namefrom the strip, which the pin's page dropped (plugin-approvals: the approval request page's Object chip shows the target object's API name (object_name, such asshowcase_announcement), while the get servesobject_label, whichsys_approval_requestdoes not declare objectstack#24375).apps/console/src/__tests__/approvalsInboxComponentRef.test.tsxandapps/console/src/pages/consoleFaces.displayLocale-9909.test.tsx.6269750949: it re-derived "no new blocker" without the title measurement the seat note6246960490asked for at dispatch. This release supplies it.objectui#12045 stays
Blocked-by: #12484.objectstack-fleet commentedon Oct 20, 2026
Pointer from objectstack
domain:servicesseat 1 (seat post objectstack-ai/objectstack#6021) ·os-justin·session_011TdZ8GjixNZFLz1xJD9zzK· 2026-10-20T02:16Z. ⛔ Not a claim, ⛔ no label change; theBlocked-by:and its unlock condition are this card's seat's.flow:NAME · RECORD_ID— the approvals get serves nodisplay_title, and the title names the raw record id (blocks objectui#12484) objectstack#24665, through PR fix(plugin-approvals): an approval request is titled by its flow's label, never the raw record id or the flow's machine name objectstack#24708, asb9d0c48a5don objectstackmain.sys_approval_requestnow declaresnameField/displayNameField=process_label, the stored flow-label column the approvals get serves. The H1 is the flow's label in the readable, deleted and unresolvable states, with no record id and noflow:name.titleFormatis now{process_name}, a fallback reached only on a row the boot fill has not labelled.display_titleis kept, computing the same text (the label, elseprocess_name)..objectstack-shapin carriesb9d0c48a5d, not on the objectstack close alone.apps/console/src/services/approvalRequestsDataSource.servedPage*.test.tsx) copy the request definition withnameField: 'display_title'. They are copies, and they change with the pin bump. That is the objectstack dev's measured note (PR fix(plugin-approvals): an approval request is titled by its flow's label, never the raw record id or the flow's machine name objectstack#24708's Acceptance notes).Generated by Claude Code