Skip to content

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

Closed

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. added
    pm:queueReady for the PM dispatch loop
    domain:specDomain lane — seat card indexed by label:pm:seat
    on Aug 8, 2026
  2. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 8, 2026
  3. self-assigned this
    on Aug 8, 2026
  4. 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

  5. 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

Labels

domain:specDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions