Repository navigation
Description
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 atbuiltin/http-nodes.ts:31calling the isAsync variant future work.
- the declaration:
- objectui — 0 hits for
isAsync(neither reader nor writer). - cloud — not present in the measuring environment (only
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'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
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.
Activity
os-zhuang commentedon Aug 8, 2026
Claim: PM loop round 2 (
domain:specseat, #6017; maintainer directive: concurrency raised to 5)Session:
session_011sGk4SKHqGRgmmqUok1P8MBranch:
claude/issue-6748-retire-isasyncWorktree:
objectstack-issue-6748Domain:
domain:specFile surface:
packages/spec/src/automation/node-executor.zod.ts(declaration); the five shipped writers (builtin/screen-nodes.ts,builtin/map-node.ts,builtin/wait-node.ts,plugin-approvals/src/approval-node.ts,plugin-approvals/src/approval-revise-node.ts); fixture/pin sites listed in the body; ADR-0087 conversion + liveness ledger + generated baselines (authorable-surface/automation.json,authorable-defaults/automation.json,authorable-surface.base.json) + references per thespec-property-retirementplaybook. ⛔hook.zod.ts'sisasynctombstone alias is a DIFFERENT key — untouched. (Stop on breach; explain in the report.)Serial constraints cleared: same-file sibling #6749 (supportsPause stale-comment fix) — status checked at claim time and relayed to the dev (rebase over it if it lands first; do not fold it in, it is not this card). In-flight this lane: #6735 / #5384+#5227 / #6361 — all disjoint. Generated trees shared ⇒ serial landing relay by this seat.
Container assessment: M,
mode:subagentshared container.Generated by Claude Code
os-zhuang commentedon Aug 9, 2026
ACCEPT → PR #6862 (
Fixes #6748+Fixes #6749; ESLint + TypeScript Type Check verifiedsuccessby this seat, 24/25 success + 1 conditional skip). Ready now; auto-merge held until PR #6840 merges — relay slot 3 (both regenerate protocol-17 registries / spec-changes / upgrade-guide; second lander rebases + re-runs generators, per the dev's own overlap analysis vs PR #6866).Load-bearing points: tombstone retirement (not bare delete — schema is non-strict), D3 semantic migration deliberately instead of D2 (descriptors are code-published, never stored — nothing for
migrate metato rewrite); zero-reader measurement re-run fresh (4 grep forms, 0 readers, objectui/cloud 0); liveness-ledger assumption falsified correctly (ActionDescriptor is outside the ledger walk — nothing to advance); reverse verification predicted-then-red (53 reds incl. an independently load-bearing baseline pin). Out-of-scope finding #6844 filed (D3 acceptanceCriteria residue — held for triage).Two process catches recorded for #6863's implementation scope:
Check Changeset's adr-0087 marker gate lives inpr-automation.yml(outside the lint.yml enumeration instruction), and the restore recipe (git checkout <branch> -- <path>) presumes a commit exists — second dev to hit this tonight; both go into the dispatch-instruction fix.Generated by Claude Code