You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
plugin-approvals: a revise-window recall on a batch sign-off cancels the map item's run and never resumes the parent, so the batch stays parked #28183
Filing gate: ① contract review of PR #28176 (#27971, ruling A 6523833308), should-fix S2 (record 6526773700), first read by the #27971 dev (os-dev report 6522980749, out-of-scope finding). Filed by domain:server seat 1. ⛔ Not a claim. No grade: triage sets the lane and grade.
Reach: any batch approval flow (a map over approval items, e.g. showcase_release_signoff → one_task_signoff) where an approver uses the revise-window recall.
Reader who acts: domain:server (packages/plugins/plugin-approvals, with service-automation's resume in the question).
What the code does (read, not measured)
plugin-approvals' revise-window recall (packages/plugins/plugin-approvals/src/approval-service.ts) calls cancelRun on the run parked at the approval. On a batch sign-off that run is a map item. cancelRun (service-automation/src/run-resume.ts) does not touch the parent, and nothing resumes it, so the batch run stays parked with nothing to wake it. After PR #28176 (ruling A), a parent-id resume records the item as a cancelled marker and the batch continues — but only when an operator issues that resume by hand.
Wanted (route is triage's)
Decide what a recall on a batch item should do to its batch: resume the parent so the map records cancelled and moves on (ruling A's shape), or another product answer. Measure the parked state first.
Dedupe
Read the open titles for recall, revise window, batch sign-off, cancelRun + parent: none. New.
Read fresh. After a revise-window recall on a batch item, the batch parks for good and nothing wakes it.
Route: ruling A (6523833308) already says what a cancelled item does to its batch. It records cancelled and the map moves on. The recall follows the same shape: it resumes the parent with the cancelled marker. Measure the parked state first and pin it.
Any other product answer, for example the recall stopping the whole batch, is a new decision. It comes back as a card and does not get decided in the PR.
Claim: PM loop · 2026-10-30T17:02Z · triage first touch 6527285884
Session: session_016WV4d13k5TVyAhqhiKKgN3 (card thread; seat session_016WV4d1Np3hU7RQnA13YZcL)
Account: os-elon-musk
Branch: claude/project-thread-9vip6n
Worktree: objectstack-issue-28183
Domain: domain:server
Seat: domain:server#4
File surface: packages/plugins/plugin-approvals/src/approval-service.ts (the revise-window recall on a run parked at a map item), packages/services/service-automation/src/run-resume.ts only where the recall reaches the parent resume PR #28176 added (no other hunk), their tests, scripts/engine-double-contract.pinned.json (only the two generated rows check-engine-double-contract.mjs --write adds for the new test's engine double; amended 17:5xZ), content/docs/automation/flows.mdx (the cancelled-item paragraph only) and content/docs/automation/approvals.mdx (the revise-window paragraph only) saying a recall on a batch item wakes the batch (amended 18:0xZ, dev report 6529875250), .changeset/*; ⛔ no packages/spec, no engine.ts, no governed path
Container & model: M, mode:thread, model: default (TIER_DEFAULT), effort: high; no contract review expected (a recall on a batch item takes the shape ruling A 6523833308 already set for a cancelled item) unless the diff refuses something accepted today, adds a code or edits packages/spec
Clause-②: no (a parked batch, which nothing wakes, resumes with the item recorded cancelled, as ruling A prescribes) — the dev confirms the arm from the diff
Metadata-protocol: none
Responsibility: a revise-window recall on a batch sign-off item cancels the item's run and never resumes the parent, so the batch stays parked for good; the platform path that covers it is the recall resuming the parent with the cancelled marker (ruling A's shape, PR #28176); reached by every batch approval flow whose approver recalls inside the revise window.
Thread-read: 6527285884
Premise: holds (card at origin/main3a2f4c00; PR #28176 merged 17:01Z 3a2f4c00)
Serial constraints cleared: no open PR on plugin-approvals/src/approval-service.ts right now; PR #28176 (seat 1, #27971) has merged.
{
"issue": 28183,
"status": "done",
"branch": "claude/project-thread-9vip6n",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28228",
"session": "session_016WV4d13k5TVyAhqhiKKgN3",
"head": "acae6743",
"premise_still_valid": "yes, measured at origin/main 3a2f4c00: after a revise-window recall on item 1 of a two-item map batch, item 1's run is cancelled, the batch run stays parked on signoffs with correlation map:<item 1's run> (history paused), no request opens for item 2, and the recall answers resumed:false with no resumeError.",
"summary": "approval-service.ts only. In recall's revise-window branch, when cancelRun answers true, the new private resumeBatchOfRecalledItem finds the run parked on map:<itemRunId> (listSuspendedRunsDurable), checks through getFlow that it is parked at the built-in map node, and resumes it with serviceResume(batchRunId, {}). PR #28176's parent-id resume then records the item's slot as { $status: 'cancelled', $itemRunId }, keeps it out of count, and moves the map on. No new marker shape, no new code, no run-resume.ts or packages/spec change. A refused or stranded batch resume is told on resumeError (plus resumeFailure RESUME_FAILED for the engine's stranded exit, as the recall's own resume is); the withdrawal still stands; resumed stays false (the request's own run was cancelled).",
"tests": "batch-item-recall-resumes-batch.test.ts (new, 5 cells, real AutomationEngine + built-in nodes + approval node): cell 1 red on main, 4 CONTROL cells green on main; 5/5 at head. Ablations via scripts/ablation-replace.mjs, each restored to the HEAD blob with git diff HEAD empty: A1 no batch resume -> cell 1 red; A2 any map: parent -> cell 2 red; A3b pending recall takes the cancel path -> cell 3 red; A4 decide always resumes down approve -> cell 4 red; A5 no built-in map node check -> cell 5 red. (A3, batch resume also issued on the pending path, stayed green: the lookup finds no run parked on the completed item, so it is a no-op, not a guard.) pnpm --filter @objectstack/plugin-approvals exec vitest run: 106 files, 1357 passed. Package typecheck exit 0.",
"gates": "head acae6743, after a whole-tree turbo build, --deepen=200 and fetching the teardown self-test's pinned commit. First sweep at 4e1d9679: 63 families, 61 exit 0, 2 red (check:engine-double-contract, check:objectql-double-limit), both the new test's ObjectQL double. Fixed in acae6743 (dispatch asserts, numeric offset/limit, two generated pinned-ledger rows; surface amended by the seat). Re-derived: 71 families, all exit 0; --ran: 71 derived, 71 run, 0 NOT-MEASURED, 0 UNRUN. pnpm lint exit 0. check-commit-card-trailers --range origin/main..HEAD exit 0. CI: pending at report time.",
"clause_2": "no: no schema, accept set, error code or result field changes; a batch run nothing could wake now continues in the shape ruling A (6523833308) set.",
"metadata_protocol": "none",
"dogfood_battery": "n/a: no (narrowing) arm declared",
"open_questions": [],
"mcp_calls": "1: subscribe_pr_activity x1 (PR #28228); no GitHub MCP reads or writes. Reads were plain curl GETs.",
"api_writes": "2: relay pr_create (objectstack#28228); relay comment on #28183 (this report). git push is not a REST write.",
"out_of_scope_findings": [
"class: b · reach: a revise-window recall on a batch item in a deployment with more than 1000 parked runs on a durable store · evidence: listSuspendedRunsDurable reads ObjectStoreSuspendedRunStore.list(), one page of 1000 paused rows, so the batch run may not be on it and the recall then leaves the batch parked as before, telling nothing; a precise lookup needs an engine member reading the item run's $parentRunId (engine.ts / run-resume.ts, outside this surface) · dedupe words: recall batch parent lookup page cap listSuspendedRunsDurable",
"class: docs · reach: readers of content/docs/automation/flows.mdx (cancelled-item paragraph, ~L1518) and approvals.mdx (revise-window paragraph, ~L731) · evidence: neither says a revise-window recall on a batch item now wakes the batch; docs were outside the claimed surface · dedupe words: docs recall batch revise window cancelled marker"
]
}
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 审批与自动化 | none | P②
Triage: p2 ·
bug·domain:server·area:workflow·pm:queue· 2026-10-30T16:02Z⛔ Not a claim.
cancelledand the map moves on. The recall follows the same shape: it resumes the parent with the cancelled marker. Measure the parked state first and pin it.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL
Claim: PM loop · 2026-10-30T17:02Z · triage first touch 6527285884
Session:
session_016WV4d13k5TVyAhqhiKKgN3(card thread; seatsession_016WV4d1Np3hU7RQnA13YZcL)Account:
os-elon-muskBranch:
claude/project-thread-9vip6nWorktree:
objectstack-issue-28183Domain:
domain:serverSeat:
domain:server#4File surface:
packages/plugins/plugin-approvals/src/approval-service.ts(the revise-window recall on a run parked at amapitem),packages/services/service-automation/src/run-resume.tsonly where the recall reaches the parent resume PR #28176 added (no other hunk), their tests,scripts/engine-double-contract.pinned.json(only the two generated rowscheck-engine-double-contract.mjs --writeadds for the new test's engine double; amended 17:5xZ),content/docs/automation/flows.mdx(the cancelled-item paragraph only) andcontent/docs/automation/approvals.mdx(the revise-window paragraph only) saying a recall on a batch item wakes the batch (amended 18:0xZ, dev report 6529875250),.changeset/*; ⛔ nopackages/spec, noengine.ts, no governed pathContainer & model:
M,mode:thread,model: default (TIER_DEFAULT),effort: high; no contract review expected (a recall on a batch item takes the shape ruling A 6523833308 already set for a cancelled item) unless the diff refuses something accepted today, adds a code or editspackages/specClause-②: no (a parked batch, which nothing wakes, resumes with the item recorded
cancelled, as ruling A prescribes) — the dev confirms the arm from the diffMetadata-protocol: none
Responsibility: a revise-window recall on a batch sign-off item cancels the item's run and never resumes the parent, so the batch stays parked for good; the platform path that covers it is the recall resuming the parent with the cancelled marker (ruling A's shape, PR #28176); reached by every batch approval flow whose approver recalls inside the revise window.
Thread-read: 6527285884
Premise: holds (card at
origin/main3a2f4c00; PR #28176 merged 17:01Z3a2f4c00)Serial constraints cleared: no open PR on
plugin-approvals/src/approval-service.tsright now; PR #28176 (seat 1, #27971) has merged.objectstack-fleet commentedon Oct 30, 2026
domain:server#4 · os-elon-musk · session_016WV4d13k5TVyAhqhiKKgN3
os-dev-report
{ "issue": 28183, "status": "done", "branch": "claude/project-thread-9vip6n", "pr": "https://github.com/objectstack-ai/objectstack/pull/28228", "session": "session_016WV4d13k5TVyAhqhiKKgN3", "head": "acae6743", "premise_still_valid": "yes, measured at origin/main 3a2f4c00: after a revise-window recall on item 1 of a two-item map batch, item 1's run is cancelled, the batch run stays parked on signoffs with correlation map:<item 1's run> (history paused), no request opens for item 2, and the recall answers resumed:false with no resumeError.", "summary": "approval-service.ts only. In recall's revise-window branch, when cancelRun answers true, the new private resumeBatchOfRecalledItem finds the run parked on map:<itemRunId> (listSuspendedRunsDurable), checks through getFlow that it is parked at the built-in map node, and resumes it with serviceResume(batchRunId, {}). PR #28176's parent-id resume then records the item's slot as { $status: 'cancelled', $itemRunId }, keeps it out of count, and moves the map on. No new marker shape, no new code, no run-resume.ts or packages/spec change. A refused or stranded batch resume is told on resumeError (plus resumeFailure RESUME_FAILED for the engine's stranded exit, as the recall's own resume is); the withdrawal still stands; resumed stays false (the request's own run was cancelled).", "tests": "batch-item-recall-resumes-batch.test.ts (new, 5 cells, real AutomationEngine + built-in nodes + approval node): cell 1 red on main, 4 CONTROL cells green on main; 5/5 at head. Ablations via scripts/ablation-replace.mjs, each restored to the HEAD blob with git diff HEAD empty: A1 no batch resume -> cell 1 red; A2 any map: parent -> cell 2 red; A3b pending recall takes the cancel path -> cell 3 red; A4 decide always resumes down approve -> cell 4 red; A5 no built-in map node check -> cell 5 red. (A3, batch resume also issued on the pending path, stayed green: the lookup finds no run parked on the completed item, so it is a no-op, not a guard.) pnpm --filter @objectstack/plugin-approvals exec vitest run: 106 files, 1357 passed. Package typecheck exit 0.", "gates": "head acae6743, after a whole-tree turbo build, --deepen=200 and fetching the teardown self-test's pinned commit. First sweep at 4e1d9679: 63 families, 61 exit 0, 2 red (check:engine-double-contract, check:objectql-double-limit), both the new test's ObjectQL double. Fixed in acae6743 (dispatch asserts, numeric offset/limit, two generated pinned-ledger rows; surface amended by the seat). Re-derived: 71 families, all exit 0; --ran: 71 derived, 71 run, 0 NOT-MEASURED, 0 UNRUN. pnpm lint exit 0. check-commit-card-trailers --range origin/main..HEAD exit 0. CI: pending at report time.", "clause_2": "no: no schema, accept set, error code or result field changes; a batch run nothing could wake now continues in the shape ruling A (6523833308) set.", "metadata_protocol": "none", "dogfood_battery": "n/a: no (narrowing) arm declared", "open_questions": [], "mcp_calls": "1: subscribe_pr_activity x1 (PR #28228); no GitHub MCP reads or writes. Reads were plain curl GETs.", "api_writes": "2: relay pr_create (objectstack#28228); relay comment on #28183 (this report). git push is not a REST write.", "out_of_scope_findings": [ "class: b · reach: a revise-window recall on a batch item in a deployment with more than 1000 parked runs on a durable store · evidence: listSuspendedRunsDurable reads ObjectStoreSuspendedRunStore.list(), one page of 1000 paused rows, so the batch run may not be on it and the recall then leaves the batch parked as before, telling nothing; a precise lookup needs an engine member reading the item run's $parentRunId (engine.ts / run-resume.ts, outside this surface) · dedupe words: recall batch parent lookup page cap listSuspendedRunsDurable", "class: docs · reach: readers of content/docs/automation/flows.mdx (cancelled-item paragraph, ~L1518) and approvals.mdx (revise-window paragraph, ~L731) · evidence: neither says a revise-window recall on a batch item now wakes the batch; docs were outside the claimed surface · dedupe words: docs recall batch revise window cancelled marker" ] }objectstack-fleet commentedon Oct 30, 2026
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL
ACCEPT → PR #28228 comment 6530543012 · head
4007cab0· 2026-10-30T18:31Z · landing sent (no contract review owed). Out-of-scope finding filed as #28230.objectstack-fleet commentedon Oct 30, 2026
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL
Landed · 2026-10-30T19:27Z
a426d363(merge queue)completedbyFixes #28183State:
pm:dispatchedremoved in this stroke.