Repository navigation
fix(service-automation): a corrupt correlation cycle back to the resumed run no longer names that run as its own child - #28101
Conversation
…med run no longer names that run as its own child resolveSuspensionChain now seeds its seen-set with the caller's run id, so an A -> B -> A correlation cycle ends the chain at B and the map refusal names the item run, not the run the caller is already resuming. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d1oZadHHFdEZXANxiG
…her resume refusals The client resume docblock, the service README's code list and the automation checklist's trigger-status item now name the map-item refusal the resume door answers since the parent-id gate landed. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d1oZadHHFdEZXANxiG
…e-automation Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d1oZadHHFdEZXANxiG
📓 Docs Drift CheckThis PR changes 2 package(s): ⛔ 3 release-owned page(s) name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 27 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 5c30569aecd599b488b08e8d118fe7d11be1a0d9 && git checkout 5c30569aecd599b488b08e8d118fe7d11be1a0d9
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 6410029d1bb550a13429ec83f22eff523300de26 1b77a96a014bac214f30ab480118ccb1eea432c8 && git checkout -B drift-repro 6410029d1bb550a13429ec83f22eff523300de26 && git merge --no-ff 1b77a96a014bac214f30ab480118ccb1eea432c8
node scripts/docs-audit/affected-docs.mjs --json 6410029d1bb550a13429ec83f22eff523300de26
|
|
domain:server#1 · os-elon-musk · session_016WV4czVnUdQQCVKSW5J2uk Seat ACCEPT · PR #28101 · head
|
Requested by Elon · project thread
Part of #27971 — this PR carries the rider (comment 6516883756) and the docs half only. The card's main fix (recording a cancelled
mapitem on a parent-id resume) waits on the maintainer's ruling (decision analysis 6523020455) and is not in this PR.Clause-②: no
Metadata-protocol: none
Skills-docs: none —
skills/**names neitherRESUME_CHILD_PENDINGnor map cancellation; undercontent/docs/**the code appears only in the generatedreferences/api/pages (automation-api, contract, error-code-ledger), which already list it.维护者速读
packages/services/service-automation/src/engine.ts(resolveSuspensionChain 的 seen 初值)、src/map-parent-resume-refusal.test.ts(新环形用例)。pnpm --filter @objectstack/service-automation exec vitest run --maxWorkers=2 src/map-parent-resume-refusal.test.ts,预期 6 个用例全绿。mapwhose parked item run was cancelled still advances past that item #27971 主修复的形状另在卡上等你裁决。What changes
resolveSuspensionChain(service-automation/src/engine.ts) seeds itsseenset with the caller's run id before the walk. A corrupt correlation cycle A → B → A used to yield the chain[A, B, A], and the409 RESUME_CHILD_PENDINGrefusal then told the caller to resume A, the run it was already resuming. The chain now ends at B and the refusal names B.409 RESUME_CHILD_PENDINGis added to the clientresume()docblock's list of refusals that leave the suspension intact (packages/client/src/index.ts), to the service-automation README's code list, and to the automation checklist itemautomation.trigger-status-contract(acceptance[4], a new variant row, history revision 9).@objectstack/service-automationpatch.Tests
map-parent-resume-refusal.test.ts: names the item run, never the caller's own, when a corrupt correlation cycles back to the caller. It points the item's row back at its parent (map:PARENT), resumes the parent, and asserts the code, that the message names the item run and not the parent, and that the map state did not move../engine.jsfromsrc, so nodistis on the path):scripts/ablation-replace.mjsreplaced the seeded constructor with an empty one (anchor x1 → x0, blob c3ff057c → 43ab85a7); the new pin went red (1 failed, 5 passed); the restore matched the HEAD blob c3ff057c andgit diff HEADwas empty.Acceptance notes
mainf6adf48 for the card's main half (not changed here): aftercancelRunon a parked map item, a parent-id resume advances past it. The parent completes, a downstream node seesresultsholding only item 2's output, andcountis 1.409 RESUME_CHILD_PENDING:showcase_release_signoff's item parks on an approval, which answers 403 first. The new checklist variant says so.Verification
Package suite and typecheck at 24787ee
pnpm --filter @objectstack/service-automation test: Test Files 226 passed (226), Tests 2863 passed (2863).pnpm --filter @objectstack/service-automation typecheck: check:test-typecheck OK, 0 errors. The head after that commit only adds the changeset.Derived gate families (dispatch-gates --commands, reconciled with --ran)
67 derived families: 66 ran with exit 0 and 1 is NOT MEASURED. 58 of them ran at 24787ee; the 9 changeset families the changeset added ran at 1b77a96.
check-plugin-teardown-shape --self-testwas re-run after fetching its pinned positive-control commit, andcheck:skill-examplesafter building@objectstack/client-reactand its dependencies; both exit 0. NOT MEASURED:pnpm check:dual-build-cjs-loadsexited 3 (prerequisite): it reads thedist/of about 40 packages, apps and adapters included, that this container did not build. CI's run is the reading for it.node scripts/check-platform-checklist.mjs --changed-from origin/main: exit 0, 14 anchors judged, 0 lost.pnpm lintis a repo-wide scan owned by CI.Human Minimum
packages/specholds no runtime logic. (not touched)pnpm lintpasses. (CI)main, one pull request.packages/spectouched: its generated artifacts are regenerated and committed. (not touched)content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_016WV4d1oZadHHFdEZXANxiG
Generated by Claude Code