Skip to content

spec: the D3 ledger's resume-authority-undeclared… acceptance criteria still says "supportsPause is a declaration nothing enforces (#5703)" — the same staleness #6749 fixed in the TSDoc, one channel over #6844

Description

@os-zhuang

Found while implementing #6748 + #6749 (one PR, packages/spec/src/automation/node-executor.zod.ts). Not fixed there: #6749 scoped itself to the TSDoc and explicitly recorded "no schema, baseline, or registry consequence", so touching this text would have widened that card's blast radius into generated artifacts. Filing instead, per Prime Directive #10.

The stale text

packages/spec/src/migrations/registry.ts, inside the MIGRATIONS_BY_MAJOR[17].semantic entry for the #5561 resumeAuthority secure-default flip, acceptanceCriteria closes with:

⚠️ supportsPause is a declaration nothing enforces (#5703), so an executor whose execute() returns suspend: true while leaving supportsPause false is warned about by NEITHER channel — check those by hand against the same rule.

That was true when written. PR #6746 (#6667, merged 2026-08-08 14:54Z) made it false: AutomationEngine.refuseUndeclaredSuspension refuses exactly that executor at the one seam every suspension passes through (packages/services/service-automation/src/engine.ts, refuseUndeclaredSuspension / the call site in executeNode).

Why it is worth a card rather than a shrug

This is not an internal comment. The string is projected verbatim into two published channels by gen:spec-changes / gen:upgrade-guide:

  • packages/spec/spec-changes.json — which the spec_changes MCP tool serves;
  • docs/protocol-upgrade-guide.md:396 — the "Done when" line an upgrading author (very often an AI, ADR-0033) reads.

So a v17 upgrader is currently told to hand-audit a class of mistake the engine now refuses on its own, and told that the mismatch is invisible when it is in fact loud. It is the same defect class as #6749#6746's residue in a doc surface — just in the channel #6749 did not name.

Suggested fix

Replace the ⚠️ clause with the post-#6746 statement: the mismatch is refused at run time (guard-class, not routable by a fault edge), so the remaining hand-check is only the resumeAuthority declaration itself. Then pnpm --filter @objectstack/spec gen:spec-changes && gen:upgrade-guide — editing this string alone goes stale in both generated files otherwise (the spec-property-retirement skill's "editing only a conversion's summary still goes stale" trap).

Unlabeled and unassigned for PM triage: it is a concrete defect (a published instruction that is now wrong), not an observation-class finding, but it is prose-only and harms nobody's runtime.


Generated by Claude Code

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions