docs(autonomy): autonomous-runner design pack (WP7) - #676
Conversation
Charter import plus spine and seam specifications, design contract only. runner.md imports the T4 charter verbatim in substance: the queue-contract split (interactive upstream with the plugins, autonomous drain with the runner), both build triggers restated with executors rendered in the shipped surface-class vocabulary, the self-run-primary substrate stance with the vendor-hosted human-merge-gate cap, inherited constraints cited from their owning contracts, anti-goals, and an explicit no-build clause - the runner-execution home stays unborn until a T4 build trigger fires. The two-layer composition spine records the normative shape (minimal composable orchestration over the sandbox-provider and agent-adapter seams with the autonomous/interactive split) and the adopt-first binding stance with reimplement-the-pattern as the named fallback, no library pinned. seams.md specifies the eight seams as the spine's complete interface set, each citing its shipped owning contract (queue+lease, isolation policy, observability+cost, return accounting) or marked runner-new, with the envelope fields stop_reason, outcome, evidence, and resume_handle resolved and all deeper token sets routed to the phase-2 leaves. PLAN phase 1 tagged DONE. Gates: contract validator clean (vendor deny-list on reference/), typos clean, markdownlint clean, 8 seam sections exact, both build triggers and the no-build clause grep-verified, every cited anchor and leaf file verified present. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…7 phase 2) Three leaves complete the design pack's normative content. lifecycle.md fixes the linear state model (leased, executing, verifying, disposing, then escalated or complete), each state's owning seam cited, transition telemetry riding the telemetry contract, the thin per-item-PR launch disposition with the vendor-hosted human-gate cap restated explicitly on the disposition path, and batched gated-merge serialization named as a growth stage binding a platform-native merge-queue facility on its evidence trigger. escalation.md resolves the terminal-handoff shape: four terminal outcomes with success never filing escalation work, the two-family stop-criteria taxonomy (runner-owned deterministic, agent-signaled through stop_reason) with transient-recoverable retrying instead of escalating, the deterministic two-step mapping from stop reason to outcome to event class, two additively registered runner event classes (runner-needs-human, runner-cap-exceeded) beside the guardrail contract's six, contract-default severities for all eight classes on the notice/attention/urgent axis, the urgent stop-reason override for isolation violations and security/data-integrity events, evidence-bundle contents with resume_handle takeover, 72h/one-bump acknowledgment knobs, the deferred mid-run interrupt with its evidence trigger, escalation telemetry on the custom-namespace mechanism, and four research gaps carried as UNVERIFIED. topology.md maps the four ownership homes (design pack, unborn runner-execution home, settings-as-code governance the runner reads and never writes, deployment-owned operational config), the launch backend set (one free self-run L2 container-class backend; L3 deferred, C5 dispatch blocked until bound, the floor cited from the work-classes cell; cloud backends advisory and vendor-hosted-capped), and the USER-RESERVED birth-time decisions. Hub links corrected to reference-relative paths. PLAN phase 2 tagged DONE. Gates: contract validator, typos, markdownlint all clean; lychee over the five-file pack 66 links, 0 errors. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…P7 phase 3) The security binding gains the escalation-severity refinement as three genuinely additive optional keys beside an untouched escalation_routes: escalation_severity (event class to severity token - the explicit join), escalation_severity_routes (severity token to route, personal-push a legal route value at any tier; resolution is severity-first with the event class's own escalation_routes entry as fallback), and escalation_ack (staleness_window, reescalation_cap; contract defaults 72h and one bump live in the runner escalation contract, not the schema). The event-class registry grows additively with runner-needs-human and runner-cap-exceeded: escalation_routes keeps REQUIRING only the six inherited guardrail classes - existing bindings validate unchanged - while the two runner classes are legal OPTIONAL route keys, accepted exactly like any guardrail class per the escalation contract. check-security-binding.mjs mirrors the shapes and adds the one semantic rule the schema cannot express: an event class bound in escalation_severity with neither a bound severity route nor its own escalation_routes entry is unroutable, fail-closed. Setup surface: SKILL.md gains the short runner note (design pack bindable-when-born; nothing runner-specific recorded until a build trigger fires except the escalation notification routes; 427/500 lines), evals.json gains case 29 covering that slice, the plugin README gains the runner-design-pack capability with the build row still trigger-gated, plugin.json bumps to 0.7.0, and the root catalog is regenerated. PLAN phase 3 tagged DONE. Verified: full fixture sweep 11 pass / 95 reject with ZERO flips among the 102 pre-WP7 fixtures (additivity proven, not asserted); the four new escalation fixtures behave exactly as named (valid binding with runner classes, severities, personal-push urgent route, and ack knobs passes; bad severity token, unroutable class, and non-positive ack values each reject with their own finding); a runner class bound through an optional escalation_routes entry alone is routable; validate-plugins.sh, catalog --check, contract validator, and typos all clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Mechanical acceptance probe: the branch diff against the base contains exactly seventeen paths, all inside the four allowed surfaces (reference/ pack files, skills/setup/ surfaces, the two READMEs, the plugin manifest) plus the PLAN's own phase tags; no new script files of any kind; zero repo-creation instructions under reference/runner*. Full gate roster run locally: validate-plugins.sh, generate-catalog --check, validate-plugin-contracts.mjs, run-plugin-tests.sh (all pass or skip), claude plugin validate --strict, markdownlint, typos, and lychee over the five-file pack (0 errors). PLAN phase 4 tagged DONE. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 3m 49s —— View job PR Review: docs(autonomy): autonomous-runner design pack (WP7)
OverviewWell-constructed design-pack PR. The progressive-disclosure architecture is sound, the no-build covenant is consistently upheld across all five doc files, and the schema/script changes are genuinely additive — the additivity proof (10→11 pass, 92→95 reject, zero flips on pre-WP7 fixtures) is credible given what's added. Two issues found: one is stale text that will be incorrect at merge, one is a contract ambiguity that could split implementors. Issues1. Stale forward-link note in
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 56507c517a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ss (wave 1) Two review findings. First, the schema accepted any reescalation_cap >= 1 while the escalation contract allows a single stale-unacked re-escalation - one severity bump, never a loop. The schema now pins the value at exactly 1 and check-security-binding.mjs rejects a higher cap with its own finding (new fixture escalation-ack-loop rejects on exactly that). Second, topology.md forced executor_class vendor-hosted for ANY cloud backend, contradicting the executor-surface contract: self-operated executors are CLI/SDK processes wherever they run, and hosting configuration is deployment-owned. The merge-row cap now follows the executor surface class, never the hosting alone - an org-operated cloud substrate running the self-operated runner stays self-operated, while a vendor-managed backend (the vendor operates the executor) still forces vendor-hosted and its human-gate cap. Verified: loop fixture rejects with the single new finding; full sweep 11 pass / 96 reject, zero flips among prior fixtures; schema parses; contract validator, typos, and lychee clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 27s —— View job Wave-1 fix review — docs(autonomy): autonomous-runner design pack (WP7)
Wave-1 delta reviewThe commit Fixed ✅ — Re-escalation cap pinned at one (Codex P2)Three-layer fix is correct and complete:
Fixed ✅ — Executor class follows surface, not hosting (Codex P2)
This correctly aligns with the executor-surface-classes contract and removes the prior conflation of hosting configuration with executor class. The auto-merge promotion path is now reachable for self-operated runners on cloud substrates, as it should be. Still open — Stale forward-link note in
|
| Finding | Source | Wave-1 status |
|---|---|---|
| Re-escalation cap must be ≤ 1 | Codex P2 | ✅ Fixed |
| Self-operated cloud runner executor class | Codex P2 | ✅ Fixed |
Stale forward-link note in runner.md |
Prior review (must-fix) | ❌ Outstanding |
Urgent override ambiguity in escalation.md |
Prior review (recommended) | ❌ Outstanding |
The wave-1 changes are clean and correct. One must-fix (stale text) remains before merge.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e6fa78347a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…route (wave 2) One review finding. The schema descriptions and the checker's routability rule modeled severity-first ROUTE resolution with the per-event route as fallback - under that reading a bound severity route would replace the event class's queue destination, so a gate failure could notify a channel instead of filing its required queue item, breaking the always-filed tracker item and its acknowledgment lifecycle. Corrected to the escalation contract's actual model: the escalation item always files at the event class's own escalation_routes destination; escalation_severity_routes is the NOTIFICATION fan-out layered on that filed item (channel, personal-push), never its queue destination and never a replacement. A severity with no bound notification route degrades to tracker-item-only fan-out - a conforming binding, not a defect - so the unroutable semantic rule is removed and its fixture flips to escalation-severity-tracker-only-valid (now passing, the degrade proof). Verified: renamed fixture passes; full sweep 12 pass / 95 reject with no other flips; schema parses; contract validator and typos clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 18s —— View job Wave-2 delta review — docs(autonomy): autonomous-runner design pack (WP7)
OverviewCommit Fixed ✅ — Severity selects notification fan-out, never the item routeThree-part fix is correct and complete. Schema descriptions ( Semantic check removed ( Fixture rename ( The Still open — Stale forward-link note in
|
| Finding | Source | Current status |
|---|---|---|
| Severity fan-out vs queue route | Codex P2 (wave 2) | ✅ Fixed |
| Re-escalation cap pinned at 1 | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
| Executor class follows surface, not hosting | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
Stale forward-link note in runner.md |
Prior review (must-fix) | ❌ Outstanding |
Urgent override ambiguity in escalation.md |
Prior review (recommended) | ❌ Outstanding |
Wave-2 changes are clean and correct. One must-fix (stale text in runner.md) remains before merge; the urgent-override clarification is strongly recommended given the security implications.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7bbfd14c02
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…routes (wave 3)
Four review findings. First, the success exception suppressed every
escalation, but the guardrail matrix fires untrusted-provenance on every
C5 item unconditionally: escalation.md now scopes the exception to the
runner's OWN outcome escalation and states that inherited always-firing
classes fire regardless of outcome, emitted before completion under
their own route and severity.
Second, the per-item-PR disposition wrongly covered C1, whose matrix row
is not applicable and whose class definition forbids repository
mutation: lifecycle.md's disposition now splits - a read-only class
completes by attaching its artifact to the governed queue item (the
audit trail), only mutating classes take the per-item PR path.
Third, a severity route was a single opaque string, so an urgent binding
could carry only a push route while the contract's cumulative fan-out
ladder requires the channel notification beneath it:
escalation_severity_routes entries are now explicit leg objects
({channel, push}, at least one), and a push leg without a channel leg
rejects (new fixture escalation-push-without-channel).
Fourth, a severity-bound runner event class with no escalation_routes
entry had no queue destination for its filed handoff: the checker now
requires the runner class's own route whenever that class is severity
bound (new fixture escalation-runner-route-missing rejects; legacy
bindings that never key a runner class stay untouched), and the
tracker-only degrade fixture now proves the legal form on an inherited
class whose queue route is always required.
Verified: all seven escalation fixtures behave exactly as named; full
sweep 12 pass / 97 reject with no other flips; schema parses; contract
validator, typos, markdownlint, and lychee clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 33s —— View job Wave-3 delta review — docs(autonomy): autonomous-runner design pack (WP7)
OverviewCommit Fixed ✅ — C5 always-fires (
|
| Finding | Source | Wave-3 status |
|---|---|---|
| C5 always-fires: success exception suppressed inherited class | Codex P1 (wave 3) | ✅ Fixed |
| C1 queue-artifact: PR path wrongly covered read-only class | Codex P2 (wave 3) | ✅ Fixed |
| Urgent fan-out leg model: push-only binding skips channel rung | Codex P2 (wave 3) | ✅ Fixed |
| Runner class queue destination: severity-bound with no route | Codex P2 (wave 3) | ✅ Fixed |
| Severity selects fan-out, never item route | Codex P2 (wave 2) | ✅ Fixed (prior wave) |
| Re-escalation cap pinned at 1 | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
| Executor class follows surface, not hosting | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
Stale forward-link note in runner.md |
Prior review (must-fix) | ❌ Outstanding — 3 waves |
Urgent override ambiguity in escalation.md |
Prior review (recommended) | ❌ Outstanding — 2 waves |
Wave-3 changes are clean and correct. One must-fix (stale text in runner.md) remains before merge; the urgent-override clarification remains strongly recommended given the security implications.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 46689b41cc
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
One review finding. The one-level severity bump was undefined for an item already at urgent (the untrusted-provenance default and both urgent stop-reason overrides), leaving an implementation unable to bump within the defined axis. escalation.md now specifies saturation: an already-urgent item still re-escalates once, by re-notifying with a fresh urgent fan-out at the same severity - the re-escalation is never skipped and no level above the axis is minted. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 30s —— View job Wave-4 delta review — docs(autonomy): autonomous-runner design pack (WP7)
OverviewCommit Fixed ✅ — Re-escalation bump saturates at
|
| Finding | Source | Wave-4 status |
|---|---|---|
Re-escalation saturation at urgent |
Codex P2 (wave 4) | ✅ Fixed |
| C5 always-fires: success exception scoped correctly | Codex P1 (wave 3) | ✅ Fixed (prior wave) |
| C1 queue-artifact: PR path excluded for read-only class | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Urgent fan-out leg model: push-only binding rejects | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Runner class queue destination: severity-bound requires route | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Severity selects fan-out, never item route | Codex P2 (wave 2) | ✅ Fixed (prior wave) |
| Re-escalation cap pinned at 1 | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
| Executor class follows surface, not hosting | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
Stale forward-link note in runner.md |
Prior review (must-fix) | ❌ Outstanding — 4 waves |
Urgent override ambiguity in escalation.md |
Prior review (recommended) | ❌ Outstanding — 3 waves |
Wave-4 change is clean and correct. One must-fix (two stale sentences at runner.md:122–123) is the single remaining blocker before merge. The urgent-override ambiguity clarification remains strongly recommended given the security implications.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 433fb9732a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
One review finding. The state model let a C4 item pass leased to executing on ordinary admission, but the guardrail matrix fires structural-plan-approval for a C4 item before execution. lifecycle.md now specifies the two-phase C4 drain through the one queue: the first leased run plans only and disposes as the structural-plan-approval item (the inherited event class on its own route and severity, plan attached); the structural execution is a second run admitted only from the human-approved item, whose leased-to-executing transition requires the recorded approval and fail-closes to escalated without it. No second approval channel; the terminal-handoff shape is untouched - neither phase pauses mid-run. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 31s —— View job Wave-5 delta review — docs(autonomy): autonomous-runner design pack (WP7)
OverviewCommit Fixed ✅ — C4 execution gates on plan-approval item (Codex P2)
The prose-only treatment (no state machine diagram change) is appropriate for a design doc at this stage. The top-level state model ( Still open — Stale forward-link note in
|
| Finding | Source | Wave-5 status |
|---|---|---|
| C4 execution gates on plan-approval item | Codex P2 (wave 5) | ✅ Fixed |
Re-escalation saturation at urgent |
Codex P2 (wave 4) | ✅ Fixed (prior wave) |
| C5 always-fires: success exception scoped correctly | Codex P1 (wave 3) | ✅ Fixed (prior wave) |
| C1 queue-artifact: PR path excluded for read-only class | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Urgent fan-out leg model: push-only binding rejects | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Runner class queue destination: severity-bound requires route | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Severity selects fan-out, never item route | Codex P2 (wave 2) | ✅ Fixed (prior wave) |
| Re-escalation cap pinned at 1 | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
| Executor class follows surface, not hosting | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
Stale forward-link note in runner.md |
Prior review (must-fix) | ❌ Outstanding — 5 waves |
Urgent override ambiguity in escalation.md |
Prior review (recommended) | ❌ Outstanding — 4 waves |
Wave-5 change is clean and correct. One must-fix (two stale sentences at runner.md:122–123) is the single remaining blocker before merge. The urgent-override clarification remains strongly recommended given the security implications of silent severity downgrade on isolation-violation and security/data-integrity stops.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ea741e04b2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…s (wave 6) One review finding. A legacy binding omitting the optional escalation_severity map and both optional runner routes still validates, yet every non-success stop maps to a runner event class - a runner launched under such a binding would have no queue destination for its required human-gated handoff. The static checker cannot close this (no binding key says a runner is enabled), so the escalation contract now carries the launch precondition: at startup the runner verifies both runner-needs-human and runner-cap-exceeded carry bound escalation_routes entries and fail-closes - blocking dispatch - when either is absent, exactly as for an absent security binding. The binding stays valid for every pre-runner surface; the requirement binds the runner. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 50s —— View job Wave-6 delta review — docs(autonomy): autonomous-runner design pack (WP7)
OverviewCommit Fixed ✅ — Runner launch fail-closes without its escalation routes (Codex P2)Two-part fix is correct and complete.
All four implementation-critical properties are now unambiguous: (a) the check is both-classes (not one-or-other); (b) fail-closed on absent entry, matching the absent-security-binding precondition in the topology leaf; (c) pre-runner bindings stay valid; (d) the rationale for why schema/checker enforcement is not possible is stated inline, so an implementor knows not to hunt for static rejection.
The approach correctly identifies that the enforcement gap is structural — no binding schema field declares "a runner is enabled" — and closes it at the right layer. Still open — Stale forward-link note in
|
| Finding | Source | Wave-6 status |
|---|---|---|
| Runner launch fail-closes without escalation routes | Codex P2 (wave 6) | ✅ Fixed |
| C4 execution gates on plan-approval item | Codex P2 (wave 5) | ✅ Fixed (prior wave) |
Re-escalation saturation at urgent |
Codex P2 (wave 4) | ✅ Fixed (prior wave) |
| C5 always-fires: success exception scoped correctly | Codex P1 (wave 3) | ✅ Fixed (prior wave) |
| C1 queue-artifact: PR path excluded for read-only class | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Urgent fan-out leg model: push-only binding rejects | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Runner class queue destination: severity-bound requires route | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Severity selects fan-out, never item route | Codex P2 (wave 2) | ✅ Fixed (prior wave) |
| Re-escalation cap pinned at 1 | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
| Executor class follows surface, not hosting | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
Stale forward-link note in runner.md |
Prior review (must-fix) | ❌ Outstanding — 6 waves |
Urgent override ambiguity in escalation.md |
Prior review (recommended) | ❌ Outstanding — 5 waves |
Wave-6 change is correct and well-scoped. One must-fix (two stale sentences at runner.md:122–123) is the single remaining blocker before merge. The urgent-override clarification remains strongly recommended given the security implications of silent severity downgrade on isolation-violation and security/data-integrity stops.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 958655c73c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…e (wave 7) One review finding. The terminal invariant said only a run that lands its CHANGE becomes complete, contradicting the same leaf's non-mutating dispositions - a C1 queue artifact and a C4 planning run's plan-approval item both complete without a repository change. The invariant now keys on a successfully landed class disposition (queue artifact, plan-approval item, or per-item PR); every other ending stays escalated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 31s —— View job Wave-7 delta review — docs(autonomy): autonomous-runner design pack (WP7)
OverviewCommit Fixed ✅ — Completion is a landed disposition, not a landed change (Codex P2)
The fix is exactly correct and covers all three cases:
The state-table description for Still open — Stale forward-link note in
|
| Finding | Source | Wave-7 status |
|---|---|---|
| Completion is a landed disposition, not a landed change | Codex P2 (wave 6→7) | ✅ Fixed |
| Runner launch fail-closes without escalation routes | Codex P2 (wave 6) | ✅ Fixed (prior wave) |
| C4 execution gates on plan-approval item | Codex P2 (wave 5) | ✅ Fixed (prior wave) |
Re-escalation saturation at urgent |
Codex P2 (wave 4) | ✅ Fixed (prior wave) |
| C5 always-fires: success exception scoped correctly | Codex P1 (wave 3) | ✅ Fixed (prior wave) |
| C1 queue-artifact: PR path excluded for read-only class | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Urgent fan-out leg model: push-only binding rejects | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Runner class queue destination: severity-bound requires route | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Severity selects fan-out, never item route | Codex P2 (wave 2) | ✅ Fixed (prior wave) |
| Re-escalation cap pinned at 1 | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
| Executor class follows surface, not hosting | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
Stale forward-link note in runner.md |
Prior review (must-fix) | ❌ Outstanding — 7 waves |
Urgent override ambiguity in escalation.md |
Prior review (recommended) | ❌ Outstanding — 6 waves |
Wave-7 change is clean and correct. One must-fix (two stale sentences at runner.md:122–123) is the single remaining blocker before merge. The urgent-override clarification remains strongly recommended given the security implications of silent severity downgrade on isolation-violation and security/data-integrity stops.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0dabf52fc9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ve 8) One review finding, resolved as a contract clarification rather than a new rejection. The fan-out legs are org-bound routes and each leg exists only where its route is bound: an org with no push adapter legitimately binds urgent with the channel leg alone, and an unbound leg degrades the fan-out toward the always-filed tracker item - a reviewed security-surface choice, not an unverifiable claim, so it does not fail closed. The one rejected shape stays the inverse (a push leg without the channel beneath it), because the ladder is cumulative. escalation.md now states this explicitly where the fan-out table is defined. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 8s —— View job Wave-8 delta review — docs(autonomy): autonomous-runner design pack (WP7)
OverviewCommit Fixed ✅ — Channel-only urgent is the legal degraded fan-out (Codex P2)
The fix is a prose clarification only — no schema, checker, or fixture change was needed. This is correct because:
The Codex finding misread the intended behavior: No fixture change is needed: the existing Still open — Stale forward-link note in
|
| Finding | Source | Wave-8 status |
|---|---|---|
| Channel-only urgent is the legal degraded fan-out | Codex P2 (wave 8) | ✅ Fixed |
| Completion is a landed disposition, not a landed change | Codex P2 (wave 7) | ✅ Fixed (prior wave) |
| Runner launch fail-closes without escalation routes | Codex P2 (wave 6) | ✅ Fixed (prior wave) |
| C4 execution gates on plan-approval item | Codex P2 (wave 5) | ✅ Fixed (prior wave) |
Re-escalation saturation at urgent |
Codex P2 (wave 4) | ✅ Fixed (prior wave) |
| C5 always-fires: success exception scoped correctly | Codex P1 (wave 3) | ✅ Fixed (prior wave) |
| C1 queue-artifact: PR path excluded for read-only class | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Urgent fan-out leg model: push-only binding rejects | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Runner class queue destination: severity-bound requires route | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Severity selects fan-out, never item route | Codex P2 (wave 2) | ✅ Fixed (prior wave) |
| Re-escalation cap pinned at 1 | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
| Executor class follows surface, not hosting | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
Stale forward-link note in runner.md |
Prior review (must-fix) | ❌ Outstanding — 8 waves |
Urgent override ambiguity in escalation.md |
Prior review (recommended) | ❌ Outstanding — 7 waves |
Wave-8 change is correct (doc clarification only; schema and checker were already right). One must-fix (two stale sentences at runner.md:122–123) is the single remaining blocker before merge. The urgent-override ambiguity clarification remains strongly recommended given the security implications of silent severity downgrade on isolation-violation and security/data-integrity stops.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c1aabe21e1
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
… (wave 9) One review finding. Two schema descriptions still carried the superseded severity-only routing option for runner classes, so a consumer following the schema contract would prepare a binding the checker rejects. Both now state the enforced rule: a runner class keyed in escalation_severity must also carry its own escalation_routes entry, because severity selects only notification fan-out and can never supply the filed item's queue destination. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 37s —— View job Wave-9 delta review — docs(autonomy): autonomous-runner design pack (WP7)
OverviewCommit Fixed ✅ — Schema descriptions match the runner-route requirement (Codex P2)Two description fields updated; no structural schema change.
The prior description said "a runner class may also route solely through the escalation_severity join" — directly contradicting the checker's
The prior description named three valid binding shapes: "an optional escalation_routes key, the escalation_severity join, or both" — the middle option being the illegal severity-only shape. The replacement correctly removes that option: "a runner class keyed in escalation_severity must also carry its own escalation_routes entry (the queue destination severity can never supply)." Both corrections are minimal and consistent with each other. No fixture changes were needed: Still open — Stale forward-link note in
|
| Finding | Source | Wave-9 status |
|---|---|---|
| Schema descriptions match the runner-route requirement | Codex P2 (wave 8→9) | ✅ Fixed |
| Channel-only urgent is the legal degraded fan-out | Codex P2 (wave 8) | ✅ Fixed (prior wave) |
| Completion is a landed disposition, not a landed change | Codex P2 (wave 7) | ✅ Fixed (prior wave) |
| Runner launch fail-closes without escalation routes | Codex P2 (wave 6) | ✅ Fixed (prior wave) |
| C4 execution gates on plan-approval item | Codex P2 (wave 5) | ✅ Fixed (prior wave) |
Re-escalation saturation at urgent |
Codex P2 (wave 4) | ✅ Fixed (prior wave) |
| C5 always-fires: success exception scoped correctly | Codex P1 (wave 3) | ✅ Fixed (prior wave) |
| C1 queue-artifact: PR path excluded for read-only class | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Urgent fan-out leg model: push-only binding rejects | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Runner class queue destination: severity-bound requires route | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Severity selects fan-out, never item route | Codex P2 (wave 2) | ✅ Fixed (prior wave) |
| Re-escalation cap pinned at 1 | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
| Executor class follows surface, not hosting | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
Stale forward-link note in runner.md |
Prior review (must-fix) | ❌ Outstanding — 9 waves |
Urgent override ambiguity in escalation.md |
Prior review (recommended) | ❌ Outstanding — 8 waves |
Wave-9 change is correct (two schema description fixes; no structural change, no fixture change needed). One must-fix (two stale sentences at runner.md:122–123) is the single remaining blocker before merge. The urgent-override clarification remains strongly recommended given the security implications of silent severity downgrade on isolation-violation and security/data-integrity stops.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: fd0b5a7861
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…e 10) One review finding. The C4 fail-close on a missing recorded approval went straight to escalated with no enumerated stop, leaving its event class, severity, and route unspecified. Missing plan approval is now a runner-owned stop reason in the taxonomy and the step-one table, mapping to needs-human (so it files through runner-needs-human at its bound route and severity like every other non-success stop), and the lifecycle leaf's C4 gate names that stop instead of a bare escalated transition. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 50s —— View job Wave-10 delta review — docs(autonomy): autonomous-runner design pack (WP7)
OverviewCommit Fixed ✅ — Missing C4 approval is a mapped runner-owned stop (Codex P2)Two-file fix is correct and complete.
Previously this was a bare "fail-closes to No schema or checker change was needed: the condition resolves through the existing Still open — Stale forward-link note in
|
| Finding | Source | Wave-10 status |
|---|---|---|
| Missing C4 approval is a mapped runner-owned stop | Codex P2 (wave 9→10) | ✅ Fixed |
| Schema descriptions match the runner-route requirement | Codex P2 (wave 8→9) | ✅ Fixed (prior wave) |
| Channel-only urgent is the legal degraded fan-out | Codex P2 (wave 8) | ✅ Fixed (prior wave) |
| Completion is a landed disposition, not a landed change | Codex P2 (wave 7) | ✅ Fixed (prior wave) |
| Runner launch fail-closes without escalation routes | Codex P2 (wave 6) | ✅ Fixed (prior wave) |
| C4 execution gates on plan-approval item | Codex P2 (wave 5) | ✅ Fixed (prior wave) |
Re-escalation saturation at urgent |
Codex P2 (wave 4) | ✅ Fixed (prior wave) |
| C5 always-fires: success exception scoped correctly | Codex P1 (wave 3) | ✅ Fixed (prior wave) |
| C1 queue-artifact: PR path excluded for read-only class | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Urgent fan-out leg model: push-only binding rejects | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Runner class queue destination: severity-bound requires route | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Severity selects fan-out, never item route | Codex P2 (wave 2) | ✅ Fixed (prior wave) |
| Re-escalation cap pinned at 1 | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
| Executor class follows surface, not hosting | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
Stale forward-link note in runner.md |
Prior review (must-fix) | ❌ Outstanding — 10 waves |
Urgent override ambiguity in escalation.md |
Prior review (recommended) | ❌ Outstanding — 9 waves |
Wave-10 change is clean and correct. One must-fix (two stale sentences at runner.md:122–123) is the single remaining blocker before merge. The urgent-override clarification remains strongly recommended given the security implications of silent severity downgrade on isolation-violation and security/data-integrity stops.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 05e96dcafd
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
One review finding. The turn, budget, and wall-clock caps (and the retry budget behind the execution-error stop) had no owning configuration seam - only the drain-level autonomous_concurrency and items_per_run were cited - so cap-exceeded could not be made deterministic. The session/resume/caps seam now pins the home: the per-item caps are admission-policy knobs on the SECURITY binding, siblings of the drain-level pair on the same agent-unwritable surface (a cap the governed agents could edit is no cap). Their exact keys land as additive schema keys with the build, token names resolving at /architect like every other deferred seam token; the runner reads them and fail-closes at launch when they are unbound, so no item ever runs unbounded on implicit defaults. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 46s —— View job Wave-11 delta review — docs(autonomy): autonomous-runner design pack (WP7)
OverviewCommit Fixed ✅ — Per-item caps get an owning binding home (Codex P2)
All four implementation-critical properties are now specified and correct:
The prose-only treatment is appropriate for a design pack: the exact schema keys and their allowed ranges are genuinely build-time decisions, and claiming otherwise would violate the no-build covenant. The fix correctly closes the gap identified by the Codex finding without over-specifying. The commit also tightens the preceding "Plugs into (shipped)" bullet from "run caps bind the admission-policy knobs" to "drain-level caps bind the admission-policy knobs" — a small but correct clarification that distinguishes the drain-level pair (already shipped) from the per-item caps (now pinned to the same surface but deferred to /architect). Still open — Stale forward-link note in
|
| Finding | Source | Wave-11 status |
|---|---|---|
| Per-item caps: owning binding home pinned | Codex P2 (wave 10→11) | ✅ Fixed |
| Missing C4 approval is a mapped runner-owned stop | Codex P2 (wave 10) | ✅ Fixed (prior wave) |
| Schema descriptions match the runner-route requirement | Codex P2 (wave 9) | ✅ Fixed (prior wave) |
| Channel-only urgent is the legal degraded fan-out | Codex P2 (wave 8) | ✅ Fixed (prior wave) |
| Completion is a landed disposition, not a landed change | Codex P2 (wave 7) | ✅ Fixed (prior wave) |
| Runner launch fail-closes without escalation routes | Codex P2 (wave 6) | ✅ Fixed (prior wave) |
| C4 execution gates on plan-approval item | Codex P2 (wave 5) | ✅ Fixed (prior wave) |
Re-escalation saturation at urgent |
Codex P2 (wave 4) | ✅ Fixed (prior wave) |
| C5 always-fires: success exception scoped correctly | Codex P1 (wave 3) | ✅ Fixed (prior wave) |
| C1 queue-artifact: PR path excluded for read-only class | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Urgent fan-out leg model: push-only binding rejects | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Runner class queue destination: severity-bound requires route | Codex P2 (wave 3) | ✅ Fixed (prior wave) |
| Severity selects fan-out, never item route | Codex P2 (wave 2) | ✅ Fixed (prior wave) |
| Re-escalation cap pinned at 1 | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
| Executor class follows surface, not hosting | Codex P2 (wave 1) | ✅ Fixed (prior wave) |
Stale forward-link note in runner.md |
Prior review (must-fix) | ❌ Outstanding — 11 waves |
Urgent override ambiguity in escalation.md |
Prior review (recommended) | ❌ Outstanding — 10 waves |
Wave-11 change is minimal, correct, and well-reasoned. One must-fix (two stale sentences at runner.md:122–123) is the single remaining blocker before merge. The urgent-override clarification remains strongly recommended given the security implications of silent severity downgrade on isolation-violation and security/data-integrity stops.
## Summary Effort-end housekeeping for the AI-adoption-ladder effort: all seven work packages are merged, so the per-WP topic slices come out per the close-out convention (publish the PLAN, then prune the slice). - WP4–WP7 PLANs were already spliced into their PR bodies at each close-out (#372, #377, #600, #676). - WP1–WP3 PLANs are now published the same way into #333, #343, and #356 (each merged PR body gained a `PLAN (published at effort-end close-out)` details block), so every slice's content has a durable home on its merged PR before the directory is removed. - The WP map in `docs/topics/ai-adoption-ladder/index.md` now records delivery PRs instead of live slugs. The effort hub itself (index, design evidence, research docs) stays. No content is lost: every deleted PLAN.md is byte-recoverable from git history and readable in its merged PR's details block. ## Related No linked issue (effort-end housekeeping; the WP map issue #239 is already closed). - #239 (WP map: AI adoption ladder — the effort this closes out) - #333 / #343 / #356 (WP1–WP3 delivery PRs, PLANs published into their bodies in this close-out) - #372 / #377 / #600 / #676 (WP4–WP7 delivery PRs, PLANs published at their own close-outs) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ger row (#698) ## Summary D1 sweep for #353: the WP1–WP7 PLAN out-of-package notes (mined from the merged PR bodies #333/#343/#356/#372/#377/#600/#676) contained 31 deferred notes; every note that named no tracking issue and had no contract-recorded trigger now has a durable home: - **README roadmap** gains four trigger-gated rows: fleet guardrail materializations (WP5), fleet routine stand-up + existing-scheduler reconciliation (WP6), vendor-binding capability templates (WP6), cost enforcement / hard spend caps (WP5, 3→4 trigger). - **Trigger register** gains the second-binding-consumer cross-repo drift check (WP1). - **`reference/return-accounting.md`** records the per-work-class precision-graduation deferral beside its band-stability rule (WP3). - **CHANGELOG.md created** for the autonomy plugin (first entry; 0.1.0–0.7.0 history stays in the WP PR bodies) + version bump to 0.7.1 — starts the CHANGELOG-parity posture #663 gates on. All other mined notes were already covered: tracked issues (#351, #352, #694–#697), contract-recorded triggers (telemetry immutable-ID, return-accounting expansion/revisit), delivered sibling WPs, resolved `/architect` questions, or the user-held dormant triggers (runner build T4, L3 backend, merge serialization, mid-run interrupt, org-enablement, cross-team). Full disposition table lands as a comment on #353 at close. Documentation only — no contract semantics change. ## Related - #685 (effort-end prune that moved the PLAN records into the merged PR bodies) - #663 (CHANGELOG-parity gate this PR's new CHANGELOG.md starts satisfying) - WP delivery PRs mined: #333, #343, #356, #372, #377, #600, #676 Closes #353 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Summary
WP7 of the AI-adoption-ladder effort: the autonomous-runner design pack — the
architect-ready design contract the T4 charter graduates into, as a progressive-disclosure
hub (
plugins/autonomy/reference/runner.md) with four leaves underreference/runner/.Design only: zero build artifacts, the runner-execution home stays unborn, both T4 build
triggers are restated and neither is assumed fired.
both build triggers, self-run-primary substrate stance with the vendor-hosted
human-merge-gate cap, inherited constraints, anti-goals) with an explicit no-build clause;
the two-layer composition spine (normative shape in seam vocabulary; adopt-first binding
stance with reimplement-the-pattern as the named fallback, no library pinned); the 8 seams
as the spine's complete interface set, each citing its shipped owning contract or marked
runner-new; envelope fields
stop_reason/outcome/evidence/resume_handleresolved.
leased → executing → verifying → disposing → (escalated | complete)with per-transitiontelemetry cited from the telemetry contract; thin per-item-PR launch disposition with the
vendor-hosted cap restated on the disposition path; batched gated-merge serialization as a
growth stage on its evidence trigger, binding a platform-native merge-queue facility, never
reimplemented. Terminal-handoff escalation: four terminal outcomes (
successnever filesescalation work), the two-family stop-criteria taxonomy (
runner-owned/agent-signaled),the deterministic two-step mapping (stop reason → outcome → event class), two additively
registered runner event classes (
runner-needs-human,runner-cap-exceeded),contract-default severities for all eight classes on the
notice/attention/urgentaxis,the urgent stop-reason override, 72h/one-bump acknowledgment knobs, deferred mid-run
interrupt, and four research gaps carried as UNVERIFIED. Topology: four ownership homes, the
launch backend set (one free self-run L2 container-class backend; L3 deferred with C5
dispatch blocked until bound, the floor cited from the work-classes cell; cloud backends
advisory and vendor-hosted-capped), birth-time decisions USER-RESERVED.
genuinely additive optional keys beside an untouched
escalation_routes—escalation_severity(event class → severity),escalation_severity_routes(severity →route, personal-push legal at any tier, severity-first resolution with the per-event route
as fallback),
escalation_ack(staleness window, re-escalation cap). The event-classregistry grows additively:
escalation_routeskeeps requiring only the six inheritedguardrail classes (existing bindings validate unchanged) while the two runner classes are
legal optional route keys.
check-security-binding.mjsmirrors the shapes and adds the onesemantic rule the schema cannot express (an unroutable severity-bound event class fails
closed). SKILL.md gains the short runner note (427/500 lines), evals.json case 29 covers
the slice, plugin 0.6.0 → 0.7.0, catalog regenerated.
Zero-build audit (phase 4)
Branch diff vs base: exactly 17 paths, all inside the four allowed surfaces (reference/ pack,
skills/setup/, the two READMEs, the plugin manifest) plus the PLAN's own phase tags. No new
.sh/.mjs/.pyfiles.grep -rci 'git init\|create the repo'overreference/runner*= 0.No sentence in the pack reads as a build commitment; birth-time decisions carry arbiter
USER-RESERVED.
Additivity proof (schema)
Full security-binding fixture sweep before/after: 10 pass / 92 reject → 11 pass / 95 reject
with zero flips among the 102 pre-WP7 fixtures — the delta is exactly the four new
escalation fixtures (valid binding passes; bad severity token, unroutable event class, and
non-positive ack values each reject with their own finding). A runner class bound through an
optional
escalation_routesentry alone is routable, matching the escalation contract.Near-duplicate audit
The pack cites the shipped contracts for every inherited obligation — matrix cells, isolation
ladder levels, queue/lease dispatch, telemetry emission and join attribute, return-accounting
capture, executor surface classes — and defines only runner-new content (envelope fields,
state model, stop-criteria taxonomy, severity mapping, ownership seams). The two deliberate
restatements are the stress-test F6 items: the vendor-hosted human-gate cap on the lifecycle
disposition path and on the topology cloud-backend path.
Gates
validate-plugins.sh,generate-catalog --check,validate-plugin-contracts.mjs(vendordeny-list over reference/),
run-plugin-tests.sh(all pass or skip),claude plugin validate --strict, markdownlint, typos, lychee over the five-file pack(66 links, 0 errors) — all green locally.
Related
No linked issue (the T4 charter decision node #244 is already closed; this package delivers
the design pack it chartered).
extends additively)
PLAN
ai-ladder-wp7-runner
Brief
TLDR
Runner design pack (T4 charter graduation): architect-ready design contract for the
autonomous-drain runner — spine shape + 8 seam specs, lifecycle state model, two-family
stop-criteria taxonomy with terminal-handoff escalation, matrix-derived backend set, and the
topology seam map. Design only: build stays gated on the T4 triggers; the runner-execution
home stays unborn.
Goal
When the T4 build trigger fires,
/architectand the build start from a complete,Boris-aligned design contract instead of a cold charter: every design decision T4 graduated
(composition spine, isolation backends, lifecycle depth, escalation UX, topology) is resolved
in contract vocabulary, every inherited constraint is imported unchanged, and nothing in the
package commits, implies, or starts a build before the trigger earns it.
Locked decisions
Constraints
only as marked examples and in binding docs.
that reads as a build commitment.
or escalation mechanism.
edit them.
block and name the compliant path, never degrade silently.
surfaced.
scale).
Acceptance criteria
lifecycle state model, two-family stop-criteria taxonomy, severity/ack/re-escalation knob
set, launch backend derivation, topology seam map.
no build commitment anywhere in the text.
resolved by this package (mid-run interrupt stays deferred with its own evidence trigger;
this pack resolves the inherited deferral, it does not claim nothing remains deferred).
cross-vendor agent-needs-human signaling (agent-protocol / agent-instruction-file guidance)
UNVERIFIED; managed-agent event names drift between stream and webhook surfaces — bind
exact names at build from live docs; the deprecated approval-SDK is never cited as living
precedent.
Claude kick off Claude" cell stays inside the governed-queue audit trail; the step-4 cell
is chartered, not built — closed loop via self-run substrate, programmatic-scheduling
surface class, cost controls as caps/budget knobs, model selection as cost tiers;
monitor-by-exception instantiated as terminal-handoff escalation; the thread-post return
metric is fed by return-accounting capture at the runner boundary.
Captured assumptions
re-verify at trigger; reimplement-the-pattern is the named fallback (D2).
webhook) remain available — beta/moving surfaces; re-verify at build before relying on
them for the mid-run-interrupt growth stage.
entrypoint (live-verified in a prior session).
time; absent adapters, severity fan-out degrades to tracker-item-only — never silently
drops the escalation itself.
Out-of-scope (deferred with triggers)
cost/context.
post-graduation.
Deferred questions
/architect(with the plugin naming pass)./architect./architect.outcome, exact managed-event name bindings — build stage, gated on the T4 trigger;
arbiter: USER-RESERVED (trigger firing is a user-ratified event).
Plan
Recommendation-locked this round under the user's standing pre-authorization. Token sets
(D-deferred, resolved here): lifecycle state tokens
leased/executing/verifying/disposing/escalated/complete(terminal:escalated,complete); terminal-outcometokens
success/gate-failed/needs-human/cap-exceeded; stop-criteria familytokens
runner-owned(deterministic) andagent-signaled(judgment, via thestructured-output envelope field
stop_reason); severity levelsnotice/attention/urgent(three levels — mapped to org-bound notification fan-out; tracker item always,channel notification per org route, personal-push tier org-bindable at
urgent); defaultstaleness window 72h with one re-escalation (severity bump, cap 1) — org-bindable knobs.
Design-pack docs live under
reference/runner/(hubreference/runner.md).Prerequisites: WP4 + WP5 + WP6 implementation PRs merged (this pack imports their contracts
by citation). Design only — zero build artifacts; the runner-execution home stays unborn.
Phase 1: Charter import + spine and seam specs [DONE]
plugins/autonomy/reference/runner.mdplugins/autonomy/reference/runner/seams.mdstop_reason,outcome,evidence(bundle ref),resume_handle.Sanity Check:
grep -ci 'build trigger' plugins/autonomy/reference/runner.md≥ 2 (both triggers restated)grep -c 'no build' plugins/autonomy/reference/runner.md≥ 1 (commitment clause present)grep -cE '^## ' plugins/autonomy/reference/runner/seams.md= 8Phase 2: Lifecycle + stop-criteria + escalation leaves [DONE]
plugins/autonomy/reference/runner/lifecycle.mdleased → executing → verifying → disposing → (escalated | complete), every transition emitting telemetry per the telemetry contract (trace-linked); launch disposition thin (per-item PR through the platform's native flow, merge disposition governed by the WP5 matrix row — including the vendor-hosted human-gate cap whenever the executing backend is vendor-hosted, restated here rather than inherited silently); batched gated-merge serialization named as a growth stage with its evidence trigger (observed concurrent auto-merge collisions) binding to a platform-native merge-queue facility — never reimplemented.plugins/autonomy/reference/runner/escalation.mdsuccess/gate-failed/needs-human/cap-exceeded); the NON-SUCCESS outcomes file the human-gated work item with the evidence bundle (failure summary, run-transcript link, cost, trace link,resume_handle; human takeover = resume the persisted session), whilesuccesscompletes through the normal disposition + return-accounting path — no escalation item, no ack/re-escalation obligations, else every healthy run would generate false escalation work (PR-review finding); two-family stop-criteria taxonomy verbatim (runner-owned: turn/budget/wall-clock caps, execution error after retries, refusal, verification-gate failure, isolation violation; agent-signaled viastop_reason: ambiguity, design decision, security/data-integrity event, unresolvable blocker, no-progress); transient-recoverable retries with backoff, never escalates; severity axis (notice/attention/urgent) → org-bound fan-out with personal-push as an org-bindable route; an EXPLICIT two-step mapping so severity resolution is deterministic for every non-success stop (PR-review findings — the severity join keys on event class, which runner outcomes alone never named, and stop reasons in turn never named their outcome): STEP ONE, stop reason → terminal outcome — runner-owned: verification-gate failure →gate-failed; turn/budget/wall-clock cap →cap-exceeded; execution error after retries, refusal, and isolation violation →needs-human; agent-signaled (everystop_reasonvalue: ambiguity, design decision, security/data-integrity event, unresolvable blocker, no-progress) →needs-human; STEP TWO, outcome → event class:gate-failed→ the guardrail contract's gate-failure event class;needs-humanandcap-exceeded→ two runner escalation event classes with the tokensrunner-needs-humanandrunner-cap-exceeded, registered ADDITIVELY alongside the guardrail contract's set — the Phase 3 schema edit extends the event-class registry (the enumescalation_routesandescalation_severitykeys validate against) with these two tokens, andcheck-security-binding.mjsaccepts route/severity bindings for them like any guardrail class (default severitiesattentionandnotice, org-bindable), and contract default severities for EVERY inherited guardrail event class so severity fan-out is defined with noescalation_severitybinding at all (gate failureattention, verification divergenceattention, admission rejectionnotice, demotion eventattention, structural-class plan approvalattention, untrusted-provenanceurgent— all org-bindable overrides); an isolation violation or asecurity/data-integritystop reason carries anurgentseverity override regardless of its event class's default; the filed escalation item's envelope records the resolved event class AND the originating stop reason; acknowledgment-on-item + stale-unacked re-escalation (default 72h window, one severity-bump re-escalation, both org-bindable); mid-run interrupt deferred with its evidence trigger; escalation telemetry rides the telemetry contract's custom-namespace mechanism — the exact namespace token is read from the shipped telemetry contract at implementation, not pinned here (candidate upstream contribution noted). Research gaps carried verbatim (CI-action-class failure-reporting UNVERIFIED; cross-vendor needs-human signaling UNVERIFIED; managed-agent event-name drift — bind at build; deprecated approval-SDK never cited as living precedent).plugins/autonomy/reference/runner/topology.mdexecutor_class: vendor-hosted, capping every merge row at human-gated, per F6); birth-time decisions listed with arbiter USER-RESERVED (repo count/name/language, spine re-verification, exact managed-event names).Sanity Check:
grep -c 'disposing' plugins/autonomy/reference/runner/lifecycle.md≥ 1grep -c 'cap-exceeded' plugins/autonomy/reference/runner/escalation.md≥ 1 andgrep -c 'stop_reason' …/escalation.md≥ 1grep -ci 'UNVERIFIED' plugins/autonomy/reference/runner/escalation.md≥ 2grep -c 'USER-RESERVED' plugins/autonomy/reference/runner/topology.md≥ 1Phase 3: Setup note + WP5 escalation-route join [DONE]
plugins/autonomy/skills/setup/SKILL.mdplugins/autonomy/skills/setup/schemas/guardrails-security-binding.schema.jsonadditionalProperties: false, so an undeclared shape would fail every severity-tiered binding):escalation_routeskeeps its existing event-class→route entries unchanged; three new OPTIONAL top-level keys land beside it, modeling the event/severity join explicitly —escalation_severity(event class → severity token, the join: which severity each event class escalates at; contract defaults per event class, org-bindable),escalation_severity_routes(severity token → route,notice/attention/urgent, personal-push a legal route value at any tier; route resolution = event class → its severity → that severity's route, falling back to the event class's ownescalation_routesentry when no severity route is bound), andescalation_ack(staleness_window, default 72h;reescalation_cap, default 1). Old bindings validate unchanged — no major bump; that resolution is now in-plan, not asserted.plugins/autonomy/skills/setup/scripts/check-security-binding.mjsescalation_ackvalues positive; routability per event class matches the resolution rule — an event class keyed inescalation_severityis routable when its severity has anescalation_severity_routesentry OR the event class has its ownescalation_routesentry (severity-only fan-out is legal, matching severity-route-first resolution; a legacy per-event route is the fallback, never a requirement), and only an event class with NEITHER is flagged unroutable.plugins/autonomy/skills/setup/evals/evals.jsonplugins/autonomy/README.md+plugins/autonomy/.claude-plugin/plugin.jsonSanity Check:
grep -ci 'unborn' plugins/autonomy/skills/setup/SKILL.md≥ 1grep -c 'build trigger' plugins/autonomy/README.md≥ 1)grep -c 'escalation_severity_routes' …schema.json≥ 1 and a pre-WP7 fixture binding still passescheck-security-binding.mjsunchanged (no major bump proven, not asserted)/skill-quality:check+validate-evalspass;claude plugin validate --strictexit 0Phase 4: Zero-build audit + gates [DONE]
Acceptance probe (mechanical): the package introduces no executable/runtime artifact — the
diff contains no new files outside
reference/,skills/setup/, README, and pluginmanifest; no new scripts; no repo-creation instruction anywhere. Then the full gate roster
(
validate-plugins.sh,run-plugin-tests.sh,validate-plugin-contracts.mjs,markdown/typos/lychee,
claude plugin validate --strict, catalog regen). Near-duplicateaudit statement: the pack cites the shipped contracts for every inherited obligation and
defines only runner-new content.
Sanity Check:
git diff --name-only <base>contains no path outside the four allowed surfaces; no*.sh/*.mjsadditionsgrep -rci 'git init\|create the repo' plugins/autonomy/reference/runner*= 0Blast radius
MEDIUM — docs-only within one plugin, but the pack pre-commits topology and escalation
contracts the eventual build must honor; WP5's last cross-package deferral resolves here.
Fully git-revertible; zero runtime surface by design.
Stress-test summary
Fresh-context plan review (WP6+WP7 batch): 10 findings, verdict FIX-THEN-SHIP, WP7's share
folded — F2 (HIGH): the escalation-route severity refinement touched the WP5 security-binding
schema (
additionalProperties: false) but Phase 3 listed neither the schema nor thevalidator, leaving the flagship severity/ack knob set unbindable, and "additive, no major
bump" was asserted over what read as a value-shape change → both files added to Phase 3 and
the refinement modeled as genuinely additive optional keys (
escalation_severity_routes,escalation_ack), with a pre-WP7 fixture-passes gate proving no major bump. F5 (MED): theC5→L3 fail-closed gate now CITES the WP5 work-classes matrix cell (which imports T3's C5/L3
row) instead of asserting the value. F6 (LOW-MED): the vendor-hosted human-gate merge cap is
restated on the cloud-backend and disposition paths instead of silently inherited. F7 (LOW):
the Phase 3 SKILL.md change gains eval coverage like every other WP. F9 (LOW): the
"last cross-package deferral" claim scoped to the WP5-inherited deferral. F10 (LOW): the
escalation-telemetry namespace token is read from the shipped telemetry contract at
implementation, not pinned in the plan. Scope discipline (zero build artifacts, unborn
runner-execution home, USER-RESERVED birth decisions) audited clean.
Execution shape
Fully sequential 1 → 2 → 3 → 4 — leaves depend on the hub's imported charter; the setup note
cites Phase 2's escalation severity axis; Phase 4 audits the authored tree. Cross-package:
after WP4+WP5+WP6 implementation PRs.
Open questions
names) — USER-RESERVED at trigger fire, restated in topology.md.
Decisions made (gate-passed)
leased/executing/verifying/disposing/escalated/completesuccess/gate-failed/needs-human/cap-exceedednotice/attention/urgent; 72h staleness, one re-escalationstop_reason/outcome/evidence/resume_handlereference/runner/escalation_severityas the explicit event→severity join,escalation_severity_routes,escalation_ack) beside an untouchedescalation_routes; schema + validator edits in Phase 3additionalProperties: false, proven by the pre-WP7 fixture gate; the join key answers the PR-review finding that severity→route alone left route selection non-deterministic per event classHandoff to implementation
User-approval gates
user-locked; the zero-build audit is the backstop).
/architect review.Execution shape ([EXEC-SHAPE] tagged)
Sequential 1→4, all main-session (table above). PLAN.md phase tags advance in the same
commit as each phase.
Mechanical work
Commit per phase on the implementation branch (suggest
docs/autonomy-runner-design-pack—docs-type: the package is normative text only); gates re-run in full at Phase 4; PR body
carries the zero-build audit output + near-duplicate audit statement + this PLAN in a
<details>block at close-out.