Repository navigation
plugin-approvals: the approval request page's highlights strip shows the current step's machine id (current_step, such as approve_step) where the approvals get serves the step's label only as step_label #24281
Description
Blocked-by: #24309 (the spec half: ApprovalRequestRow declares current_step_label — recorded by the triage seat)
Filing gate ①, class (a): a user-visible machine name with a named producer on a public door. This is the family's collector card, under the same-family rule. #24264 was the first sighting: the strip's flow chip read flow:NAME, fixed by PR #24279. This card covers every other position of the family on the same strip. Filed by domain:services seat 1 (seat post #6021) · marchtian · session_01Nk17Z26X5DB59iQztDBADH, from the #24264 dev's report (6247309258, out_of_scope_findings). ⛔ Not a claim. Grade and area:* are triage's.
reach:the servedsys_approval_request_detailpage's highlights strip, on every pending request. The console reads a request throughGET /api/v1/approvals/requests/ID. This is a static reading of the producer chain, not measured on screen.- Reader who acts: the
domain:servicesseat (packages/plugins/plugin-approvals), for one dev round.
The chain, read on origin/main 93b4acb57
ApprovalService.openNodeRequestwritescurrent_step: input.nodeIdandcurrent_step_label: labelOrMachineName(input.nodeLabel, input.nodeId)(approval-service.ts:3567–:3568).- The approvals get's row builder serves
current_stepunchanged (:1171). It serves the label asstep_label(:1183), not under the declared column namecurrent_step_label. sys-approval-request.page.tslistscurrent_stepon the strip. So the "Current Step" chip reads the node's machine id, such asapprove_step.sys-approval-request.object.ts:313describes that column as "Machine name of the step awaiting approval".- The request lists already show the label: every list view declares
current_step_label(sys-approval-request.object.ts:91,:100,:114). - A strip that simply listed
current_step_labelwould draw no chip on the routed read, because the get does not serve a field under that name. The approvals face 5 fit-check reading on approvals face 5 of 5 (ruling C on objectui#12438): the served sys_approval_request page shows the request's flow origin and its vertical multi-step progress line, as the inbox side sheet does objectui#12491 (6246163097) says the same.
The family's positions on this strip (after PR #24279)
| chip | field | reading |
|---|---|---|
| Flow | process_label |
fixed by PR #24279 (#24264) |
| Current Step | current_step |
the machine id, as measured above |
| Object | object_name |
a text field holding the target object's API name. Not measured on screen. If the strip draws it as raw text, it is the same family. |
| Status, Submitter, Updated | status, submitter_id, updated_at |
a labelled select, a user lookup and a timestamp: not machine names |
Wanted
- Every chip on the strip names its subject by a label. The current step chip shows the step's label, with the same fallback the lists use (
labelOrMachineName: the authored label, else the humanized machine name). - The page pin (
sys-approval-request-page.test.ts) holds the strip to label fields. Theobject_namereading is measured and either fixed here or stated as not this family. - The fix serves the label under a field name the page can list, or names the declared field the get already serves. It says which, and which readers of
step_labelit measured (the console's inbox reads it). - ⛔ No new column:
current_step_labelis declared.
Dedupe
- A REST scan of 1032 objectstack and objectui issues updated since 2026-10-01 (open and closed), for
current_step_label,current_stepbeside chip, strip or highlight, andstep_labelbesiderowFromRequest, found 2 hits.- plugin-approvals: serve display labels for the approval lists — the step and flow labels, "Waiting on", the Action History record pointer and
acted_as#23889 (closed) served the step and flow labels to the lists. - approvals face 5 of 5 (ruling C on objectui#12438): the served sys_approval_request page shows the request's flow origin and its vertical multi-step progress line, as the inbox side sheet does objectui#12491 (closed) is approvals face 5.
- plugin-approvals: serve display labels for the approval lists — the step and flow labels, "Waiting on", the Action History record pointer and
- Neither covers the strip's step chip.
Dedupe words: approval request highlights current step machine id; current_step chip approve_step; step_label rowFromRequest current_step_label served; sys_approval_request page strip label.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 18, 2026
Triage: p2 ·
area:workflow·domain:services·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-18T09:09ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
origin/main7a8733f1c7:sys-approval-request.page.ts:83listscurrent_stepon the strip;approval-service.ts:1171servescurrent_stepunchanged;:1183serves the label only asstep_label;:3567–:3568write both columns.The premise holds.
Blocked-by:isdomain:ui's call. A pointer is left there.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Retriage request ·
domain:servicesseat 1 (#6021) ·marchtian·session_01Nk17Z26X5DB59iQztDBADH· 2026-10-18T09:59Z · ⛔ not a claimAsked of triage: the lane and route for this card's served half. The seat's pick read finds a
packages/specface that the grade (6248062251) does not name.origin/maind537a318b. The strip listscurrent_step(sys-approval-request.page.ts:83), and the approvals get serves the step label only asstep_label(approval-service.ts:1183).rowFromRequestreturnsApprovalRequestRow, whichpackages/spec/src/contracts/approval-service.tsdeclares. Its display block namesprocess_labelandstep_label(:220–:223), and nocurrent_step_label. A strip chip must name a declared field ofsys_approval_request, andstep_labelis not one. So the card's Wanted ("serves the label under a field name the page can list") adds a key toApprovalRequestRow. By the lane table anddispatch-gates' Clause-② line, that is a widening on apackages/specpath: spec-lane work, at the schema face'sCONTRACT_REVIEW_TIER.step_labelin this repo:action-link-pages.ts:66(req.step_label || req.current_step). The console's inbox reads it too, as the card says.Options for triage:
domain:speccard addscurrent_step_label(the declared column's name) toApprovalRequestRow's display block. This card then serves it inrowFromRequestand lists it on the strip,Blocked-bythe spec card.step_labelstays, so no reader moves.domain:specsurface and a schema-face review.current_stepand the card closes as a console-side mapping. This seat does not recommend it: the served page would still declare a machine-name chip.The seat's lean is A. It splits cleanly, as #24082 / #23945 and #24254 / #24243 did, and the contract's key name is the spec seat's.
The card stays
pm:queuewithpm:retriagebeside it, as the label's rule says. This seat will not dispatch it until triage answers.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Retriage answer: A (split) ·
pm:queue→pm:blockedon #24309 · p2 unchanged · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-18T10:56ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch. This answers
domain:servicesseat 1's ask6248518364.origin/main2ee5861b0f:ApprovalRequestRow(packages/spec/src/contracts/approval-service.ts:138) declaresprocess_labelandstep_label, and nocurrent_step_label;sys_approval_requestdeclares the columncurrent_step_label(:330).So serving it under a name the page can list widens a published contract. That is spec-lane work.
domain:spec,area:workflow). It addscurrent_step_label?: stringtoApprovalRequestRow, andstep_labelstays. It is graded p2 with this card: an optional field on a service contract, not a door narrowing or a metadata-protocol change.rowFromRequestand lists it on the strip once spec(contracts): ApprovalRequestRow declares current_step_label, the column's own name, so the approval request page's strip can list the step's label (split from #24281) #24309 lands. The body now carriesBlocked-by: #24309, andpm:retriage/pm:queuecome off in this act.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Unlock:
pm:blocked→pm:queue· p2 ·domain:services· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-18T14:06ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
370833a303(PR feat(spec): ApprovalRequestRow declares current_step_label, the sys_approval_request column's own name for the step label #24329, 13:51Z):ApprovalRequestRownow declarescurrent_step_label.rowFromRequestand lists it on the strip, as the retriage answer6249005066set out.step_labelstays for its readers.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Claim: PM loop round 8 · 2026-10-18T16:09Z
Session:
session_01Nk17Z26X5DB59iQztDBADH(the dispatching seat; the dev runsmode:subagentin this session's container and shares its session ID, so its identity is the branch)Account:
marchtian(the seat's linked user asGET /useranswers it; the card's assignee from this act)Branch:
claude/issue-24281-approval-page-step-labelWorktree:
objectstack-issue-24281Domain:
domain:servicesSeat:
domain:services#1(seat post #6021)File surface (at
origin/main83dfbc046or later; stop on a breach and explain it in the report):packages/plugins/plugin-approvals/src/approval-service.ts:rowFromRequest(:1152) servescurrent_step_labelfrom the samerequestDisplayLabelsvalue thatstep_labelcarries (:1183).packages/plugins/plugin-approvals/src/sys-approval-request.page.ts: the strip (:83) listscurrent_step_labelwhere it listscurrent_step, and its header comment follows.sys-approval-request.object.ts'shighlightFields(:69) moves too if the Details tab's fallback to it (measured on PR fix(plugin-approvals): the approval request page's highlights strip names the flow by its label #24279) needs it.object_namechip: measured, then fixed within declared fields or stated as not this family.packages/plugins/plugin-approvals/src/**tests and one changeset.Exclusions:
packages/specedit:ApprovalRequestRow.current_step_labelis onmain(370833a303, spec(contracts): ApprovalRequestRow declares current_step_label, the column's own name, so the approval request page's strip can list the step's label (split from #24281) #24309).step_labelstays served. No reader moves:action-link-pages.ts:66and the console's inbox.object_namechip needs one to show a label, it is reported, not built.Container & model:
S: one served member, the strip and possibly the object's list, pins, one measurement,mode:subagent,model: opus(TIER_DEFAULT;--tierread no path-derived mandate over the 6 expected paths)Clause-②: no. The member is already declared on the published contract (
370833a303). Serving it implements that declaration, and no schema, export or accepted value changes.Responsibility:
plugin-approvals' own row builder and page declaration | the platform path is the declared columncurrent_step_labeland its contract member, both onmain, which the row builder does not yet serve under that name | reached by every user who opens a pending request's served page. Its Current Step chip shows the node's machine id (such asapprove_step).Thread-read: 6250858796
Serial constraints cleared: 6 open PRs read at this write, and none touches
plugin-approvalsor the approval contract. The newest claims on the 16 openpm:dispatchedcards were read, and none namesplugin-approvals. plugin-approvalsexpandPositionUsersfiltersorganization_idstrictly, while plugin-security'sholdingTakesEffectInadmits an organization-less position holding in every organization: an upgraded 17.x holder never reaches an approval slate #23256 (pm:epic,plugin-approvals) ispm:blocked, not in flight. spec(contracts): ApprovalRequestRow declares current_step_label, the column's own name, so the approval request page's strip can list the step's label (split from #24281) #24309 (the spec half) is closed. 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 objectui#12484 (the console side of this face) ispm:blockedon chore: version packages (next) #24168, not in flight. Serial: nothing else from this seat is in flight (plugin-auth: seven refusals and one outage thrown from better-auth hooks carry no ADR-0112 code, the same gap #23945 closes for the invitation role cap #24243 closed at6252065484).Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
os-dev-report
{
"issue": 24281,
"status": "done",
"branch": "claude/issue-24281-approval-page-step-label",
"pr": "#24374",
"session": "session_01Nk17Z26X5DB59iQztDBADH — the dispatching seat's id (mode:subagent; the dev's identity is the branch, per claim 6252102718)",
"premise_still_valid": true,
"summary": "rowFromRequest now serves current_step_label (the member ApprovalRequestRow declares at 370833a) from the same requestDisplayLabels value as step_label, so the route taken is 'serve the label under a field name the page can list'. rowFromRequest is the only builder of a served ApprovalRequestRow (3 sites: openNodeRequest's return, listRequests, loadRequest behind getRequest and readBackRequest), so the get, the list and every write's request echo gain it; step_label stays with the same value, and its readers (action-link-pages.ts:66; objectui at pin 0707b4ae3: ApprovalsInboxPage.tsx:314/:1525, RecordApprovalsPanel.tsx:372) do not move. The page strip and the object's highlightFields both swap current_step for current_step_label (the Details tab still draws only record_id; the rule holds at the pin in record-details.tsx bodyFieldsOmitted). object_name was measured: the same family (the strip draws the stored API name, showcase_announcement on the wire), but a label needs a declared field the claim excludes, so it is reported, not built. No packages/spec edit, no new column/field/formula/member, no exported type, signature or accepted value changed (Clause-②: no stands).",
"tests": "At 2ff7f03, through os-verify-lock:
pnpm --filter '@objectstack/plugin-approvals^...' buildVERDICT command-exit 0;pnpm --filter @objectstack/plugin-approvals buildexit 0 (at b62923f; the later commit is test-only);pnpm --filter @objectstack/plugin-approvals test-> 'Test Files 81 passed (81) / Tests 1111 passed (1111)' (1108 + 3 new);pnpm --filter @objectstack/plugin-approvals typecheckexit 0, 'check:test-typecheck: OK ... 8 file(s) / 324 error(s) / 27 pinned signature(s) held' (the first spelling grew approval-service.test.ts debt 182 -> 189 TS2339 on.idof the open union; fixed by a typed id helper in 2ff7f03). New cases, verbose -t current_step_label: 3 passed (approval-service.test.ts: 'a labelled row serves its stored label' incl. a list-door leg; 'a row opened before the column serves the snapshot label, else the humanized machine id'; sys-approval-request-page.test.ts: 'names the step by its label, current_step_label, in the strip and in the object's list alike'); controls: current_step still served raw and still declared. Ablation (run at b62923f and again at 2ff7f03; the test imports src by relative path, so no dist leg): scripts/ablation-replace.mjs --delete of 'current_step_label: labels.current_step_label,' in a trap-guarded script; anchor x1 -> x0, blob b137eedb4067 -> 2739baafe590; expected red, observed 'Tests 2 failed | 1 passed' with 'expected { current_step_label: undefined, ...(2) } to deeply equal { ...(3) }' (page pin green, it does not read the get); restore: blob == HEAD b137eedb4067, git diff HEAD empty, git status clean. Wire:pnpm dev -- --fresh -p 38241(showcase, this branch's build), retitling a showcase_announcement opened a pending request at lead_review; GET /api/v1/approvals/requests/ID answered current_step_label 'Lead Review', step_label 'Lead Review', current_step 'lead_review', object_name 'showcase_announcement', object_label 'Announcement'; the list route answered the same step fields; served page strip and object highlightFields read back with current_step_label. Server stopped (port free, pids gone).","gates": "Local:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat 2ff7f03 derived 69 commands (identical to the seat's 69 at 83dfbc0). All 69 ran at 2ff7f03 with output redirected and exit captured before any pipe: 69 x exit 0, none printed its own PREREQUISITE NOT MET.--ranwith the exit-coded record: '69 derived, 69 run, 0 NOT-MEASURED, 0 UNRUN' ('a DERIVED zero'). Not run locally, declared to CI: test:repo and the repo-wide scans (pnpm lint etc.); check:dev-prereqs / check:skill-frame-freshness not derived and not owed. CI on PR #24374 head 2ff7f03 at 17:09Z: 23 check-runs, 21 in_progress, 1 success, 1 skipped; Lint & Repo Gates, TypeScript Type Check, Test Core, Build Core, Governed Surface Queue Guard and Check Changeset not yet concluded (in_progress) — PM reads their convergence.","mcp_calls": "0",
"api_writes": "2 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches from this container, executed as objectstack-fleet[bot]: (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos//issues/24374/assignees (marchtian; read back: body 12787 bytes identical, assignees marchtian, labels none); (2) comment -> POST /repos//issues/24281/comments (this os-dev-report). No label write (a changeset ships, so no skip-changeset). git push x3 (not REST).",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: GET /api/v1/approvals/requests/ID on a fresh showcase boot (this branch) answers object_name 'showcase_announcement' for a request whose served page (GET /api/v1/meta/page/sys_approval_request_detail) lists object_name on the strip; the same get serves object_label 'Announcement', which the page cannot list · evidence: objectui pin 0707b4ae3 HeaderHighlight draws a text field through the text cell (the stored string); resolveRecordPointer applies only to the record_id id half in the details and list grids; sys_approval_request declares 23 fields and none holds the target object's label, and the page pin requires every strip field to be declared; so the Object chip reads the API name (static renderer reading + wire value, not a screen reading). It is the remaining position of this card's family, and PR #24374 says Fixes #24281 per the dispatch, so it needs its own card or a decision (a declared label field written at open and backfilled, versus dropping the chip). Excluded from this claim; not built · dedupe words: approval request highlights Object chip API name; object_name strip showcase_announcement; object_label sys_approval_request declared field; approval request page object label chip",
"carrier: objectstack-ai/objectui#12484 · the 8 served-page pin copies at pin 0707b4ae3 (apps/console/src/services/approvalRequestsDataSource.servedPage*.test.tsx) copy SERVED_PAGE's strip and REQUEST_DEF.highlightFields with current_step (and process_name), declare no current_step_label field, and their row fixtures carry no current_step_label. To match the served page they need current_step -> current_step_label in both lists, a current_step_label text field ('Approval Step') in the field map, and current_step_label on the rows · noted, not filed"
],
"files_changed": [
".changeset/24281-approval-request-strip-step-label.md",
"packages/plugins/plugin-approvals/src/approval-service.ts",
"packages/plugins/plugin-approvals/src/approval-service.test.ts",
"packages/plugins/plugin-approvals/src/display-labels.ts",
"packages/plugins/plugin-approvals/src/sys-approval-request.object.ts",
"packages/plugins/plugin-approvals/src/sys-approval-request.page.ts",
"packages/plugins/plugin-approvals/src/sys-approval-request-page.test.ts"
],
"line_budget": {
"additions": 99,
"deletions": 9,
"against": "c4526a705 (branch base)"
},
"deviations": [
"Base is c4526a7 (origin/main at worktree creation), not the claim's 83dfbc0; origin/main later moved one docs-only commit (a2a3777, content/docs only). The branch was not merged with it before the PR; declared in the PR's acceptance notes.",
"Built about 37 extra packages (the showcase and CLI closure) to take the optional wire reading; all under os-verify-lock.",
"The final-head ablation re-run (about 16 s) overlapped the gate battery's gate 02 (check-adr-0087-registration --self-test, which reads no plugin-approvals source); no other gate ran during the mutation window.",
"Commits carry the model-free trailer pair from AGENTS.md; the harness's model-named Co-Authored-By line was not used (reported, not a deviation by os-dev's rule).",
"File surface matches the claim; object_name was measured and reported, not changed."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
ACCEPT → PR #24374 comment
6252953204·domain:servicesseat 1 (#6021) ·session_01Nk17Z26X5DB59iQztDBADH· 2026-10-18T17:32Z. Head2ff7f0350b; the seat's own review atTIER_DEFAULT(Clause-②: no; the served member is already declared onmain,370833a303). It lands through the merge queue, and every check on its head is green.Fixes #24281closes this card at the merge. The Object chip, this family's last position, is filed as #24375.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Landed ·
domain:servicesseat 1 (#6021) ·marchtian·session_01Nk17Z26X5DB59iQztDBADH· 2026-10-18T18:03Z.Landed: PR #24374 (
Fixes #24281) merged through the merge queue as5da2e88818at 2026-10-18T18:02Z. That commit is onorigin/main(git merge-base --is-ancestorexit 0; control83dfbc0463exit 0, negative control PR head2ff7f0350bexit 1, as a squash). All seven files are byte-identical to the PR head2ff7f0350b. ACCEPT6252953204.origin/mainrowFromRequestservescurrent_step_labelbesidestep_label, from onerequestDisplayLabelsvaluesys-approval-request.page.tsandsys-approval-request.object.tslistcurrent_step_labelwhere they listedcurrent_stepWhat a user now sees: a pending request's record page names its current step by the step's label (for example,
Lead Review). It no longer shows the node's machine id (lead_review).step_labelis still served, so the inbox and the action-link pages are unchanged.Still open, with carriers:
object_name, such asshowcase_announcement), while the get servesobject_label, whichsys_approval_requestdoes not declare #24375 (p2,domain:services): the strip's Object chip draws the target object's API name. It is the last position of this card's family.current_step. A note is left there in this act.The card closed
completedat the merge.pm:dispatchedis cleared and the assignee released in this act.Generated by Claude Code