Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
ed5c903
arch: ws-0 — state, checkpoints, BoundedRing, CapabilityCallSignature…
henrypark133 May 13, 2026
285880e
arch(ws-0): align state + checkpoints with evolved spec (12 gap-fixes…
henrypark133 May 13, 2026
a564dbf
arch(ws-0): wire stage_checkpoint_payload end-to-end (codex iter 1 fi…
henrypark133 May 13, 2026
3d02b6b
arch(ws-0): align checkpoint contracts + materialize summary-only con…
henrypark133 May 13, 2026
cdd0648
fix(ws-0): bind model requests to prompt bundles
henrypark133 May 14, 2026
3db2d97
fix(ws-0): issue prompt authority in reborn callers
henrypark133 May 14, 2026
bff12ed
arch: ws-1 — strategy traits α (context, capability, model) (iter 2, …
henrypark133 May 13, 2026
d903b89
arch(ws-1): align alpha strategies with skeleton spec
henrypark133 May 13, 2026
654e30d
arch: ws-2 — strategy traits β (batch, gate, recovery) (iter 1, appro…
henrypark133 May 13, 2026
9df56cd
arch(ws-2): align beta strategies with skeleton spec
henrypark133 May 13, 2026
0422c17
arch: ws-3 — strategy traits γ (stop, drain, budget) (iter 2, approved)
henrypark133 May 13, 2026
06418ec
arch(ws-3): align gamma strategies with skeleton spec
henrypark133 May 13, 2026
dbb7acb
arch(ws-3.5): add loop family registry
henrypark133 May 13, 2026
342f48a
merge: ws-1 into level1-merged
henrypark133 May 14, 2026
aba3923
merge: ws-2 into level1-merged
henrypark133 May 14, 2026
79cd701
merge: ws-3 into level1-merged
henrypark133 May 14, 2026
22a8e1d
merge: ws-3.5 into level1-merged
henrypark133 May 14, 2026
d299ca3
fix(ws-0): address review feedback
henrypark133 May 14, 2026
f9957bb
arch: ws-1 — strategy traits α (context, capability, model) (iter 2, …
henrypark133 May 13, 2026
a7ce26f
arch(ws-1): align alpha strategies with skeleton spec
henrypark133 May 13, 2026
9b68319
fix(ws-1): address review feedback
henrypark133 May 14, 2026
18c4467
arch: ws-2 — strategy traits β (batch, gate, recovery) (iter 1, appro…
henrypark133 May 13, 2026
f6b53a1
arch(ws-2): align beta strategies with skeleton spec
henrypark133 May 13, 2026
9ebcd03
fix(ws-2): address review feedback
henrypark133 May 14, 2026
62c7038
fix(ws-2): encode retry contracts
henrypark133 May 14, 2026
a57ae7e
fix(ws-2): validate strategy safe summaries
henrypark133 May 14, 2026
ea8c23e
arch: ws-3 — strategy traits γ (stop, drain, budget) (iter 2, approved)
henrypark133 May 13, 2026
ff2dbfd
arch(ws-3): align gamma strategies with skeleton spec
henrypark133 May 13, 2026
7b44361
fix(ws-3): address review feedback
henrypark133 May 14, 2026
521bb34
arch(ws-3.5): add loop family registry
henrypark133 May 13, 2026
3858912
fix(ws-3.5): harden loop family registry
henrypark133 May 14, 2026
a498d4d
fix(ws-3.5): return registry duplicate errors
henrypark133 May 14, 2026
11820b4
merge: ws-0 fixes into level1
henrypark133 May 14, 2026
d9df0be
merge: ws-1 fixes into level1
henrypark133 May 14, 2026
12630d3
merge: ws-2 fixes into level1
henrypark133 May 14, 2026
18efa75
merge: ws-3 fixes into level1
henrypark133 May 14, 2026
18e0e75
merge: ws-3.5 fixes into level1
henrypark133 May 14, 2026
fa88833
fix(level1): address integration review feedback
henrypark133 May 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[workspace]
members = [".", "crates/ironclaw_common", "crates/ironclaw_host_api", "crates/ironclaw_storage", "crates/ironclaw_filesystem", "crates/ironclaw_memory", "crates/ironclaw_events", "crates/ironclaw_event_projections", "crates/ironclaw_reborn_event_store", "crates/ironclaw_extensions", "crates/ironclaw_processes", "crates/ironclaw_dispatcher", "crates/ironclaw_scripts", "crates/ironclaw_mcp", "crates/ironclaw_wasm", "crates/ironclaw_capabilities", "crates/ironclaw_secrets", "crates/ironclaw_network", "crates/ironclaw_host_runtime", "crates/ironclaw_runtime_policy", "crates/ironclaw_authorization", "crates/ironclaw_run_state", "crates/ironclaw_approvals", "crates/ironclaw_resources", "crates/ironclaw_trust", "crates/ironclaw_turns", "crates/ironclaw_threads", "crates/ironclaw_loop_support", "crates/ironclaw_reborn", "crates/ironclaw_reborn_config", "crates/ironclaw_reborn_composition", "crates/ironclaw_reborn_cli", "crates/ironclaw_conversations", "crates/ironclaw_product_adapters", "crates/ironclaw_product_workflow", "crates/ironclaw_product_adapter_registry", "crates/ironclaw_wasm_product_adapters", "crates/ironclaw_telegram_v2_adapter", "crates/ironclaw_outbound", "crates/ironclaw_architecture", "crates/ironclaw_safety", "crates/ironclaw_skills", "crates/ironclaw_llm", "crates/ironclaw_engine", "crates/ironclaw_gateway", "crates/ironclaw_tui"]
members = [".", "crates/ironclaw_common", "crates/ironclaw_host_api", "crates/ironclaw_storage", "crates/ironclaw_filesystem", "crates/ironclaw_memory", "crates/ironclaw_events", "crates/ironclaw_event_projections", "crates/ironclaw_reborn_event_store", "crates/ironclaw_extensions", "crates/ironclaw_processes", "crates/ironclaw_dispatcher", "crates/ironclaw_scripts", "crates/ironclaw_mcp", "crates/ironclaw_wasm", "crates/ironclaw_capabilities", "crates/ironclaw_secrets", "crates/ironclaw_network", "crates/ironclaw_host_runtime", "crates/ironclaw_runtime_policy", "crates/ironclaw_authorization", "crates/ironclaw_run_state", "crates/ironclaw_approvals", "crates/ironclaw_resources", "crates/ironclaw_trust", "crates/ironclaw_turns", "crates/ironclaw_agent_loop", "crates/ironclaw_threads", "crates/ironclaw_loop_support", "crates/ironclaw_reborn", "crates/ironclaw_reborn_config", "crates/ironclaw_reborn_composition", "crates/ironclaw_reborn_cli", "crates/ironclaw_conversations", "crates/ironclaw_product_adapters", "crates/ironclaw_product_workflow", "crates/ironclaw_product_adapter_registry", "crates/ironclaw_wasm_product_adapters", "crates/ironclaw_telegram_v2_adapter", "crates/ironclaw_outbound", "crates/ironclaw_architecture", "crates/ironclaw_safety", "crates/ironclaw_skills", "crates/ironclaw_llm", "crates/ironclaw_engine", "crates/ironclaw_gateway", "crates/ironclaw_tui"]
exclude = [
"channels-src/discord",
"channels-src/feishu",
Expand Down
21 changes: 21 additions & 0 deletions crates/ironclaw_agent_loop/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# ironclaw_agent_loop guardrails

- Owns "what an agent loop is": strategy traits, the `AgentLoopPlanner` facade,
the `AgentLoopExecutor` trait + canonical impl, and `LoopExecutionState`.
- Stays one layer above `ironclaw_turns` (which owns runner-facing turn
contracts). Depends on `ironclaw_turns` for `LoopRunContext`, `LoopExit`,
`LoopXxxPort` traits, and ref types.
- Does NOT depend on `ironclaw_reborn`. The framework crate has no knowledge
of `AgentLoopDriver`; that bridge lives in `PlannedDriver` in
`ironclaw_reborn`.
- Stores refs, cursors, counters, versions, and safe summaries only. Never
raw prompts, raw model output, raw tool input, secrets, host paths, provider
errors, or stack traces in `LoopExecutionState` or any strategy slot.
- Strategies are `&self`-only; `LoopExecutionState` is value-immutable. All
mutation happens by the executor swapping a strategy's returned slot into
the next whole state. There is no `&mut LoopExecutionState` API.
- New strategies, slots, and outcome enums must land typed (no string keys,
no `serde_json::Value` interior in long-lived state). Per
`.claude/rules/types.md`.
- Master spec: `docs/reborn/agent-loop-skeleton.md`. Workstream briefs:
`docs/reborn/agent-loop-briefs/`.
21 changes: 21 additions & 0 deletions crates/ironclaw_agent_loop/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[package]
name = "ironclaw_agent_loop"
version = "0.1.0"
edition = "2024"
rust-version = "1.92"
description = "Agent-loop framework state and strategy contracts for IronClaw Reborn"
authors = ["NEAR AI <support@near.ai>"]
license = "MIT OR Apache-2.0"
homepage = "https://github.com/nearai/ironclaw"
repository = "https://github.com/nearai/ironclaw"
publish = false

[dependencies]
async-trait = "0.1"
blake3 = "1"
ironclaw_host_api = { path = "../ironclaw_host_api", version = "0.1.0" }
ironclaw_turns = { path = "../ironclaw_turns", version = "0.1.0" }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
serde_jcs = "0.2"
thiserror = "2"
44 changes: 44 additions & 0 deletions crates/ironclaw_agent_loop/src/families/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
use std::sync::Arc;

use crate::family::{
ComponentDigest, ComponentIdentity, LoopFamily, LoopFamilyId, LoopFamilyPlanner,
};

struct DefaultLoopFamilyPlanner;

impl LoopFamilyPlanner for DefaultLoopFamilyPlanner {}

/// Stable digest: SHA-256 of
/// `ironclaw_agent_loop.default_family.v1:planner=DefaultLoopFamilyPlanner;schema=component_identity_v1;family_id=default`.
///
/// Update this digest when the default family composition, planner behavior, or
/// identity schema changes in a replay-relevant way.
pub const DEFAULT_FAMILY_DIGEST: ComponentDigest = ComponentDigest([
0xf5, 0xa3, 0x2b, 0xd7, 0x15, 0x2f, 0xf4, 0x9a, 0x2b, 0xb7, 0x92, 0xee, 0x97, 0xe2, 0xa4, 0x54,
0x35, 0x4f, 0x0d, 0xab, 0x6a, 0x81, 0xcc, 0x3a, 0xbe, 0x35, 0xe9, 0x33, 0x55, 0xc9, 0x2a, 0xcf,
]);

/// The default loop family: the text-tool-use baseline once the planner and
/// executor workstreams land.
pub fn default() -> LoopFamily {
LoopFamily::new(
LoopFamilyId::DEFAULT,
ComponentIdentity::from_static("default", DEFAULT_FAMILY_DIGEST),
Arc::new(DefaultLoopFamilyPlanner),
)
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn default_family_has_default_identity() {
let family = default();

assert_eq!(family.id(), &LoopFamilyId::DEFAULT);
assert_eq!(family.version().id, "default");
assert_ne!(family.version().digest, ComponentDigest([0; 32]));
assert_eq!(family.version().digest, DEFAULT_FAMILY_DIGEST);
}
}
Loading
Loading