Filed by the services-lane PM (session_01USNUyHEr7uaU6MoEWXitei) as the reporting half of #6667 piece 2, whose dispatch required a fresh measurement at pickup and explicitly forbade folding the outcome into that PR. packages/spec belongs to the spec seat, so this is filed unassigned rather than actioned.
The measurement (2026-08-08, re-run at pickup — not the #5703 thread's reading)
Measured at origin/main cfeb9a0 (objectstack) and origin/main a4f837c (objectui):
- objectstack — readers of
ActionDescriptor.isAsync: 0. Every hit is a declaration, a generated baseline, a writer, a fixture, or prose:
- the declaration:
packages/spec/src/automation/node-executor.zod.ts:306 (z.boolean().default(false));
- generated baselines:
packages/spec/authorable-surface/automation.json:12, authorable-surface.base.json:2058, authorable-defaults/automation.json:8;
- writers (5 shipped descriptors):
builtin/screen-nodes.ts:50, builtin/map-node.ts:54, builtin/wait-node.ts:193, plugin-approvals/src/approval-node.ts:115, plugin-approvals/src/approval-revise-node.ts:80;
- fixtures / shape pins only:
engine.test.ts:2595,2619, plugin-suspended-run-wiring.test.ts:123, resume-authority-gate.test.ts:67, plugin-approvals/approval-revise.test.ts:451;
- prose only:
content/docs/references/automation/node-executor.mdx:73, docs/adr/0018:94,137,188,196, docs/adr/0019:62, docs/adr/0044:343, and a comment at builtin/http-nodes.ts:31 calling the isAsync variant future work.
- objectui — 0 hits for
isAsync (neither reader nor writer).
- cloud — not present in the measuring environment (only
objectstack and objectui are checked out); cross-checked by GitHub org-wide code search isAsync org:objectstack-ai, which returned 19 hits, all in objectstack.
⚠️ Exclude when scoping: packages/spec/src/data/hook.zod.ts:124's isasync is a data-hook tombstone alias mapping to async — a different key with a similar name. Retiring it is not part of this card.
Why this is a retirement card
Declared-but-never-read is exactly ADR-0049's enforce-or-remove subject, and the sibling capability on the same descriptor just went the other way: #6667 / PR #6746 made supportsPause enforced at runtime. isAsync has no such consumer to grow into — nothing in either repo reads it, so there is no behaviour to enforce, only a key that five shipped descriptors dutifully write and nobody consults.
The repo has a playbook for this exact shape: the spec-property-retirement skill (removal route, liveness-ledger discipline, ADR-0087 conversion, generated baselines, forms, docs and pin tests). The five shipped writers come out with it.
If the spec seat judges instead that a real consumer is imminent, the alternative is to enforce it the way #6746 enforced supportsPause — that would be a services-lane card, and this PM will take it back on request.
Serialization
⚠️ Same file as #6749 (the one-line stale-comment fix on supportsPause, filed alongside this). Land #6749 first — it is a comment correction that becomes true the moment PR #6746 merges — and rebase this retirement on top, or fold #6749 into this card's PR if the spec seat takes both at once.
Refs: #6667 (source, its piece 2), PR #6746 (supportsPause enforcement — the sibling that went the other way), #5703 (the closed predecessor), ADR-0049.
Filed by the services-lane PM (
session_01USNUyHEr7uaU6MoEWXitei) as the reporting half of #6667 piece 2, whose dispatch required a fresh measurement at pickup and explicitly forbade folding the outcome into that PR.packages/specbelongs to the spec seat, so this is filed unassigned rather than actioned.The measurement (2026-08-08, re-run at pickup — not the #5703 thread's reading)
Measured at
origin/maincfeb9a0(objectstack) andorigin/maina4f837c(objectui):ActionDescriptor.isAsync: 0. Every hit is a declaration, a generated baseline, a writer, a fixture, or prose:packages/spec/src/automation/node-executor.zod.ts:306(z.boolean().default(false));packages/spec/authorable-surface/automation.json:12,authorable-surface.base.json:2058,authorable-defaults/automation.json:8;builtin/screen-nodes.ts:50,builtin/map-node.ts:54,builtin/wait-node.ts:193,plugin-approvals/src/approval-node.ts:115,plugin-approvals/src/approval-revise-node.ts:80;engine.test.ts:2595,2619,plugin-suspended-run-wiring.test.ts:123,resume-authority-gate.test.ts:67,plugin-approvals/approval-revise.test.ts:451;content/docs/references/automation/node-executor.mdx:73,docs/adr/0018:94,137,188,196,docs/adr/0019:62,docs/adr/0044:343, and a comment atbuiltin/http-nodes.ts:31calling the isAsync variant future work.isAsync(neither reader nor writer).objectstackandobjectuiare checked out); cross-checked by GitHub org-wide code searchisAsync org:objectstack-ai, which returned 19 hits, all in objectstack.packages/spec/src/data/hook.zod.ts:124'sisasyncis a data-hook tombstone alias mapping toasync— a different key with a similar name. Retiring it is not part of this card.Why this is a retirement card
Declared-but-never-read is exactly ADR-0049's enforce-or-remove subject, and the sibling capability on the same descriptor just went the other way: #6667 / PR #6746 made
supportsPauseenforced at runtime.isAsynchas no such consumer to grow into — nothing in either repo reads it, so there is no behaviour to enforce, only a key that five shipped descriptors dutifully write and nobody consults.The repo has a playbook for this exact shape: the
spec-property-retirementskill (removal route, liveness-ledger discipline, ADR-0087 conversion, generated baselines, forms, docs and pin tests). The five shipped writers come out with it.If the spec seat judges instead that a real consumer is imminent, the alternative is to enforce it the way #6746 enforced
supportsPause— that would be a services-lane card, and this PM will take it back on request.Serialization
supportsPause, filed alongside this). Land #6749 first — it is a comment correction that becomes true the moment PR #6746 merges — and rebase this retirement on top, or fold #6749 into this card's PR if the spec seat takes both at once.Refs: #6667 (source, its piece 2), PR #6746 (
supportsPauseenforcement — the sibling that went the other way), #5703 (the closed predecessor), ADR-0049.