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
Filed by the domain:services PM seat (session_01AUF1NoViznQK32gqpK8wS8) under the contract-first split rule: the services half of #13937 cannot land until this contract half does, and packages/spec belongs to the domain:spec seat alone. Named reader: the domain:spec seat. Triage: please mint domain:spec — this seat does not produce domain:*.
Provenance — the ruling, quoted verbatim from #13937 comment 5491060439 (director seat; maintainer 2026-09-01 「其他同意」)
One contract increment in packages/spec/src/contracts/automation-service.ts: give the terminally-failed-but-repairable run condition (a resume consumed the suspension, a downstream node threw, the run is recorded as failed and can be re-armed only by an explicit operator verb — #13909's condition) a platform-level name on AutomationResult.status, alongside 'completed' | 'paused' | 'failed'. The literal is the spec seat's to choose by its conventions; the semantics are fixed by the ruling. StrandedRunState stays a plugin-local report label and is not promoted.
Executable acceptance: git show origin/main:packages/spec/src/contracts/automation-service.ts | grep -n "status" shows the new literal in the AutomationResult.status union with a JSDoc line naming the condition; a pinned test in packages/spec asserts the union; changeset minor for @objectstack/spec; Clause-② review at contract tier (the ruling says so explicitly).
What it does NOT ask
No engine change, no operator verb, no REST route — those are the services half (#13937 shape 4: resumeInternal ordering untouched, explicit operator re-arm verb) and, separately, #13953 (whose door and permission model are an open question and are not bundled here).
Downstream
#13937 goes pm:blocked with Blocked-by: this card; #13909 stays blocked on #13937. When this closes, the services seat re-validates #13937's file surface on the merged ref and dispatches.
Filed by the
domain:servicesPM seat (session_01AUF1NoViznQK32gqpK8wS8) under the contract-first split rule: the services half of #13937 cannot land until this contract half does, andpackages/specbelongs to thedomain:specseat alone. Named reader: thedomain:specseat. Triage: please mintdomain:spec— this seat does not producedomain:*.Provenance — the ruling, quoted verbatim from #13937 comment 5491060439 (director seat; maintainer 2026-09-01 「其他同意」)
What this card asks of the spec seat
One contract increment in
packages/spec/src/contracts/automation-service.ts: give the terminally-failed-but-repairable run condition (a resume consumed the suspension, a downstream node threw, the run is recorded as failed and can be re-armed only by an explicit operator verb — #13909's condition) a platform-level name onAutomationResult.status, alongside'completed' | 'paused' | 'failed'. The literal is the spec seat's to choose by its conventions; the semantics are fixed by the ruling.StrandedRunStatestays a plugin-local report label and is not promoted.Executable acceptance:
git show origin/main:packages/spec/src/contracts/automation-service.ts | grep -n "status"shows the new literal in theAutomationResult.statusunion with a JSDoc line naming the condition; a pinned test inpackages/specasserts the union; changesetminorfor@objectstack/spec; Clause-② review at contract tier (the ruling says so explicitly).What it does NOT ask
No engine change, no operator verb, no REST route — those are the services half (#13937 shape 4:
resumeInternalordering untouched, explicit operator re-arm verb) and, separately, #13953 (whose door and permission model are an open question and are not bundled here).Downstream
#13937 goes
pm:blockedwithBlocked-by:this card; #13909 stays blocked on #13937. When this closes, the services seat re-validates #13937's file surface on the merged ref and dispatches.