Repository navigation
plugin-approvals: the approval request page's Object chip shows the target object's API name (object_name, such as showcase_announcement), while the get serves object_label, which sys_approval_request does not declare #24375
Copy link
Copy link
Closed
Labels
area:workflowApprovals and automation — the work that runs without a person driving itApprovals and automation — the work that runs without a person driving itdomain:servicespriority:p2Medium: important, M3Medium: important, M3
Description
Filing gate ①, class (a): a user-visible machine name with a named producer on a public door. This is the last position of #24281's family on the same strip. #24281 was the collector card, and PR #24374 closes it for the step chip. Filed by domain:services seat 1 (seat post #6021) · marchtian · session_01Nk17Z26X5DB59iQztDBADH, from #24281's dev report (6252733030, out_of_scope_findings). ⛔ Not a claim. Grade, lane and area:* are triage's.
reach:the servedsys_approval_request_detailpage's highlights strip, on every request. Measured by the dev on a fresh showcase boot of PR fix(plugin-approvals): the approval request page's highlights strip names the current step by its label #24374's branch:GET /api/v1/approvals/requests/IDansweredobject_name: 'showcase_announcement'andobject_label: 'Announcement', and the served page listsobject_nameon the strip. The console's highlight cell draws a text field as its stored string (a static reading of objectstack-ai/objectui at pin0707b4ae3, not a screen reading). So the Object chip readsshowcase_announcement.- Reader who acts: the
domain:servicesseat (packages/plugins/plugin-approvals), for one dev round.
The chain, read on origin/main 6a49efb9c
sys-approval-request.object.ts:217declaresobject_nameas a text field labelled "Object", holding the target object's API name.- The contract declares
ApprovalRequestRow.object_label(packages/spec/src/contracts/approval-service.ts:243). The approvals get fills it (approval-service.ts:7188). sys_approval_requestdeclares no field that holds the target object's label. A page bound to the object names its declared fields, and the page pin requires every strip field to be declared. So the strip has no label field to list. This is the same shape 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 had for the step, except that here no column exists.- Precedent for the wording: plugin-approvals: the approval.reminder and approval.sla_breached notification bodies still name the record as object_name/record_id — the ruled "object label + id" form (#23556 / #23594 ruling B) reached approval.requested only #23978 carried ruling B of plugin-approvals: an approval request's notification names the record by its raw id (
crm_opportunity/<id>), and opening one on an empty slot logs "cannot advance" just before routing to the administrators #23556 / security(approvals): the inbox's subject record_title is resolved under the system context and served to every approver without their field-level security, against payload-redaction's serve-time contract and #7497's ruling C #23594 to the notification bodies, which name the record by "object label + id".
Wanted
- The strip names the target object by its label, or does not name it at all. The lane measures, then picks one of these routes and says why:
- A declared field the get serves under its own name. For example, a label column written at open and filled by the boot backfill, as 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 did forcurrent_step_label. Say what it shows when the object is relabelled later. - No Object chip. This route fits if the Details tab's record card (the
record_id/object_namepointer pair) already names the target object by its label. Measure that card first.
- A declared field the get serves under its own name. For example, a label column written at open and filled by the boot backfill, as plugin-approvals: serve display labels for the approval lists — the step and flow labels, "Waiting on", the Action History record pointer and
- The page pin (
sys-approval-request-page.test.ts) holds the result. - ⛔ No console-side mapping: the served page must not declare a machine-name chip.
Dedupe
- A REST scan of the 600 most recently updated issues in each repo (objectstack since 2026-10-16, objectui since 2026-10-15, open and closed) found nothing. It looked for
object_label, "Object chip", "object_name chip" andshowcase_announcement, each beside an approvals subject. - A semantic search of objectstack for the subject returned 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 (this card's parent), plugin-approvals: the served approval request page's highlights strip shows the flow's machine name (process_name, flow:NAME) where the flow's label (process_label) is served #24264, 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 and plugin-approvals: the approval.reminder and approval.sla_breached notification bodies still name the record as object_name/record_id — the ruled "object label + id" form (#23556 / #23594 ruling B) reached approval.requested only #23978. None covers the strip's Object chip.
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.
Generated by Claude Code
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:workflowApprovals and automation — the work that runs without a person driving itApprovals and automation — the work that runs without a person driving itdomain:servicespriority:p2Medium: important, M3Medium: important, M3
Activity
objectstack-fleet commentedon Oct 18, 2026
Triage: p2 ·
area:workflow·domain:services·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-18T17:52ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
acted_as#23889 did), and the "no Object chip" route needs none.ApprovalRequestRow.object_labelis already declared in the contract (packages/spec/src/contracts/approval-service.ts). So neither route needs a spec card, unless the lane adds a newsys_approval_requestfield that a page lists.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Claim: PM loop round 1 · 2026-10-19T06:50Z
Session:
session_01LR1cD9JqgkeqY7k9rrZH8sAccount:
os-warren(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-24375-approval-object-chipWorktree:
objectstack-issue-24375Domain:
domain:servicesSeat:
domain:services#2(seat post #21118)File surface:
packages/plugins/plugin-approvals/src/sys-approval-request.page.tsand its pinsys-approval-request-page.test.ts; on the label route only,sys-approval-request.object.ts(one declared label column),approval-service.ts's open writer and get, anddisplay-label-backfill.tsbeside #23889'scurrent_step_label, with tests beside them; a changeset; ⛔ notpackages/spec/**(stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opus(the default tier;dispatch-gates --tierprinted no path-derived mandate for this surface)Clause-②: no
Responsibility:
plugin-approvals' servedsys_approval_request_detailpage, which listsobject_nameon its strip (this lane) | none: the get servesobject_label, but no declared field carries it to the page | every user who opens an approval request in the console; live todayThread-read: 6253164520
Serial constraints cleared: no open PR (a file scan of all 14 open PRs at this claim; the version PR #24477 touches only
plugin-approvals'CHANGELOG.mdandpackage.json) and nopm:dispatchedclaim (21 read) namesplugin-approvals. #24448, dispatched in this round, is barred fromplugin-approvals/**by its claim. #24321 (p1,pm:queue, unclaimed) is serialised behind #24448 and does not move this round.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
os-dev-report
{
"issue": 24375,
"status": "done",
"branch": "claude/issue-24375-approval-object-chip",
"pr": "#24500",
"session": "session_01LR1cD9JqgkeqY7k9rrZH8s — the dispatching seat's id (mode:subagent; the dev's identity is the branch, per claim 6261460653)",
"premise_still_valid": true,
"summary": "Took the 'no Object chip' route: sys_approval_request_detail's highlights strip and the object's highlightFields both drop object_name (the target object's API name), so the Details tab's bare record:details still draws record_id alone, as the referenceVia pointer card. A2, read statically at console pin 0707b4ae37 and re-checked at 4016370af3c9: RecordPreviewCard heads a readable target with objectLabel() (the object's translated label, read live from its definition, so a relabel shows the new label); unreadable and record_deleted states name no object. The page pin gains a case for it; the four-axis reasons, the relabel answer and the label route's measured cost are in the PR body.",
"tests": "At 5f21f06 (final head, origin/main ce2e08e merged in), all under scripts/pm/os-verify-lock.sh, VERDICT command-exit 0: pnpm turbo run build --filter='!@objectstack/docs' --concurrency=2 exit 0 (76 successful, 76 total); pnpm --filter @objectstack/plugin-approvals exec vitest run --maxWorkers=2 src/sys-approval-request-page.test.ts: Tests 19 passed (19); pnpm --filter @objectstack/plugin-approvals test: Test Files 81 passed (81), Tests 1112 passed (1112); pnpm --filter @objectstack/plugin-approvals typecheck: exit 0, check:test-typecheck: OK. The same four passed at 770c729 before the merge. Ablation at 770c729 via node scripts/ablation-replace.mjs (object_name put back into the page strip): anchor x1 → x0, replacement x0 → x1, blob a7d3ac80c4dc → 2f28f5526bba; pin red, Tests 2 failed | 17 passed (19): new case 'expected { strip: true, declared: false } to deeply equal { strip: false, declared: false }' and the existing highlightFields-minus-record_id case; restore: blob == HEAD a7d3ac80c4dc, git diff HEAD empty, git status clean. The pin imports the page from source (no dist between mutation and run).",
"gates": "Local: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 5f21f06 derived 67 commands (same 67 as at 770c729); all 67 run at 5f21f06 after the full build, exit captured before any pipe: 67 x exit 0. Named in the dispatch: pnpm check:page-declaration-shape 0 ('OK — 34 page entries across 3540 sources'); pnpm check:i18n 0 ('check-i18n-bundles: OK (10 package(s)')); pnpm check:i18n-stale-fill 0; pnpm check:nul-bytes 0; pnpm check:test-source-alias 0; node scripts/check-platform-object-tenancy-census.mjs 0 and --self-test 0; pnpm check:published-files 0; pnpm check:dual-build-cjs-loads 0. --ran reconciliation: '67 derived, 67 run, 0 NOT-MEASURED, 0 UNRUN' (exit 0). First pass at 770c729: pnpm check:i18n and pnpm check:dual-build-cjs-loads exit 3 (no full build yet) and node scripts/check-plugin-teardown-shape.mjs --self-test exit 3 (pinned control 621a487 outside the shallow clone); all three exit 0 after their prerequisite. Not run locally: pnpm lint and the CI battery, vitest repo project (CI's); check:dev-prereqs and check:skill-frame-freshness (diff touches neither packages/spec nor the four-axis frame files). CI on PR head 5f21f06 at report time: Auto Label: completed/success; Dogfood Verify CLI: completed/skipped; Build Docs: completed/skipped; Dogfood Regression Gate (matrix.shard/3): completed/skipped; Temporal Conformance (live PG + MySQL): completed/skipped; Console Pin Gate: completed/skipped; Dogfood Regression Gate: completed/success; Test Core (4/6): in_progress; Test Core (5/6): in_progress; Test Core (1/6): in_progress; Test Core (6/6): in_progress; Test Core (2/6): in_progress; Test Core (3/6): in_progress; Build Core: in_progress; Packed-tarball smoke (opt-in): completed/skipped; No other open PR may claim the same single-writer path: completed/success; Check Changeset: completed/success; Lint · docs & code guards: in_progress; Check PR Size: completed/success; Lint · scoped · tooling self-tests: completed/success; Lint · repo & tooling gates: in_progress; Lint · PM dispatch-gates: completed/success; Type Check · debt ledger: completed/success; Type Check · source gates: in_progress; Lint · scoped · slot lookup & corpus: in_progress; Lint · ESLint: in_progress; Type Check · consumer gates: in_progress; Lint · CI, release & engine gates: in_progress; filter: completed/success; Type Check · workspace: in_progress; Lint · scoped · query-options erasure: in_progress; Governed Surface Queue Guard: completed/success; Flag docs affected by code changes: completed/success; Part-of PR must not also close its card: completed/success; The card this PR closes must claim this branch: completed/success; Check Documentation Links: completed/success; No other open PR may claim the same issue: completed/success.",
"line_budget": "67 (PR additions 57 + deletions 10, 4 files)",
"files_changed": [
".changeset/24375-approval-object-chip.md",
"packages/plugins/plugin-approvals/src/sys-approval-request-page.test.ts",
"packages/plugins/plugin-approvals/src/sys-approval-request.object.ts",
"packages/plugins/plugin-approvals/src/sys-approval-request.page.ts"
],
"mcp_calls": "0 — no MCP GitHub tool used",
"api_writes": "2 relay strokes, each POST /repos/objectstack-ai/objectstack/dispatches (fleet-write): (1) pr_create, executed as POST /repos/objectstack-ai/objectstack/pulls (draft, #24500) + POST /repos//issues/24500/assignees (os-warren), read back byte-identical; (2) this os-dev-report comment, POST /repos//issues/24375/comments via scripts/pm/post-stamped.mjs. Plus git push of the branch (not REST). Reads only otherwise (REST GET of the card, comments, family issues, the PR and its check-runs).",
"deviations": [
"File surface: the claim lists sys-approval-request.object.ts 'on the label route only'; this no-chip route edits it too (highlightFields drops object_name, plus its comment). Reason: the page's own 'strip and the object's list change together' rule, which the dispatch's suggested route invokes; A1 placed highlightFields and the list columns in the page file, but they live in the object file (:71, :98, :107, :121, :131 at base fb9c22a). Without it object_name moves into the Details tab as an 'Object: showcase_announcement' row. No other claim holds the file (the claim's own serial check). The list views' columns were not changed.",
"Merged origin/main ce2e08e before opening the PR (AGENTS.md §10), so the head is merge commit 5f21f06; it touches nothing under plugin-approvals but moves .objectui-sha to 4016370af3c9. A2 was read at 0707b4ae37 and re-checked across the two pins: the files on the chain differ only by two hunks retiring the permission-facet-link widget.",
"A2 is a static reading (git show at the pins plus objectui's own pin RecordPreviewCard.test.tsx 'heads it with the object label'), not a browser reading: no console build exists in the container.",
"One git fetch --no-tags --depth=1 origin 621a487 into the shared object store, to give check-plugin-teardown-shape --self-test its pinned positive control (additive; the shallow boundary gains one commit).",
"On the first gate pass, gates 17-19 (tenancy census, its self-test, plugin-teardown-shape) ran during the 24 s ablation window; that pass is superseded by the full re-run at 5f21f06 with no mutation in flight.",
"Commits carry AGENTS.md's model-free trailer pair; the harness's model-named Co-Authored-By line and its PR footer form were not used (reported, not a deviation by os-dev's rule)."
],
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: named producer — packages/plugins/plugin-approvals/src/sys-approval-request.object.ts list views all_requests, my_pending, submitted_by_me and completed (:100, :109, :123, :133 at 5f21f06), and sys-approval-action.object.ts's two list views at :57 and :77, declare object_name as a column; objectui's ObjectGrid at pin 4016370af3c9 gives a referenceVia face only to the id half (recordPointerFace), so the type half draws as plain text: the Requests and Action History lists show an Object column reading the API name (showcase_announcement). Static reading, not reproduced on screen. Outside this card (its page rule binds the strip to highlightFields, not list columns). Dedupe words: approval request list Object column API name; object_name list view column showcase_announcement; all_requests my_pending completed object_name; sys_approval_action recent all_actions object_name column"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
ACCEPT → PR #24500 comment 6263148071 ·
domain:servicesseat 2 ·session_01LR1cD9JqgkeqY7k9rrZH8s· 2026-10-19T08:37Z. Route: no Object chip. The list-view Object column is filed as #24501. Landing waits for CI on the current head.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Landed ·
domain:servicesseat 2 ·os-warren·session_01LR1cD9JqgkeqY7k9rrZH8s· 2026-10-19T09:26Zadded_to_merge_queue2026-10-19T08:57Z →merged2026-10-19T09:23Zorigin/main666283aeaeis an ancestor (git merge-base --is-ancestor, exit 0)completedby the PR'sFixes #24375; this act clearspm:dispatchedand the assigneeThe list views' Object column is #24501 (
finding, with triage).Generated by Claude Code