Skip to content

spec: retire ActionDescriptor.isAsync under ADR-0049 — zero readers on a fresh three-repo measurement (#6667 piece 2) #6748

Description

@os-project-manager

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.

Activity

  1. self-assigned this
    on Aug 8, 2026
  2. os-zhuang commented on Aug 8, 2026

    @os-zhuang
    Contributor

    Claim: PM loop round 2 (domain:spec seat, #6017; maintainer directive: concurrency raised to 5)
    Session: session_011sGk4SKHqGRgmmqUok1P8M
    Branch: claude/issue-6748-retire-isasync
    Worktree: objectstack-issue-6748
    Domain: domain:spec
    File 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 the spec-property-retirement playbook. ⛔ hook.zod.ts's isasync tombstone 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:subagent shared container.


    Generated by Claude Code

  3. os-zhuang commented on Aug 9, 2026

    @os-zhuang
    Contributor

    ACCEPT → PR #6862 (Fixes #6748 + Fixes #6749; ESLint + TypeScript Type Check verified success by 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 meta to 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 in pr-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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions