IronClaw
IronClaw records why a subagent woke before it runs
IronClaw adds subagent activation provenance, an explicit activate primitive and a derived autonomous-wake cap. Related work preserves terminal dispatch records while an issue removes duplicate turn and spawn-mode vocabulary.
nearai/ironclaw PR #7752 is the inspected primary source: “feat(turns): subagent activation provenance, activate() primitive, and derived autonomous-wake cap (slice 1).” The related records below were inspected as supporting context rather than independent confirmation.
The facts
- nearai/ironclaw PR #7752 was created 2026-08-19T18:10:33Z and was closed at inspection; its title is “feat(turns): subagent activation provenance, activate() primitive, and derived autonomous-wake cap (slice 1).” - nearai/ironclaw PR #7753 was created 2026-08-19T18:39:35Z and was open at inspection; its title is “fix(capabilities): preserve terminal dispatch records.” - nearai/ironclaw issue #7755 was created 2026-08-19T20:48:03Z and was open at inspection; its title is “Collapse two duplicated turn/subagent vocabulary types (dead metadata struct + duplicate spawn-mode enums).” - The repository reported 12604 stars, 1504 open issues, default branch main, and last push 2026-08-20T01:19:24Z. - The latest tagged-release baseline checked was ironclaw-v1.3.0 published 2026-08-19T23:17:37Z.
What changed
nearai/ironclaw PR #7752 reports: Summary Adds the foundation background subagents need, with **no production behavior change**: builtin.spawn_subagent stays deny-filtered and nothing in production calls the new primitive yet. ActivationProvenance (Human / ParentAgent / System) in ironclaw_host_api::turn, persisted through agent-turn process metadata onto TurnRunRecord — additive and serde-defaulted, so existing durable rows keep deserializing. TurnCoordinator::activate() — the single re-activation primitive. Deliberately **not** a second admission path: it builds an ordinary SubmitTurnRequest, so one-active-run exclusivity, idempotency replay, and busy rejection behave exactly as for any other submission. The only thing it adds is the provenance stamp. A bounded newest-first run-window query, reusing the existing process_scope_v3 index and its already-implemented descending sort — **no new index, no backfilling migration, no per-backend SQL**. A derived consecutive-System-activation cap (16) built on that window — no stored counter, no new component. Nothing else bounds the cumulative spawn → settle → wake → spawn cycle; a parent that spawns a fresh child on every background completion would otherwise loop indefinitely under every existing cap, with no human in it. This is slice 1 of the accepted design in docs/internal/reborn/subagent-spawn/thread-harness-design.md. Slice 2 (background mode + completion delivery) follows separately — it opens a real design question (ironclaw_agent_loop is contracts-only, so the drain seam must be a loop_contracts port) that deserves its own review rather than a paragraph at the bottom of a
nearai/ironclaw PR #7753 reports: Summary Retain fresh worker-local capability invocation state when dispatch fails so DefaultHostRuntime can materialize the required durable Failed terminal edge. Remove the ProcessInvocationStatePort::discard_pending escape hatch, which deleted the state before outcome-layer terminalization and caused process invocation not found warnings. Replace the inner-layer cleanup assertion with a caller-path regression that verifies exactly one failed journal edge and durable read-back after store reconstruction. This restores the terminal-evidence invariant from #7598 and fixes the regression introduced while addressing review feedback in #7678. Change Type [x] Bug fix [ ] New feature [ ] Refactor [ ] Documentation [ ] CI/Infrastructure [ ] Security [ ] Dependencies Test Strategy The regression test drives DefaultHostRuntime::invoke_capability with a real ProcessInvocationStore over the in-memory process journal and a dispatcher that returns a backend failure. It asserts: the caller receives a failed capability outcome; the invocation is durably Failed with error_kind = Dispatch; exactly one CapabilityInvocationState journal edge exists and it is Failed; a reconstructed store reads the same terminal record. The capability-host contract separately asserts that dispatch failure leaves fresh pending state available for the outcome owner rather than deleting it. Validation [x] Regression reproduced before the fix: terminal invocation evidence was absent. [x] Focused lifecycle regression tests: 2 passed. [x] cargo test -p ironclaw_processes -p ironclaw_capabilities — 279 passed. [x] cargo test -p ironclaw_host_runtime --test host_runtime_contract
nearai/ironclaw issue #7755 reports: Two behavior-preserving collapses in the turn/subagent vocabulary, found by a /cleanup evidence pass while reviewing #7752. Both are single-slice PRs. **Neither should land until #7752 merges** — a structural change must not ride in with a feature. Evidence pass recorded at.cleanup/turn-vocabulary/research.md (local, gitignored); the findings are reproduced here. F2 — Delete the duplicate agent-turn metadata struct (do this first) AgentTurnProcessMetadata (crates/kernel/ironclaw_turns/src/process_projection/metadata.rs:16) is a **13-field strict subset** of AgentTurnProcessStateMetadata's 17. The four extras there are actor, resolved_run_profile, spawn_tree_descendant_cap, subagent_activation_provenance. Both serialize under the **same durable key**, "agent_turn". Its only entry point is TurnRunRecord::to_process_snapshot() (process_projection/runtime.rs:827), and that method's **only caller is a test** (process_projection/tests.rs:1208). TurnRunProcessExt is defined and implemented in one file and consumed nowhere in production. Why this is worth more than the line count.** Two Rust types writing one durable key is the *structural cause* of the bug class fixed in #7752: a row written by the subset type deserializes into the superset type with **defaults** for the missing fields. That is exactly how subagent_activation_provenance was silently read back as None after a terminal metadata rewrite, leaving the autonomous-wake cap unable to fire in production. #7752 fixed the instance; this deletion removes the second writer so the class cannot recur through this path. Scope:** one struct, one trait, one impl, one pub use (lib.rs:83), one test. Well inside a
Why it matters
Delegation becomes governable when activation cause, dispatch evidence and wake budget share one vocabulary. Duplicate types and missing terminal records fracture the audit trail. The operator test is whether the system remains bounded and its receipts still describe the action after failure, retry or restart.
Current
The primary record was closed when captured on 2026-08-20. The tagged-release baseline was ironclaw-v1.3.0 published 2026-08-19T23:17:37Z. Repository metadata, full source bodies, current pull requests and issues, releases, Google News, Hacker News, Lobsters, Metamesh and the rendered ClawCharts row were inspected. ClawCharts selected the subject; it did not prove the claim.
Evidence
The primary URL is https://github.com/nearai/ironclaw/pull/7752. Supporting records are https://github.com/nearai/ironclaw/pull/7753 and https://github.com/nearai/ironclaw/issues/7755. Source bodies, timestamps and states are preserved in the daily evidence bundle. Test counts and reproductions remain attributed to their authors unless identified as independently rerun.
Source boundary
Open work is described as open, closed work as closed, and operator reports as reports. A pull request is evidence of proposed or reviewed direction, not proof of a shipped release. Search residue, package mirrors and historically published source spines were excluded.
Operator take
Record activation cause before execution, preserve terminal dispatch through completion, and derive wake limits from one canonical turn contract. Preserve a before-state receipt, make the smallest reversible change, and verify the original failure independently.
Caveat
Public project records are mutable. Status, scope and evidence can change after publication. This brief records the inspected state and does not authorize changes to a reader’s deployment.
Source inspected; source state, environment and release boundary remain explicit.