…nk APP is com.objectstack.setup
approvals.dynamic-approver-routing (r5): a paused run's detail carries
its variables snapshot (#7639), measured live in QA run #27134, so the
vars clause gains a snapshot leg on the stage-2-paused run beside the
kept resolution leg; knownGaps[0], steps[7] and source[3] follow.
approvals.notification-deep-link (r9): steps[3] and acceptance[3]'s
verify name the bare-route landing segment com.objectstack.setup, as
measured in #27134 (requestPagePath falls back to the name 'setup';
the app shell rewrites the alias to the package id).
Claude-Session: https://claude.ai/code/session_01QSeKYmP1ZLg3jhTNud1E3J
Co-authored-by: Claude <noreply@anthropic.com>
Part of #25807 (wave-2 accuracy, slice D)
Clause-②: no
Metadata-protocol: none
维护者速读
com.objectstack.setup。recordLogomits them while the continuation keeps them #7639),落地 URL 的应用段也不是setup。docs/qa/platform-checklist/areas/approvals.json中approvals.dynamic-approver-routing的 acceptance[3] 与 knownGaps[0]。node scripts/check-platform-checklist.mjs,预期输出OK — 16 areas, 329 items。What changes
One file, two items, each
revision+1 from main with main'shistorykept as an exact prefix and one appended row citing #27134.approvals.dynamic-approver-routingr4 → r5knownGaps[0]is rewritten as CLOSED by finding: a suspended flow run's variables are unreadable on run-detail — the pausedrecordLogomits them while the continuation keeps them #7639, not deleted. A paused run's detail now carries its variables: both suspend sites (thestatus: 'paused'recordLog inservice-automation/src/engine.ts, and the re-suspend inrun-resume.ts, which is where this flow re-pauses at stage 2) hand one snapshot to the continuation and to the paused log entry thatGET /api/v1/automation/:name/runs/:runIdserves. QA run · area:approvals slice-C ids (5/5) · 07d18e69 · 2026-10-28 · 5 PASS / 0 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #27134 measured it live.acceptance[3]is stronger, not weaker. It gains a snapshot leg: on the stage-2-paused run,variables['lead_review.next_reviewers']must equal the submitted pick, ids and order. Decision outputs land as flat NODEID.KEY variables (engine.ts#applyResumeSignal). The resolution leg stays unchanged: stage-2pending_approvers, 1 → 1 and 2 → 2, same order. Both legs must hold on both chains, and a missing or disagreeing snapshot is a FAIL. The old "⛔ Do NOT prescribe reading the run's variables snapshot" sentence is gone, because its premise no longer holds.steps[7]andsource[3]say the same thing. The run id is the stage-2 request'sflow_run_id.approvals.notification-deep-linkr8 → r9steps[3]: on the bare/system/approvalsroute, APP iscom.objectstack.setup.requestPagePath(ApprovalsInboxPage.tsx) falls back to the setup app's namesetup. The app shell'scanonicalAppPathname(ui/packages/app-shell/src/utils/appRoute.ts) then replaces that name alias with the package idSETUP_APP_PACKAGE_ID(packages/apps/setup/src/index.ts). QA run · area:approvals slice-C ids (5/5) · 07d18e69 · 2026-10-28 · 5 PASS / 0 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #27134 measured this live.acceptance[3]'s verify parenthetical had the same stalesetup, and it gets the same correction. Every clause still uses the APP placeholder, so no assertion changes.Acceptance notes
knownGaps[0]+ acceptance[3]'s reason, andsteps[3]. The same stale fact also sat insteps[7]andsource[3]of the first item and inacceptance[3]'s verify of the second. They are corrected here because leaving them would make each item contradict itself. No other item is touched.lead_review.next_reviewers. QA run · area:approvals slice-C ids (5/5) · 07d18e69 · 2026-10-28 · 5 PASS / 0 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #27134 read variables on a stage-1-paused run, so the stage-2 key is grounded in source at base 74133d9. The history row says so, and a prior verdict on acceptance[3] does not carry.Verification
Local gates at HEAD bf4b3b8 (each exit captured before any pipe)
node scripts/check-platform-checklist.mjs→ exit 0,OK — 16 areas, 329 items (324 active, 1 planned); symbol anchors 1036/1046 resolved, 10 on the named residualnode scripts/check-platform-checklist.mjs --self-test→ exit 0, 265 assertionsnode scripts/checklist-select.mjs area:approvals→ exit 0, 20 runnable items, both edited items includednode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack→ exit 0, 16 commands. All 16 were run and exited 0.check:doc-formula-expressionsfirst answered exit 3 (PREREQUISITE NOT MET: lint/formula not built). Afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lint(VERDICT command-exit 0), it answered exit 0.--ran→ exit 0,16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED (a DERIVED zero)Generated by Claude Code