# CleverAgents Documentation (Detailed Spec) ## Overview CleverAgents is your **command center for AI agents** — a unified platform for orchestrating any task you want agents to accomplish, from developing large software projects to writing comprehensive technical papers, administering databases, managing cloud infrastructure, or any complex multi-step workflow. The core value proposition is enabling long-running, complex, large-scale tasks to execute autonomously with minimal human intervention, making it ideal for building entire software systems, producing extensive documentation, or managing sophisticated operations largely hands-off. !!! info "Server Mode" In **server mode**, CleverAgents becomes a collaborative hub where teams can share resources — prompts, actors, actions, and projects — while executing plans in the cloud. This enables a consistent experience across all your devices: start a complex task on your laptop, check progress from your phone, and review results from any machine. !!! note "Runtime Foundation" While CleverAgents leverages LangGraph and LangChain for the underlying LLM runtime primitives (tool calling, graphs, routing), its value lies in what it builds on top of these foundations. !!! success "Core Capabilities" - [x] A **first-class plan lifecycle** (Action templates driving Strategize / Execute / Apply phases) for breaking down and tracking complex work - [x] A **project + resource model** for grounding tasks in real codebases, databases, documents, and infrastructure - [x] A consistent **actor abstraction** for defining and composing intelligent agents - [x] An independently registered **resource abstraction** for representing anything that can be read, written, or queried - [x] An independently registered **tool abstraction** for reusable, callable operations with resource bindings - [x] A **validation abstraction** that extends the tool concept with pass/fail semantics and resource-centric attachment with optional project/plan scoping - [x] A consistent **skill abstraction** for organizing tools into composable capability collections - [x] A **sandbox + checkpoint** safety model for safe, reversible execution - [x] A **CLI/TUI/Web UX** for controlling and monitoring large multi-step autonomous work !!! example "Advanced Subsystems" - A scalable **Advanced Context Management System (ACMS)** with a Universal Knowledge Ontology (UKO), a demand-driven Context Request Protocol (CRP), pluggable context strategies, a fusion coordinator, and hot/warm/cold tiers with per-actor views. - **Invariants** as first-class constraints (global, project, action, and plan scoped) that flow into the decision tree, with precedence-based conflict resolution via the Invariant Reconciliation Actor. - A future-facing ==correction model== where the user can "edit the decision tree" and only recompute affected subtrees. ### Standards Alignment CleverAgents deliberately adopts open, versioned protocols wherever possible so that clients, tools, and skills can interoperate without bespoke integrations. !!! tip "Guiding Principles" 1. **Prefer open protocols** — align with community standards to keep integrations portable and reduce vendor lock-in. 2. **Keep adapters at the edge** — standards map into stable internal domain models so core logic remains protocol-agnostic. The following standards are integrated into the architecture: | Standard | Role | Key Benefit | | :------- | :--- | :---------- | | **ACP** (Agent Client Protocol) | Versioned client-server contract for sessions, plan lifecycle, registry access, and event streaming | Clients are interchangeable; enables reliable remote execution in server mode | | **MCP** (Model Context Protocol) | Discovering and invoking external tools over a server boundary | Plug-and-play access to a growing ecosystem of tool providers | | **LSP** (Language Server Protocol) | IDE integration via an LSP server surfacing plan-aware code actions and diagnostics | Editor-agnostic IDE support without bespoke plugins | | **Agent Skills** ([AgentSkills.io](https://AgentSkills.io)) | Packaging instruction-driven, multi-step workflows as `SKILL.md` with progressive disclosure | Teaches agents *how* to accomplish complex tasks, complementing MCP tools | ??? info "Agent Client Protocol (ACP) -- Details" Defines the versioned client-server contract for sessions, plan lifecycle, registry access, and event streaming across all Presentation-layer clients (CLI, TUI, Web, IDE). This makes clients interchangeable and enables reliable remote execution in server mode. ??? info "Model Context Protocol (MCP) -- Details" The standard for discovering and invoking external tools over a server boundary. MCP servers are bridged into the Tool Registry via adapters, giving CleverAgents plug-and-play access to a growing ecosystem of tool providers. ??? info "Language Server Protocol (LSP) -- Details" The standard for IDE integration. The CleverAgents IDE plugin is an LSP server that surfaces plan-aware code actions, diagnostics, and context lookups, communicating with the backend exclusively through ACP. This provides editor-agnostic IDE support without bespoke plugins. ??? info "Agent Skills (AgentSkills.io) -- Details" The standard for packaging instruction-driven, multi-step workflows as `SKILL.md` with progressive disclosure. Agent Skills complement MCP tools by teaching agents *how* to accomplish complex tasks rather than simply exposing callable functions. ## Glossary ???+ abstract "Plan Lifecycle" Plan : A ==ULID-identified==, hierarchical unit of work instantiated from an Action template. Progresses through four phases — **Action**, **Strategize**, **Execute**, **Apply** — persisting a decision tree at each step. May spawn child plans. Scoped to one or more projects. Top-level plans carry a namespaced name (`[[server:]namespace/]name`); child plans are identified solely by their plan ID (ULID). All plans are referenced by plan ID when precision is needed, especially in hierarchies containing subplans. Action : A YAML-defined, reusable plan template specifying a description, definition of done, strategy/execution actors, typed arguments, and optional invariants. Project-agnostic until bound to one or more projects via `agents plan use`, which instantiates a Plan. Namespaced as `[[server:]namespace/]name`. Strategize : Second phase of the plan lifecycle (following the Action phase). The first phase where active processing occurs. ==Read-only==: the strategy actor produces the initial decision tree — strategy choices, invariant enforcement records, resource selections, child plan blueprints — without modifying any resources. Execute : Third phase of the plan lifecycle. The execution actor carries out decisions from Strategize — invoking tools, spawning child plans, producing artifacts, creating checkpoints — with all mutations confined to a sandbox. May also create additional decisions constrained by Strategize-phase decisions, based on runtime discoveries. Apply : Fourth and final phase of the plan lifecycle. Merges the sandbox changeset into real project resources. Terminal states: `applied` (success), `constrained` (cannot complete — may revert to Strategize), `errored` (failed), `cancelled` (user/system cancelled). Decision : A persisted choice point in a plan's decision tree, created during Strategize or Execute. Records the question, chosen option, alternatives, confidence score, rationale, context snapshot, and downstream dependencies. Types: `prompt_definition`, `invariant_enforced`, `strategy_choice`, `subplan_spawn`, `subplan_parallel_spawn`, among others. Supports targeted correction with selective subtree recomputation. Invariant : A natural-language constraint on plan execution scoped to global, project, action, or plan level. Precedence: ==plan > action > project > global==. Reconciled by the Invariant Reconciliation Actor at the start of Strategize; recorded as `invariant_enforced` decisions that propagate to child plans. Automation Profile : A named set of confidence thresholds (each `0.0`–`1.0`) gating which plan operations proceed automatically versus requiring human approval. `0.0` = always automatic; `1.0` = always manual. Eight built-in profiles (`manual` through `full-auto`). Custom profiles namespaced as `[[server:]namespace/]name`. ???+ abstract "Projects & Resources" Project : A named scope linking resources (from the Resource Registry), context policies, invariants, and validation attachments. Does not own resources; a single resource may be linked to multiple projects. Identified solely by its namespaced name (`[[server:]namespace/]name`) — no ULID is generated. May be local or remote. Resource : A ULID-identified entity registered in the Resource Registry representing anything readable, writable, or queryable (git repos, filesystems, databases, etc.). Classified as physical or virtual, typed by a Resource Type, and organized in a DAG via parent/child links. Resource Type : A schema-level definition constraining a category of resources. Specifies accepted CLI arguments, physical/virtual classification, permitted parent/child type relationships, auto-discovery rules, sandbox strategy, and handler implementation. Built-in types (e.g., `git-checkout`, `fs-mount`) are unnamespaced; custom types are namespaced as `[[server:]namespace/]name`. Physical Resource : A resource bound to a concrete, located artifact — a specific file at a specific path, a specific repo at a specific URL. Directly readable and writable by tools. Two physical resources with identical content remain distinct instances. Virtual Resource : A resource representing an abstract equivalence identity that links physical resources sharing the same content, hash, or name. ==Has no location; cannot be directly read or written.== Equivalence relationships update when underlying physical resources diverge. Resource Binding : The association between a tool and the resources it operates on, declared via typed resource slots. Slots resolve through **contextual binding** (from the plan's project), **static binding** (hardcoded at registration), or **parameter binding** (passed at invocation). Resource Registry : The persistent catalog of all registered resources and their DAG relationships (parent/child links). One of the core registries, alongside the Tool Registry, Skill Registry, Actor Registry, and Provider Registry. ???+ abstract "Tools & Skills" Tool : The ==atomic unit of execution==: a namespaced, independently registered callable operation. Defined by JSON Schema inputs/outputs, capability metadata (`read_only`, `writes`, `checkpointable`), and a four-stage lifecycle (`discover` / `activate` / `execute` / `deactivate`). Sources: MCP servers, Agent Skills folders, built-ins, or custom Python. Namespaced as `[[server:]namespace/]name`. Validation : A Tool subtype adding: a `mode` (`required` | `informational`) controlling whether failure blocks execution; a structured JSON return with mandatory `passed` boolean, optional `data`, and optional `message`. ==Always read-only== (`writes = false`, `checkpointable = false`). May wrap an existing Tool via `wraps` + `transform`. Managed via `agents validation add/attach/detach`; always attached to a resource, optionally scoped to a project or plan. Anonymous Tool : An inline tool definition embedded in a skill YAML or actor graph node. Same schema as a named tool but unregistered, unnamespaced, and scoped only to its defining context. Skill : A composable, namespaced collection of tools assembled by referencing named tools, defining inline anonymous tools, including other skills, or exposing MCP server tools and Agent Skills ([AgentSkills.io](https://AgentSkills.io)) tools. Actors reference skills by name to acquire capabilities. Namespaced as `[[server:]namespace/]name`. MCP (Model Context Protocol) : A standard for exposing tools and resources over a server boundary via JSON-RPC. CleverAgents discovers MCP tools through the `MCPToolAdapter` and registers them in the Tool Registry with extended capability metadata. MCP tools can be composed into skills and used as tool nodes in actor graphs. Agent Skills ([AgentSkills.io](https://AgentSkills.io)) : A standard for packaging instruction-driven, multi-step workflows as `SKILL.md` files with optional `scripts/`, `references/`, and `assets/` directories, using progressive disclosure. Surfaced as tools inside skills and loaded on demand by the actor runtime. ???+ abstract "Actors & Sessions" Actor : A YAML-configured conversational unit — either a single LLM/agent or a composed LangGraph of actors and tool nodes. Specialized roles: strategy actor, execution actor, estimation actor, invariant reconciliation actor. Namespaced as `[[server:]namespace/]name`. Session : A persistent conversation thread tied to an orchestrator actor. Maintains message history across plans and serves as the user's natural-language interface. Server : An optional shared backend providing multi-user storage, namespace resolution, and remote plan execution. ???+ abstract "Protocols & Standards" ACP (Agent Client Protocol) : A versioned client-server protocol that defines authentication, session lifecycle, plan operations, registry access, and event streaming for all Presentation-layer clients (CLI, TUI, Web, IDE plugin). In local mode ACP maps to in-process service facade calls; in server mode it is implemented by the REST API over HTTPS. LSP (Language Server Protocol) : A standard for IDE integration. The CleverAgents IDE plugin runs as an LSP server that translates code actions and diagnostics into plan operations and validation results, communicating with the backend through ACP. Enables editor-agnostic IDE support without bespoke plugins per editor. ???+ abstract "Naming & Identity" Namespace : The scoping segment in the name format `[[server:]namespace/]name`. Defaults to `local/` when omitted. `local/` is reserved for local-only items. Non-`local/` namespaces with server omitted assume the default configured server. Built-in LLM actors use provider prefixes (e.g., `openai/`, `anthropic/`). Built-in resource types are unnamespaced. ULID : ==Universally Unique Lexicographically Sortable Identifier.== Assigned to plans, decisions, resources, correction attempts, and validation attachments. Projects, actions, skills, and tools use their namespaced name as sole identifier instead. ???+ abstract "Context Management (ACMS)" ACMS (Advanced Context Management System) : The pluggable, strategy-driven framework for assembling actor context. Comprises the UKO, CRP, pluggable context strategies, the Context Assembly Pipeline, and hot/warm/cold tiered storage with per-actor scoped views. UKO (Universal Knowledge Ontology) : An RDF-based, inheritance-driven ontology representing resources at multiple abstraction levels with provenance and temporal versioning. Four layers: universal foundation, domain specializations (software, documents, data schemas, infrastructure), paradigm/format specializations (procedural programming, markdown), and technology-specific (Python, PostgreSQL). ==Semantically aware — implicit relationships are inferred from content analysis.== CRP (Context Request Protocol) : A structured vocabulary through which actors declare needed information, desired detail depth, and scope. Context Strategy : A pluggable retrieval component that searches for and assembles ContextFragments using a specific approach (keyword search, semantic embedding, graph navigation, temporal archaeology, etc.). Registered with the Context Assembly Pipeline; executed in parallel by the StrategyExecutor. Context Assembly Pipeline : The central ACMS orchestrator. Ten pluggable Protocol-defined components in three phases: **Strategy Orchestration**, **Fragment Fusion**, and **Context Finalization**. Each component ships with a default implementation and is overridable at global, project, or plan scope. Skeleton (context) : A compressed representation of a plan's accumulated context produced by the SkeletonCompressor. Propagated from parent plans to child plans as inherited context. Size governed by the `skeleton_ratio` budget parameter. ## CLI Commands !!! adr "Architecture Decision" The CLI command structure, output rendering, and interaction patterns are defined in [ADR-021: CLI and Output Rendering](adr/ADR-021-cli-and-output-rendering.md). ### Command Synopsis
agents|cleveragents [--data-dir <DATA_PATH>] [--config-path <CONFIG_PATH>]
[--format (rich|color|table|plain|json|yaml)]
[--help|-h] [--version]
[--install-completion [<INST_SHELL>]] [--show-completion [<SHOW_SHELL>]]
[-v...] <COMMAND> [<ARGS>...]
agents version
agents info
agents diagnostics
agents init [--yes|-y]
agents session create [--actor <ACTOR>]
agents session list
agents session show <SESSION_ID>
agents session delete [--yes|-y] <SESSION_ID>
agents session export [(--output|-o) <FILE>] <SESSION_ID>
agents session import (--input|-i) <FILE>
agents session tell --session <SESSION_ID> [--actor <ACTOR>] [--stream] <PROMPT>
agents project create [(--description|-d) <DESC>] [--resource <RESOURCE>]...
[--invariant <INVARIANT>]... [--invariant-actor <ACTOR>] <NAME>
agents project link-resource [--read-only] <PROJECT> <RESOURCE>
agents project unlink-resource [--yes|-y] <PROJECT> <RESOURCE_NAME>
agents project list [(--namespace|-n) NS] [<REGEX>]
agents project show <PROJECT>
agents validation add (--config|-c) <FILE> [--update]
agents validation attach [--project <PROJECT>|--plan <PLAN_ID>]
<RESOURCE> <VALIDATION> [<ARGS>...]
agents validation detach [--yes|-y] <ATTACHMENT_ID>
agents project delete [--force|-f] [--yes|-y] <NAME>
agents project context set[--view (strategize|execute|apply|default)]
[--include-resource <INCLUDE_RESOURCE>]...
[--exclude-resource <EXCLUDE_RESOURCE>]...
[--include-path <INCLUDE_GLOB>]...
[--exclude-path <EXCLUDE_GLOB>]...
[--hot-max-tokens <N>]
[--warm-max-decisions <N_WARM_MAX>]
[--cold-max-decisions <N_COLD_MAX>]
[--query-limit <N>]
[--max-file-size <MAX_FILE_BYTES>]
[--max-total-size <MAX_TOTAL_BYTES>]
[--summarize|--no-summarize]
[--summary-max-tokens <N>]
[--strategy <STRATEGY>]...
[--default-breadth <N>]
[--default-depth <INT_OR_NAME>]
[--depth-gradient <HOP:INT_OR_NAME>]...
[--skeleton-ratio <FLOAT>]
[--temporal-scope (current|recent|all)]
[--auto-refresh|--no-auto-refresh]
[--clear] <PROJECT>
agents project context show [--view (strategize|execute|apply|default)]
<PROJECT>
agents project context inspect [--view (strategize|execute|apply|default)]
[--strategy <STRATEGY>]
[--focus <UKO_URI>]...
[--breadth <N>] [--depth <INT_OR_NAME>]
<PROJECT>
agents project context simulate [--view (strategize|execute|apply|default)]
[--budget <TOKENS>]
[--focus <UKO_URI>]...
[--strategy <STRATEGY>]...
<PROJECT>
agents actor run [(--output|-o) <OUTPUT_FILE>]
[-v...] [--unsafe|-u] [--context <CONTEXT_NAME>]
[--context-dir <CONTEXT_PATH>] [--load-context <LOAD_CONTEXT_NAME>]
[(--temperature|-t) <TEMP>] [--allow-rxpy-in-run-mode]
[--skill <SKILL>]... <NAME> <PROMPT>
agents actor add (--config|-c) <FILE> [--update]
agents actor remove <NAME>
agents actor list
agents actor show <NAME>
agents actor context remove [--yes|-y] (--all|-a|<NAME>)
agents actor context list [<REGEX>]
agents actor context show <NAME>
agents actor context export (--output|-o) <FILE> <NAME>
agents actor context import [--update] (--input|-i) <FILE> [<NAME>]
agents actor context clear [--yes|-y] (--all|-a|<NAME>)
agents skill add (--config|-c) <FILE> [--update]
agents skill remove [--yes|-y] <NAME>
agents skill list [(--namespace|-n) <NS>] [--source <SOURCE>]
agents skill show <NAME>
agents skill tools <NAME>
agents tool add (--config|-c) <FILE> [--update]
agents tool remove [--yes|-y] <NAME>
agents tool list [(--namespace|-n) <NS>] [--source <SOURCE>] [--type (tool|validation)] [<REGEX>]
agents tool show <NAME>
agents resource type add (--config|-c) <FILE> [--update]
agents resource type remove [--yes|-y] <NAME>
agents resource type list [<REGEX>]
agents resource type show <NAME>
agents resource add [(--description|-d) <DESC>] [--update] <TYPE> <NAME> [type-specific-flags...]
agents resource remove [--yes|-y] <NAME>
agents resource list [--all] [(--type|-t) <TYPE>]
agents resource show <RESOURCE>
agents resource inspect [--tree] [--file <PATH>] <RESOURCE>
agents resource tree [(--depth|-d) <N>] [(--type|-t) <TYPE>] <RESOURCE>
agents resource link-child <PARENT> <CHILD>
agents resource unlink-child [--yes|-y] <PARENT> <CHILD>
agents plan list [--phase <PHASE>] [--state <STATE>] [--project <PROJECT>]
[--action <ACTION>] [<REGEX>]
agents plan use [--automation-profile <PROFILE>]
[--invariant <INVARIANT>]...
[--strategy-actor <STRATEGY_ACTOR>]
[--execution-actor <EXEC_ACTOR>]
[--estimation-actor <EST_ACTOR>]
[--invariant-actor <INV_ACTOR>]
[--arg/-a name=value]...
<ACTION> <PROJECT>...
agents plan execute <PLAN_ID>
agents plan apply [--yes|-y] <PLAN_ID>
agents plan status <PLAN_ID>
agents plan cancel [(--reason|-r) <REASON>] <PLAN_ID>
agents plan tree [--show-superseded] <PLAN_ID>
agents plan explain [--show-context] [--show-reasoning] <DECISION_ID>
agents plan correct --mode (revert|append) (--guidance|-g) <GUIDANCE>
[--dry-run] [--yes|-y] <DECISION_ID>
agents plan diff (--correction <CORRECTION_ATTEMPT_ID>|<PLAN_ID>)
agents plan artifacts <PLAN_ID>
agents plan prompt <PLAN_ID> <GUIDANCE>
agents plan rollback [--yes|-y] <PLAN_ID> <CHECKPOINT_ID>
agents action create (--config|-c) <CFG_FILE>
agents action list [(--namespace|-n) <NS>] [(--state|-s) <STATE>] [<REGEX>]
agents action show <ACTION_NAME>
agents action archive <ACTION_NAME>
agents automation-profile add (--config|-c) <FILE> [--update]
agents automation-profile remove [--yes|-y] <NAME>
agents automation-profile list [<REGEX>]
agents automation-profile show <NAME>
agents config set <key> <value>
agents config get <key>
agents config list [--filter-values <REGEX>] [<REGEX>]
agents invariant add [--global] [(--project|-p) PROJECT] [--plan PLAN_ID]...
[--action ACTION]... <INVARIANT_TEXT>
agents invariant list [--global] [(--project|-p) PROJECT] [--plan PLAN_ID] [--action ACTION]
[--effective] [<REGEX>]
agents invariant remove [--yes|-y] <INVARIANT_ID>
$ agents --data-dir /srv/cleveragents --config-path /srv/cleveragents/config.toml info
╭─ System Snapshot ─────────────────╮
│ CleverAgents 1.0.0 │
│ Mode: local │
│ Automation: review │
│ Status: ready │
╰───────────────────────────────────╯
╭─ Paths ───────────────────────────────╮
│ Data Dir: /srv/cleveragents │
│ Config: /srv/cleveragents/config.toml │
│ Logs: /srv/cleveragents/logs │
│ Cache: /srv/cleveragents/cache │
│ Database: /srv/cleveragents/agents.db │
╰───────────────────────────────────────╯
╭─ Runtime ──────────╮
│ PID: 4127 │
│ Uptime: 00:14:32 │
│ Python: 3.13.1 │
│ Host: devbox.local │
│ Platform: linux │
╰────────────────────╯
╭─ Projects & Sessions ─╮
│ Projects: 2 │
│ Sessions: 1 active │
│ Active Plans: 0 │
│ Actors: 3 │
╰───────────────────────╯
✓ OK Environment loaded
agents version
$ agents version
╭─ CLI Version ────╮
│ CleverAgents CLI │
│ Version: 1.0.0 │
│ Channel: stable │
│ Python: 3.13 │
╰──────────────────╯
╭─ Build ────────────────╮
│ Build Date: 2026-02-08 │
│ Commit: a17c3f9 │
│ Schema: v3 │
│ Platform: linux-x86_64 │
╰────────────────────────╯
╭─ Dependencies ─────────────────╮
│ LangGraph: 0.2.60 │
│ LangChain: 0.3.18 │
│ MCP SDK: 1.4.0 │
│ Pydantic: 2.10.4 │
╰────────────────────────────────╯
✓ OK Version reported
agents info
$ agents info
╭─ Environment ───────────────────────────────────────────────╮
│ Data Dir: /home/alex/.cleveragents │
│ Config: /home/alex/.cleveragents/config.toml │
│ Database: sqlite:///home/alex/.cleveragents/cleveragents.db │
│ Server Mode: disabled │
│ Platform: Linux 6.8.0 (x86_64) │
╰─────────────────────────────────────────────────────────────╯
╭─ Runtime ─────────────────────────╮
│ Automation: review │
│ Providers: 3 configured │
│ Sessions: 2 active │
│ Active Plans: 1 │
╰───────────────────────────────────╯
╭─ Storage ─────╮
│ Cache: 118 MB │
│ Logs: 42 MB │
│ Backups: 3 │
│ DB Size: 8 MB │
╰───────────────╯
╭─ Indexing ─────────────╮
│ Text Index: ready │
│ Vector Index: ready │
│ Graph Store: disabled │
│ Indexed Files: 1,247 │
╰────────────────────────╯
✓ OK Environment details ready
agents diagnostics
$ agents diagnostics
╭─ Checks ────────────────────────────────╮
│ Check Status Details │
│ ─────────────── ────── ────────────── │
│ Config file OK readable │
│ Database OK writable │
│ OPENAI_API_KEY WARN missing │
│ Anthropic key OK configured │
│ Disk space OK 2.1 GB free │
│ Text index OK tantivy 0.22 │
│ Vector index OK faiss (CPU) │
│ Graph store WARN not configured │
│ File permissions OK data dir r/w │
│ Git OK git 2.43.0 │
╰─────────────────────────────────────────╯
╭─ Summary ─────────╮
│ Checks: 10 total │
│ Warnings: 2 │
│ Errors: 0 │
│ Duration: 0.6s │
╰───────────────────╯
╭─ Recommendations ─────────────────────────────────────────────╮
│ - Set OPENAI_API_KEY to enable OpenAI models │
│ - Configure a graph store backend for structural code queries │
│ - Verify provider credentials via config │
╰───────────────────────────────────────────────────────────────╯
⚠ WARN 2 warnings require attention
$ agents diagnostics
╭─ Checks ────────────────────────────────────────────╮
│ Check Status Details │
│ ─────────────── ─────── ──────────────────── │
│ Config file OK readable │
│ Database ERROR locked by another process │
│ OPENAI_API_KEY OK configured │
│ Anthropic key ERROR invalid key format │
│ Disk space WARN 312 MB free (low) │
│ Text index OK tantivy 0.22 │
│ Vector index ERROR FAISS library not found │
│ Graph store OK neo4j 5.15 │
│ File permissions OK data dir r/w │
│ Git OK git 2.43.0 │
╰─────────────────────────────────────────────────────╯
╭─ Summary ─────────╮
│ Checks: 10 total │
│ Warnings: 1 │
│ Errors: 3 │
│ Duration: 1.2s │
╰───────────────────╯
╭─ Errors (must fix) ─────────────────────────────────────────────────╮
│ 1. Database is locked by PID 12847 — stop the other process or │
│ delete the lock file at ~/.cleveragents/agents.db-lock │
│ 2. Anthropic key starts with "pk-" — expected "sk-ant-" prefix │
│ Run: agents config set provider.anthropic.api-key │
│ 3. FAISS library not installed — vector search will not work │
│ Run: pip install faiss-cpu │
╰─────────────────────────────────────────────────────────────────────╯
✗ ERROR 3 errors must be resolved before CleverAgents can operate
agents init [--yes|-y]
$ agents init
Warning: This will remove all data in /home/alex/.cleveragents
Continue? [y/N]: y
╭─ Environment Reset ────────────────────────────────╮
│ Config: /home/alex/.cleveragents/config.toml │
│ Database: /home/alex/.cleveragents/cleveragents.db │
│ Backup: /home/alex/.cleveragents.backup-2026-02-08 │
│ Status: ready │
╰────────────────────────────────────────────────────╯
╭─ Defaults ──────────────────────────────────╮
│ Automation Profile: supervised │
│ Built-in Profiles: 8 loaded │
╰─────────────────────────────────────────────╯
╭─ Created ─────────────────╮
│ Config: config.toml │
│ Database: cleveragents.db │
│ Logs: logs/ │
│ Cache: cache/ │
│ Backups: backups/ │
╰───────────────────────────╯
╭─ Schema ───────────────────────╮
│ Version: v3 │
│ Tables: 12 created │
│ Migrations: up to date │
╰────────────────────────────────╯
✓ OK Environment initialized
$ agents init --yes
╭─ Initialized ──────────────────────────────────────────╮
│ Data Dir: /home/alex/.cleveragents (created) │
│ Config: /home/alex/.cleveragents/config.toml │
│ Database: initialized (schema v3) │
│ Directories: logs, cache, sessions, contexts │
╰────────────────────────────────────────────────────────╯
✓ OK Initialized (non-interactive)
agents session create [--actor <ACTOR>]
$ agents session create --actor local/orchestrator
╭─ Session ───────────────────────╮
│ ID: 01HXM2A6K1P2E9Q9D4GQ7J4S7Z │
│ Actor: local/orchestrator │
│ Created: 2026-02-08 12:44 │
│ Namespace: local │
╰─────────────────────────────────╯
╭─ Settings ─────────────╮
│ Automation: review │
│ Streaming: off │
│ Context: default │
│ Memory: enabled │
│ Max History: 50 turns │
╰────────────────────────╯
╭─ Actor Details ───────────────────╮
│ Provider: anthropic │
│ Model: claude-3.5 │
│ Temperature: 0.7 │
│ Context Window: 200K tokens │
╰───────────────────────────────────╯
✓ OK Session created
agents session list
$ agents --format table session list
╭─ Sessions ───────────────────────────────────────────────────────────────────╮
│ ID Name Actor Messages Updated │
│ ──────── ─────────────── ────────────────── ──────── ──────────────── │
│ 01HXM2A6 weekly-planning local/orchestrator 6 2026-02-08 12:44 │
│ 01HXM1F2 refactor-sprint local/orchestrator 14 2026-02-07 18:11 │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Summary ────────────────────╮
│ Total: 2 │
│ Most Recent: weekly-planning │
│ Oldest: refactor-sprint │
│ Total Messages: 20 │
│ Storage: 42 KB │
╰──────────────────────────────╯
✓ OK 2 sessions listed
agents session show <SESSION_ID>
$ agents session show 01HXM2A6K1P2E9Q9D4GQ7J4S7Z
╭─ Session Summary ───────────────╮
│ ID: 01HXM2A6K1P2E9Q9D4GQ7J4S7Z │
│ Actor: local/orchestrator │
│ Messages: 6 │
│ Created: 2026-02-08 12:30 │
│ Updated: 2026-02-08 12:44 │
│ Automation: review │
╰─────────────────────────────────╯
╭─ Recent Messages ──────────────────────────────────╮
│ user Create an action to refresh dependency locks │
│ assistant Plan created, running commands... │
│ assistant Completed 2 commands │
╰────────────────────────────────────────────────────╯
╭─ Linked Plans ────────────────────────────────╮
│ Plan ID Phase State │
│ ────────────────────────── ────── ──────── │
│ 01HXM8C2ZK4Q7C2B3F2R4VYV6J execute complete │
╰───────────────────────────────────────────────╯
╭─ Token Usage ──────────────╮
│ Input Tokens: 3,420 │
│ Output Tokens: 1,185 │
│ Estimated Cost: $0.0184 │
╰────────────────────────────╯
✓ OK Session details loaded
agents session delete [--yes|-y] <SESSION_ID>
$ agents session delete 01HXM2A6K1P2E9Q9D4GQ7J4S7Z
Delete session 01HXM2A6K1P2E9Q9D4GQ7J4S7Z? [y/N]: y
╭─ Deletion Summary ──────────────────╮
│ Session: 01HXM2A6K1P2E9Q9D4GQ7J4S7Z │
│ ID: 01HXM2A6K1P2E9Q9D4GQ7J4S7Z │
│ Messages: 6 removed │
│ Storage: 18 KB freed │
│ Plans Orphaned: 0 │
╰─────────────────────────────────────╯
╭─ Cleanup ───────────╮
│ Backups: none │
│ Logs: preserved │
│ Context: cleared │
│ Checkpoints: none │
╰─────────────────────╯
✓ OK Session deleted
agents session export [(--output|-o) <FILE>] <SESSION_ID>
$ agents session export --output /tmp/weekly-planning.json 01HXM2A6K1P2E9Q9D4GQ7J4S7Z
╭─ Session Export ────────────────────╮
│ Session: 01HXM2A6K1P2E9Q9D4GQ7J4S7Z │
│ Output: /tmp/weekly-planning.json │
│ Messages: 6 │
│ Size: 24 KB │
│ Format: JSON │
╰─────────────────────────────────────╯
╭─ Contents ─────────────────╮
│ Messages: 6 │
│ Plan References: 1 │
│ Metadata Keys: 2 │
│ Actor Config: included │
│ Schema Version: v3 │
╰────────────────────────────╯
╭─ Integrity ──────────────────╮
│ Checksum: sha256:7a9b...42c1 │
│ Encrypted: no │
╰──────────────────────────────╯
✓ OK Export completed
agents session import (--input|-i) <FILE>
$ agents session import --input /tmp/weekly-planning.json
╭─ Session Import ────────────────────────╮
│ Input: /tmp/weekly-planning.json │
│ Session ID: 01HXM3D3B2W4CQYQ3P4ZB8A5T1 │
│ Messages: 6 │
│ Schema: v3 │
╰─────────────────────────────────────────╯
╭─ Validation ────────────╮
│ Checksum: verified │
│ Schema: compatible │
│ Actor Ref: resolved │
╰─────────────────────────╯
╭─ Merge ──────────────╮
│ Existing: none │
│ Strategy: create new │
╰──────────────────────╯
✓ OK Import completed
agents session tell --session <SESSION_ID> [--actor <ACTOR>] [--stream] <PROMPT>
$ agents session tell "Create an action to refresh dependency locks and add it to the platform project" \
--session 01HXM2A6K1P2E9Q9D4GQ7J4S7Z
╭─ Plan Request ──────────────────────────────────────────╮
│ Actor: local/orchestrator │
│ Session: 01HXM2A6K1P2E9Q9D4GQ7J4S7Z │
│ Automation: review │
│ Prompt: Create an action to refresh dependency locks... │
╰─────────────────────────────────────────────────────────╯
╭─ Commands Executed ─────────────────────────────────────────────────────────────────────────────────────────╮
│ - agents action create --config ./actions/refresh-locks.yaml │
│ - agents resource add git-checkout local/platform-repo --path /repos/platform │
│ - agents project link-resource local/platform local/platform-repo │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Result ──────────────────────────╮
│ Action: local/refresh-locks │
│ Project: local/platform │
│ Resource: local/platform-repo │
╰───────────────────────────────────╯
╭─ Usage ─────────────────────╮
│ Input Tokens: 1,842 │
│ Output Tokens: 624 │
│ Cost: $0.0094 │
│ Duration: 3.2s │
│ Tool Calls: 3 │
╰─────────────────────────────╯
✓ OK Orchestrator completed 3 commands
$ agents session tell --session 01HXM2A6K1 --stream "What files were changed in the last plan?"
╭─ Session ──────────────────────────╮
│ ID: 01HXM2A6K1P2E9Q9D4GQ7J4S7Z │
│ Actor: local/orchestrator │
│ Mode: streaming │
╰────────────────────────────────────╯
▍ The last plan (01HXM8C2ZK) modified 6 files in the auth module:
1. `src/auth/session.py` — refactored session validation
2. `src/auth/tokens.py` — updated token expiry to 7200s
3. `src/auth/__init__.py` — updated exports
4. `tests/test_auth.py` — added 12 new test cases
5. `tests/test_session.py` — updated session fixtures
6. `docs/auth.md` — updated API documentation
All changes passed validation (24/24 tests, lint clean).
╭─ Usage ──────────────────╮
│ Tokens: 1,240 (stream) │
│ Duration: 3.1s │
│ Tool Calls: 2 │
╰──────────────────────────╯
✓ OK Stream complete
agents project create [(--description|-d) <DESC>] [--resource <RESOURCE>]...
[--invariant <INVARIANT>]... [--invariant-actor <ACTOR>] <NAME>
$ agents project create --description "Backend API" local/api-service
╭─ Project ──────────────────────╮
│ Name: local/api-service │
│ Description: Backend API │
│ Type: local │
│ Created: 2026-02-08 12:46 │
╰────────────────────────────────╯
╭─ Paths ────────────────────────────────────╮
│ Root: /repos/api-service │
│ Data Dir: /repos/api-service/.cleveragents │
╰────────────────────────────────────────────╯
╭─ Defaults ──────────────────────────────╮
│ Sandbox: git_worktree │
│ Validations: 0 │
│ Context Filters: none │
│ Automation Profile: (inherits global) │
╰─────────────────────────────────────────╯
╭─ Resources ──────╮
│ Total: 0 │
│ Indexed: 0 │
│ Sandboxable: 0 │
╰──────────────────╯
✓ OK Project created
$ agents project create -d "Frontend web application" \
--resource local/web-repo --resource local/web-db \
--invariant "All components must have unit tests" \
--invariant "CSS must pass stylelint checks" \
--invariant-actor local/invariant-resolver \
local/web-app
╭─ Project Created ─────────────────────╮
│ Name: local/web-app │
│ Description: Frontend web app │
│ Remote: no │
╰───────────────────────────────────────╯
╭─ Linked Resources ───────────────────────────────────────╮
│ Name Type Read-Only │
│ ───────────────── ────────────── ───────── │
│ local/web-repo git-checkout no │
│ local/web-db local/database no │
╰──────────────────────────────────────────────────────────╯
╭─ Invariants ────────────────────────────────────╮
│ 1. All components must have unit tests │
│ 2. CSS must pass stylelint checks │
│ Reconciliation Actor: local/invariant-resolver │
╰─────────────────────────────────────────────────╯
✓ OK Project created
agents project link-resource [--read-only] <PROJECT> <RESOURCE>
$ agents resource add git-checkout local/api-repo --path /repos/api --branch main
$ agents project link-resource local/api-service local/api-repo
╭─ Resource Linked ───────────────────────╮
│ Project: local/api-service │
│ Resource: local/api-repo │
│ Type: git-checkout │
│ Read-Only: no │
╰─────────────────────────────────────────╯
╭─ Access ─────────────────╮
│ Read: allowed │
│ Write: allowed │
│ Apply: requires approval │
╰──────────────────────────╯
╭─ Indexing ─────────────────────╮
│ Status: indexing... │
│ Files Found: 347 │
│ Language: Python (primary) │
│ Estimated Time: ~20 seconds │
╰────────────────────────────────╯
✓ OK Resource linked to project
agents project unlink-resource [--yes|-y] <PROJECT> <RESOURCE_NAME>
$ agents project unlink-resource local/api-service local/api-repo
Unlink local/api-repo from local/api-service? [y/N]: y
╭─ Resource Unlinked ─────────────────────────────────╮
│ Project: local/api-service │
│ Resource: local/api-repo │
│ Type: git-checkout │
╰─────────────────────────────────────────────────────╯
╭─ Index Cleanup ──────────╮
│ Text Index: 347 removed │
│ Vectors: 892 removed │
│ Graph Triples: cleared │
│ Duration: 0.3s │
╰──────────────────────────╯
╭─ Project Summary ──────────────╮
│ Linked Resources: 1 remaining │
│ Last Updated: 2026-02-09 10:30 │
│ Active Plans: 0 │
╰────────────────────────────────╯
✓ OK Resource unlinked from project
agents project list [(--namespace|-n) NS] [<REGEX>]
$ agents --format table project list
╭─ Projects ────────────────────────────────────────────────────╮
│ Name Resources Remote Active Plans │
│ ───────────────── ───────── ────── ──────────── │
│ local/api-service 2 No 1 │
│ local/docs 1 No 0 │
╰───────────────────────────────────────────────────────────────╯
╭─ Summary ──────────────────╮
│ Total: 2 │
│ With Resources: 2 │
│ Remote: 0 │
│ Total Resources: 3 │
│ Indexed Files: 1,247 │
│ Active Plans: 1 │
╰────────────────────────────╯
✓ OK 2 projects listed
agents project show <PROJECT>
$ agents project show local/api-service
╭─ Project Details ──────────────╮
│ Name: local/api-service │
│ Description: Backend API │
│ Resources: 2 │
│ Remote: no │
│ Created: 2026-02-08 12:46 │
╰────────────────────────────────╯
╭─ Linked Resources ──────────────────────────────────────────────────────╮
│ Resource Type Sandbox Read-Only │
│ ──────────────── ────────────── ──────────────────── ───────── │
│ local/api-repo git-checkout git_worktree no │
│ local/staging-db local/database transaction_rollback yes │
╰─────────────────────────────────────────────────────────────────────────╯
╭─ Validations (3) ──────────────────────────────────────────────────────────────────╮
│ local/run-tests Run unit tests with coverage required │
│ resource: local/api-repo scope: project (attachment: 01HXM5A1B2C3D4E5F6G7…)│
│ local/lint-check Lint check required │
│ resource: local/api-repo scope: direct (always active) (attachment: 01HXM5…)│
│ local/check-bundle-size Check bundle size (advisory) info │
│ resource: local/api-repo scope: project (attachment: 01HXM5D4E5F6G7H8J9…)│
╰───────────────────────────────────────────────────────────────────────────────────╯
╭─ Context ───────────────────╮
│ Include: repo │
│ Exclude: **/node_modules/** │
│ Max File Size: 1 MB │
╰─────────────────────────────╯
╭─ Indexing Status ──────────╮
│ Text Index: ready │
│ Vector Index: ready │
│ Graph Store: disabled │
│ Indexed Files: 347 │
│ Last Indexed: 12:48 │
╰────────────────────────────╯
╭─ Active Plans ──────────────────────────╮
│ Plan ID Action Phase │
│ ──────── ─────────────────── ─────── │
│ 01HXM7A9 local/code-coverage execute │
╰─────────────────────────────────────────╯
✓ OK Project loaded
agents project delete [--force|-f] [--yes|-y] <NAME>
$ agents project delete local/docs
Delete project local/docs? This cannot be undone. [y/N]: y
╭─ Deletion Summary ──────────────────╮
│ Project: local/docs │
│ Resources: 1 unlinked │
│ Data Dir: /repos/docs/.cleveragents │
╰─────────────────────────────────────╯
╭─ Index Cleanup ────────╮
│ Text Index: cleared │
│ Vectors: 240 removed │
│ Graph Triples: none │
│ Storage Freed: 12 MB │
╰────────────────────────╯
╭─ Backups ────────────────────────────────────╮
│ Snapshot: /backups/local-docs-2026-02-08.tgz │
│ Retention: 7 days │
╰──────────────────────────────────────────────╯
✓ OK Project deleted
$ agents project delete local/api-service
Delete project local/api-service? [y/N]: y
╭─ Delete Blocked ──────────────────────────────────────────╮
│ Cannot delete: project has active plans │
│ Active Plans: 2 │
│ 01HXM7A9 — execute/processing (local/code-coverage) │
│ 01HXM4J1 — strategize/processing (local/refactor-api) │
╰───────────────────────────────────────────────────────────╯
╭─ Resolution ──────────────────────────────────────────────────────╮
│ - Cancel or complete active plans first, or │
│ - Use --force to cancel all active plans and delete the project │
╰───────────────────────────────────────────────────────────────────╯
✗ ERROR Delete blocked — 2 active plans
$ agents project delete --force --yes local/api-service
╭─ Force Delete ─────────────────────────────────────────╮
│ Cancelling: 2 active plans │
│ 01HXM7A9 — cancelled (was execute/processing) │
│ 01HXM4J1 — cancelled (was strategize/processing) │
╰────────────────────────────────────────────────────────╯
╭─ Deleted ────────────────────╮
│ Project: local/api-service │
│ Resources Unlinked: 2 │
│ Validations Detached: 3 │
│ Plans Cancelled: 2 │
│ Context Policies: cleared │
╰──────────────────────────────╯
✓ OK Project force-deleted
agents project context set[--view (strategize|execute|apply|default)]
[--include-resource <INCLUDE_RESOURCE>]...
[--exclude-resource <EXCLUDE_RESOURCE>]...
[--include-path <INCLUDE_GLOB>]...
[--exclude-path <EXCLUDE_GLOB>]...
[--hot-max-tokens <N>]
[--warm-max-decisions <N_WARM_MAX>]
[--cold-max-decisions <N_COLD_MAX>]
[--query-limit <N>]
[--max-file-size <MAX_FILE_BYTES>]
[--max-total-size <MAX_TOTAL_BYTES>]
[--summarize|--no-summarize]
[--summary-max-tokens <N>]
[--strategy <STRATEGY>]...
[--default-breadth <N>]
[--default-depth <INT_OR_NAME>]
[--depth-gradient <HOP:INT_OR_NAME>]...
[--skeleton-ratio <FLOAT>]
[--temporal-scope (current|recent|all)]
[--auto-refresh|--no-auto-refresh]
[--clear] <PROJECT>
$ agents project context set --view strategize \
--include-resource repo --exclude-path "**/node_modules/**" \
--hot-max-tokens 12000 --warm-max-decisions 50 --cold-max-decisions 200 \
--summarize --summary-max-tokens 800 local/api-service
╭─ Context Policy ────────────╮
│ Project: local/api-service │
│ View: strategize │
│ Include: repo │
│ Exclude: **/node_modules/** │
╰─────────────────────────────╯
╭─ Limits ─────────────────────╮
│ Hot Tokens: 12000 (soft cap) │
│ Warm Decisions: 50 │
│ Cold Decisions: 200 │
│ Query Limit: 20 │
│ Max File Size: 1 MB │
│ Max Total Size: 50 MB │
╰──────────────────────────────╯
╭─ Summarization ─╮
│ Enabled: yes │
│ Max Tokens: 800 │
╰─────────────────╯
╭─ Other Views ────────╮
│ execute: (default) │
│ apply: (default) │
│ default: (unset) │
╰──────────────────────╯
✓ OK Context policy updated
agents project context show [--view (strategize|execute|apply|default)]
<PROJECT>
$ agents project context show --view strategize local/api-service
╭─ Context Policy ────────────╮
│ Project: local/api-service │
│ View: strategize │
│ Include: repo │
│ Exclude: **/node_modules/** │
╰─────────────────────────────╯
╭─ Limits ─────────────────────╮
│ Hot Tokens: 12000 (soft cap) │
│ Warm Decisions: 50 │
│ Cold Decisions: 200 │
│ Query Limit: 20 │
│ Max File Size: 1 MB │
│ Max Total Size: 50 MB │
╰──────────────────────────────╯
╭─ Summarization ─╮
│ Enabled: yes │
│ Max Tokens: 800 │
╰─────────────────╯
╭─ Current Usage ──────────────╮
│ Hot Context: 8,420 / 12,000 │
│ Warm Entries: 12 / 50 │
│ Cold Entries: 47 / 200 │
│ Indexed Resources: 1 │
╰──────────────────────────────╯
✓ OK Context policy loaded
agents project context inspect [--view (strategize|execute|apply|default)]
[--strategy <STRATEGY>]
[--focus <UKO_URI>]...
[--breadth <N>] [--depth <INT_OR_NAME>]
<PROJECT>
$ agents project context inspect --view execute --focus uko-py:module/src.auth --breadth 2 local/api-service
╭─ ACMS Context Inspection ────────────────────────────────────────╮
│ Project: local/api-service │
│ View: execute │
│ Focus: uko-py:module/src.auth │
│ Breadth: 2 hops │ Depth: 3 (MEMBER_SUMMARY) │
╰──────────────────────────────────────────────────────────────────╯
╭─ UKO Graph (2-hop neighborhood) ─────────────────────────────────╮
│ uko-py:module/src.auth (depth 9/FULL_SOURCE, 1,240 tokens) │
│ ├─ contains → uko-py:class/AuthHandler (depth 3, 320 tokens) │
│ ├─ contains → uko-py:class/TokenValidator (depth 3, 280 tok) │
│ ├─ imports → uko-py:module/src.db (depth 0, 90 tokens) │
│ └─ imports → uko-py:module/src.config (depth 0, 60 tok) │
╰──────────────────────────────────────────────────────────────────╯
╭─ Active Strategies ──────────────────────────────────────────────╮
│ breadth-depth-navigator quality=0.85 budget=45% 4 fragments │
│ semantic-embedding quality=0.60 budget=35% 6 fragments │
│ simple-keyword quality=0.30 budget=20% 3 fragments │
╰──────────────────────────────────────────────────────────────────╯
╭─ Budget ─────────────────────────────╮
│ Model Window: 128,000 tokens │
│ Response Reserve: 4,096 tokens │
│ Tool Definitions: 2,400 tokens │
│ System Prompt: 1,200 tokens │
│ Skeleton Reserve: 18,046 (15%) │
│ Available Budget: 102,258 tokens │
│ Used: 1,990 / 102,258 (1.9%) │
╰──────────────────────────────────────╯
✓ OK Context inspection complete
agents project context simulate [--view (strategize|execute|apply|default)]
[--budget <TOKENS>]
[--focus <UKO_URI>]...
[--strategy <STRATEGY>]...
<PROJECT>
$ agents project context simulate --view strategize --budget 16000 \
--focus uko-py:module/src.auth --focus uko-py:module/src.db \
local/api-service
╭─ ACMS Simulation ────────────────────────────────────────────────╮
│ Project: local/api-service │
│ View: strategize │
│ Budget: 16,000 tokens (override) │
│ Focus: uko-py:module/src.auth, uko-py:module/src.db │
╰──────────────────────────────────────────────────────────────────╯
╭─ Strategy Results ───────────────────────────────────────────────╮
│ breadth-depth-navigator │
│ Confidence: 0.85 │ Budget: 7,200 tokens │ 12 fragments │
│ Top: src/auth/__init__.py (depth 9, 1,240t, score=0.95) │
│ src/db/models.py (depth 3, 480t, score=0.88) │
│ │
│ semantic-embedding │
│ Confidence: 0.60 │ Budget: 5,600 tokens │ 8 fragments │
│ Top: src/auth/jwt.py (depth 3, 380t, score=0.82) │
│ src/middleware/auth_check.py (depth 3, 290t, score=0.79) │
│ │
│ simple-keyword │
│ Confidence: 0.30 │ Budget: 3,200 tokens │ 5 fragments │
│ Top: src/auth/utils.py (depth 6, 210t, score=0.71) │
╰──────────────────────────────────────────────────────────────────╯
╭─ Fusion Result ──────────────────────────────────────────────────╮
│ Included: 18 fragments (14,820 tokens, 92.6% of budget) │
│ Excluded: 7 fragments (3,200 tokens, below budget cutoff) │
│ Deduplicated: 4 fragments merged │
│ Skeleton: 2,400 tokens (15% reserve) │
│ Preamble: 180 tokens │
╰──────────────────────────────────────────────────────────────────╯
✓ OK Simulation complete (dry run — no context was assembled)
agents actor run [(--output|-o) <OUTPUT_FILE>]
[-v...] [--unsafe|-u] [--context <CONTEXT_NAME>]
[--context-dir <CONTEXT_PATH>] [--load-context <LOAD_CONTEXT_NAME>]
[(--temperature|-t) <TEMP>] [--allow-rxpy-in-run-mode]
[--skill <SKILL>]... <NAME> <PROMPT>
$ agents actor run --context docs local/code_reader "Summarize the README"
╭─ Run Summary ─────────────────╮
│ Actor: local/code_reader │
│ Context: docs │
│ Temperature: 0.2 │
│ Provider: anthropic │
│ Model: claude-3.5 │
╰───────────────────────────────╯
╭─ Inputs ─────────────────────╮
│ Prompt: Summarize the README │
│ Context Files: 3 │
│ Context Size: 12.4 KB │
╰──────────────────────────────╯
╭─ Result Metrics ───────╮
│ Output: stdout │
│ Input Tokens: 1,524 │
│ Output Tokens: 842 │
│ Duration: 1.8s │
│ Cost: $0.0021 │
│ Tool Calls: 0 │
╰────────────────────────╯
✓ OK Summary generated
$ agents actor run --temperature 0.2 --skill local/code-analysis \
local/reviewer "Review the auth module for security issues"
╭─ Actor Run ─────────────────────────╮
│ Actor: local/reviewer │
│ Type: agent │
│ Temperature: 0.2 │
│ Skill: local/code-analysis │
╰─────────────────────────────────────╯
╭─ Response ────────────────────────────────────────────────────────╮
│ I identified 3 potential security concerns in the auth module: │
│ │
│ 1. Token expiry not validated in `validate_session()` at │
│ src/auth/session.py:42. The JWT expiry claim is decoded but │
│ not checked against current time. │
│ │
│ 2. Missing rate limiting on the `/auth/refresh` endpoint. │
│ An attacker could brute-force refresh tokens. │
│ │
│ 3. Low severity: Password hashing uses bcrypt with cost=10. │
│ Consider cost=12 for production deployments. │
╰───────────────────────────────────────────────────────────────────╯
╭─ Usage ──────────────╮
│ Tokens: 2,840 │
│ Duration: 4.2s │
│ Cost: $0.009 │
│ Tool Calls: 6 │
╰──────────────────────╯
✓ OK Actor run completed
$ agents actor run --output review.md local/reviewer "Write a code review report"
╭─ Actor Run ───────────────╮
│ Actor: local/reviewer │
│ Output: review.md │
│ Tokens: 4,120 │
│ Duration: 6.8s │
╰───────────────────────────╯
✓ OK Output written to review.md (2.4 KB)
agents actor add (--config|-c) <FILE> [--update]
$ agents actor add --config ./actors/reviewer.yaml
╭─ Actor Added ────────╮
│ Name: local/reviewer │
│ Provider: openai │
│ Model: gpt-4 │
│ Default: yes │
│ Unsafe: no │
│ Type: graph │
╰──────────────────────╯
╭─ Config ─────────────────────╮
│ Path: ./actors/reviewer.yaml │
│ Hash: 8b3f3d2 │
│ Options: 4 │
│ Nodes: 3 │
│ Edges: 4 │
╰──────────────────────────────╯
╭─ Capabilities ───────╮
│ - code review │
│ - diff summarization │
│ - lint guidance │
╰──────────────────────╯
╭─ Tools ────────────────────────╮
│ Tool Read-Only Safe │
│ ──────────── ───────── ──── │
│ read_file yes yes │
│ search_files yes yes │
│ git_diff yes yes │
╰────────────────────────────────╯
✓ OK Actor added
$ agents actor add --config ./actors/reviewer.yaml
╭─ Error ─────────────────────────────────────────────────╮
│ Actor already exists: local/reviewer │
│ Registered: 2026-02-07 14:22 │
│ Use --update to replace the existing actor definition. │
╰─────────────────────────────────────────────────────────╯
✗ ERROR Actor already registered — use --update to replace
$ agents actor add --config ./actors/reviewer.yaml --update
╭─ Actor Updated ─────────────────────╮
│ Name: local/reviewer │
│ Type: agent │
│ Status: updated │
╰─────────────────────────────────────╯
╭─ Changes ────────────────────────────╮
│ Skills: +1 (local/code-analysis) │
│ Model: unchanged │
│ Graph: updated │
╰──────────────────────────────────────╯
✓ OK Actor updated
agents actor remove <NAME>
$ agents actor remove local/reviewer
╭─ Actor Removed ──────╮
│ Name: local/reviewer │
│ Provider: openai │
│ Model: gpt-4 │
╰──────────────────────╯
╭─ Impact ───────────────────────────────────╮
│ Sessions: 0 affected │
│ Active Plans: 0 affected │
│ Actions Referencing: 0 │
╰────────────────────────────────────────────╯
╭─ Cleanup ──────────────╮
│ Config: kept on disk │
│ Contexts: 1 orphaned │
╰────────────────────────╯
✓ OK Actor removed
agents actor list
$ agents actor list
╭─ Actors ──────────────────────────────────────────────────────────────╮
│ Name Provider Model Default Built-in Unsafe │
│ ────────────── ───────── ────────── ─────── ──────── ────── │
│ local/reviewer openai gpt-4 ✓ no │
│ openai/gpt-4 openai gpt-4 ✓ no │
│ anthropic/3.5 anthropic claude-3.5 ✓ no │
╰───────────────────────────────────────────────────────────────────────╯
╭─ Summary ──────────────╮
│ Total: 3 │
│ Built-in: 2 │
│ Custom: 1 │
│ Unsafe: 0 │
│ Providers Used: 2 │
╰────────────────────────╯
✓ OK 3 actors listed
agents actor show <NAME>
$ agents actor show local/reviewer
╭─ Actor Details ────────────────────╮
│ Name: local/reviewer │
│ Provider: openai │
│ Model: gpt-4 │
│ Default: yes │
│ Built-in: no │
│ Unsafe: no │
│ Type: graph │
│ Created: 2026-02-08 12:35 │
│ Updated: 2026-02-08 12:40 │
│ Config: ./actors/reviewer.yaml │
│ Config Hash: 9c4e2a1 │
╰────────────────────────────────────╯
╭─ Options ──────────╮
│ - temperature: 0.2 │
│ - max_tokens: 2048 │
│ - top_p: 1.0 │
╰────────────────────╯
╭─ Graph Structure ─╮
│ Nodes: 3 │
│ Edges: 4 │
│ Entry: analyze │
│ Exit: report │
╰───────────────────╯
╭─ Tools ────────────────────────╮
│ Tool Read-Only Safe │
│ ──────────── ───────── ──── │
│ read_file yes yes │
│ search_files yes yes │
│ git_diff yes yes │
╰────────────────────────────────╯
╭─ Access ────────────╮
│ Unsafe: no │
│ Filesystem: allowed │
│ Network: restricted │
╰─────────────────────╯
╭─ Usage ─────────────────────────────────────────╮
│ Referenced by Actions: 1 (local/code-coverage) │
│ Active in Sessions: 0 │
│ Total Runs: 14 │
│ Avg Cost/Run: $0.0032 │
╰─────────────────────────────────────────────────╯
✓ OK Actor loaded
agents actor context remove [--yes|-y] (--all|-a|<NAME>)
$ agents actor context remove docs
╭─ Context Removed ───────────╮
│ Context: docs │
│ Status: removed │
╰─────────────────────────────╯
╭─ Stats ───────────────────╮
│ Remaining Size: 48 KB │
│ Updated: 2026-02-08 13:06 │
╰───────────────────────────╯
✓ OK Context updated
agents actor context list [<REGEX>]
$ agents actor context list docs
╭─ Context Files ──────────────────────────────╮
│ Name Type Size Added │
│ ──────────────── ──── ─────── ────────── │
│ README.md file 4.2 KB 02-08 12:10 │
│ docs/overview.md file 12.8 KB 02-08 12:10 │
│ docs/cli.md file 9.5 KB 02-08 12:10 │
╰──────────────────────────────────────────────╯
╭─ Stats ───────────────────────╮
│ Total Files: 3 │
│ Total Size: 26.5 KB │
│ Estimated Tokens: ~6,600 │
│ Languages: Markdown │
╰───────────────────────────────╯
✓ OK 3 files listed
agents actor context show <NAME>
$ agents actor context show docs
╭─ Context Summary ───────────╮
│ Context: docs │
│ Files: 3 │
│ Total Size: 26.5 KB │
│ Estimated Tokens: ~6,600 │
│ Created: 2026-02-08 12:10 │
╰─────────────────────────────╯
✓ OK Context displayed
agents actor context export (--output|-o) <FILE> <NAME>
$ agents actor context export --output /tmp/docs-context.json docs
╭─ Context Export ───────────────╮
│ Context: docs │
│ Output: /tmp/docs-context.json │
│ Items: 12 │
│ Size: 48 KB │
╰────────────────────────────────╯
╭─ Integrity ──────────────────╮
│ Checksum: sha256:19b2...a7d0 │
│ Compressed: no │
╰──────────────────────────────╯
✓ OK Export completed
agents actor context import [--update] (--input|-i) <FILE> [<NAME>]
$ agents actor context import --input /tmp/docs-context.json docs
╭─ Context Import ──────────────╮
│ Context: docs │
│ Input: /tmp/docs-context.json │
│ Items: 12 │
╰───────────────────────────────╯
╭─ Merge ───────────╮
│ Strategy: replace │
│ Conflicts: 0 │
╰───────────────────╯
✓ OK Import completed
agents actor context clear [--yes|-y] (--all|-a|<NAME>)
$ agents actor context clear docs
Clear context docs? [y/N]: y
╭─ Context Cleared ────╮
│ Context: docs │
│ Items: 12 removed │
│ Storage: 48 KB freed │
╰──────────────────────╯
╭─ Retention ────────╮
│ Context: preserved │
│ Files: removed │
╰────────────────────╯
✓ OK Context cleared
agents skill add (--config|-c) <FILE> [--update]
$ agents skill add --config ./skills/devops-toolkit.yaml
╭─ Skill Registered ────────────────────────╮
│ Name: local/devops-toolkit │
│ Description: Full-stack development tools │
│ Config: ./skills/devops-toolkit.yaml │
│ Created: 2026-02-08 13:10 │
╰───────────────────────────────────────────╯
╭─ Includes ────────────────────╮
│ local/file-ops (registered) │
│ local/git-ops (registered) │
│ local/github (registered) │
╰───────────────────────────────╯
╭─ Tool Sources ────────────────────────────────╮
│ Source Count Details │
│ ───────────── ───── ─────────────────── │
│ builtin 14 file, dir, git, shell │
│ mcp 6 github (4), linear (2) │
│ agent_skill 2 deploy, code-review │
│ custom 1 run_migrations │
│ ───────────── ───── ─────────────────── │
│ Total: 23 │
╰───────────────────────────────────────────────╯
╭─ MCP Servers ────────────────────╮
│ linear: validated (2 tools) │
╰──────────────────────────────────╯
✓ OK Skill registered with 23 tools
$ agents skill add --config ./skills/devops-toolkit-v2.yaml
✗ Error: Skill 'local/devops-toolkit' is already registered.
To overwrite the existing configuration, re-run with --update:
agents skill add --config ./skills/devops-toolkit-v2.yaml --update
$ agents skill add --config ./skills/devops-toolkit-v2.yaml --update
╭─ Skill Updated ───────────────────────────╮
│ Name: local/devops-toolkit │
│ Description: Full-stack development tools │
│ Updated: 2026-02-08 14:22 │
╰───────────────────────────────────────────╯
╭─ Changes ─────────────────────╮
│ Tools Added: 2 │
│ Tools Removed: 0 │
│ Tools Modified: 1 │
│ Includes Changed: no │
│ MCP Servers Changed: no │
╰───────────────────────────────╯
╭─ Affected Actors ─────────────────────────────╮
│ Warning: 2 actors reference this skill: │
│ - local/code-assistant │
│ - local/full-stack-assistant │
│ These actors will pick up changes on next use │
╰───────────────────────────────────────────────╯
✓ OK Skill updated (23 → 25 tools)
agents skill remove [--yes|-y] <NAME>
$ agents skill remove local/devops-toolkit
Remove skill local/devops-toolkit? [y/N]: y
╭─ Skill Removed ──────────────────────╮
│ Name: local/devops-toolkit │
│ Tools: 23 removed from registry │
│ MCP Servers: 1 connection closed │
╰──────────────────────────────────────╯
╭─ Dependency Check ─────────────────────────────────╮
│ Warning: 1 skill includes this skill: │
│ - local/full-stack-dev (will lose devops tools) │
│ Warning: 2 actors reference this skill: │
│ - local/code-assistant │
│ - local/full-stack-assistant │
╰────────────────────────────────────────────────────╯
✓ OK Skill removed
agents skill list [(--namespace|-n) <NS>] [--source <SOURCE>]
$ agents skill list
╭─ Skills ────────────────────────────────────────────────────────────╮
│ Name Tools Includes Sources │
│ ────────────────────── ───── ──────── ────────────────────── │
│ local/file-ops 9 0 builtin │
│ local/git-ops 4 0 builtin │
│ local/github 4 0 mcp │
│ local/devops-toolkit 23 3 builtin, mcp, custom │
│ local/full-stack-dev 25 4 builtin, mcp, custom │
╰─────────────────────────────────────────────────────────────────────╯
╭─ Summary ─────────╮
│ Total: 5 │
│ Local: 5 │
│ Server: 0 │
│ Total Tools: 28 │
╰───────────────────╯
✓ OK 5 skills listed
agents skill show <NAME>
$ agents skill show local/devops-toolkit
╭─ Skill Details ──────────────────────────────╮
│ Name: local/devops-toolkit │
│ Description: Full-stack development tools │
│ Config: ./skills/devops-toolkit.yaml │
│ Created: 2026-02-08 13:10 │
│ Updated: 2026-02-08 14:22 │
╰──────────────────────────────────────────────╯
╭─ Includes (3) ────────────────────────────╮
│ local/file-ops → 9 tools (builtin) │
│ local/git-ops → 4 tools (builtin) │
│ local/github → 4 tools (mcp) │
╰───────────────────────────────────────────╯
╭─ Direct Tools (6) ────────────────────────────────────────╮
│ Name Source Writes Checkpoint │
│ ──────────────── ─────────── ────── ────────── │
│ create_issue mcp:linear yes no │
│ list_issues mcp:linear no — │
│ deploy-to-staging agent_skill yes composite │
│ code-review agent_skill no — │
│ run_migrations custom yes transaction │
│ shell_execute builtin yes snapshot │
╰───────────────────────────────────────────────────────────╯
╭─ MCP Servers (1) ───────────────────╮
│ linear: stdio, 2 tools, connected │
╰─────────────────────────────────────╯
╭─ Capability Summary ──────────╮
│ Total Tools: 23 │
│ Read-Only: 10 │
│ Writes: 13 │
│ Checkpointable: 10 │
│ Has Side Effects: 3 │
│ Requires Approval: 1 │
╰───────────────────────────────╯
╭─ Referenced By ───────────────────╮
│ Actors: local/code-assistant │
│ Skills: local/full-stack-dev │
╰───────────────────────────────────╯
✓ OK Skill loaded
agents skill tools <NAME>
$ agents skill tools local/devops-toolkit
╭─ Tools for local/devops-toolkit ─────────────────────────────────────────────────────────╮
│ Tool Source From Skill Read-Only Writes Checkpoint │
│ ───────────────── ─────────── ────────────── ───────── ────── ────────── │
│ read_file builtin local/file-ops ✓ — — │
│ write_file builtin local/file-ops — ✓ file │
│ edit_file builtin local/file-ops — ✓ file │
│ delete_file builtin local/file-ops — ✓ file │
│ move_file builtin local/file-ops — ✓ file │
│ copy_file builtin local/file-ops — ✓ file │
│ create_directory builtin local/file-ops — ✓ file │
│ list_directory builtin local/file-ops ✓ — — │
│ delete_directory builtin local/file-ops — ✓ file │
│ git_status builtin local/git-ops ✓ — — │
│ git_diff builtin local/git-ops ✓ — — │
│ git_log builtin local/git-ops ✓ — — │
│ git_blame builtin local/git-ops ✓ — — │
│ create_issue mcp:github local/github — ✓ no │
│ create_pr mcp:github local/github — ✓ no │
│ list_repos mcp:github local/github ✓ — — │
│ get_file_contents mcp:github local/github ✓ — — │
│ create_issue mcp:linear (direct) — ✓ no │
│ list_issues mcp:linear (direct) ✓ — — │
│ run_migrations custom (direct) — ✓ transaction │
│ deploy-to-staging agent_skill (direct) — ✓ composite │
│ code-review agent_skill (direct) ✓ — — │
│ shell_execute builtin (direct) — ✓ snapshot │
╰──────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Summary ──────────────────╮
│ Total: 23 │
│ From Includes: 17 │
│ Direct: 6 │
│ Read-Only: 10 │
│ Writes: 13 │
│ Checkpointable: 10 │
╰────────────────────────────╯
✓ OK 23 tools listed
agents tool add (--config|-c) <FILE> [--update]
$ agents tool add --config ./tools/run-migrations.yaml
╭─ Tool Registered ────────────────────────────╮
│ Name: local/run-migrations │
│ Description: Run database migrations │
│ Source: custom │
│ Config: ./tools/run-migrations.yaml │
│ Created: 2026-02-09 10:15 │
╰──────────────────────────────────────────────╯
╭─ Capability ─────────────────────╮
│ Writes: true │
│ Write Scope: database:migrations │
│ Checkpointable: true │
│ Checkpoint Scope: transaction │
│ Side Effects: schema_mutation │
╰──────────────────────────────────╯
✓ OK Tool registered
$ agents tool add --config ./tools/run-migrations-v2.yaml
✗ Error: Tool 'local/run-migrations' is already registered.
To overwrite the existing configuration, re-run with --update:
agents tool add --config ./tools/run-migrations-v2.yaml --update
$ agents tool add --config ./tools/db-migrate.yaml --update
╭─ Tool Updated ─────────────────────────────╮
│ Name: local/db-migrate │
│ Source: custom (Python) │
│ Status: updated (was version 1 → now 2) │
╰────────────────────────────────────────────╯
╭─ Changes ─────────────────────────────────────╮
│ Input Schema: modified (added batch_size) │
│ Capabilities: unchanged (writes, checkpoint) │
│ Description: updated │
╰───────────────────────────────────────────────╯
╭─ References ──────────────────╮
│ Skills: 1 (local/db-tools) │
│ Actors: 0 │
│ Referencing skills will use │
│ the updated definition. │
╰───────────────────────────────╯
✓ OK Tool updated
agents tool remove [--yes|-y] <NAME>
$ agents tool remove local/run-migrations
Remove tool local/run-migrations? [y/N]: y
╭─ Tool Removed ────────────────────╮
│ Name: local/run-migrations │
│ Source: custom │
╰───────────────────────────────────╯
╭─ References ──────────────────────────────────────╮
│ Warning: This tool is referenced by: │
│ - Skill: local/devops-toolkit │
│ - Actor graph node: code_executor.run_db_migrate │
│ These references will break until resolved. │
╰───────────────────────────────────────────────────╯
✓ OK Tool removed
$ agents tool remove local/check-bundle-size
Remove validation local/check-bundle-size? [y/N]: y
╭─ Validation Removed ─────────────────────────────╮
│ Name: local/check-bundle-size │
│ Description: Check bundle size (advisory) │
╰──────────────────────────────────────────────────╯
╭─ Detached From ────────────────────────────────────────────╮
│ Warning: This validation had 2 attachments: │
│ - local/api-repo (scope: project local/api-service) │
│ - local/api-repo (direct) │
│ These attachments have been removed. │
╰───────────────────────────────────────────────────────────╯
✓ OK Validation removed
agents tool list [(--namespace|-n) <NS>] [--source <SOURCE>] [--type (tool|validation)] [<REGEX>]
$ agents tool list --namespace local
╭─ Tools ─────────────────────────────────────────────────────────────────╮
│ Name Type Source Read-Only Writes │
│ ───────────────────────── ────────── ─────── ───────── ────── │
│ local/run-migrations tool custom — ✓ │
│ local/validate-api-compat tool custom — ✓ │
│ local/create-subplan tool custom — ✓ │
│ local/deploy-staging tool agent — ✓ │
│ local/run-tests validation custom ✓ — │
│ local/lint-check validation custom ✓ — │
│ local/check-bundle-size validation custom ✓ — │
│ local/type-check validation custom ✓ — │
╰─────────────────────────────────────────────────────────────────────────╯
╭─ Summary ────────────────╮
│ Total: 8 │
│ Tools: 4 │
│ Validations: 4 │
│ Read-Only: 4 │
│ Writes: 4 │
╰──────────────────────────╯
✓ OK 8 tools listed
$ agents tool list --type validation --namespace local
╭─ Validations ────────────────────────────────────────────────────────────────────╮
│ Name Source Mode Attachments │
│ ───────────────────────── ─────── ──────────── ──────────────────────── │
│ local/run-tests custom required 2 (1 direct, 1 project) │
│ local/lint-check custom required 1 (1 direct) │
│ local/check-bundle-size custom informational 1 (1 project) │
│ local/type-check custom required 2 (2 project) │
╰──────────────────────────────────────────────────────────────────────────────────╯
╭─ Summary ──────────────╮
│ Total: 4 │
│ Required: 3 │
│ Informational: 1 │
╰────────────────────────╯
✓ OK 4 validations listed
agents tool show <NAME>
$ agents tool show local/run-migrations
╭─ Tool Details ───────────────────────────────╮
│ Name: local/run-migrations │
│ Description: Run database migrations │
│ Source: custom │
│ Config: ./tools/run-migrations.yaml │
│ Registered: 2026-02-09 10:15 │
╰──────────────────────────────────────────────╯
╭─ Input Schema ─────────────────────────────────╮
│ direction: string (required) enum: [up, down] │
│ count: integer (default: 1) │
╰────────────────────────────────────────────────╯
╭─ Capability ──────────────────────╮
│ Read-Only: false │
│ Writes: true │
│ Write Scope: database:migrations │
│ Checkpointable: true │
│ Checkpoint Scope: transaction │
│ Side Effects: schema_mutation │
│ Idempotent: false │
╰───────────────────────────────────╯
╭─ Referenced By ───────────────────────╮
│ Skills: │
│ - local/devops-toolkit │
│ Actor Graph Nodes: │
│ - code_executor.run_db_migrate │
╰───────────────────────────────────────╯
✓ OK Tool details loaded
$ agents tool show local/run-tests
╭─ Validation Details ──────────────────────────────╮
│ Name: local/run-tests │
│ Type: validation │
│ Description: Run unit tests with coverage │
│ Source: custom │
│ Mode: required │
│ Config: ./validations/run-tests.yaml │
│ Registered: 2026-02-09 10:15 │
╰───────────────────────────────────────────────────╯
╭─ Input Schema ─────────────────────────────────────╮
│ coverage_threshold: integer (default: 80) │
╰────────────────────────────────────────────────────╯
╭─ Output Schema (Validation Return Format) ─────────╮
│ passed: boolean (required) │
│ message: string (optional) │
│ data: object (optional, arbitrary structure) │
╰────────────────────────────────────────────────────╯
╭─ Capability ──────────────────────╮
│ Read-Only: true (enforced) │
│ Checkpointable: false (enforced) │
│ Timeout: 600s │
╰───────────────────────────────────╯
╭─ Attached To ─────────────────────────────────────────────────────╮
│ local/api-repo (direct, always active) │
│ (attachment: 01HXM5B2C3D4E5F6G7H8J9K0L1) │
│ local/api-repo (scope: project local/api-service) │
│ (attachment: 01HXM5A1B2C3D4E5F6G7H8J9K0) │
╰──────────────────────────────────────────────────────────────────╯
✓ OK Validation details loaded
agents validation add (--config|-c) <FILE> [--update]
$ agents validation add --config ./validations/run-tests.yaml
╭─ Validation Registered ────────────────────────────────╮
│ Name: local/run-tests │
│ Description: Run unit tests with coverage │
│ Source: custom │
│ Mode: required │
│ Config: ./validations/run-tests.yaml │
│ Created: 2026-02-09 10:15 │
╰────────────────────────────────────────────────────────╯
╭─ Capability ────────────────────────╮
│ Read-Only: true (enforced) │
│ Checkpointable: false (enforced) │
│ Timeout: 600s │
╰─────────────────────────────────────╯
✓ OK Validation registered
$ agents validation add --config ./validations/lint-check.yaml
╭─ Validation Registered ──────────────╮
│ Name: local/lint-check │
│ Description: Lint check │
│ Source: custom │
│ Mode: required │
│ Timeout: 300s │
╰───────────────────────────────────────╯
✓ OK Validation registered
$ agents validation add --config ./validations/check-bundle-size.yaml
╭─ Validation Registered ───────────────────────────╮
│ Name: local/check-bundle-size │
│ Description: Check bundle size (advisory) │
│ Source: custom │
│ Mode: informational │
│ Timeout: 300s │
╰───────────────────────────────────────────────────╯
✓ OK Validation registered
agents validation attach [--project <PROJECT>|--plan <PLAN_ID>]
<RESOURCE> <VALIDATION> [<ARGS>...]
$ agents validation attach --project local/api-service local/api-repo local/run-tests
╭─ Validation Attached ──────────────────────────────────────╮
│ Attachment ID: 01HXM5A1B2C3D4E5F6G7H8J9K0 │
│ Validation: local/run-tests │
│ Mode: required │
│ Resource: local/api-repo │
│ Scope: project local/api-service │
╰────────────────────────────────────────────────────────────╯
✓ OK Validation attached
$ agents validation attach local/api-repo local/lint-check
╭─ Validation Attached ──────────────────────────────────────╮
│ Attachment ID: 01HXM5B2C3D4E5F6G7H8J9K0L1 │
│ Validation: local/lint-check │
│ Mode: required │
│ Resource: local/api-repo │
│ Scope: direct (always active) │
│ This validation will run for ALL plans/projects │
│ that access this resource. │
╰────────────────────────────────────────────────────────────╯
✓ OK Validation attached
$ agents validation attach --project local/api-service local/api-repo local/run-tests --coverage-threshold 90
╭─ Validation Attached ──────────────────────────────────────╮
│ Attachment ID: 01HXM5C3D4E5F6G7H8J9K0L1M2 │
│ Validation: local/run-tests │
│ Mode: required │
│ Resource: local/api-repo │
│ Scope: project local/api-service │
│ Args: coverage_threshold=90 │
╰────────────────────────────────────────────────────────────╯
✓ OK Validation attached
agents validation detach [--yes|-y] <ATTACHMENT_ID>
$ agents validation detach 01HXM5A1B2C3D4E5F6G7H8J9K0
Detach validation local/run-tests from resource local/api-repo (scope: project local/api-service)? [y/N]: y
╭─ Validation Detached ───────────────────────────────────────╮
│ Attachment ID: 01HXM5A1B2C3D4E5F6G7H8J9K0 │
│ Validation: local/run-tests │
│ Resource: local/api-repo │
│ Scope: project local/api-service │
╰─────────────────────────────────────────────────────────────╯
✓ OK Validation detached
agents resource type add (--config|-c) <FILE> [--update]
$ agents resource type add --config ./resource-types/svn.yaml
╭─ Resource Type ────────────────────╮
│ Name: local/svn │
│ Physical/Virtual: physical │
│ User Addable: yes │
│ Registered: 2026-02-09 10:15 │
╰────────────────────────────────────╯
╭─ CLI Arguments ────────────────────────╮
│ Argument Required Description │
│ ──────────── ──────── ───────────── │
│ --url yes Repository URL │
│ --checkout no Local checkout │
╰────────────────────────────────────────╯
╭─ Child Types ──────────────────────────╮
│ Auto-discover: svn-revision, svn-file │
│ Manual link: fs-mount │
╰────────────────────────────────────────╯
╭─ Sandbox ──────────────────────╮
│ Strategy: copy_on_write │
│ Handler: SVNHandler (custom) │
╰────────────────────────────────╯
✓ OK Resource type registered
ℹ New subcommand available: agents resource add local/svn
agents resource type remove [--yes|-y] <NAME>
$ agents resource type remove local/svn
Remove resource type local/svn? [y/N]: y
╭─ Resource Type Removed ───────╮
│ Name: local/svn │
│ Resources Using: 0 │
│ Subcommand Removed: yes │
╰───────────────────────────────╯
✓ OK Resource type removed
agents resource type list [<REGEX>]
$ agents resource type list
╭─ Resource Types ──────────────────────────────────────────────────────────────────────────────────╮
│ Name Source Phys/Virt Addable Auto-children │
│ ─────────────────── ──────── ───────── ─────── ────────────────────────────────────── │
│ git-checkout built-in physical yes git, fs-directory │
│ git built-in physical yes git-remote, git-branch, git-tag, │
│ git-commit, git-stash, git-submodule │
│ git-remote built-in physical no (none) │
│ git-branch built-in physical no git-commit │
│ git-tag built-in physical no (none) │
│ git-commit built-in physical no git-tree │
│ git-tree built-in physical no git-tree-entry │
│ git-tree-entry built-in physical no (none) │
│ git-stash built-in physical no (none) │
│ git-submodule built-in physical no (none) │
│ fs-mount built-in physical yes fs-directory │
│ fs-directory built-in physical yes fs-file, fs-directory, │
│ fs-symlink, fs-hardlink │
│ fs-file built-in physical no (none) │
│ fs-symlink built-in physical no (none) │
│ fs-hardlink built-in physical no (none) │
│ file built-in virtual no (none) │
│ directory built-in virtual no (none) │
│ symlink built-in virtual no (none) │
│ commit built-in virtual no (none) │
│ branch built-in virtual no (none) │
│ tag built-in virtual no (none) │
│ remote built-in virtual no (none) │
│ submodule built-in virtual no (none) │
│ tree built-in virtual no (none) │
│ local/svn custom physical yes svn-revision, svn-file │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Summary ─────────────────╮
│ Built-in: 24 │
│ Custom: 1 │
│ User Addable: 4 │
╰───────────────────────────╯
✓ OK 25 resource types listed
agents resource type show <NAME>
$ agents resource type show git-checkout
╭─ Resource Type ──────────────────────────────────────────────────────╮
│ Name: git-checkout │
│ Source: built-in │
│ Description: A locally checked-out git repository with worktree │
│ Physical/Virtual: physical │
│ User Addable: yes │
╰──────────────────────────────────────────────────────────────────────╯
╭─ CLI Arguments (agents resource add git-checkout) ─────────────────╮
│ Argument Required Type Description │
│ ────────── ──────── ────── ────────────────────────────── │
│ --path yes path Local checkout directory │
│ --branch no string Default branch (default: main) │
╰────────────────────────────────────────────────────────────────────╯
╭─ Parent Types ───────────────╮
│ Allowed: (any, top-level OK) │
╰──────────────────────────────╯
╭─ Child Types ────────────────────────────────────────────────────╮
│ Type Auto Manual Link Description │
│ ───────────── ──── ─────────── ────────────────────────── │
│ git yes no Repo object DB and history │
│ fs-directory yes no Worktree root directory │
╰──────────────────────────────────────────────────────────────────╯
╭─ Sandbox ──────────────────────╮
│ Strategy: git_worktree │
│ Checkpointable: yes │
│ Handler: GitCheckoutHandler │
╰────────────────────────────────╯
✓ OK Resource type details loaded
agents resource add [(--description|-d) <DESC>] [--update] <TYPE> <NAME> [type-specific-flags...]
$ agents resource add git-checkout local/api-repo --path /home/user/projects/api-service --branch main
╭─ Resource ──────────────────────────────────────╮
│ Name: local/api-repo │
│ ID: 01HXR1A1B2C3D4E5F6G7H8J9K0 │
│ Type: git-checkout │
│ Physical/Virtual: physical │
│ Path: /home/user/projects/api-service │
│ Branch: main │
│ Created: 2026-02-09 10:20 │
╰─────────────────────────────────────────────────╯
╭─ Auto-discovered Children ─────────────────────────────────────────╮
│ ID Type Status │
│ ─────────────── ────────────── ───────────────── │
│ 01HXR1A1B2C3… git created │
│ 01HXR1A1B2C4… git-remote created │
│ 01HXR1A1B2C5… git-branch created │
│ 01HXR1A1B2C6… git-branch created │
│ 01HXR1A1B2C7… fs-directory created │
│ + 47 git-commit resources │
│ + 312 git-tree-entry resources │
│ + 3 fs-directory + 28 fs-file │
╰────────────────────────────────────────────────────────────────────╯
╭─ Capabilities ─────────────────╮
│ Readable: yes │
│ Writable: yes │
│ Sandboxable: yes │
│ Checkpointable: yes │
│ Sandbox Strategy: git_worktree │
╰────────────────────────────────╯
✓ OK Resource registered (395 child resources discovered)
$ agents resource add fs-mount local/docs --mount-path /docs/api-reference
╭─ Resource ──────────────────────────────────────╮
│ Name: local/docs │
│ ID: 01HXR2B3C4D5E6F7G8H9J0K1L2 │
│ Type: fs-mount │
│ Physical/Virtual: physical │
│ Mount Path: /docs/api-reference │
│ Created: 2026-02-09 10:22 │
╰─────────────────────────────────────────────────╯
╭─ Auto-discovered Children ────────────────────╮
│ + 1 fs-directory (root) │
│ + 3 fs-directory resources │
│ + 28 fs-file resources │
╰───────────────────────────────────────────────╯
╭─ Capabilities ──────────────────────╮
│ Readable: yes │
│ Writable: yes │
│ Sandboxable: yes │
│ Checkpointable: yes │
│ Sandbox Strategy: copy_on_write │
╰─────────────────────────────────────╯
✓ OK Resource registered (31 child resources discovered)
agents resource remove [--yes|-y] <NAME>
$ agents resource remove local/api-repo
Remove resource local/api-repo and 395 child resources? [y/N]: y
╭─ Resource Removed ──────────────────────────────────╮
│ Name: local/api-repo │
│ Type: git-checkout │
│ Children Removed: 395 │
│ Projects Unlinked: 0 │
╰─────────────────────────────────────────────────────╯
✓ OK Resource removed
agents resource list [--all] [(--type|-t) <TYPE>]
$ agents resource list
╭─ Resources ──────────────────────────────────────────────────────────────────────────────────────────────╮
│ Name ID Type Phys/Virt Children Projects │
│ ───────────────── ──────────────────────────── ─────────── ───────── ──────── ──────────────── │
│ local/api-repo 01HXR1A1B2C3D4E5F6G7H8J9K0 git-checkout physical 395 local/api-service │
│ local/docs 01HXR2B2C3D4E5F6G7H8J9K0L1 fs-mount physical 32 local/api-service │
│ local/staging-db 01HXR3C3D4E5F6G7H8J9K0L1M2 database physical 12 local/api-service, │
│ local/staging │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Summary ───────────╮
│ Total: 3 │
│ Physical: 3 │
│ Virtual: 0 │
│ Total Children: 405 │
╰─────────────────────╯
✓ OK 3 resources listed
agents resource show <RESOURCE>
$ agents resource show local/api-repo
╭─ Resource ─────────────────────────────────────────╮
│ Name: local/api-repo │
│ ID: 01HXR1A1B2C3D4E5F6G7H8J9K0 │
│ Type: git-checkout │
│ Physical/Virtual: physical │
│ Path: /home/user/projects/api-service │
│ Branch: main │
│ Created: 2026-02-09 10:20 │
╰────────────────────────────────────────────────────╯
╭─ Capabilities ────────────────────╮
│ Readable: yes │
│ Writable: yes │
│ Sandboxable: yes │
│ Checkpointable: yes │
│ Sandbox Strategy: git_worktree │
╰───────────────────────────────────╯
╭─ Parents ────╮
│ (top-level) │
╰──────────────╯
╭─ Direct Children ──────────────────────────────────────────────────────╮
│ ID Type Auto Children │
│ ──────────────────────────── ──────────── ──── ──────── │
│ 01HXR4D4E5F6G7H8J9K0L1M2N3 git yes 363 │
│ 01HXR5E5F6G7H8J9K0L1M2N3P4 fs-directory yes 32 │
╰────────────────────────────────────────────────────────────────────────╯
╭─ Linked Projects ─────────────╮
│ - local/api-service (r/w) │
╰───────────────────────────────╯
╭─ Tool Bindings ────────────────────────────────╮
│ Tool Slot Access │
│ ──────────────────────── ───── ─────────── │
│ (builtin) git_status repo read_only │
│ (builtin) git_diff repo read_only │
│ (builtin) git_log repo read_only │
│ local/run-migrations db (not bound) │
╰────────────────────────────────────────────────╯
✓ OK Resource details loaded
agents resource inspect [--tree] [--file <PATH>] <RESOURCE>
$ agents resource inspect local/api-repo --tree
╭─ Resource Tree: local/api-repo ──────────────────────────────────────╮
│ │
│ /home/user/projects/api-service │
│ ├── src/ │
│ │ ├── api/ │
│ │ │ ├── __init__.py │
│ │ │ ├── auth/ │
│ │ │ │ ├── auth_middleware.py │
│ │ │ │ ├── token_service.py │
│ │ │ │ └── rbac.py │
│ │ │ ├── routes/ │
│ │ │ └── models/ │
│ │ └── utils/ │
│ ├── tests/ │
│ ├── README.md │
│ └── pyproject.toml │
│ │
╰─────────────────────────────────────────────────────────────────────╯
╭─ Summary ──────────────╮
│ Directories: 8 │
│ Files: 41 │
│ Total Size: 284 KB │
╰────────────────────────╯
✓ OK Resource tree displayed
$ agents resource inspect local/api-repo --file src/api/auth/auth_middleware.py
╭─ File: src/api/auth/auth_middleware.py ──────────────────╮
│ Resource: local/api-repo │
│ Size: 2.4 KB │
│ Language: Python │
│ Last Modified: 2026-02-10 14:32 │
╰──────────────────────────────────────────────────────────╯
1 │ from fastapi import Request, HTTPException
2 │ from .token_service import validate_token
3 │
4 │ async def auth_middleware(request: Request):
5 │ token = request.headers.get("Authorization")
6 │ if not token:
7 │ raise HTTPException(status_code=401)
8 │ user = await validate_token(token)
9 │ request.state.user = user
10 │ return user
│ ... (24 more lines)
✓ OK File displayed
agents resource tree [(--depth|-d) <N>] [(--type|-t) <TYPE>] <RESOURCE>
$ agents resource tree local/api-repo --depth 2
╭─ Resource Tree: local/api-repo ──────────────────────────────────────╮
│ │
│ git-checkout 01HXR1A1..J9K0 (physical) │
│ ├── git 01HXR4D4..M2N3 (physical) │
│ │ ├── git-remote 01HXR6F6..P4Q5 │
│ │ ├── git-branch 01HXR7G7..Q5R6 │
│ │ │ ├── git-commit 01HXR8H8..R6S7 │
│ │ │ └── ... 22 more git-commit resources │
│ │ └── git-branch 01HXR9J9..S7T8 │
│ │ └── ... 26 git-commit resources │
│ └── fs-directory 01HXR5E5..N3P4 (physical) │
│ ├── fs-directory 01HXRAK1..T8U9 │
│ ├── fs-directory 01HXRBL2..U9V0 │
│ └── ... 28 more fs-file resources │
│ │
╰─────────────────────────────────────────────────────────────────────╯
╭─ Summary ──────────────╮
│ Total shown: 14 │
│ Total in subtree: 395 │
│ Max depth: 2 │
╰────────────────────────╯
✓ OK Resource tree displayed
agents resource link-child <PARENT> <CHILD>
$ agents resource link-child local/api-repo 01HXR2B2C3D4E5F6G7H8J9K0L1
╭─ Child Linked ──────────────────────────────────────╮
│ Parent: local/api-repo │
│ Child: 01HXR2B2C3D4E5F6G7H8J9K0L1 │
│ Child Type: fs-mount │
│ Status: linked │
╰─────────────────────────────────────────────────────╯
✓ OK Child resource linked
agents resource unlink-child [--yes|-y] <PARENT> <CHILD>
$ agents resource unlink-child local/api-repo 01HXR2B2C3D4E5F6G7H8J9K0L1
Unlink 01HXR2B2C3D4E5F6G7H8J9K0L1 from parent local/api-repo? [y/N]: y
╭─ Child Unlinked ────────────────────────────────────╮
│ Parent: local/api-repo │
│ Child: 01HXR2B2C3D4E5F6G7H8J9K0L1 │
│ Status: unlinked │
╰─────────────────────────────────────────────────────╯
✓ OK Child resource unlinked
agents plan list [--phase <PHASE>] [--state <STATE>] [--project <PROJECT>]
[--action <ACTION>] [<REGEX>]
$ agents --format table plan list --phase execute
╭─ Plans ──────────────────────────────────────────────────────────────────────────────╮
│ ID Phase State Action Project Elapsed │
│ ──────── ─────── ────────── ─────────────────── ───────────────── ───────── │
│ 01HXM7A9 execute processing local/code-coverage local/api-service 00:01:12 │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Filters ──────╮
│ Phase: execute │
│ State: (any) │
│ Project: (any) │
│ Action: (any) │
╰────────────────╯
╭─ Summary ─────────╮
│ Total: 1 │
│ Processing: 1 │
│ Completed: 0 │
│ Errored: 0 │
╰───────────────────╯
✓ OK 1 plan listed
$ agents plan list
╭─ Plans ──────────────────────────────────────────────────────────────────────────────────────╮
│ ID Phase State Action Project Elapsed │
│ ──────── ────────── ────────── ─────────────────── ───────────────── ───────── │
│ 01HXM7A9 execute processing local/code-coverage local/api-service 00:01:12 │
│ 01HXM6R3 apply applied local/add-auth local/api-service 00:07:14 │
│ 01HXM5K2 execute errored local/migrate-db local/api-service 00:04:33 │
│ 01HXM4J1 strategize processing local/refactor-api local/web-app 00:00:45 │
│ 01HXM3H8 cancelled cancelled local/add-logging local/api-service 00:02:10 │
╰──────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Summary ─────────────╮
│ Total: 5 │
│ Processing: 2 │
│ Completed: 1 │
│ Errored: 1 │
│ Cancelled: 1 │
╰───────────────────────╯
✓ OK 5 plans listed
$ agents plan list --project local/web-app
╭─ Plans ──────────────────────────────────────────────────────────────────────────────╮
│ ID Phase State Action Project Elapsed │
│ ──────── ────────── ────────── ─────────────────── ───────────── ───────── │
│ 01HXM4J1 strategize processing local/refactor-api local/web-app 00:00:45 │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Filters ─────────────────╮
│ Phase: (any) │
│ State: (any) │
│ Project: local/web-app │
│ Action: (any) │
╰───────────────────────────╯
✓ OK 1 plan listed
agents plan use [--automation-profile <PROFILE>]
[--invariant <INVARIANT>]...
[--strategy-actor <STRATEGY_ACTOR>]
[--execution-actor <EXEC_ACTOR>]
[--estimation-actor <EST_ACTOR>]
[--invariant-actor <INV_ACTOR>]
[--arg/-a name=value]...
<ACTION> <PROJECT>...
$ agents plan use local/code-coverage local/api-service \
--arg target_coverage_percent=85 --automation-profile trusted
╭─ Plan Created ──────────────────────╮
│ Plan ID: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Phase: strategize │
│ Action: local/code-coverage │
│ Project: local/api-service │
│ Automation: trusted │
│ Attempt: 1 │
╰─────────────────────────────────────╯
╭─ Inputs ──────────────────────╮
│ - target_coverage_percent=85 │
│ - automation_profile=trusted │
╰───────────────────────────────╯
╭─ Actors ────────────────────────╮
│ Strategy: local/strategist │
│ Execution: local/executor │
│ Estimation: (none) │
╰─────────────────────────────────╯
╭─ Automation ─────────────────────────╮
│ Profile: trusted │
│ Source: CLI flag │
│ Read-Only: no │
╰──────────────────────────────────────╯
╭─ Context ───────────────────────╮
│ Resources: 2 (repo, db) │
│ Indexed Files: 347 │
│ View: strategize │
│ Hot Token Budget: 12,000 │
╰─────────────────────────────────╯
╭─ Next Steps ─────────────────────────────────────╮
│ - agents plan execute 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ - agents plan status 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ - agents plan tree 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
╰──────────────────────────────────────────────────╯
✓ OK Plan created
$ agents plan use local/security-audit local/api-service local/web-app \
--invariant "Never modify production database schemas" \
--invariant "All changes must include test coverage" \
--automation-profile supervised
╭─ Plan Created ──────────────────────────────────────╮
│ Plan: 01HXM9D2ZK4Q7C2B3F2R4VYV6J │
│ Action: local/security-audit │
│ Phase: strategize (running) │
│ Automation: supervised │
╰─────────────────────────────────────────────────────╯
╭─ Target Projects ───────────────────╮
│ 1. local/api-service (3 resources) │
│ 2. local/web-app (2 resources) │
╰─────────────────────────────────────╯
╭─ Plan Invariants ──────────────────────────────────────────╮
│ Scope Source Invariant │
│ ──────── ─────── ────────────────────────────────── │
│ plan CLI Never modify production DB schemas │
│ plan CLI All changes must include test coverage │
│ project config API responses must be backward-compat │
│ global config Follow Python PEP 8 style guide │
╰────────────────────────────────────────────────────────────╯
✓ OK Plan created — strategize in progress
$ agents plan use local/code-coverage local/api-service \
--strategy-actor local/senior-planner \
--execution-actor local/fast-executor \
--arg target_coverage_percent=95
╭─ Plan Created ──────────────────────────────────────╮
│ Plan: 01HXM9E3ZK4Q7C2B3F2R4VYV6J │
│ Action: local/code-coverage │
│ Phase: strategize (running) │
│ Automation: trusted │
╰─────────────────────────────────────────────────────╯
╭─ Actor Overrides ────────────────────╮
│ Strategy: local/senior-planner │
│ Execution: local/fast-executor │
│ (Estimation: action default) │
╰──────────────────────────────────────╯
╭─ Arguments ─────────────────╮
│ target_coverage_percent: 95 │
╰─────────────────────────────╯
✓ OK Plan created — strategize in progress
agents plan execute <PLAN_ID>
$ agents plan execute 01HXM8C2ZK4Q7C2B3F2R4VYV6J
╭─ Execution ──────────────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Phase: execute │
│ Sandbox: git_worktree │
│ Worker: local/executor │
│ Started: 12:58:10 │
│ Attempt: 1 │
╰──────────────────────────────────╯
╭─ Sandbox ──────────────────────────────────╮
│ Strategy: git_worktree │
│ Path: /repos/api/.worktrees/plan-01HXM8 │
│ Branch: cleveragents/plan-01HXM8C2 │
│ Status: active │
╰────────────────────────────────────────────╯
╭─ Strategy Summary ─────────────────────╮
│ Decisions: 8 │
│ Invariants: 2 │
│ Planned Child Plans: 2+ │
│ Estimated Files: ~12 │
│ Risk: low │
╰────────────────────────────────────────╯
╭─ Progress ────────╮
│ ⏳ Collect context │
│ • Run tools │
│ • Build changeset │
│ • Validate │
╰───────────────────╯
✓ OK Execution started
$ agents plan execute 01HXM7K2ZK4Q7C2B3F2R4VYV6J
╭─ Execution Resumed ─────────────────╮
│ Plan: 01HXM7K2ZK4Q7C2B3F2R4VYV6J │
│ Phase: execute (resumed) │
│ Sandbox: git_worktree │
│ Worker: local/executor │
│ Checkpoint: cp_01HXM8C2 (loaded) │
│ Resumed From: step 4 of 6 │
╰─────────────────────────────────────╯
╭─ Previous Progress ──────────────────────╮
│ ✓ Step 1: Collect context (0.8s) │
│ ✓ Step 2: Analyze codebase (4.2s) │
│ ✓ Step 3: Generate migrations (6.1s) │
│ ✗ Step 4: Apply migrations (errored) │
│ ○ Step 5: Update models (pending) │
│ ○ Step 6: Run validations (pending) │
╰──────────────────────────────────────────╯
╭─ Guidance Applied ──────────────────────────────────────────────╮
│ "Use smaller batch sizes for the migration to avoid timeouts" │
╰─────────────────────────────────────────────────────────────────╯
✓ OK Execution resumed from checkpoint cp_01HXM8C2
agents plan apply [--yes|-y] <PLAN_ID>
$ agents plan apply 01HXM8C2ZK4Q7C2B3F2R4VYV6J
Apply changes for plan 01HXM8C2ZK4Q7C2B3F2R4VYV6J? [y/N]: y
╭─ Apply Summary ─────────────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Artifacts: 6 files updated │
│ Changes: 42 insertions, 9 deletions │
│ Project: local/api-service │
│ Applied At: 2026-02-08 13:04 │
╰─────────────────────────────────────╯
╭─ Validation (from Execute) ────╮
│ Tests: passed (24/24) │
│ Lint: passed (0 warnings) │
│ Type Check: passed (0 errors) │
│ Duration: 12.4s │
╰────────────────────────────────╯
╭─ Sandbox Cleanup ─────────╮
│ Worktree: removed │
│ Branch: merged to main │
│ Checkpoint: archived │
╰───────────────────────────╯
╭─ Plan Lifecycle ────────────────────────╮
│ Phase: apply │
│ State: applied │
│ Total Duration: 00:06:14 │
│ Total Cost: $0.0847 │
│ Decisions Made: 8 │
│ Child Plans: 2 (completed) │
╰─────────────────────────────────────────╯
╭─ Next Steps ──────╮
│ - Review git diff │
│ - Commit changes │
╰───────────────────╯
✓ OK Changes applied
$ agents plan apply --yes 01HXM8C2ZK4Q7C2B3F2R4VYV6J
╭─ Apply Summary ─────────────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Artifacts: 6 files updated │
│ Changes: 42 insertions, 9 deletions │
│ Project: local/api-service │
╰─────────────────────────────────────╯
╭─ Validation ───────────────────────────────────────────────╮
│ ✗ Tests: FAILED (22/24 passed, 2 failed) │
│ FAIL test_auth.py::test_session_refresh — AssertionError │
│ FAIL test_auth.py::test_token_expiry — TimeoutError │
│ ✓ Lint: passed (0 warnings) │
│ ✓ Type Check: passed (0 errors) │
│ Duration: 14.8s │
╰────────────────────────────────────────────────────────────╯
╭─ Sandbox Status ─────────────────────────────────────────────╮
│ Worktree: preserved (changes NOT committed) │
│ Checkpoint: cp_01HXM8C2 (pre-apply state available) │
│ The sandbox is preserved for correction or manual review. │
╰──────────────────────────────────────────────────────────────╯
╭─ Recovery Options ──────────────────────────────────────────────────╮
│ - agents plan prompt — provide guidance to fix test failures │
│ - agents plan correct — revert and re-execute with guidance │
│ - agents plan rollback — restore to a previous checkpoint │
│ - agents plan cancel — abort the plan entirely │
╰─────────────────────────────────────────────────────────────────────╯
✗ ERROR Apply refused — 2 required Execute-phase validations did not pass
agents plan status <PLAN_ID>
$ agents plan status 01HXM8C2ZK4Q7C2B3F2R4VYV6J
╭─ Plan Status ────────────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Phase: execute │
│ State: processing │
│ Action: local/code-coverage │
│ Project: local/api-service │
│ Automation: review │
│ Attempt: 1 │
╰──────────────────────────────────╯
╭─ Progress ───────╮
│ ✓ Strategize │
│ ⏳ Execute │
│ • Apply (queued) │
╰──────────────────╯
╭─ Timing ──────────╮
│ Started: 12:57:01 │
│ Elapsed: 00:01:12 │
│ ETA: 00:03:45 │
╰───────────────────╯
╭─ Execution Detail ──────────╮
│ Sandbox: git_worktree │
│ Tool Calls: 8 │
│ Files Modified: 3 │
│ Child Plans: 1/2 complete │
│ Checkpoints: 2 created │
╰─────────────────────────────╯
╭─ Cost ───────────────╮
│ Tokens Used: 12,420 │
│ Cost So Far: $0.041 │
│ Estimated: $0.085 │
╰──────────────────────╯
✓ OK Status refreshed
$ agents plan status 01HXM6R3ZK4Q7C2B3F2R4VYV6J
╭─ Plan Status ─────────────────────╮
│ Plan: 01HXM6R3ZK4Q7C2B3F2R4VYV6J │
│ Phase: apply │
│ State: applied │
│ Action: local/add-auth │
│ Project: local/api-service │
│ Automation: trusted │
│ Attempt: 1 │
╰───────────────────────────────────╯
╭─ Progress ───────────╮
│ ✓ Strategize │
│ ✓ Execute │
│ ✓ Apply (committed) │
╰──────────────────────╯
╭─ Timing ─────────────────────────╮
│ Started: 2026-02-08 12:57:01 │
│ Finished: 2026-02-08 13:04:15 │
│ Total Duration: 00:07:14 │
╰──────────────────────────────────╯
╭─ Result ────────────────────────────╮
│ Decisions Made: 8 │
│ Child Plans: 2/2 complete │
│ Artifacts: 6 files updated │
│ Validations: 3/3 passed │
│ Total Cost: $0.085 │
╰─────────────────────────────────────╯
✓ OK Plan completed successfully
$ agents plan status 01HXM9F2ZK4Q7C2B3F2R4VYV6J
╭─ Plan Status ────────────────────╮
│ Plan: 01HXM9F2ZK4Q7C2B3F2R4VYV6J │
│ Phase: strategize │
│ State: processing │
│ Action: local/refactor-auth │
│ Project: local/api-service │
│ Automation: supervised │
╰──────────────────────────────────╯
╭─ Progress ───────────────╮
│ ⏳ Strategize (running) │
│ ○ Execute (waiting) │
│ ○ Apply (waiting) │
╰──────────────────────────╯
╭─ Strategy Progress ────────╮
│ Decisions Made: 4 │
│ Invariants Enforced: 2 │
│ Child Plans Planned: 3 │
│ Elapsed: 00:00:28 │
╰────────────────────────────╯
✓ OK Strategize in progress
$ agents plan status 01HXM7K2ZK4Q7C2B3F2R4VYV6J
╭─ Plan Status ────────────────────╮
│ Plan: 01HXM7K2ZK4Q7C2B3F2R4VYV6J │
│ Phase: execute │
│ State: errored │
│ Action: local/migrate-db │
│ Project: local/api-service │
│ Automation: supervised │
│ Attempt: 1 │
╰──────────────────────────────────╯
╭─ Progress ───────────╮
│ ✓ Strategize │
│ ✗ Execute │
│ ○ Apply (skipped) │
╰──────────────────────╯
╭─ Error Detail ──────────────────────────────────────────────────╮
│ Error: Tool invocation failed: connection refused │
│ Tool: local/db-migrate │
│ Step: 4 of 6 │
│ Checkpoint: cp_01HXM8C2 (sandbox state preserved) │
│ Recoverable: yes — use "agents plan prompt" to provide guidance │
╰─────────────────────────────────────────────────────────────────╯
╭─ Cost ───────────────╮
│ Tokens Used: 8,340 │
│ Cost So Far: $0.028 │
╰──────────────────────╯
✗ ERROR Plan errored — use `agents plan prompt` to resume or `agents plan cancel` to abort
agents plan cancel [(--reason|-r) <REASON>] <PLAN_ID>
$ agents plan cancel 01HXM8C2ZK4Q7C2B3F2R4VYV6J --reason "blocked on credentials"
╭─ Plan Cancelled ─────────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Phase: execute │
│ Reason: blocked on credentials │
│ State: cancelled │
│ Cancelled At: 13:02:15 │
╰──────────────────────────────────╯
╭─ Sandbox ────────────────╮
│ Status: preserved │
│ Files Modified: 3 │
│ Checkpoints: 2 │
╰──────────────────────────╯
╭─ Child Plans ─────────────╮
│ Completed: 1 │
│ Cancelled: 1 │
│ Artifacts Preserved: yes │
╰───────────────────────────╯
╭─ Recovery ───────────────────────────────────────────╮
│ - Resolve credentials │
│ - Run agents plan execute 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
╰──────────────────────────────────────────────────────╯
✓ OK Plan cancelled
agents plan tree [--show-superseded] <PLAN_ID>
$ agents plan tree 01HXM8C2ZK4Q7C2B3F2R4VYV6J
╭─ Decision Tree ──────────────────────────────────────────────────────────────────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ ├─ [prompt_definition] "Increase test coverage to 85%" │
│ ├─ [invariant_enforced] "Prioritize financial transaction and user mgmt code" │
│ ├─ [invariant_enforced] "All API calls over TCP must be mocked" │
│ ├─ [strategy_choice] "Prioritize auth and payments" (confidence: 0.82) │
│ ├─ [subplan_parallel_spawn] "Implement auth and payment modules, in parallel" │
│ │ ├─ [subplan_spawn] "Write auth tests" → Plan: 01HXM9F1A │
│ │ └─ [subplan_spawn] "Write payment tests" → Plan: 01HXM9F2B │
│ └─ [subplan_parallel_spawn] "Write tests for remaining modules" │
│ └─ ... │
╰──────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Tree Summary ─────────────╮
│ Nodes: 9 │
│ Depth: 3 │
│ Child Plans: 2+ │
│ Invariants: 2 │
│ Superseded: 0 (hidden) │
╰────────────────────────────╯
╭─ Child Plans ──────────────────────────────────────╮
│ ID Phase State │
│ ────────── ─────── ───────── │
│ 01HXM9F1A execute processing │
│ 01HXM9F2B execute queued │
╰────────────────────────────────────────────────────╯
╭─ Decision IDs (for correction) ──────────────────╮
│ Root: 01HXM9A0B1Q2W3R5G8Z0P4Q1X8 │
│ Invariant 1: 01HXM9A0C1R3X4S6G9Z1P5Q2Y9 │
│ Invariant 2: 01HXM9A0D2S4Y5T7H0Z2P6Q3Z0 │
│ Strategy: 01HXM9A1C2Q7W3R5G8Z0P4Q1X9 │
│ Parallel 1: 01HXM9A1D3R8X5S7H1Z2P5Q2Y0 │
│ Spawn Auth: 01HXM9A2D3Q8W4R6H9Z1P5Q2X0 │
│ Spawn Payment: 01HXM9A3E4Q9W5R7I0Z2P6Q3X1 │
│ Parallel 2: 01HXM9A4F5Q0W6R8J1Z3P7Q4X2 │
╰──────────────────────────────────────────────────╯
✓ OK Decision tree rendered
agents plan explain [--show-context] [--show-reasoning] <DECISION_ID>
$ agents plan explain 01HXM9A1C2Q7W3R5G8Z0P4Q1X9 --show-context
╭─ Decision ─────────────────────────────────────╮
│ ID: 01HXM9A1C2Q7W3R5G8Z0P4Q1X9 │
│ Type: strategy_choice │
│ Question: Which modules should be prioritized? │
│ Chosen: Auth and payments │
│ Confidence: 0.82 │
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Sequence: 2 of 5 │
│ Created: 2026-02-08 12:58 │
╰────────────────────────────────────────────────╯
╭─ Alternatives Considered ──────────────────────╮
│ 1. Auth and payments (chosen) │
│ 2. User module first (coverage 71%, med risk) │
│ 3. All modules equally (spread thin) │
╰────────────────────────────────────────────────╯
╭─ Impact ──────────────────────╮
│ Downstream Decisions: 3 │
│ Downstream Child Plans: 2 │
│ Artifacts Produced: 5 │
│ Correction Impact: medium │
╰───────────────────────────────╯
╭─ Context Snapshot ───────────────╮
│ - Coverage < 70% in auth │
│ - Payments failures last release │
│ - Auth: 12 files, 45% coverage │
│ - Payments: 8 files, 52% cover. │
│ Hot Context Hash: sha256:4b2e... │
╰──────────────────────────────────╯
╭─ Rationale ───────────────────────────────────────╮
│ Auth and payment modules have the lowest coverage │
│ and highest business risk. Auth handles security │
│ tokens, payments handles money. Both had bugs in │
│ the last release traceable to missing tests. │
╰───────────────────────────────────────────────────╯
╭─ Correction ──────────────────────────────────────────────╮
│ agents plan correct 01HXM9A1C2Q7W3R5G8Z0P4Q1X9 │
│ --mode revert --guidance "Prioritize payments first..." │
╰───────────────────────────────────────────────────────────╯
✓ OK Decision explained
$ agents plan explain --show-reasoning 01HXM9A1C2Q7W3R5G8Z0P4Q1X9
╭─ Decision ──────────────────────────────╮
│ ID: 01HXM9A1C2Q7W3R5G8Z0P4Q1X9 │
│ Type: strategy_choice │
│ Choice: Convert to async/await │
│ Alternatives: 3 │
╰─────────────────────────────────────────╯
╭─ Alternatives Considered ────────────────────────────────────╮
│ 1. Convert to async/await patterns (chosen) │
│ 2. Keep synchronous with thread pool │
│ 3. Use callback-based approach │
╰──────────────────────────────────────────────────────────────╯
╭─ Rationale ──────────────────────────────────────────────────╮
│ Async/await is the modern Python standard for I/O-bound │
│ operations. The project already uses asyncio in 3 modules. │
│ Thread pools would add complexity without native support. │
╰──────────────────────────────────────────────────────────────╯
╭─ Model Reasoning (raw) ───────────────────────────────────────╮
│ I need to decide on the concurrency pattern for the payment │
│ processing module. Let me analyze the current codebase: │
│ │
│ 1. src/payments/api.py uses synchronous requests. │
│ 2. src/core/scheduler.py already uses asyncio. │
│ 3. The database driver (asyncpg) supports async natively. │
│ 4. Project invariant says "prefer modern Python patterns". │
│ │
│ Given that 3/5 core modules already use asyncio, and the │
│ database driver supports it, converting to async/await is │
│ the most consistent choice. Thread pools would work but │
│ add unnecessary complexity and don't integrate well with │
│ the existing asyncio event loop in scheduler.py. │
╰───────────────────────────────────────────────────────────────╯
✓ OK Decision explained
agents plan correct --mode (revert|append) (--guidance|-g) <GUIDANCE>
[--dry-run] [--yes|-y] <DECISION_ID>
$ agents plan correct 01HXM9A1C2Q7W3R5G8Z0P4Q1X9 --mode revert \
--guidance "Prioritize payments first" --yes
╭─ Correction ────────────────────────────────────────╮
│ Mode: revert │
│ Impact: 3 decisions, 2 child plans, 5 artifacts │
│ New Decision: 01HXM9B7Z3Q1Q8K2E9H7K3W2M8 │
│ Corrects: 01HXM9A1C2Q7W3R5G8Z0P4Q1X9 │
│ Attempt: 2 │
╰─────────────────────────────────────────────────────╯
╭─ Affected Subtree ──────────────╮
│ Decisions Invalidated: 3 │
│ Child Plans Rolled Back: 2 │
│ Artifacts Archived: 5 │
│ Unaffected Decisions: 2 │
╰─────────────────────────────────╯
╭─ Sandbox Rollback ─────────────╮
│ Checkpoint: cp_01HXM8C2 │
│ Files Reverted: 5 │
│ Status: restored │
╰────────────────────────────────╯
╭─ Recompute ──────────────╮
│ Queued: 2 child plans │
│ ETA: 4m │
╰──────────────────────────╯
╭─ History ───────────────────────────────────────────╮
│ - Original decision superseded │
│ - Prior artifacts archived for comparison │
│ - agents plan diff --correction 01HXM9B7Z3Q1Q8K2.. │
╰─────────────────────────────────────────────────────╯
✓ OK Correction applied
$ agents plan correct 01HXM9A1C2Q7W3R5G8Z0P4Q1X9 --mode append \
--guidance "Also add rate limiting to the auth endpoints"
╭─ Correction ─────────────────────────────────────╮
│ Mode: append │
│ Impact: adds to existing subtree, no rollback │
│ New Decision: 01HXM9C3Z5T2Q8K2E9H7K3W2M8 │
│ Appended After: 01HXM9A1C2Q7W3R5G8Z0P4Q1X9 │
│ Attempt: 2 │
╰──────────────────────────────────────────────────╯
╭─ Append Detail ─────────────────────────────────────────────────╮
│ Original decision preserved: yes │
│ Existing artifacts kept: yes │
│ Additional work: appended as new child plan │
│ The original 5 artifacts remain; a new child plan will add │
│ rate-limiting code on top of the existing auth changes. │
╰─────────────────────────────────────────────────────────────────╯
╭─ Queued ──────────╮
│ New child: 1 │
│ ETA: 2m │
╰───────────────────╯
✓ OK Append correction queued
$ agents plan correct 01HXM9A1C2Q7W3R5G8Z0P4Q1X9 --mode revert \
--guidance "Use async/await pattern instead" --dry-run
╭─ Dry Run — Correction Preview ─────────────────────────────────────╮
│ ⚠ This is a preview only. No changes will be made. │
╰────────────────────────────────────────────────────────────────────╯
╭─ Would Revert ───────────────────────────────────────╮
│ Decisions to invalidate: 3 │
│ 01HXM9A1.. strategy_choice "sync pattern" │
│ 01HXM9A2.. implementation_choice "requests" │
│ 01HXM9A3.. tool_invocation write_file ×4 │
│ Child plans to roll back: 2 │
│ Artifacts to archive: 5 files │
│ Unaffected decisions: 2 (will be kept) │
╰──────────────────────────────────────────────────────╯
╭─ Estimated Cost ──────────╮
│ Re-strategize: ~$0.012 │
│ Re-execute: ~$0.035 │
│ Total: ~$0.047 │
│ ETA: ~4 minutes │
╰───────────────────────────╯
To execute this correction, remove --dry-run and add --yes
agents plan diff (--correction <CORRECTION_ATTEMPT_ID>|<PLAN_ID>)
$ agents plan diff 01HXM8C2ZK4Q7C2B3F2R4VYV6J
╭─ Diff Summary ─────────────────────────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Project: local/api-service │
│ Files Changed: 2 │
│ Insertions: 12 │
│ Deletions: 4 │
│ Net Change: +8 lines │
╰────────────────────────────────────────────────╯
╭─ Files ───────────────────────────────╮
│ Path Change Status │
│ ─────────────────── ────── ──────── │
│ src/auth/session.py +8 -2 modified │
│ src/auth/tokens.py +4 -2 modified │
╰───────────────────────────────────────╯
╭─ Patch Preview ──────────────────────────╮
│ --- a/src/auth/session.py │
│ +++ b/src/auth/session.py │
│ @@ -12,4 +12,10 @@ │
│ - import jwt │
│ + import sessionlib │
│ - def validate_token(...) │
│ + def validate_session(...) │
│ --- a/src/auth/tokens.py │
│ +++ b/src/auth/tokens.py │
│ @@ -5,3 +5,7 @@ │
│ - TOKEN_EXPIRY = 3600 │
│ + TOKEN_EXPIRY = 7200 │
╰──────────────────────────────────────────╯
╭─ Risk Assessment ────────────────╮
│ API Compatibility: preserved │
│ Test Coverage: maintained │
│ Breaking Changes: none detected │
╰──────────────────────────────────╯
✓ OK Diff generated
$ agents plan diff --correction 01HXM9B7Z3Q1Q8K2E9H7K3W2M8
╭─ Correction Diff ───────────────────────────────╮
│ Correction: 01HXM9B7Z3Q1Q8K2E9H7K3W2M8 │
│ Original Decision: 01HXM9A1C2Q7W3R5.. │
│ Mode: revert │
│ Files Changed: 3 │
│ New Insertions: 18 │
│ New Deletions: 6 │
╰─────────────────────────────────────────────────╯
╭─ Comparison ─────────────────────────────────────────────────────╮
│ File Before (original) After (corrected) │
│ ──────────────────── ──────────────── ──────────────────── │
│ src/payments/api.py +12 -4 +18 -6 (expanded) │
│ src/auth/tokens.py +8 -2 (unchanged) │
│ tests/test_payments.py (new file) (new file, larger) │
╰──────────────────────────────────────────────────────────────────╯
╭─ Patch Preview (corrected vs original) ───────────╮
│ --- a/src/payments/api.py (original) │
│ +++ b/src/payments/api.py (corrected) │
│ @@ -1,12 +1,18 @@ │
│ - # sync payment processing │
│ + # async payment processing (corrected) │
│ + import asyncio │
│ + from aiohttp import ClientSession │
│ ... │
╰───────────────────────────────────────────────────╯
✓ OK Correction diff generated
agents plan artifacts <PLAN_ID>
$ agents plan artifacts 01HXM8C2ZK4Q7C2B3F2R4VYV6J
╭─ Artifacts ─────────────────────────────────────────────────╮
│ Path Type Size Change Child Plan │
│ ───────────────────── ───── ────── ───────── ─────── │
│ src/auth/session.py write 2.1 KB +8 -2 root │
│ tests/test_session.py write 4.7 KB +47 -0 root │
│ src/auth/tokens.py edit 1.8 KB +4 -2 root │
│ tests/test_tokens.py write 3.2 KB +32 -0 auth │
╰─────────────────────────────────────────────────────────────╯
╭─ Summary ───────────╮
│ Total: 4 │
│ Writes: 2 (new) │
│ Edits: 2 (modified) │
│ Deletes: 0 │
│ Total Size: 11.8 KB │
╰─────────────────────╯
╭─ By Plan ─────────────────╮
│ Root Plan: 3 artifacts │
│ auth-tests: 1 artifact │
│ payment-tests: (pending) │
╰───────────────────────────╯
✓ OK 4 artifacts listed
agents plan prompt <PLAN_ID> <GUIDANCE>
$ agents plan prompt 01HXM8C2ZK4Q7C2B3F2R4VYV6J "Use mocks for database tests"
╭─ Guidance Added ────────────────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Guidance: Use mocks for database tests │
│ Scope: next execution step │
│ Phase: execute │
│ State: errored → processing │
╰─────────────────────────────────────────╯
╭─ Decision Created ────────────────────────╮
│ Type: user_intervention │
│ ID: 01HXM9C5G7R2X8S3K4Z5Q8R6Y3 │
│ Parent: 01HXM9A1C2Q7W3R5G8Z0P4Q1X9 │
╰───────────────────────────────────────────╯
╭─ Queue ────╮
│ Pending: 1 │
│ Applied: 0 │
╰────────────╯
✓ OK Guidance queued
agents plan rollback [--yes|-y] <PLAN_ID> <CHECKPOINT_ID>
$ agents plan rollback 01HXM8C2ZK4Q7C2B3F2R4VYV6J cp_01HXM8C2
Rollback plan 01HXM8C2ZK4Q7C2B3F2R4VYV6J to cp_01HXM8C2? [y/N]: y
╭─ Rollback Summary ───────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Checkpoint: cp_01HXM8C2 │
│ Label: before auth refactor │
│ Files: 6 reverted │
╰──────────────────────────────────╯
╭─ Changes Reverted ──────────────────╮
│ File Action │
│ ────────────────────── ────────── │
│ src/auth/session.py restored │
│ src/auth/tokens.py restored │
│ tests/test_session.py removed │
│ tests/test_tokens.py removed │
│ src/auth/fixtures.py restored │
│ src/auth/__init__.py restored │
╰─────────────────────────────────────╯
╭─ Impact ──────────────────────────────╮
│ Child Plans Invalidated: 2 │
│ Sandbox: restored to cp_01HXM8C2 │
│ Decisions After CP: 2 discarded │
│ Tool Calls After CP: 5 undone │
╰───────────────────────────────────────╯
╭─ Post-Rollback State ──────────╮
│ Phase: execute │
│ State: queued (awaiting input) │
│ Checkpoints Remaining: 2 │
╰────────────────────────────────╯
✓ OK Rollback complete
agents action create (--config|-c) <CFG_FILE>
$ agents action create --config ./actions/code-coverage.yaml
╭─ Action Created ────────────────────────╮
│ Name: local/code-coverage │
│ State: available │
│ Strategy Actor: local/strategist │
│ Execution Actor: local/executor │
│ Reusable: yes │
│ Read Only: no │
│ Config: ./actions/code-coverage.yaml │
│ Created: 2026-02-08 12:20 │
╰─────────────────────────────────────────╯
╭─ Definition of Done ─╮
│ Coverage reaches 85% │
╰──────────────────────╯
╭─ Arguments ──────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ─────────────────────── ────── ──────── ───────────────────── │
│ target_coverage_percent int yes Target coverage % │
│ test_command string no Test framework to use │
╰──────────────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────╮
│ Profile: supervised │
│ Source: default │
╰───────────────────────────────────────╯
✓ OK Action created
agents action list [(--namespace|-n) <NS>] [(--state|-s) <STATE>] [<REGEX>]
$ agents action list
╭─ Actions ──────────────────────────────────────────────────────────────────────────────────╮
│ Name State Strategy Actor Execution Actor Reusable Plans │
│ ─────────────────── ───────── ──────────────── ─────────────── ──────── ───── │
│ local/code-coverage available local/strategist local/executor ✓ 3 │
╰────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Filters ────────╮
│ State: available │
│ Namespace: (any) │
╰──────────────────╯
╭─ Summary ──────────────╮
│ Total: 1 │
│ Available: 1 │
│ Archived: 0 │
│ Total Plans Created: 3 │
╰────────────────────────╯
✓ OK 1 action listed
agents action show <ACTION_NAME>
$ agents action show local/code-coverage
╭─ Action Details ──────────────────────╮
│ Name: local/code-coverage │
│ State: available │
│ Strategy Actor: local/strategist │
│ Execution Actor: local/executor │
│ Reusable: yes │
│ Read Only: no │
│ Created: 2026-02-08 12:20 │
╰───────────────────────────────────────╯
╭─ Definition of Done ─╮
│ Coverage reaches 85% │
╰──────────────────────╯
╭─ Arguments ──────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ─────────────────────── ────── ──────── ───────────────────── │
│ target_coverage_percent int yes Target coverage % │
│ test_command string no Test framework to use │
╰──────────────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────╮
│ Profile: supervised │
│ Source: default │
╰───────────────────────────────────────╯
╭─ History ────────────────────╮
│ Plans Created: 3 │
│ Plans Completed: 2 │
│ Plans Failed: 0 │
│ Avg Duration: 00:04:30 │
│ Avg Cost: $0.072 │
╰──────────────────────────────╯
╭─ Usage ───────────────────────────────────────────────────────────╮
│ - agents plan use local/code-coverage local/api-service │
│ --arg target_coverage_percent=85 │
╰───────────────────────────────────────────────────────────────────╯
✓ OK Action loaded
agents action archive <ACTION_NAME>
$ agents action archive local/old-action
╭─ Action Archived ───────────╮
│ Name: local/old-action │
│ State: available → archived │
│ Archived: 2026-02-08 12:22 │
╰─────────────────────────────╯
╭─ Impact ───────────────────────╮
│ Availability: hidden from list │
│ Existing Plans: unchanged │
│ Active Plans: 0 affected │
╰────────────────────────────────╯
╭─ History ─────────────────╮
│ Total Plans: 5 │
│ Completed: 4 │
│ Failed: 1 │
│ Last Used: 2026-02-06 │
╰───────────────────────────╯
✓ OK Action archived
agents automation-profile add (--config|-c) <FILE> [--update]
$ agents automation-profile add --config ./profiles/careful-auto.yaml
╭─ Profile Registered ─────────────────────────────────────────────╮
│ Name: local/careful-auto │
│ Description: Autonomous execution with mandatory sandbox │
│ and manual apply │
│ Created: 2026-02-08 14:30 │
╰──────────────────────────────────────────────────────────────────╯
╭─ Confidence Thresholds ────────────────╮
│ auto_strategize: 0.0 │
│ auto_execute: 0.0 │
│ auto_apply: 1.0 │
│ auto_decisions_strategize: 0.0 │
│ auto_decisions_execute: 0.0 │
│ auto_validation_fix: 0.0 │
│ auto_strategy_revision: 1.0 │
│ auto_child_plans: 0.0 │
│ auto_retry_transient: 0.0 │
│ auto_checkpoint_restore: 0.0 │
│ require_sandbox: true │
│ require_checkpoints: true │
│ allow_unsafe_tools: false │
╰────────────────────────────────────────╯
✓ OK Profile registered
agents automation-profile remove [--yes|-y] <NAME>
$ agents automation-profile remove local/careful-auto
Remove automation profile local/careful-auto? [y/N]: y
╭─ Profile Removed ──────────╮
│ Name: local/careful-auto │
╰────────────────────────────╯
✓ OK Profile removed
agents automation-profile list [<REGEX>]
$ agents automation-profile list
╭─ Automation Profiles ──────────────────────────────────────────────────────────╮
│ Name Source Auto-Apply Sandbox Description │
│ ────────────────── ──────── ────────── ─────── ──────────────────────── │
│ manual built-in 1.0 yes Human-driven (default) │
│ review built-in 1.0 yes Auto-phase, manual decisions │
│ supervised built-in 1.0 yes Auto-plan, manual exec │
│ cautious built-in 1.0 yes Confidence-gated automation │
│ trusted built-in 1.0 yes Auto-exec, manual apply │
│ auto built-in 1.0 yes Full auto except apply │
│ ci built-in 0.0 yes Full auto, safe CI/CD │
│ full-auto built-in 0.0 no Complete automation │
│ local/careful-auto custom 0.8 yes Custom careful profile │
╰────────────────────────────────────────────────────────────────────────────────╯
╭─ Summary ───────────╮
│ Built-in: 8 │
│ Custom: 1 │
│ Total: 9 │
╰─────────────────────╯
✓ OK 9 profiles listed
agents automation-profile show <NAME>
$ agents automation-profile show trusted
╭─ Automation Profile ───────────────────────────────────────────╮
│ Name: trusted │
│ Source: built-in │
│ Description: Auto-exec, manual apply. Day-to-day development │
╰────────────────────────────────────────────────────────────────╯
╭─ Phase Transitions (thresholds) ─────╮
│ auto_strategize: 0.0 │
│ auto_execute: 0.0 │
│ auto_apply: 1.0 │
╰──────────────────────────────────────╯
╭─ Decision Automation (thresholds) ───╮
│ auto_decisions_strategize: 0.0 │
│ auto_decisions_execute: 0.0 │
╰──────────────────────────────────────╯
╭─ Self-Repair (thresholds) ───────────╮
│ auto_validation_fix: 0.0 │
│ auto_strategy_revision: 1.0 │
│ auto_retry_transient: 0.0 │
│ auto_checkpoint_restore: 1.0 │
╰──────────────────────────────────────╯
╭─ Execution Controls (thresholds) ────╮
│ auto_child_plans: 0.0 │
│ require_sandbox: true │
│ require_checkpoints: true │
│ allow_unsafe_tools: false │
╰──────────────────────────────────────╯
✓ OK Profile loaded
agents config set <key> <value>
$ agents config set core.automation-profile trusted
╭─ Config Updated ──────────────────────╮
│ Key: core.automation-profile │
│ Value: trusted │
│ Previous: manual │
│ Source: config │
│ Scope: global │
╰───────────────────────────────────────╯
╭─ Effective ────────────────────────╮
│ Sessions: new sessions │
│ Plans: future plans (unless set) │
│ Existing: unchanged │
╰────────────────────────────────────╯
╭─ Saved To ──────────────────────────╮
│ File: ~/.cleveragents/config.toml │
│ Line: 8 │
╰─────────────────────────────────────╯
✓ OK Config updated
$ agents config set core.format table
╭─ Config Updated ─────────────────╮
│ Key: core.format │
│ Previous: rich │
│ New Value: table │
│ Scope: user (~/.cleveragents) │
╰──────────────────────────────────╯
✓ OK Set core.format = table
$ agents config set actor.default.invariant local/invariant-resolver
╭─ Config Updated ──────────────────────────────────╮
│ Key: actor.default.invariant │
│ Previous: (not set) │
│ New Value: local/invariant-resolver │
│ Scope: user (~/.cleveragents) │
╰───────────────────────────────────────────────────╯
✓ OK Set actor.default.invariant = local/invariant-resolver
agents config get <key>
$ agents config get core.automation-profile
╭─ Config ──────────────────────────╮
│ Key: core.automation-profile │
│ Value: trusted │
│ Source: config │
│ Overridden: no │
│ Type: string │
╰───────────────────────────────────╯
╭─ Origin ──────────────────────────╮
│ File: ~/.cleveragents/config.toml │
│ Line: 8 │
│ Default: supervised │
╰───────────────────────────────────╯
╭─ Resolution Chain ──────────────╮
│ 1. CLI flag: (not set) │
│ 2. Env var: (not set) │
│ 3. Config file: trusted │
│ 4. Default: supervised │
│ Winner: config file (level 3) │
╰─────────────────────────────────╯
✓ OK Config read
agents config list [--filter-values <REGEX>] [<REGEX>]
$ agents config list
╭─ Config ───────────────────────────────────────────────────╮
│ Key Value Source Modified │
│ ──────────────── ────────────────── ─────── ──────── │
│ core.automation-profile trusted config yes │
│ actor.default.invariant local/reconciler config yes │
│ core.log.level FATAL default no │
╰────────────────────────────────────────────────────────────╯
╭─ Overrides ─────╮
│ Env: none │
│ CLI Flags: none │
╰─────────────────╯
╭─ Config File ───────────────────────╮
│ Path: ~/.cleveragents/config.toml │
│ Size: 284 bytes │
│ Valid: yes │
╰─────────────────────────────────────╯
✓ OK 6 settings listed
agents invariant add [--global] [(--project|-p) PROJECT] [--plan PLAN_ID]...
[--action ACTION]... <INVARIANT_TEXT>
$ agents invariant add --global "All public APIs must maintain backward compatibility"
╭─ Invariant Added ──────────────────────────────────────────────────────╮
│ Invariant: All public APIs must maintain backward compatibility │
│ Scope: global │
│ ID: inv_01HXM9A1B │
╰────────────────────────────────────────────────────────────────────────╯
✓ OK Invariant added
$ agents invariant add --project local/api-service "All endpoints must validate auth tokens"
╭─ Invariant Added ──────────────────────────────────────────────╮
│ Project: local/api-service │
│ Invariant: All endpoints must validate auth tokens │
│ Scope: project │
│ ID: inv_01HXM9A2C │
╰────────────────────────────────────────────────────────────────╯
✓ OK Invariant added
$ agents invariant add --plan 01HXM8C2ZK4Q7C2B3F2R4VYV6J "All database queries must use parameterized statements"
╭─ Invariant Added ─────────────────────────────────────────────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Invariant: All database queries must use parameterized statements │
│ Scope: plan │
│ ID: inv_01HXM9G3A │
╰───────────────────────────────────────────────────────────────────────╯
✓ OK Invariant added
$ agents invariant add --action local/code-coverage "Test files must not import production secrets"
╭─ Invariant Added ──────────────────────────────────────────────────────╮
│ Action: local/code-coverage │
│ Invariant: Test files must not import production secrets │
│ Scope: action │
│ ID: inv_01HXM9H4B │
╰────────────────────────────────────────────────────────────────────────╯
✓ OK Invariant added
agents invariant list [--global] [(--project|-p) PROJECT] [--plan PLAN_ID] [--action ACTION]
[--effective] [<REGEX>]
$ agents invariant list --global
╭─ Global Invariants ──────────────────────────────────────────────────────╮
│ ID Text │
│ ────────────── ──────────────────────────────────────────────────── │
│ inv_01HXM9A1B All public APIs must maintain backward compatibility │
│ inv_01HXM9A1C Payment processing must be idempotent │
╰──────────────────────────────────────────────────────────────────────────╯
✓ OK 2 invariants
$ agents invariant list --plan 01HXM8C2ZK4Q7C2B3F2R4VYV6J --effective
╭─ Effective Invariants (Plan 01HXM8C2ZK4Q7C2B3F2R4VYV6J) ──────────────────────────────────╮
│ ID Source Text │
│ ────────────── ─────── ────────────────────────────────────────────────────── │
│ inv_01HXM9A1B global All public APIs must maintain backward compatibility │
│ inv_01HXM9A2C project All endpoints must validate auth tokens │
│ inv_01HXM9G3A plan All database queries must use parameterized statements │
╰───────────────────────────────────────────────────────────────────────────────────────────╯
│ Conflicts Resolved: 1 │
│ Global "Use shared DB pool" overridden by plan "All database queries must use │
│ parameterized statements" │
✓ OK 3 effective invariants (1 global, 1 project, 1 plan; 1 conflict resolved)
agents invariant remove [--yes|-y] <INVARIANT_ID>
$ agents invariant remove inv_01HXM9A1C
Remove invariant inv_01HXM9A1C ("Payment processing must be idempotent", scope: global)? [y/N]: y
╭─ Invariant Removed ──────────────────────────────────────────────╮
│ Removed: Payment processing must be idempotent │
│ Scope: global │
│ ID: inv_01HXM9A1C │
╰──────────────────────────────────────────────────────────────────╯
✓ OK Invariant removed
# Example: Execution actor with subplan spawning capability.
# The graph uses a tool node referencing a named registered tool.
actors:
code_executor:
type: graph
config:
actor: anthropic/claude-3-opus
skills:
- local/plan-tools # Skill containing create_subplan for LLM tool-calling
- local/file-ops
routes:
execute_workflow:
nodes:
- name: spawn_test_subplan
type: tool
tool: local/create-subplan # Named tool from Tool Registry
# File: tools/create-subplan.yaml
cleveragents:
version: "3.0"
tool:
name: local/create-subplan
description: "Spawn a subplan for a given action"
source: custom
input_schema:
type: object
properties:
action: { type: string }
target_files: { type: array, items: { type: string } }
required: [action]
capability:
writes: true
checkpointable: false
side_effects: [spawn_subplan]
code: |
subplan = ctx.spawn_subplan(
action=params["action"],
target_files=params.get("target_files", [])
)
return {"subplan_id": subplan.id}
# File: skills/plan-tools.yaml
skill:
name: local/plan-tools
description: "Tools for spawning and managing subplans"
tools:
- local/create-subplan
Decision required: Which modules should be prioritized for test coverage?
Options identified by the strategy actor:
1. auth module (currently 45% coverage, high risk)
2. payment module (currently 52% coverage, high risk)
3. user module (currently 71% coverage, medium risk)
Your choice (or provide custom guidance): _
Plan: 01KH29QDEE6DZTXKWNKCV8VP0F
├── [prompt_definition] "Increase test coverage to 85% for the whole project."
├── [invariant_enforced] "Prioritize all functionality related to financial transactions and user management"
├── [invariant_enforced] "All API calls over TCP must be mocked"
├── [strategy_choice] "Prioritize auth and payment modules, implement them in parallel before the rest"
├── [subplan_parallel_spawn] "Implement auth and payment modules, in parallel"
│ ├── [subplan_spawn] "Write tests for auth module"
│ │ └── Plan: 01KH29R8WPKPBHRY7Q0NA9XW86
│ │ ├── [prompt_definition] "Write unit tests for auth module using mocks for the remote API calls"
│ │ ├── [implementation_choice] "Test login flow first"
│ │ └── ...
│ └── [subplan_spawn] "Write tests for payment module"
│ └── Plan: 01KH29RN2YKSXMTBDG82AKRHRA
│ ├── [prompt_definition] "Write unit tests for payment module using"
│ └── ...
└── [subplan_parallel_spawn] "Write tests for all modules except the auth and payment modules"
└── ...
agents plan correct <decision_id> --mode=<mode> --guidance "<corrected decision text>"
# Correct a strategy choice
agents plan correct 01ARZ3NDEKTSV4RRFFQ69G5FAV --mode=revert \
--guidance "Prioritize the payment module first, not auth, due to upcoming deadline"
# Correct the root prompt to be more specific
agents plan tree <plan_id>
# Shows: [prompt_definition] id=01ARZ3NDEKTSV4RRFFQ69G5FAV "Increase test coverage to 85%"
agents plan correct 01ARZ3NDEKTSV4RRFFQ69G5FAV --mode=revert \
--guidance "Increase test coverage to 85%, prioritizing auth and payment modules. Use mocks for database tests, not integration tests."
# Correct a subplan's prompt (originally created by parent plan)
agents plan correct 01BRZ4PDFLUTW5SSGR70H6GBW --mode=revert \
--guidance "Write unit tests for auth module, focusing on edge cases for token expiration"
# Append a fix rather than rewriting history
agents plan correct 01ARZ3NDEKTSV4RRFFQ69G5FAV --mode=append \
--guidance "The previous approach missed error handling tests - add comprehensive error path coverage"
# Remove an invariant that shouldn't apply
agents plan correct 01CRZ5QEHMVUX6TTHR81I7HCX --mode=revert \
--guidance "Remove this invariant - TCP mocking is not needed for this module since it has no network calls"
# Add a missing invariant to the plan
agents invariant add --plan 01HXM8C2ZK4Q7C2B3F2R4VYV6J "All database queries must use parameterized statements"
Decision:
# Identity
decision_id: ULID # Unique identifier
plan_id: ULID # Parent plan this decision belongs to
parent_decision_id: ULID | null # Parent decision (for tree structure)
sequence_number: int # Order within the plan's decisions
# Classification
decision_type: enum
- prompt_definition # The prompt/description for this plan (root decision)
- invariant_enforced # An invariant (from global, project, action, or plan scope) applicable to this plan, added as a constraint
- strategy_choice # High-level approach decision during Strategize
- implementation_choice # How to implement a specific task
- resource_selection # Which resources to read/modify
- subplan_spawn # Decision to create a child plan (spawned later in Execute)
- subplan_parallel_spawn # Decision to spawn a group of child plans in parallel (contains subplan_spawn children)
- tool_invocation # Which skill/tool to use
- error_recovery # How to handle a failure
- validation_response # Response to validation failure
- user_intervention # User provided guidance/correction
# The Decision Itself
question: str # What question was being answered
chosen_option: str # What was decided
alternatives_considered: list[str] # Other options that were evaluated
confidence_score: float | null # 0.0-1.0 if the actor provided confidence
# Context Snapshot (for replay)
context_snapshot:
hot_context_hash: str # Cryptographic hash of the exact context
hot_context_ref: str # Pointer to the full stored snapshot
relevant_resources: list[ResourceRef] # Every file/symbol that influenced this decision
actor_state_ref: str # Complete LangGraph checkpoint
# When the system decides "refactor the authentication module to use async patterns,"
# it permanently records:
# - Which files were examined to make that decision
# - What symbols and dependencies were traced
# - The exact code state that was analyzed
# - The reasoning chain that led to this choice
# - Alternative approaches that were considered but rejected
# Rationale
rationale: str # Why this option was chosen
actor_reasoning: str | null # Raw LLM reasoning if available
# Downstream Impact (populated during Execute phase)
downstream_decision_ids: list[ULID] # Decisions that depend on this one
downstream_plan_ids: list[ULID] # Child plans spawned because of this decision
artifacts_produced: list[ArtifactRef] # Files/outputs created under this decision
# Timestamps
created_at: datetime
# Correction Metadata
is_correction: bool # Was this decision a correction of another?
corrects_decision_id: ULID | null # If correction, which decision was replaced
correction_reason: str | null # Why the correction was made
superseded_by: ULID | null # If this decision was later corrected
-- Core decision table
CREATE TABLE decisions (
decision_id TEXT PRIMARY KEY, -- ULID
plan_id TEXT NOT NULL,
parent_decision_id TEXT,
sequence_number INTEGER NOT NULL,
decision_type TEXT NOT NULL, -- prompt_definition, invariant_enforced, strategy_choice,
-- implementation_choice, resource_selection, subplan_spawn,
-- subplan_parallel_spawn, tool_invocation, error_recovery,
-- validation_response, user_intervention
question TEXT,
chosen_option TEXT NOT NULL,
alternatives_considered TEXT, -- JSON array
confidence_score REAL,
rationale TEXT,
actor_reasoning TEXT,
context_snapshot TEXT NOT NULL, -- JSON blob
is_correction BOOLEAN DEFAULT FALSE,
corrects_decision_id TEXT,
correction_reason TEXT,
superseded_by TEXT,
created_at TEXT NOT NULL,
FOREIGN KEY (plan_id) REFERENCES plans(plan_id),
FOREIGN KEY (parent_decision_id) REFERENCES decisions(decision_id),
FOREIGN KEY (corrects_decision_id) REFERENCES decisions(decision_id),
FOREIGN KEY (superseded_by) REFERENCES decisions(decision_id)
);
-- Downstream relationships (many-to-many for DAG)
CREATE TABLE decision_dependencies (
upstream_decision_id TEXT NOT NULL,
downstream_decision_id TEXT NOT NULL,
dependency_type TEXT NOT NULL, -- 'decision', 'plan', 'artifact'
downstream_ref TEXT NOT NULL, -- The actual ID of decision/plan/artifact
PRIMARY KEY (upstream_decision_id, downstream_decision_id, downstream_ref),
FOREIGN KEY (upstream_decision_id) REFERENCES decisions(decision_id)
);
-- Correction history
CREATE TABLE correction_attempts (
attempt_id TEXT PRIMARY KEY, -- ULID
plan_id TEXT NOT NULL,
original_decision_id TEXT NOT NULL,
new_decision_id TEXT,
original_subtree_snapshot TEXT, -- Reference to archived state
correction_reason TEXT,
status TEXT NOT NULL, -- 'pending', 'executing', 'completed', 'failed'
created_at TEXT NOT NULL,
completed_at TEXT,
FOREIGN KEY (plan_id) REFERENCES plans(plan_id),
FOREIGN KEY (original_decision_id) REFERENCES decisions(decision_id),
FOREIGN KEY (new_decision_id) REFERENCES decisions(decision_id)
);
agents action create --config ./actions/code-coverage.yaml
# Basic usage
agents plan use local/code-coverage my-api-service
# Multiple projects
agents plan use local/schema-update \
api-service \
web-frontend \
mobile-app
# With action arguments
agents plan use local/code-coverage \
my-api-service \
--arg target_coverage_percent=85 \
--arg test_framework=pytest
# With explicit automation profile
agents plan use local/deploy-action \
staging-env \
--automation-profile manual
# With invariants attached at use time
agents plan use local/code-coverage \
my-api-service \
--arg target_coverage_percent=85 \
--invariant "All API calls over TCP must be mocked" \
--invariant "Do not modify the payments module"
# Pseudocode of what happens inside a strategy actor
def compute_closure_for_refactoring(target_module):
closure = ResourceClosure()
# Direct file dependencies
closure.add_files(find_imports(target_module))
closure.add_files(find_includes(target_module))
# Symbol dependencies
for symbol in extract_exported_symbols(target_module):
closure.add_files(find_symbol_usage(symbol, scope='project'))
# Test dependencies
closure.add_files(find_tests_for_module(target_module))
# Build system dependencies
closure.add_files(find_build_references(target_module))
return closure
# Example: Action with estimation actor (defined in the YAML config file)
agents action create --config ./actions/expensive-refactor.yaml
Plan A (refactoring auth module):
- Sandbox A1: Contains only auth/*.cpp, auth_tests/*.cpp
- Cannot see Plan B's intermediate states
- Cannot accidentally depend on Plan B's half-done work
Plan B (updating API endpoints):
- Sandbox B1: Contains only api/*.cpp, api_tests/*.cpp
- Makes changes assuming current auth interface
- Protected from Plan A's intermediate refactoring
def merge_subplan_results(subplan_results):
# Group by resource type
by_resource = group_by_resource_type(subplan_results)
# Apply resource-specific merge strategies
for resource_type, changes in by_resource:
if resource_type == 'git-checkout':
merge_git_changes(changes) # Three-way merge
elif resource_type == 'fs-mount':
merge_fs_changes(changes) # Copy-on-write reconciliation
elif resource_type.startswith('database'):
merge_db_changes(changes) # Sequential application
# Validate merged state
run_integration_tests()
Decision: Refactor payment module to async
alternatives_considered:
- "Convert to async/await patterns" (chosen)
- "Use thread pool with channels" (rejected: doesn't integrate with async ecosystem)
- "Keep synchronous with timeout" (rejected: doesn't solve core latency issue)
confidence_score: 0.85
validation_performed:
- Checked all payment API consumers can handle async
- Verified database driver supports async operations
- Confirmed no regulatory requirement for sync processing
# Actor graph uses a named tool node for semantic validation
actors:
code_executor:
type: graph
skills:
- local/semantic-validators # Skill containing validation tools for LLM tool-calling
nodes:
- name: semantic_validator
type: tool
tool: local/validate-api-compat # Named tool from Tool Registry
# File: tools/validate-api-compat.yaml
cleveragents:
version: "3.0"
tool:
name: local/validate-api-compat
description: "Check for breaking API changes and attempt auto-migration"
source: custom
capability:
writes: true
checkpointable: true
code: |
# Not just syntax checking - semantic validation
old_api = extract_api_signature(previous_version)
new_api = extract_api_signature(current_version)
breaking_changes = find_breaking_changes(old_api, new_api)
if breaking_changes:
affected_consumers = find_api_consumers(breaking_changes)
migration_plan = generate_migration(breaking_changes)
if can_auto_migrate(affected_consumers, migration_plan):
apply_migration(migration_plan)
else:
raise SemanticError(
"Breaking API changes require manual review",
changes=breaking_changes,
affected=affected_consumers
)
# File: skills/semantic-validators.yaml
skill:
name: local/semantic-validators
description: "Semantic validation tools for API compatibility and code invariants"
tools:
- local/validate-api-compat
# Add invariants at different scopes
agents invariant add --global "All public APIs must maintain backward compatibility"
agents invariant add --global "Payment processing must be idempotent"
agents invariant add --project local/api-service \
"Database transactions must complete within 5 seconds"
agents invariant add --project local/api-service \
"Authentication must always use OAuth2"
agents invariant add --plan <PLAN_ID> "All API calls over TCP must be mocked"
agents invariant add --action local/code-coverage "Test files must not import production secrets"
# List invariants
agents invariant list --global
agents invariant list --project local/api-service
agents invariant list --plan <PLAN_ID> --effective # Shows reconciled view
# Remove an invariant
agents invariant remove <INVARIANT_ID>
# Attach invariants at creation time (convenience)
agents project create --invariant "All endpoints must validate auth tokens" local/api-service
agents action create --config ./actions/code-coverage.yaml
agents plan use local/code-coverage local/api-service --invariant "Mock all network calls"
# Correct an invariant decision (remove or replace via standard correction)
agents plan correct <DECISION_ID> --mode=revert \
--guidance "Remove this invariant - it does not apply to this module"
class InvariantEnforcer:
def compute_effective_invariants(self, plan):
"""Compute the effective invariant view for a plan using the Invariant Reconciliation Actor."""
# 1. Collect raw invariants from all scopes
raw = self.collect_all_invariants(plan)
# 2. Find the Invariant Reconciliation Actor (plan -> project -> global config)
reconciler = (
self.get_plan_invariant_actor(plan)
or self.get_project_invariant_actor(plan)
or self.get_global_invariant_actor()
)
# 3. Reconcile: apply precedence (plan > project > global), resolve conflicts
effective = reconciler.reconcile(raw, precedence=['plan', 'project', 'global'])
return effective
def collect_all_invariants(self, plan):
"""Collect invariants from all scopes accessible to this plan."""
invariants = []
invariants.extend(self.get_global_invariants())
for project in plan.projects:
invariants.extend(self.get_project_invariants(project))
invariants.extend(self.get_action_invariants(plan.action))
invariants.extend(self.get_plan_invariants(plan))
return invariants
def check_invariant_preservation(self, changes, enforced_invariants):
"""Check that changes respect all enforced invariants."""
for invariant in enforced_invariants:
if not self.verify_invariant(invariant, changes):
return InvariantViolation(invariant, changes)
return Success()
Error Pattern Database:
- pattern: "Async conversion in payment module"
historical_failures:
- "Race condition in payment confirmation"
- "Timeout handling breaks idempotency"
preventive_checks:
- "Add explicit transaction boundaries"
- "Verify idempotency keys are preserved"
- "Check distributed lock acquisition"
# Step 1: Register resources independently
agents resource add git-checkout local/api-repo \
--path /repos/api-service \
--branch main
agents resource add local/database local/staging-db \
--connection-string "postgresql://staging.example.com/mydb" \
--read-only
# Step 2: Create the project
agents project create "my-api-service"
# Step 3: Link resources to the project
agents project link-resource "my-api-service" local/api-repo
agents project link-resource "my-api-service" local/staging-db --read-only
name: local/my-workflow
cleveragents:
version: "3.0"
default_actor: workflow_controller
actors:
# Simple LLM actor with skills referenced by name
my_assistant:
type: llm
config:
actor: openai/gpt-4 # Reference to built-in actor
temperature: 0.7
system_prompt: |
You are a helpful assistant.
Current task: {{ context.task_description }}
skills:
- local/file-ops # Grants access to all tools in this skill
- local/git-ops
# LLM actor with a composite skill (includes many sub-skills)
data_processor:
type: llm
config:
actor: anthropic/claude-3-opus
system_prompt: |
You are a data processing assistant.
skills:
- local/data-toolkit # A skill containing analysis + transformation tools
# Actor referencing another actor
reviewer:
type: llm
config:
actor: local/code-reviewer # Reference to another custom actor
memory_enabled: true
max_history: 20
skills:
- local/file-ops
- local/git-ops
routes:
main_workflow:
type: graph
entry_point: start
nodes:
- name: analyze
type: agent
agent: my_assistant
- name: process
type: agent
agent: data_processor
edges:
- source: start
target: analyze
- source: analyze
target: process
- source: process
target: end
context:
global:
task_description: "Default task"
nodes:
- name: run_db_migrate
type: tool
tool: local/run-migrations # Named tool from Tool Registry
override: # Optional metadata override
capability:
human_approval_required: true
- name: spawn_tests
type: tool
tool: local/create-subplan # Another named tool
nodes:
- name: custom_validation
type: tool
anonymous: true
description: "Validate output format before proceeding"
input_schema:
type: object
properties:
data: { type: object }
capability:
read_only: true
code: |
# Inline Python — same format as a named tool YAML body
if not params["data"].get("status"):
raise ValueError("Missing status field")
return {"valid": True}
# File: tools/run-migrations.yaml
cleveragents:
version: "3.0"
tool:
name: local/run-migrations
description: "Run database migrations for the API service"
source: custom # mcp | agent_skill | builtin | custom
# Resource bindings — what resources this tool needs access to
resources:
db:
type: local/database
access: read_write
required: true
description: "Target database for migrations"
input_schema:
type: object
properties:
direction:
type: string
enum: [up, down]
count:
type: integer
default: 1
required: [direction]
capability:
writes: true
write_scope:
resource_slots: [db] # References the "db" resource slot
checkpointable: true
checkpoint_scope: transaction
side_effects: [schema_mutation]
code: |
import subprocess
direction = params["direction"]
count = params.get("count", 1)
db = ctx.resources["db"] # Access the bound database resource
result = subprocess.run(
["alembic", direction, str(count)],
capture_output=True, text=True, cwd=db.sandbox.root
)
return {"stdout": result.stdout, "returncode": result.returncode}
# File: tools/create-github-issue.yaml
cleveragents:
version: "3.0"
tool:
name: local/create-github-issue
description: "Create a GitHub issue via MCP"
source: mcp
mcp_server:
command: "npx @anthropic/mcp-github"
env:
GITHUB_TOKEN: "${GITHUB_TOKEN}"
tool_name: create_issue # The tool name as exposed by the MCP server
capability:
writes: true
write_scope: [github:issues]
checkpointable: false
# File: tools/deploy-staging.yaml
cleveragents:
version: "3.0"
tool:
name: local/deploy-staging
description: "Deploy the current branch to the staging environment"
source: agent_skill
agent_skill:
path: ./skills/deploy-to-staging
sandbox_policy: container
allowed_tools: ["Bash(docker:*)", "Bash(kubectl:*)", "Read"]
capability:
writes: true
checkpointable: false
side_effects: [deploy, infrastructure]
# Register a new tool from its YAML configuration
agents tool add --config ./tools/run-migrations.yaml
# Update an existing tool (re-reads the config file, overwrites registration)
agents tool add --config ./tools/run-migrations.yaml --update
# List all registered tools
agents tool list
# Show details for a tool (schema, capability, references)
agents tool show local/run-migrations
# Remove a tool
agents tool remove local/run-migrations
skill:
name: local/my-skill
tools:
- local/run-migrations # Named tool reference
- local/validate-api-compat # Named tool reference
anonymous_tools: # Inline definitions, same format as tool YAML
- description: "One-off data cleanup for this project"
input_schema:
type: object
properties:
table: { type: string }
capability:
writes: true
checkpointable: true
code: |
# ... Python code ...
return {"cleaned": count}
nodes:
- name: custom_step
type: tool
anonymous: true
description: "Inline validation specific to this workflow"
input_schema:
type: object
properties:
data: { type: object }
capability:
read_only: true
code: |
# ... Python code ...
return {"valid": True}
skill:
name: local/strict-devops
tools:
- name: local/run-migrations
override:
capability:
human_approval_required: true # Override: require approval in this skill
write_scope: [database:staging] # Override: restrict scope for this context
- local/validate-api-compat # No overrides, use as registered
nodes:
- name: safe_migrate
type: tool
tool: local/run-migrations
override:
capability:
human_approval_required: true
skill:
name: local/production-ops
includes:
- name: local/devops-toolkit
tool_overrides:
- tool: local/run-migrations
override:
capability:
human_approval_required: true # In this context, require human approval
write_scope: [database:production]
- tool: local/create-github-issue
override:
capability:
human_approval_required: true # Require approval in this context
tool:
name: local/run-migrations
description: "Run database migrations"
source: custom
resources:
db:
type: local/database
access: read_write
required: true
description: "Target database for migrations"
capability:
writes: true
write_scope: [db:migrations] # References the "db" slot
checkpointable: true
code: |
direction = params["direction"]
db_resource = ctx.resources["db"] # Access the bound resource
result = db_resource.handler.execute_migration(direction, db_resource.sandbox)
return {"status": "ok"}
tool:
name: local/cross-repo-diff
description: "Compare files across two git repositories"
source: custom
resources:
source_repo:
type: git-checkout
access: read_only
required: true
description: "Source repository to compare from"
target_repo:
type: git-checkout
access: read_only
required: true
description: "Target repository to compare against"
capability:
read_only: true
code: |
source = ctx.resources["source_repo"]
target = ctx.resources["target_repo"]
# ... compare files across repos ...
resources:
repo:
type: git-checkout
access: read_write
# No `bind` field → contextual binding
resources:
docs:
type: fs-mount
access: read_only
bind: local/company-docs # Static: always this resource
description: "Company documentation corpus"
resources:
target:
type: git-checkout
access: read_only
from_param: repository # Bound from the "repository" input parameter
description: "Repository to analyze"
input_schema:
type: object
properties:
repository:
type: string
description: "Name of the registered resource to analyze"
required: [repository]
<style="color: cyan; font-weight: 600;">available_agent_skills>
<style="color: cyan; font-weight: 600;">agent_skill>
<style="color: cyan; font-weight: 600;">name>deploy-to-staging</style="color: cyan; font-weight: 600;">name>
<style="color: cyan; font-weight: 600;">description>Deploy the current branch to the staging environment.</style="color: cyan; font-weight: 600;">description>
<style="color: cyan; font-weight: 600;">tool>local/deploy-staging</style="color: cyan; font-weight: 600;">tool>
</style="color: cyan; font-weight: 600;">agent_skill>
</style="color: cyan; font-weight: 600;">available_agent_skills>
read_file(path: str) -> str
write_file(path: str, content: str) -> None
edit_file(path: str, edits: list[Edit]) -> None
delete_file(path: str) -> None
move_file(source: str, destination: str) -> None
copy_file(source: str, destination: str) -> None
create_directory(path: str) -> None
list_directory(path: str, pattern: str = "*") -> list[str]
delete_directory(path: str, recursive: bool = False) -> None
search_files(pattern: str, content_pattern: str = None) -> list[Match]
find_definition(symbol: str) -> list[Location]
find_references(symbol: str) -> list[Location]
git_status() -> GitStatus
git_diff(path: str = None) -> str
git_log(count: int = 10) -> list[Commit]
git_blame(path: str) -> list[BlameLine]
capability:
read_only: bool # Whether tool only performs read operations
writes: bool # Whether tool can modify resources
write_scope: # What the tool is allowed to mutate
- file_paths: ["src/**", "tests/**"] # Path patterns within bound resources
- resource_slots: ["repo", "db"] # Resource slot names (from resource bindings)
- environment: container | host
idempotent: bool # Whether repeated calls produce same result
checkpointable: bool # Whether tool supports checkpoint/rollback
checkpoint_scope: str # What can be rolled back (file, transaction, commit, snapshot)
side_effects: # Non-reversible effects
- install_packages
- mutate_infra
- send_email
cost_profile: # Usage constraints
rate_limit: "10/min"
estimated_cost: "$0.01/call"
human_approval_required: bool # Whether a human must approve invocation
1. LLM generates tool call
e.g., edit_file(path="src/main.py", changes=[...])
or: local/github.create_issue(title="Bug fix", body="...")
or: (activates Agent Skill "deploy-to-staging" via instructions)
↓
2. Tool Router receives call
- Resolves tool by name from the Tool Registry or actor's skill tool sets
- Validates parameters against inputSchema
- Checks capability metadata against plan's access policy:
• Is this tool in allowed skill categories?
• Does the plan allow writes?
• Is human approval required?
- If denied → return AccessDeniedError to LLM
↓
3. Resource Binding Resolution & Sandbox Context
- Resolve resource bindings for this tool:
• Static bindings: already resolved at registration
• Contextual bindings: resolve from plan's project resources
• Parameter bindings: resolve from invocation arguments
- Validate resource type compatibility for each slot
- Validate access mode (e.g., read_write tool on read_only resource → error)
- Ensure sandbox exists for each bound resource (lazy sandboxing)
- Maps logical paths to sandbox-relative paths via bound resource handlers
- Inject bound resources into ctx.resources[slot_name]
- If tool is checkpointable → create pre-execution checkpoint
↓
4. Adapter-Specific Execution
- MCP: sends tools/call JSON-RPC to server process
- Agent Skill: agent follows loaded SKILL.md instructions,
running scripts and tools in sandboxed shell
- Built-in: calls native Python implementation directly
- Custom: executes inline code with sandboxed context
↓
5. Change Recording
- If tool modified resources → create Change record(s)
- Append Change(s) to plan's ChangeSet
- Update sandbox state
- If checkpointable → record checkpoint for rollback
↓
6. Result Return
- Normalize result to uniform Result type
- Return to LLM agent for continued reasoning
class ToolExecutionContext:
"""Context provided to every tool execution, regardless of source."""
def __init__(self, plan: Plan, sandbox: Sandbox,
resources: dict[str, BoundResource]):
self.plan = plan
self.sandbox = sandbox
self.resources = resources # slot_name → BoundResource
self.changes: list[Change] = []
def record_change(self, change: Change) -> None:
"""Record a change made by a tool."""
self.changes.append(change)
self.plan.changeset.add_change(change)
class WriteFileTool:
"""Example: built-in tool for writing files."""
def execute(self, path: str, content: str, ctx: ToolExecutionContext) -> None:
handler = ctx.sandbox.get_handler(path)
change = handler.write(path, content, ctx.sandbox)
ctx.record_change(change)
# Before sending to MCP server:
# Logical path: "src/main.py"
# Sandbox path: "/tmp/sandbox-01HXM/worktree/src/main.py"
# The adapter rewrites the tool arguments so the MCP server
# operates on sandboxed state without knowing about the sandbox.
Agent Skill Tool: "local/deploy-staging"
SKILL.md instructions:
1. Run tests using the built-in shell tool
2. Create a PR using the GitHub MCP tool (create_pull_request)
3. Wait for CI using the GitHub MCP tool (get_check_runs)
4. Deploy using the AWS MCP tool (ecs_update_service)
5. Verify deployment using the HTTP MCP tool (fetch_url)
{
"passed": true,
"message": "All 247 tests passed, 94% coverage",
"data": {
"tests_run": 247,
"tests_passed": 247,
"tests_failed": 0,
"coverage_percent": 94.2,
"coverage_threshold": 80,
"duration_seconds": 12.4
}
}
$ agents validation attach --project local/api-service local/api-repo local/run-tests --coverage-threshold 90
$ agents validation attach --project local/staging-api local/api-repo local/run-tests --coverage-threshold 70
agents plan prompt <plan_id> "Try using mock objects for the database tests"
validate → fail → fix → re-validate → fail → fix → re-validate → ... → retry limit
→ request strategy revision → re-strategize → re-execute → validate
→ still failing → escalate to user → user provides guidance → resume
→ still failing → plan fails
# Actor graph with explicit validation nodes
graph:
nodes:
- name: implement
type: agent
actor: local/code-writer
- name: run_tests
type: tool
tool: local/run-tests # This is a Validation (subtype of Tool)
- name: lint_check
type: tool
tool: local/lint-check # Also a Validation
- name: fix_issues
type: agent
actor: local/code-fixer
edges:
- [implement, run_tests]
- [implement, lint_check]
- condition: "not run_tests.passed or not lint_check.passed"
from: [run_tests, lint_check]
to: fix_issues
- [fix_issues, run_tests] # Retry loop
- [fix_issues, lint_check]
# Skill: local/python-quality
skill:
name: local/python-quality
description: "Python code quality tools and validations"
tools:
- local/run-tests # Validation (required)
- local/lint-check # Validation (required)
- local/type-check # Validation (required)
- local/format-code # Plain Tool (writes)
- local/run-benchmarks # Validation (informational)
# validations/tests-pass.yaml
# Wraps the existing local/run-tests tool — no test logic duplicated
name: local/tests-pass
description: "Validate that all unit tests pass (wraps local/run-tests)"
wraps: local/run-tests
transform: |
def transform(tool_output):
passed = tool_output.get("returncode") == 0
return {
"passed": passed,
"message": "All tests passed" if passed else f"Tests failed (exit {tool_output.get('returncode')})",
"data": tool_output
}
validation:
mode: required
timeout: 600
def transform(tool_output) -> dict:
"""
Args:
tool_output: The wrapped Tool's return value. The type depends on the
Tool's implementation — typically a dict (for JSON-returning
tools) but may be a string or other type.
Returns:
A dict with at minimum {"passed": bool}. May also include
"message" (str) and "data" (any).
"""
# Example: Validation wraps local/run-tests but renames arguments
name: local/tests-pass
wraps: local/run-tests
argument_mapping:
test_directory: source_dir # Forward Validation's "source_dir" → Tool's "test_directory"
coverage_enabled: true # Always pass true for coverage_enabled
verbose: false # Always pass false for verbose
transform: |
def transform(tool_output):
return {"passed": tool_output.get("returncode") == 0, "message": "Tests completed"}
validation:
mode: required
# The base tool runs tests and produces a comprehensive report
# Tool: local/run-tests (already registered)
# Validation 1: All tests must pass (required)
# validations/tests-pass.yaml
name: local/tests-pass
description: "All unit tests must pass"
wraps: local/run-tests
transform: |
def transform(tool_output):
return {
"passed": tool_output.get("returncode") == 0,
"message": f"{tool_output.get('tests_passed', 0)}/{tool_output.get('tests_run', 0)} tests passed",
"data": tool_output
}
validation:
mode: required
# Validation 2: Coverage must exceed threshold (informational for now)
# validations/coverage-check.yaml
name: local/coverage-check
description: "Coverage must exceed threshold (advisory)"
wraps: local/run-tests
transform: |
def transform(tool_output):
coverage = tool_output.get("coverage_percent", 0)
threshold = 80
return {
"passed": coverage >= threshold,
"message": f"Coverage: {coverage}% (threshold: {threshold}%)",
"data": {"coverage_percent": coverage, "threshold": threshold}
}
validation:
mode: informational
{
"validation": "local/run-tests",
"mode": "required",
"passed": true,
"message": "All 247 tests passed, 94% coverage",
"data": {
"tests_run": 247,
"tests_passed": 247,
"coverage_percent": 94.2
},
"duration_ms": 12400,
"attempt": 2,
"attachment_id": "01HXM5A1B2C3D4E5F6G7H8J9K0",
"attachment_resource": "local/api-repo",
"attachment_scope": "project",
"attachment_scope_target": "local/api-service"
}
# 1. Define validation YAML files
# (see Configuration > Validation Configuration Files for schema and examples)
# 2. Register validations
agents validation add --config ./validations/run-tests.yaml
agents validation add --config ./validations/lint-check.yaml
agents validation add --config ./validations/type-check.yaml
agents validation add --config ./validations/check-bundle-size.yaml
# 3. Attach to resource through a project (active only when this resource is accessed through this project)
agents validation attach --project local/api-service local/api-repo local/run-tests
agents validation attach --project local/api-service local/api-repo local/type-check
agents validation attach --project local/api-service local/api-repo local/check-bundle-size
# 4. Attach directly to a resource (always active for any plan accessing this resource)
agents validation attach local/api-repo local/lint-check
# 5. Verify setup
agents tool list --type validation --namespace local
agents tool show local/run-tests
# 6. Run a plan — validations execute automatically at end of Execute phase
agents plan use local/implement-feature local/api-service
# File: skills/devops-toolkit.yaml
cleveragents:
version: "3.0"
skill:
name: local/devops-toolkit
description: "Full-stack development tools for file ops, git, GitHub, and deployment"
# ── Named Tool References ───────────────────────────────
# Reference independently registered tools by name.
# These tools must already be registered via `agents tool add`.
# Optional metadata overrides can be applied per tool.
tools:
- local/run-migrations # Simple reference, use as registered
- name: local/deploy-staging # Reference with metadata override
override:
capability:
human_approval_required: true # Require approval in this skill context
# ── Include other skills ─────────────────────────────────
# All tools from included skills become part of this skill.
# Included skills must already be registered in the system.
# Individual tools from included skills can have metadata overridden.
includes:
- local/file-ops # built-in file + directory + search tools
- local/git-ops # built-in git tools
- name: local/github # MCP-based GitHub tools, with per-tool overrides
tool_overrides:
- tool: local/create-github-issue
override:
capability:
write_scope: [github:issues:org-only]
# ── MCP Server Tools ─────────────────────────────────────
# Connect to MCP servers and expose their tools.
# Tools discovered from MCP servers are auto-registered in the
# Tool Registry if not already present.
mcp_servers:
- name: linear
command: "npx @anthropic/mcp-linear"
env:
LINEAR_API_KEY: "${LINEAR_API_KEY}"
# Optional: override inferred capability metadata per tool
overrides:
- tool: create_issue
writes: true
write_scope: [linear:issues]
- tool: list_issues
read_only: true
# ── Agent Skills (SKILL.md folders) ──────────────────────
# Each Agent Skill folder is loaded as a composite tool.
# The agent discovers it via metadata, activates it by
# loading SKILL.md instructions, and follows them.
agent_skills:
- path: ./skills/code-review-checklist
sandbox_policy: none
# ── Built-in Tool Groups ─────────────────────────────────
# Opt-in to built-in tool groups provided by CleverAgents.
builtins:
- group: shell_operations
# ── Anonymous Tools ──────────────────────────────────────
# Inline tool definitions for one-off, skill-specific operations.
# Same format as a named tool YAML body but without a name.
# These are NOT registered in the Tool Registry and are NOT reusable.
anonymous_tools:
- description: "One-off cleanup for legacy migration artifacts"
input_schema:
type: object
properties:
directory: { type: string }
capability:
writes: true
checkpointable: true
checkpoint_scope: file
code: |
import os, glob
directory = params["directory"]
removed = []
for f in glob.glob(os.path.join(ctx.sandbox.root, directory, "*.legacy")):
os.remove(f)
removed.append(f)
return {"removed": removed, "count": len(removed)}
# File: skills/file-ops.yaml
cleveragents:
version: "3.0"
skill:
name: local/file-ops
description: "File and directory operations"
builtins:
- group: file_operations # read, write, edit, delete, move, copy
- group: directory_operations # create, list, delete dirs
# File: skills/github.yaml
cleveragents:
version: "3.0"
skill:
name: local/github
description: "GitHub operations via MCP"
mcp_servers:
- name: github
command: "npx @anthropic/mcp-github"
env:
GITHUB_TOKEN: "${GITHUB_TOKEN}"
overrides:
- tool: create_issue
writes: true
write_scope: [github:issues]
checkpointable: false
- tool: create_pull_request
writes: true
write_scope: [github:pulls]
checkpointable: false
- tool: list_repos
read_only: true
- tool: get_file_contents
read_only: true
local/full-stack-dev
├── includes: local/file-ops
│ └── builtins: file_operations, directory_operations
├── includes: local/git-ops
│ └── builtins: git_operations
├── includes: local/github
│ └── mcp_servers: github (create_issue, create_pr, list_repos, ...)
├── agent_skills: code-review-checklist
└── tools: local/run-migrations, local/deploy-staging (named tool refs)
Flattened tool set available to actors referencing local/full-stack-dev:
read_file, write_file, edit_file, delete_file, move_file, copy_file,
create_directory, list_directory, delete_directory,
git_status, git_diff, git_log, git_blame,
create_issue, create_pr, list_repos, get_file_contents,
code-review-checklist (agent skill),
local/run-migrations, local/deploy-staging (named tools)
# First, register any named tools the skill will reference
agents tool add --config ./tools/run-migrations.yaml
agents tool add --config ./tools/deploy-staging.yaml
# Then register the skill (which references those tools by name)
agents skill add --config ./skills/devops-toolkit.yaml
# Update an existing skill (re-reads the config file, overwrites registration)
agents skill add --config ./skills/devops-toolkit.yaml --update
# List all registered skills
agents skill list
# Show details for a skill (tools, includes, metadata)
agents skill show local/devops-toolkit
# List all tools provided by a skill (flattened, including from child skills)
agents skill tools local/devops-toolkit
# Remove a skill
agents skill remove local/devops-toolkit
# File: actors/code-assistant.yaml
cleveragents:
version: "3.0"
default_actor: code_assistant
actors:
code_assistant:
type: llm
config:
actor: anthropic/claude-3-opus
temperature: 0.3
system_prompt: |
You are a code assistant with access to file, git, and GitHub tools.
Current task: {{ context.task_description }}
# Reference skills by fully-qualified name.
# All tools from these skills become available to this actor.
skills:
- local/file-ops
- local/git-ops
- local/github
# Or reference a single composite skill that includes all of the above
full_stack_assistant:
type: llm
config:
actor: anthropic/claude-3-opus
system_prompt: |
You are a full-stack development assistant.
skills:
- local/full-stack-dev # includes file-ops, git-ops, github, etc.
skills:
- dev:freemo/custom-analysis # from dev server, personal namespace
- prod:cleverthis/deploy-tools # from prod server, org namespace
- local/file-ops # local skill
# 1) Checked-out git repo (has local files on disk)
agents resource add git-checkout local/acme-app \
--path /home/alice/projects/acme-dashboard --branch main
# 2) Git repo via remote URL (no local checkout — metadata only)
agents resource add git local/acme-upstream \
--url git@github.com:acmecorp/dashboard.git
# 3) Standalone directory (not a git repo — just files on disk)
agents resource add fs-directory local/acme-deploy \
--path /opt/deploy/acme-dashboard
# File: resource-types/database.yaml
cleveragents:
version: "3.0"
resource_type:
name: local/database
description: "A SQL database (PostgreSQL, MySQL, SQLite, etc.)"
physical_or_virtual: physical
user_addable: true
# CLI arguments for `agents resource add local/database`
cli_arguments:
- name: connection-string
type: string
required: true
description: "Database connection string (e.g., postgresql://host/dbname)"
validation:
pattern: "^(postgresql|mysql|sqlite)://"
- name: schema
type: string
required: false
description: "Default schema to use"
- name: read-only
type: boolean
required: false
default: false
description: "Whether the database should be treated as read-only"
# Sandbox and handler
sandbox_strategy: transaction_rollback
handler: DatabaseHandler
checkpointable: true
# Allowed parent types (empty means can be top-level)
allowed_parent_types: []
# Child types
child_types:
- type: local/db-schema
auto_discover: true
manual_link: false
description: "Discovered database schemas"
- type: local/db-table
auto_discover: true
manual_link: false
description: "Discovered tables within schemas"
# Capabilities
capabilities:
readable: true
writable: true
sandboxable: true
checkpointable: true
agents resource type add --config ./resource-types/database.yaml
# Now available: agents resource add local/database <NAME> --connection-string CONN [--schema SCHEMA] [--read-only]
# Register a checked-out git repository (most common)
agents resource add git-checkout local/api-repo --path /home/user/projects/api-service --branch main
# Auto-discovers: git child (repo metadata, remotes, branches, commits, tree entries)
# + fs-directory child (worktree root directory, subdirectories, files)
# Register a git repo via remote URL (no local checkout — exists on remote server)
agents resource add git local/upstream --url git@github.com:org/upstream.git
# Auto-discovers: remotes, branches, tags, commits, trees, tree entries, stashes, submodules
# (no fs-directory — not checked out locally)
# Register a standalone directory (not a git repo — just files on disk)
agents resource add fs-directory local/docs --path /opt/docs/api-reference
# Auto-discovers: subdirectories, files, symlinks, hardlinks
# Register a standalone filesystem mount (entire volume)
agents resource add fs-mount local/data-volume --mount-path /mnt/data
# Auto-discovers: root fs-directory, subdirectories, files, symlinks, hardlinks
# Link resources to projects (resources must be registered first)
agents project link-resource local/api-service local/api-repo
agents project link-resource local/api-service local/docs --read-only
class ResourceHandler(Protocol):
"""Handler for a specific resource type."""
def read(self, path: str, sandbox: Sandbox) -> Content:
"""Read content from the sandboxed resource."""
...
def write(self, path: str, content: Content, sandbox: Sandbox) -> Change:
"""Write content and return the Change record."""
...
def delete(self, path: str, sandbox: Sandbox) -> Change:
"""Delete resource and return the Change record."""
...
def list(self, pattern: str, sandbox: Sandbox) -> list[str]:
"""List paths matching pattern."""
...
def diff(self, path: str, sandbox: Sandbox) -> str:
"""Generate diff between sandbox and original state."""
...
def supports_operation(self, operation: OperationType) -> bool:
"""Check if this resource supports the given operation."""
...
def discover_children(self, resource: ResourceRecord) -> list[ResourceRecord]:
"""Auto-discover child resources (called at registration and refresh)."""
...
def content_hash(self, path: str, sandbox: Sandbox) -> str:
"""Compute content hash for identity tracking."""
...
def create_sandbox(self, resource: ResourceRecord) -> Sandbox:
"""Create a sandbox for this resource using its type's strategy."""
...
def create_checkpoint(self, sandbox: Sandbox) -> Checkpoint:
"""Create a checkpoint within the sandbox."""
...
def rollback_to(self, sandbox: Sandbox, checkpoint: Checkpoint) -> None:
"""Roll back sandbox state to a checkpoint."""
...
# Explicit slot reference
path://repo/src/main.py → routes to the "repo" slot's bound resource
path://docs/api/readme.md → routes to the "docs" slot's bound resource
# Default: unqualified paths route to the tool's primary resource slot
src/main.py → routes to the first (or only) resource slot
DetailDepth = int # Non-negative integer, 0 = most minimal, no upper bound
@dataclass
class DetailLevelMap:
"""Maps named detail levels to integer depths for a UKO domain.
Inherited: a child map includes all entries from its parent map,
and may insert additional levels at any integer position."""
domain: str # UKO namespace (e.g., "uko-code:", "uko-py:")
parent: DetailLevelMap | None # Parent map to inherit from
levels: dict[str, int] # Named level -> integer depth
max_depth: int # Maximum meaningful depth for this domain
def resolve(self, depth: int | str) -> int:
"""Resolve a named level or integer to an integer depth."""
if isinstance(depth, int):
return min(depth, self.max_depth)
# Look up named level in this map, then parent maps
if depth in self.levels:
return self.levels[depth]
if self.parent:
return self.parent.resolve(depth)
raise ValueError(f"Unknown detail level: {depth}")
@dataclass
class ContextRequest:
"""A structured request for context, issued by an actor or skill."""
# === What to find ===
query: str | None = None # Natural language query
entities: list[str] = field(default_factory=list) # Named entities to focus on
uko_types: list[str] = field(default_factory=list) # UKO types to filter
# === Scope control ===
focus: list[str] = field(default_factory=list)
# URIs or identifiers of specific items to focus on
breadth: int = 2
# How many hops outward in the dependency/reference graph.
depth: int | str = 3
# How much detail to include for each item found.
# May be a raw integer (0-N) or a named level string (e.g., "SIGNATURES")
# resolved via the active DetailLevelMap for the target node's UKO type.
# === Focus depth gradient ===
depth_gradient: bool = True
# When True, items closer to the focus get more detail.
# === Temporal scope ===
temporal: TemporalScope = TemporalScope.CURRENT
# === Budget ===
max_tokens: int | None = None
# === Strategy hints ===
preferred_strategies: list[str] = field(default_factory=list)
required_backends: list[str] = field(default_factory=list)
# === Priority and purpose ===
priority: float = 0.5 # 0.0 = background, 1.0 = critical
purpose: str = "" # Why is this context needed?
@dataclass
class ContextFragment:
"""A single piece of context assembled by a strategy."""
uko_node: str # UKO URI of the source node
content: str # Rendered text content
detail_depth: int # Resolved integer depth of this fragment
token_count: int # Token count of content
relevance_score: float # 0.0-1.0 relevance to the request
provenance: FragmentProvenance # Trace back to resource + location
metadata: dict = field(default_factory=dict)
@dataclass
class AssembledContext:
"""The fused, budget-respecting context payload."""
fragments: list[ContextFragment] # Ordered context fragments
total_tokens: int # Total token count
budget_used: float # Fraction of budget consumed (0.0-1.0)
strategies_used: list[str] # Which strategies contributed
context_hash: str # Cryptographic hash for snapshot
preamble: str | None # Optional structure summary
provenance_map: dict # Fragment -> resource/location mapping
# Built-in skill, always available
skill:
name: builtin/context
description: "Request additional context during reasoning"
anonymous_tools:
- name: request_context
description: "Request specific context to be added to the conversation"
input_schema:
type: object
properties:
query: { type: string, description: "What information do you need?" }
focus: { type: array, items: { type: string },
description: "Specific files, classes, or functions to focus on" }
breadth: { type: integer, default: 2,
description: "How many dependency hops outward (0-5)" }
depth: { oneOf: [{ type: integer, minimum: 0 }, { type: string }],
default: 3,
description: "Detail depth — integer (0-N) or named level from the active DetailLevelMap (e.g., 'SIGNATURES', 'FULL_SOURCE')" }
purpose: { type: string, description: "Why do you need this context?" }
required: [purpose]
- name: query_history
description: "Query historical context about past decisions and changes"
input_schema:
type: object
properties:
query: { type: string }
scope: { type: string, enum: ["current_plan", "plan_tree", "all_plans"],
default: "plan_tree" }
required: [query]
- name: get_context_budget
description: "Check remaining context token budget"
input_schema:
type: object
properties: {}
@runtime_checkable
class ContextStrategy(Protocol):
"""A pluggable context assembly strategy."""
@property
def name(self) -> str: ...
@property
def capabilities(self) -> StrategyCapabilities: ...
def can_handle(self, request: ContextRequest,
backends: BackendSet) -> float:
"""Returns 0.0-1.0 confidence that this strategy can usefully
contribute to this request."""
...
def assemble(self, request: ContextRequest,
backends: BackendSet,
budget: int,
plan_context: PlanContext) -> list[ContextFragment]:
"""Execute the strategy. Must respect the budget."""
...
def explain(self) -> str: ...
@dataclass
class StrategyCapabilities:
"""Declares what a strategy is capable of."""
uses_text: bool = False
uses_vector: bool = False
uses_graph: bool = False
uses_temporal: bool = False
uko_levels: list[str] = field(default_factory=list)
resource_types: list[str] = field(default_factory=list)
supports_depth_breadth: bool = False
supports_plan_hierarchy: bool = False
supports_temporal: bool = False
quality_score: float = 0.5
[context.strategies]
enabled = ["simple-keyword", "semantic-embedding", "arce", "breadth-depth-navigator"]
[context.strategies.custom]
"my-domain-strategy" = "my_package.strategies.DomainStrategy"
# Pipeline component overrides (see Architecture > ACMS > Context Assembly Pipeline)
[context.pipeline]
strategy-selector = "builtin:ConfidenceWeightedSelector" # default
budget-allocator = "builtin:ProportionalBudgetAllocator" # default
fragment-scorer = "my_extensions.scorers:DomainAwareScorer" # custom override
Request: focus=["class://AuthManager"], breadth=2, depth=9 (FULL_SOURCE), gradient=True
Result (token costs approximate):
Distance 0 — depth 9 (FULL_SOURCE):
class AuthManager: # 800 tokens
"""Manages user authentication..."""
def authenticate(self, username, password):
...full body...
def validate_token(self, token):
...full body...
Distance 1 — depth 4 (SIGNATURES):
class BaseManager: # 120 tokens
def connect(self) -> Connection: ...
def disconnect(self) -> None: ...
class CryptoUtils: # 80 tokens
def hash_password(pwd: str) -> str: ...
def verify_hash(pwd: str, hash: str) -> bool: ...
class UserDB: # 100 tokens
def find_user(username: str) -> User | None: ...
def create_user(user: User) -> None: ...
Distance 2 — depth 0 (MODULE_LISTING):
class Connection # 20 tokens
class User # 15 tokens
class DatabasePool # 15 tokens
Total: ~1,150 tokens (vs ~15,000 if everything were depth 9)
Request: focus=["uko-doc:section/security-architecture"], breadth=2, depth=10 (FULL_CONTENT), gradient=True
Result (token costs approximate):
Distance 0 — depth 10 (FULL_CONTENT):
## 5. Security Architecture # 2,400 tokens
Complete section text including all paragraphs,
code examples, diagrams, and subsections:
5.1 Authentication Flow
5.2 Authorization Model
5.3 Token Management
Distance 1 — depth 6 (TOPIC_SENTENCES — sections that discuss security topics):
## 3. API Design # 180 tokens
Section headings + first sentence of each paragraph:
"The API uses JWT tokens for authentication..."
"Rate limiting is enforced per-client..."
## 8. Deployment # 120 tokens
"TLS termination occurs at the load balancer..."
"Secrets are injected via Vault..."
Distance 2 — depth 0 (TITLE_ONLY — sections referenced by distance-1 sections):
## 2. System Overview # 30 tokens
## 9. Monitoring # 25 tokens
## Appendix A: Threat Model # 20 tokens
Total: ~2,775 tokens (vs ~18,000 if the entire document were depth 10)
Request: focus=["uko-data:table/auth.users"], breadth=2, depth=11 (FULL_CATALOG), gradient=True
Result (token costs approximate):
Distance 0 — depth 11 (FULL_CATALOG):
CREATE TABLE auth.users ( # 650 tokens
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(60) NOT NULL,
...complete DDL + triggers + sample rows + statistics...
);
Distance 1 — depth 7 (DDL — tables with foreign keys to/from users):
CREATE TABLE auth.sessions ( # 180 tokens
id UUID PRIMARY KEY,
user_id UUID REFERENCES auth.users(id),
...DDL with constraints...
);
CREATE TABLE auth.roles ( # 120 tokens
...DDL with constraints...
);
CREATE VIEW auth.active_users AS ... # 90 tokens
Distance 2 — depth 1 (TABLE_LISTING — tables referenced by distance-1 tables):
auth.permissions # 20 tokens
auth.audit_log # 15 tokens
public.organizations # 15 tokens
Total: ~1,090 tokens (vs ~8,500 if the entire schema were depth 11)
Plan Lifecycle ACMS Actions
───────────────── ────────────────────────────
Plan created (agents plan use) ResourceScope resolved.
ScopedBackendViews created.
Strategize phase begins InitialContextAssembler runs:
- Inherits parent context (if subplan)
- Runs Context Assembly Pipeline
- Produces AssembledContext
- Injects into actor's system prompt
Strategy actor reasons Actor may issue ContextRequests via
builtin/context skill.
Each request triggers re-assembly
with remaining budget.
Strategy actor produces decisions Each Decision's context_snapshot
captures AssembledContext hash +
provenance map.
Execute phase begins New InitialContextAssembler run
with execute-phase view.
Decisions from Strategize are in
warm tier.
Execution actor works Dynamic ContextRequests as needed.
Subplan spawned PlanContextInheritance computes
child context from parent.
SkeletonCompressor propagates parent
context as skeleton.
New ResourceScope (possibly narrower).
Apply phase Minimal context assembly
(validation results, diff summary).
Plan completes Hot context archived to warm.
Warm context ages to cold based
on retention policy.
class OutputSession:
"""A live output document that coordinates element production and materialization.
The session manages the lifecycle of all output elements for a single command
invocation. It is the bridge between format-agnostic producer code and the
format-specific materialization strategy.
Thread Safety:
The session is thread-safe. Multiple producers may create and write to
handles concurrently. The session serializes event delivery to the
materialization strategy using an internal event queue.
Lifecycle:
session = OutputSession.open(command, strategy)
handle_a = session.panel("Title") # create handles
handle_b = session.table("Results", ...)
handle_a.set_entry(...) # write to handles (concurrent OK)
handle_b.add_row(...)
handle_a.close() # close handles when done
handle_b.close()
session.close() # finalize the session
"""
# --- Session lifecycle ---
command: str # The command that owns this session
session_id: str # Unique session identifier (ULID)
created_at: datetime # Session creation timestamp
_strategy: MaterializationStrategy # The active materialization strategy
_handles: OrderedDict[str, ElementHandle] # handle_id → handle, in declaration order
_event_queue: asyncio.Queue[ElementEvent] # Internal event queue for serialization
_state: SessionState # "open" | "closing" | "closed"
_lock: threading.Lock # Protects handle creation/removal
@classmethod
def open(cls, command: str, strategy: MaterializationStrategy,
metadata: dict | None = None) -> "OutputSession":
"""Open a new output session.
Called by the CLI framework before command execution. The strategy is
selected based on the resolved format (see Format Resolution).
Args:
command: The command string (e.g., "project show").
strategy: The materialization strategy for the active format.
metadata: Optional command metadata (user, timestamp, etc.).
Returns:
A new OutputSession ready for element creation.
"""
...
# --- Element handle factories ---
# Each factory creates a typed handle, registers it with the session in
# declaration order, and emits an ElementCreated event to the strategy.
def panel(self, title: str, *,
border_style: str = "rounded",
priority: str = "normal",
collapse_hint: str = "auto",
metadata: dict | None = None) -> "PanelHandle":
"""Create a panel element handle for key-value pair output."""
...
def table(self, title: str | None, *,
columns: list["ColumnDef"],
summary: dict | None = None,
max_rows_hint: int | None = None,
sort_key: str | None = None,
priority: str = "normal",
collapse_hint: str = "auto",
metadata: dict | None = None) -> "TableHandle":
"""Create a table element handle for tabular data."""
...
def tree(self, root_label: str, *,
root_style: str | None = None,
max_depth_hint: int | None = None,
show_guides: bool = True,
priority: str = "normal",
collapse_hint: str = "auto",
metadata: dict | None = None) -> "TreeHandle":
"""Create a tree element handle for hierarchical data."""
...
def progress(self, label: str, *,
total: int | None = None,
indeterminate: bool = False,
steps: list[str] | None = None,
priority: str = "normal",
metadata: dict | None = None) -> "ProgressHandle":
"""Create a progress indicator handle.
Args:
label: Display label for the progress indicator.
total: Total units of work (None for indeterminate).
indeterminate: If True, show a spinner instead of a progress bar.
steps: Named steps to track (creates ProgressStep objects with
initial status "pending").
"""
...
def status(self, message: str, *,
level: str = "info",
detail: str | None = None,
priority: str = "normal",
metadata: dict | None = None) -> "StatusHandle":
"""Create a status message handle."""
...
def text(self, content: str = "", *,
wrap: bool = True,
indent: int = 0,
priority: str = "normal",
metadata: dict | None = None) -> "TextHandle":
"""Create a text block handle."""
...
def code(self, content: str = "", *,
language: str | None = None,
line_numbers: bool = False,
highlight_lines: list[int] | None = None,
priority: str = "normal",
metadata: dict | None = None) -> "CodeHandle":
"""Create a code block handle."""
...
def diff(self, *,
file_a: str | None = None,
file_b: str | None = None,
priority: str = "normal",
metadata: dict | None = None) -> "DiffHandle":
"""Create a diff block handle."""
...
def separator(self, style: str = "line") -> "SeparatorHandle":
"""Create a visual separator. Separators are auto-closed on creation."""
...
def action_hint(self, commands: list[str],
description: str | None = None) -> "ActionHintHandle":
"""Create an action hint. Action hints are auto-closed on creation."""
...
# --- Session operations ---
def snapshot(self) -> "StructuredOutput":
"""Return a static snapshot of all elements accumulated so far.
The snapshot captures the current state of every handle (open or closed)
as a StructuredOutput object. This is used by accumulate-mode strategies
(json/yaml) at session end, and is available at any time for logging,
debugging, or programmatic inspection.
"""
...
def close(self, *, exit_code: int = 0) -> "StructuredOutput":
"""Close the session and finalize all output.
Any handles still open are force-closed (with a warning logged).
Emits a SessionEnd event to the strategy. Returns the final
StructuredOutput snapshot.
Args:
exit_code: The command's exit code (included in the snapshot).
Returns:
The final StructuredOutput snapshot.
"""
...
# --- Context manager support ---
def __enter__(self) -> "OutputSession":
return self
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
"""Auto-close session on context exit.
If exiting due to an exception, sets exit_code to 1 and emits an
error status element before closing.
"""
...
class ElementHandle(Generic[E]):
"""Base class for all element handles.
An element handle is a write-only view of an output element. Producers use
handles to incrementally build element content without knowledge of the
active format or materialization strategy.
Type Parameter:
E: The OutputElement subclass this handle wraps (e.g., Panel, Table).
Thread Safety:
Individual handle methods are thread-safe. Multiple threads may call
methods on *different* handles concurrently. Concurrent writes to the
*same* handle are serialized via an internal lock.
Lifecycle:
handle = session.table(...) # Created by session factory
handle.add_row(...) # Write operations (zero or more)
handle.close() # Finalize (required unless auto-closed)
Closed Handle Behavior:
Calling any write method on a closed handle raises ElementClosedError.
"""
handle_id: str # Unique handle identifier (ULID)
element_type: str # Semantic type ("panel", "table", etc.)
declaration_index: int # Position in session's declaration order
_session: OutputSession # Owning session (for event emission)
_element: E # The accumulated element state
_state: HandleState # "open" | "closed"
_lock: threading.Lock # Serializes writes to this handle
def close(self) -> None:
"""Close this handle, signaling that no more data will be written.
Emits an ElementClosed event to the materialization strategy.
For buffered strategies, this triggers rendering of the element.
"""
...
@property
def is_open(self) -> bool:
"""Whether this handle is still accepting writes."""
...
@property
def element(self) -> E:
"""The accumulated element state (read-only snapshot)."""
...
def __enter__(self) -> Self:
return self
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
"""Auto-close handle on context exit."""
if self.is_open:
self.close()
class PanelHandle(ElementHandle[Panel]):
"""Handle for building a Panel element incrementally.
Panels are titled groups of key-value pairs. Entries can be added,
updated, or removed after creation.
"""
def set_entry(self, key: str, value: str, *,
style_hint: str | None = None,
icon: str | None = None) -> None:
"""Set or update a key-value entry in the panel.
If an entry with the given key already exists, it is updated.
Otherwise, a new entry is appended.
Emits an ElementUpdated event.
"""
...
def set_entries(self, entries: dict[str, str], *,
style_hints: dict[str, str] | None = None) -> None:
"""Set multiple entries at once (batch update). Emits a single event."""
...
def remove_entry(self, key: str) -> None:
"""Remove an entry by key. Emits an ElementUpdated event."""
...
class TableHandle(ElementHandle[Table]):
"""Handle for building a Table element incrementally.
Tables are the primary element for streamed data. Rows can be added
one at a time or in batches as data becomes available from queries,
API calls, or concurrent operations.
"""
def add_row(self, row: dict) -> None:
"""Append a single row to the table.
The row dict maps column names to cell values. Missing columns
are filled with None. Extra columns not in the schema are ignored.
Emits an ElementUpdated event (type=row_added).
"""
...
def add_rows(self, rows: list[dict]) -> None:
"""Append multiple rows in a batch. Emits a single ElementUpdated event."""
...
def set_summary(self, summary: dict) -> None:
"""Set or update the summary/aggregation row. Emits an ElementUpdated event."""
...
def set_sort_key(self, column: str, *, descending: bool = False) -> None:
"""Change the sort key. Emits an ElementUpdated event."""
...
class TreeHandle(ElementHandle[Tree]):
"""Handle for building a Tree element incrementally.
Trees are built by adding child nodes to existing nodes. The root node
is created with the handle. Subtrees can be constructed incrementally
as hierarchical data is discovered.
"""
def add_child(self, parent_path: str | None, label: str, *,
style_hint: str | None = None,
collapsed: bool = False,
metadata: dict | None = None) -> str:
"""Add a child node to the tree.
Args:
parent_path: Slash-separated path to the parent node (None = root).
label: Display label for the new node.
style_hint: Optional color/style hint.
collapsed: Whether this node starts collapsed in interactive renderers.
metadata: Arbitrary data attached to the node.
Returns:
The full path to the newly created node (for use as parent_path
in subsequent add_child calls).
Emits an ElementUpdated event.
"""
...
def set_node_style(self, path: str, style_hint: str) -> None:
"""Update the style of an existing node. Emits an ElementUpdated event."""
...
class ProgressHandle(ElementHandle[ProgressIndicator]):
"""Handle for updating a ProgressIndicator element.
Progress handles are unique in that they are expected to receive many
rapid updates. The materialization strategy may throttle update events
to avoid overwhelming the terminal (e.g., limiting redraws to 10/sec).
"""
def set_progress(self, current: int, total: int | None = None) -> None:
"""Update the progress counter.
Args:
current: Current progress value.
total: Total value (can change, e.g., when total is discovered late).
Emits an ElementUpdated event (may be throttled by the strategy).
"""
...
def set_step_status(self, step_label: str, status: str) -> None:
"""Update the status of a named step.
Args:
step_label: The label of the step to update.
status: New status — "pending" | "active" | "done" | "error" | "skipped".
Emits an ElementUpdated event.
"""
...
def set_label(self, label: str) -> None:
"""Update the progress label text. Emits an ElementUpdated event."""
...
def increment(self, delta: int = 1) -> None:
"""Increment progress by delta. Convenience wrapper around set_progress."""
...
class StatusHandle(ElementHandle[StatusMessage]):
"""Handle for a status message.
Status handles are typically created and immediately closed (fire-and-forget
messages). However, they can be kept open for messages that may be revised
(e.g., a "Working..." status that becomes "Done" or "Failed").
"""
def set_message(self, message: str) -> None:
"""Update the status message text. Emits an ElementUpdated event."""
...
def set_level(self, level: str) -> None:
"""Change the status level. Emits an ElementUpdated event."""
...
def set_detail(self, detail: str | None) -> None:
"""Set or clear the detail text. Emits an ElementUpdated event."""
...
class TextHandle(ElementHandle[TextBlock]):
"""Handle for a text block. Supports appending text incrementally."""
def append(self, text: str) -> None:
"""Append text to the block. Emits an ElementUpdated event."""
...
def set_content(self, content: str) -> None:
"""Replace the entire content. Emits an ElementUpdated event."""
...
class CodeHandle(ElementHandle[CodeBlock]):
"""Handle for a code block."""
def set_content(self, content: str) -> None:
"""Set the code content. Emits an ElementUpdated event."""
...
def set_language(self, language: str) -> None:
"""Set the language for syntax highlighting. Emits an ElementUpdated event."""
...
def set_highlight_lines(self, lines: list[int]) -> None:
"""Set lines to highlight. Emits an ElementUpdated event."""
...
class DiffHandle(ElementHandle[DiffBlock]):
"""Handle for a diff block. Hunks can be added incrementally."""
def add_hunk(self, header: str, lines: list["DiffLine"]) -> None:
"""Add a diff hunk. Emits an ElementUpdated event."""
...
def set_stats(self, insertions: int, deletions: int, **extra: int) -> None:
"""Set diff statistics. Emits an ElementUpdated event."""
...
class ElementEvent:
"""Base class for all events emitted by element handles."""
event_type: str # "created" | "updated" | "closed"
handle_id: str # The handle that emitted this event
element_type: str # The element kind ("panel", "table", etc.)
timestamp: datetime # When the event occurred
session_id: str # The owning session
class ElementCreated(ElementEvent):
"""Emitted when a new element handle is created via a session factory."""
event_type = "created"
declaration_index: int # Position in session declaration order
initial_state: OutputElement # The element's initial state
class ElementUpdated(ElementEvent):
"""Emitted when data is written to an element handle."""
event_type = "updated"
update_type: str # Kind-specific: "entry_set", "row_added",
# "progress_changed", "step_status_changed", etc.
delta: dict # The change payload (what was added/modified)
element_snapshot: OutputElement # The full element state after this update
class ElementClosed(ElementEvent):
"""Emitted when an element handle is closed (no more data will arrive)."""
event_type = "closed"
final_state: OutputElement # The element's final accumulated state
class SessionEnd(ElementEvent):
"""Emitted when the session itself is closed."""
event_type = "session_end"
exit_code: int
snapshot: "StructuredOutput" # The complete accumulated output
class OutputElement:
"""Base class for all output element snapshot types."""
element_type: str # Semantic type identifier
metadata: dict # Arbitrary metadata (timestamps, IDs, etc.)
priority: str = "normal" # "critical" | "normal" | "supplementary"
collapse_hint: str = "auto" # "always" | "auto" | "never" — guidance for renderers
# on whether this element can be collapsed/hidden
class Panel(OutputElement):
"""A titled group of key-value pairs."""
element_type = "panel"
title: str
entries: list[PanelEntry] # Each entry: key, value, style_hint (color, icon, etc.)
border_style: str = "rounded" # "rounded" | "square" | "heavy" | "none"
class PanelEntry:
"""A single key-value pair within a Panel."""
key: str
value: str
style_hint: str | None = None # Color/style for the value (e.g., "success", "warning")
icon: str | None = None # Optional icon/prefix character
class Table(OutputElement):
"""A tabular data set with typed columns."""
element_type = "table"
title: str | None
columns: list[ColumnDef] # name, type, alignment, width_hint, sortable
rows: list[dict] # Column name → cell value
summary: dict | None # Optional aggregation row (totals, counts)
max_rows_hint: int | None # Suggest truncation for large datasets
sort_key: str | None # Default sort column
class ColumnDef:
"""Schema for a single table column."""
name: str # Column display name
type: str = "string" # "string" | "number" | "boolean" | "datetime" | "id"
alignment: str = "left" # "left" | "right" | "center"
width_hint: int | None = None # Suggested character width (None = auto)
sortable: bool = False # Whether this column can be sorted
style_hint: str | None = None # Default style for cells in this column
class Tree(OutputElement):
"""A hierarchical tree structure."""
element_type = "tree"
root: TreeNode # Recursive node structure
max_depth_hint: int | None # Suggest depth truncation
show_guides: bool = True # Whether to show tree guide lines
class TreeNode:
"""A node in a tree structure."""
label: str
style_hint: str | None # Color/style for this node
children: list["TreeNode"]
collapsed: bool = False # Hint: start collapsed in interactive renderers
metadata: dict # Arbitrary data attached to the node
class StatusMessage(OutputElement):
"""A status line (success, warning, error, info)."""
element_type = "status"
level: str # "ok" | "warn" | "error" | "info"
message: str
detail: str | None # Optional detail text
class ProgressIndicator(OutputElement):
"""A progress bar or spinner for long-running operations."""
element_type = "progress"
label: str
current: int | None
total: int | None
indeterminate: bool = False # Spinner mode vs. progress bar mode
steps: list[ProgressStep] | None # Named steps with status (pending/active/done)
class ProgressStep:
"""A named step within a progress indicator."""
label: str
status: str # "pending" | "active" | "done" | "error" | "skipped"
class CodeBlock(OutputElement):
"""A block of source code with optional syntax highlighting."""
element_type = "code"
content: str
language: str | None # For syntax highlighting
line_numbers: bool = False
highlight_lines: list[int] | None # Lines to emphasize
class DiffBlock(OutputElement):
"""A unified diff display."""
element_type = "diff"
hunks: list[DiffHunk]
file_a: str | None
file_b: str | None
stats: dict | None # insertions, deletions, etc.
class DiffHunk:
"""A single hunk within a diff."""
header: str # @@ line range @@
lines: list[DiffLine]
class DiffLine:
"""A single line in a diff hunk."""
type: str # "context" | "add" | "remove"
content: str
line_number_old: int | None
line_number_new: int | None
class TextBlock(OutputElement):
"""A free-form text block (descriptions, rationale, etc.)."""
element_type = "text"
content: str
wrap: bool = True
indent: int = 0
class Separator(OutputElement):
"""A visual separator between logical groups."""
element_type = "separator"
style: str = "line" # "line" | "blank" | "double"
class ActionHint(OutputElement):
"""A suggested next-step action for the user."""
element_type = "action_hint"
commands: list[str] # Suggested CLI commands
description: str | None
class StructuredOutput:
"""Static snapshot of a complete command output.
This is the accumulated state of all elements at a point in time.
It is produced by OutputSession.snapshot() and OutputSession.close().
Uses:
- Final serialization for json/yaml formats
- Logging and audit trails
- Programmatic inspection and testing
- TUI widget data binding (initial state)
"""
command: str # The command that produced this output
session_id: str # The session that produced this output
elements: list[OutputElement] # Ordered list of element snapshots
exit_code: int = 0
timing: dict | None # start_time, end_time, duration
metadata: dict # command-specific metadata
class MaterializationStrategy(Protocol):
"""Interface for format-driven output materialization.
A materialization strategy receives element lifecycle events from the
OutputSession and decides when to render element content to the output
stream. Strategies do not render elements themselves — they delegate
to a paired ElementRenderer at the appropriate time.
The strategy is the mechanism by which format-agnostic producer code
produces correct output regardless of format. The producer writes to
handles; the strategy decides what reaches the terminal and when.
"""
strategy_name: str # "live" | "sequential_buffer" | "accumulate"
def bind(self, renderer: "ElementRenderer",
terminal_caps: "TerminalCapabilities") -> None:
"""Bind this strategy to a renderer and terminal capabilities.
Called once during format resolution, before the session opens.
The strategy retains a reference to the renderer for use during
event handling. The output stream is provided separately via
on_session_begin, since the session owns the stream.
"""
...
def on_session_begin(self, session: OutputSession, stream: IO) -> None:
"""Called when the session opens. The strategy receives the output
stream and may write preamble (e.g., opening JSON bracket)."""
...
def on_element_created(self, event: ElementCreated) -> None:
"""Called when a new element handle is created."""
...
def on_element_updated(self, event: ElementUpdated) -> None:
"""Called when data is written to an element handle."""
...
def on_element_closed(self, event: ElementClosed) -> None:
"""Called when an element handle is closed."""
...
def on_session_end(self, event: SessionEnd) -> None:
"""Called when the session closes. The strategy may write epilogue."""
...
class LiveMaterializer(MaterializationStrategy):
"""Materialization strategy for the `rich` format.
Renders element updates in real-time using terminal cursor movement.
Multiple elements can be visually active and updating simultaneously.
The terminal display is a live document that is rewritten in place.
Behavior:
- on_element_created: Allocates screen region for the element, renders
initial (possibly empty) visual state.
- on_element_updated: Re-renders the element in place using cursor
movement. For progress indicators, updates may be throttled to a
maximum refresh rate (default: 15 fps) to avoid terminal flooding.
- on_element_closed: Renders the final state and freezes the screen
region (no further updates). May apply a visual transition (e.g.,
spinner resolves to a checkmark).
- on_session_end: Finalizes the display, moves cursor to end, and
restores normal terminal scrolling.
Screen Layout:
Elements are arranged vertically in declaration order. Each element
occupies a contiguous block of terminal lines. The materializer tracks
the line offset and height of each element's region. When an element's
height changes (e.g., a table gains rows), subsequent elements are
shifted down.
Concurrent Updates:
Updates from multiple handles are coalesced into a single frame refresh
at the target frame rate. The materializer maintains a dirty-element set
and redraws all dirty elements in a single pass per frame.
"""
strategy_name = "live"
_frame_rate: float = 15.0 # Maximum redraws per second
_element_regions: OrderedDict[str, ScreenRegion] # handle_id → screen region
_dirty_set: set[str] # handle_ids that need redraw
_frame_timer: asyncio.TimerHandle # Coalescing timer for frame redraws
class SequentialBufferMaterializer(MaterializationStrategy):
"""Materialization strategy for `plain`, `color`, and `table` formats.
Buffers element content and renders elements sequentially in declaration
order. An element's content is rendered to the output stream only when
its handle is closed. If handles are closed out of declaration order,
the out-of-order element's rendered content is held in a buffer until
all preceding elements have been rendered.
This strategy ensures that static, scrolling output formats produce
coherent sequential output even when producers write to handles
concurrently and close them in arbitrary order.
Behavior:
- on_element_created: Records the element's declaration index. No output.
- on_element_updated: Buffers the update internally. No output.
- on_element_closed: If this element is the next in declaration order,
renders it immediately (and any buffered subsequent elements that are
also closed). Otherwise, buffers the rendered content.
- on_session_end: Force-renders any remaining buffered elements (handles
that were never closed, in declaration order).
Example (two tables populated concurrently):
1. Handle A (index 0) created — table "Resources"
2. Handle B (index 1) created — table "Validations"
3. Handle B receives rows, Handle A receives rows (interleaved)
4. Handle B closes (index 1) — rendered content buffered (waiting for A)
5. Handle A closes (index 0) — A is rendered to stream, then buffered B
is rendered to stream
Result: Output shows table A followed by table B, regardless of the
order in which data arrived or handles closed.
"""
strategy_name = "sequential_buffer"
_next_render_index: int = 0 # The declaration index to render next
_rendered_buffers: dict[int, str] # index → pre-rendered content (waiting)
_closed_set: set[int] # Declaration indices of closed elements
class AccumulateMaterializer(MaterializationStrategy):
"""Materialization strategy for `json` and `yaml` formats.
Accumulates all element data silently until the session ends, then
serializes the complete StructuredOutput as a single JSON or YAML
document.
Behavior:
- on_element_created: No output.
- on_element_updated: No output.
- on_element_closed: No output.
- on_session_end: Calls session.snapshot() to get the final
StructuredOutput, then delegates to the ElementRenderer's
serialize() method for complete document serialization.
This strategy is the simplest — it ignores all intermediate events and
only acts on session_end. It exists as a distinct strategy (rather than
a special case) to maintain the uniform strategy interface.
"""
strategy_name = "accumulate"
class ElementRenderer(Protocol):
"""Interface for format-specific element rendering.
An ElementRenderer knows how to paint each element type for a specific
output format. It is called by the MaterializationStrategy when it is
time to render an element.
Implementations:
- PlainElementRenderer: ASCII text, no escapes
- ColorElementRenderer: ANSI-colored text, same layout as plain
- TableElementRenderer: Unicode box-drawing with color
- RichElementRenderer: Advanced terminal features (cursor, animation)
- JsonElementRenderer: JSON serialization
- YamlElementRenderer: YAML serialization
"""
format_name: str # "plain", "color", "table", "rich", "json", "yaml"
def render_panel(self, panel: Panel, stream: IO) -> None:
"""Render a panel element to the stream."""
...
def render_table(self, table: Table, stream: IO) -> None:
"""Render a table element to the stream."""
...
def render_tree(self, tree: Tree, stream: IO) -> None:
"""Render a tree element to the stream."""
...
def render_status(self, status: StatusMessage, stream: IO) -> None:
"""Render a status message to the stream."""
...
def render_progress(self, progress: ProgressIndicator, stream: IO) -> None:
"""Render a progress indicator to the stream."""
...
def render_code(self, code: CodeBlock, stream: IO) -> None:
"""Render a code block to the stream."""
...
def render_diff(self, diff: DiffBlock, stream: IO) -> None:
"""Render a diff block to the stream."""
...
def render_text(self, text: TextBlock, stream: IO) -> None:
"""Render a text block to the stream."""
...
def render_separator(self, separator: Separator, stream: IO) -> None:
"""Render a visual separator to the stream."""
...
def render_action_hint(self, hint: ActionHint, stream: IO) -> None:
"""Render an action hint to the stream."""
...
def render_element(self, element: OutputElement, stream: IO) -> None:
"""Dispatch to the appropriate render method based on element type.
This is the primary entry point used by materialization strategies.
It uses a dispatch table to route to the correct typed method.
"""
dispatch = {
"panel": self.render_panel,
"table": self.render_table,
"tree": self.render_tree,
"status": self.render_status,
"progress": self.render_progress,
"code": self.render_code,
"diff": self.render_diff,
"text": self.render_text,
"separator": self.render_separator,
"action_hint": self.render_action_hint,
}
handler = dispatch.get(element.element_type)
if handler:
handler(element, stream)
def serialize(self, output: StructuredOutput, stream: IO) -> None:
"""Serialize a complete StructuredOutput to the stream.
Used by AccumulateMaterializer for json/yaml formats. For visual
formats (plain/color/table/rich), this method iterates over
output.elements and calls render_element for each.
"""
...
def can_render(self, terminal_caps: "TerminalCapabilities") -> bool:
"""Whether this renderer can operate in the given terminal environment."""
...
$ agents --format plain project show local/api-service
Project Details
Name: local/api-service
Description: Backend API
Resources: 2
Remote: no
Created: 2026-02-08 12:46
Linked Resources
Resource Type Sandbox Read-Only
---------------- -------------- -------------------- ---------
local/api-repo git-checkout git_worktree no
local/staging-db local/database transaction_rollback yes
Validations (3)
local/run-tests pytest --cov=src --cov-fail-under=80 required
local/lint-check ruff check . required
local/check-bundle-size node scripts/check-bundle-size.js info
Context
Include: repo
Exclude: **/node_modules/**
Max File Size: 1 MB
Indexing Status
Text Index: ready
Vector Index: ready
Graph Store: disabled
Indexed Files: 347
Last Indexed: 12:48
Active Plans
Plan ID Action Phase
-------- ------------------- -------
01HXM7A9 local/code-coverage execute
[OK] Project loaded
$ agents --format plain plan list --phase execute
Plans
ID Phase State Action Project Elapsed
-------- ------- ---------- ------------------- ----------------- ---------
01HXM7A9 execute processing local/code-coverage local/api-service 00:01:12
Filters
Phase: execute
State: (any)
Project: (any)
Action: (any)
Summary
Total: 1
Processing: 1
Completed: 0
Errored: 0
[OK] 1 plan listed
$ agents --format color project show local/api-service
Project Details
Name: local/api-service
Description: Backend API
Resources: 2
Remote: no
Created: 2026-02-08 12:46
Linked Resources
Resource Type Sandbox Read-Only
---------------- -------------- -------------------- ---------
local/api-repo git-checkout git_worktree no
local/staging-db local/database transaction_rollback yes
Validations (3)
local/run-tests pytest --cov=src --cov-fail-under=80 required
local/lint-check ruff check . required
local/check-bundle-size node scripts/check-bundle-size.js info
Context
Include: repo
Exclude: **/node_modules/**
Max File Size: 1 MB
Indexing Status
Text Index: ready
Vector Index: ready
Graph Store: disabled
Indexed Files: 347
Last Indexed: 12:48
Active Plans
Plan ID Action Phase
-------- ------------------- -------
01HXM7A9 local/code-coverage execute
[OK] Project loaded
$ agents --format table project show local/api-service
╭─ Project Details ──────────────╮
│ Name: local/api-service │
│ Description: Backend API │
│ Resources: 2 │
│ Remote: no │
│ Created: 2026-02-08 12:46 │
╰────────────────────────────────╯
╭─ Linked Resources ──────────────────────────────────────────────────────╮
│ Resource Type Sandbox Read-Only │
│ ──────────────── ────────────── ──────────────────── ───────── │
│ local/api-repo git-checkout git_worktree no │
│ local/staging-db local/database transaction_rollback yes │
╰─────────────────────────────────────────────────────────────────────────╯
╭─ Validations (3) ────────────────────────────────────────────────────╮
│ local/run-tests pytest --cov=src --cov-fail-under=80 required │
│ local/lint-check ruff check . required │
│ local/check-bundle-size node scripts/check-bundle-size.js info │
╰──────────────────────────────────────────────────────────────────────╯
╭─ Context ───────────────────╮
│ Include: repo │
│ Exclude: **/node_modules/** │
│ Max File Size: 1 MB │
╰─────────────────────────────╯
╭─ Indexing Status ──────────╮
│ Text Index: ready │
│ Vector Index: ready │
│ Graph Store: disabled │
│ Indexed Files: 347 │
│ Last Indexed: 12:48 │
╰────────────────────────────╯
╭─ Active Plans ──────────────────────────╮
│ Plan ID Action Phase │
│ ──────── ─────────────────── ─────── │
│ 01HXM7A9 local/code-coverage execute │
╰─────────────────────────────────────────╯
✓ OK Project loaded
$ agents --format table plan execute 01HXM8C2ZK
╭─ Execution ──────────────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Phase: execute │
│ Sandbox: git_worktree │
│ Worker: local/executor │
│ Started: 12:58:10 │
│ Attempt: 1 │
╰──────────────────────────────────╯
╭─ Strategy Summary ─────────────────────╮
│ Decisions: 8 │
│ Invariants: 2 │
│ Planned Child Plans: 2+ │
│ Estimated Files: ~12 │
│ Risk: low │
╰────────────────────────────────────────╯
╭─ Progress ────────╮
│ ✓ Collect context │
│ ✓ Run tools │
│ ⏳ Build changeset │
│ • Validate │
╰───────────────────╯
✓ OK Execution started
$ agents --format rich plan execute 01HXM8C2ZK
╭─ Execution ──────────────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Phase: execute │
│ Sandbox: git_worktree │
│ Worker: local/executor │
│ Started: 12:58:10 │
╰──────────────────────────────────╯
⠋ Collecting context... (⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏ animates in place)
├── repo: local/api-repo ✓
└── db: local/staging-db ✓
╭─ Strategy Summary ──────────────────────────────────────────────────────╮
│ 8 decisions │ 2 invariants │ 2+ child plans │ ~12 files │ risk: low │
╰─────────────────────────────────────────────────────────────────────────╯
Progress ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 42% elapsed 0:01:12 ETA 0:01:40
✓ Collect context .................. 0.8s
✓ Run tools (8 calls) ............. 12.4s
⠙ Build changeset ................. (running) (animates in place)
○ Validate ........................ (pending)
╭─ Live Tool Calls ───────────────────────────────────────╮
│ #6 read_file src/auth/__init__.py ✓ 0.1s │
│ #7 write_file tests/test_auth.py ✓ 0.2s │
│ #8 edit_file src/auth/session.py ⠙ ... │
╰─────────────────────────────────────────────────────────╯
$ agents --format rich version
╭─────────────────────────────────────╮
│ CleverAgents CLI v1.0.0 │
│ channel: stable │
╰─────────────────────────────────────╯
╭─ Build ─────────────────────────────╮
│ Build Date: 2026-02-08 │
│ Commit: a17c3f9 │
│ Schema: v3 │
│ Platform: linux-x86_64 │
│ Python: 3.13.1 │
╰─────────────────────────────────────╯
╭─ Dependencies ─────────────────────────────────────────────────────────╮
│ LangGraph 0.2.60 │ LangChain 0.3.18 │ MCP SDK 1.4.0 │ Pydantic 2.10.4 │
╰────────────────────────────────────────────────────────────────────────╯
✓ OK Version reported
{
"command": "project show",
"status": "ok",
"exit_code": 0,
"data": { ... },
"timing": { "duration_ms": 42 },
"metadata": { ... }
}
{
"command": "project show",
"status": "ok",
"exit_code": 0,
"data": {
"project": {
"name": "local/api-service",
"description": "Backend API",
"type": "local",
"remote": false,
"created_at": "2026-02-08T12:46:00Z"
},
"linked_resources": [
{
"name": "local/api-repo",
"type": "git-checkout",
"sandbox_strategy": "git_worktree",
"read_only": false
},
{
"name": "local/staging-db",
"type": "local/database",
"sandbox_strategy": "transaction_rollback",
"read_only": true
}
],
"validations": [
{
"name": "local/run-tests",
"command": "pytest --cov=src --cov-fail-under=80",
"mode": "required",
"timeout": 600,
"resource": "repo"
},
{
"name": "local/lint-check",
"command": "ruff check .",
"mode": "required",
"timeout": 300,
"resource": null
},
{
"name": "local/check-bundle-size",
"command": "node scripts/check-bundle-size.js",
"mode": "informational",
"timeout": 300,
"resource": null
}
],
"context": {
"include_resources": ["repo"],
"exclude_paths": ["**/node_modules/**"],
"max_file_size_bytes": 1048576
},
"indexing": {
"text_index": "ready",
"vector_index": "ready",
"graph_store": "disabled",
"indexed_files": 347,
"last_indexed_at": "2026-02-08T12:48:00Z"
},
"active_plans": [
{
"plan_id": "01HXM7A9",
"action": "local/code-coverage",
"phase": "execute"
}
]
},
"timing": {
"duration_ms": 42
},
"messages": [
{ "level": "ok", "text": "Project loaded" }
]
}
{
"command": "plan list",
"status": "ok",
"exit_code": 0,
"data": {
"plans": [
{
"id": "01HXM7A9",
"phase": "execute",
"state": "processing",
"action": "local/code-coverage",
"project": "local/api-service",
"elapsed": "00:01:12"
}
],
"filters": {
"phase": "execute",
"state": null,
"project": null,
"action": null
},
"summary": {
"total": 1,
"processing": 1,
"completed": 0,
"errored": 0
}
},
"timing": {
"duration_ms": 18
},
"messages": [
{ "level": "ok", "text": "1 plan listed" }
]
}
command: project show
status: ok
exit_code: 0
data:
project:
name: local/api-service
description: Backend API
type: local
remote: false
created_at: "2026-02-08T12:46:00Z"
linked_resources:
- name: local/api-repo
type: git-checkout
sandbox_strategy: git_worktree
read_only: false
- name: local/staging-db
type: local/database
sandbox_strategy: transaction_rollback
read_only: true
validations:
- name: local/run-tests
command: "pytest --cov=src --cov-fail-under=80"
mode: required
timeout: 600
resource: repo
- name: local/lint-check
command: "ruff check ."
mode: required
timeout: 300
resource: null
- name: local/check-bundle-size
command: "node scripts/check-bundle-size.js"
mode: informational
timeout: 300
resource: null
context:
include_resources:
- repo
exclude_paths:
- "**/node_modules/**"
max_file_size_bytes: 1048576
indexing:
text_index: ready
vector_index: ready
graph_store: disabled
indexed_files: 347
last_indexed_at: "2026-02-08T12:48:00Z"
active_plans:
- plan_id: 01HXM7A9
action: local/code-coverage
phase: execute
timing:
duration_ms: 42
messages:
- level: ok
text: Project loaded
@dataclass
class FormatRegistration:
"""A registered format: its strategy factory, renderer factory, and fallback."""
strategy_factory: Callable[[TerminalCapabilities], MaterializationStrategy]
renderer_factory: Callable[[TerminalCapabilities], ElementRenderer]
fallback: str | None # Format name to fall back to, or None
class RendererRegistry:
"""Central registry for format (strategy, renderer) pairs.
Formats are registered by name and resolved at runtime based on the
active format and terminal capabilities. The registry supports dynamic
registration, enabling plugins to add custom formats (e.g., 'html',
'csv', 'markdown').
Built-in registrations:
"rich" → (LiveMaterializer, RichElementRenderer), fallback="table"
"table" → (SequentialBufferMaterializer, TableElementRenderer), fallback="color"
"color" → (SequentialBufferMaterializer, ColorElementRenderer), fallback="plain"
"plain" → (SequentialBufferMaterializer, PlainElementRenderer), fallback=None
"json" → (AccumulateMaterializer, JsonElementRenderer), fallback=None
"yaml" → (AccumulateMaterializer, YamlElementRenderer), fallback=None
"""
_formats: dict[str, FormatRegistration] = {}
@classmethod
def register(cls, format_name: str,
strategy_factory: Callable[[TerminalCapabilities], MaterializationStrategy],
renderer_factory: Callable[[TerminalCapabilities], ElementRenderer],
fallback: str | None = None) -> None:
"""Register a format.
Args:
format_name: The format identifier (e.g., 'rich', 'json').
strategy_factory: Callable that creates a MaterializationStrategy,
given terminal capabilities.
renderer_factory: Callable that creates an ElementRenderer,
given terminal capabilities.
fallback: Optional fallback format name if this format cannot
operate in the current terminal environment.
"""
cls._formats[format_name] = FormatRegistration(
strategy_factory=strategy_factory,
renderer_factory=renderer_factory,
fallback=fallback,
)
@classmethod
def resolve(cls, format_name: str,
terminal_caps: TerminalCapabilities
) -> tuple[MaterializationStrategy, ElementRenderer]:
"""Resolve the best (strategy, renderer) pair for the given format.
Walks the fallback chain if the requested format's renderer cannot
operate in the current terminal environment. Returns the first pair
where the renderer reports can_render(terminal_caps) == True.
Raises:
ValueError: If no usable format is found (should never happen
since 'plain' has no fallback and always works).
"""
current = format_name
visited: set[str] = set()
while current and current not in visited:
visited.add(current)
registration = cls._formats.get(current)
if registration is None:
break
renderer = registration.renderer_factory(terminal_caps)
if renderer.can_render(terminal_caps):
strategy = registration.strategy_factory(terminal_caps)
strategy.bind(renderer, terminal_caps=terminal_caps)
return strategy, renderer
current = registration.fallback
# Ultimate fallback is always plain
plain = cls._formats["plain"]
renderer = plain.renderer_factory(terminal_caps)
strategy = plain.strategy_factory(terminal_caps)
strategy.bind(renderer, terminal_caps=terminal_caps)
return strategy, renderer
@classmethod
def available_formats(cls) -> list[str]:
"""Return all registered format names."""
return sorted(cls._formats.keys())
@classmethod
def is_registered(cls, format_name: str) -> bool:
"""Check if a format is registered."""
return format_name in cls._formats
@dataclass
class TerminalCapabilities:
"""Detected capabilities of the output terminal.
This dataclass is populated once at CLI startup and passed to the
RendererRegistry for format resolution. It is also available to
individual strategies and renderers for fine-grained adaptation
(e.g., adjusting column widths to terminal width, choosing between
256-color and truecolor palettes).
"""
is_tty: bool # Is stdout a TTY?
width: int # Terminal width in columns
height: int # Terminal height in rows
supports_ansi: bool # Supports basic ANSI escape codes?
supports_256_color: bool # Supports 256-color palette?
supports_truecolor: bool # Supports 24-bit truecolor?
supports_unicode: bool # Supports Unicode (box-drawing, etc.)?
supports_cursor_movement: bool # Supports cursor repositioning?
supports_alternate_screen: bool # Supports alternate screen buffer?
no_color: bool # Is NO_COLOR environment variable set?
term_program: str | None # TERM_PROGRAM value (e.g., "iTerm2", "vscode")
@classmethod
def detect(cls) -> "TerminalCapabilities":
"""Auto-detect terminal capabilities from the environment.
Detection logic:
- is_tty: os.isatty(sys.stdout.fileno())
- width/height: os.get_terminal_size() with fallback to (80, 24)
- supports_ansi: True if is_tty and not Windows legacy console
- supports_256_color: True if TERM contains "256color" or COLORTERM is set
- supports_truecolor: True if COLORTERM is "truecolor" or "24bit"
- supports_unicode: True if locale encoding is UTF-8
- supports_cursor_movement: True if is_tty and TERM is not "dumb"
- supports_alternate_screen: True if supports_cursor_movement
- no_color: True if NO_COLOR environment variable is set (any value)
- term_program: Value of TERM_PROGRAM environment variable
"""
...
# Example: Registering a custom 'csv' format plugin
from cleveragents.output import RendererRegistry, SequentialBufferMaterializer
class CsvElementRenderer(ElementRenderer):
"""Renders tables as CSV, other elements as plain text."""
format_name = "csv"
def render_table(self, table: Table, stream: IO) -> None:
writer = csv.writer(stream)
writer.writerow([col.name for col in table.columns])
for row in table.rows:
writer.writerow([row.get(col.name, "") for col in table.columns])
def can_render(self, terminal_caps: TerminalCapabilities) -> bool:
return True # CSV works everywhere
# Register at plugin load time
RendererRegistry.register(
format_name="csv",
strategy_factory=lambda caps: SequentialBufferMaterializer(),
renderer_factory=lambda caps: CsvElementRenderer(),
fallback="plain",
)
{
"command": "project show",
"status": "error",
"exit_code": 1,
"error": {
"code": "NOT_FOUND",
"message": "Project 'local/nonexistent' not found",
"detail": "No project with name 'local/nonexistent' exists. Run 'agents project list' to see available projects.",
"suggestions": [
"agents project list",
"agents project create local/nonexistent"
]
},
"timing": { "duration_ms": 5 }
}
async def list_resources(session: OutputSession, client: ApiClient) -> None:
table = session.table("Resources", columns=[
ColumnDef(name="Name"), ColumnDef(name="Type"), ColumnDef(name="Status"),
])
try:
async for resource in client.list_resources():
table.add_row({
"Name": resource.name,
"Type": resource.type,
"Status": resource.status,
})
except ApiError as e:
table.close() # Close with partial data
session.status(f"Error fetching resources: {e}", level="error")
return
table.close()
session.status(f"{table.element.row_count} resources listed", level="ok")
async def cmd_project_show(session: OutputSession, project_name: str) -> None:
"""Implementation of 'agents project show <project>'."""
project = await api.get_project(project_name)
resources = await api.list_project_resources(project.name)
validations = await api.list_project_validations(project.name)
# --- Build output elements ---
# Panel: Project details
with session.panel("Project Details") as panel:
panel.set_entries({
"Name": project.name,
"Description": project.description,
"Resources": str(len(resources)),
"Remote": "yes" if project.remote else "no",
"Created": project.created_at.strftime("%Y-%m-%d %H:%M"),
}, style_hints={
"Name": "identifier",
"Resources": "number",
"Remote": "success" if not project.remote else "info",
"Created": "success",
})
# Table: Linked resources
with session.table("Linked Resources", columns=[
ColumnDef(name="Resource", type="string", style_hint="identifier"),
ColumnDef(name="Type"),
ColumnDef(name="Sandbox"),
ColumnDef(name="Read-Only"),
]) as table:
for r in resources:
table.add_row({
"Resource": r.name,
"Type": r.type,
"Sandbox": r.sandbox_strategy,
"Read-Only": "yes" if r.read_only else "no",
})
# Table: Validations
with session.table(f"Validations ({len(validations)})", columns=[
ColumnDef(name="ID", type="id", style_hint="identifier"),
ColumnDef(name="Command"),
ColumnDef(name="Mode"),
]) as table:
for v in validations:
table.add_row({
"ID": v.id,
"Command": v.command,
"Mode": v.mode,
})
# Status: Final message
session.status("Project loaded", level="ok")
Project Details
Name: local/api-service
Description: Backend API
Resources: 2
Remote: no
Created: 2026-02-08 12:46
Linked Resources
Resource Type Sandbox Read-Only
---------------- -------------- -------------------- ---------
local/api-repo git-checkout git_worktree no
local/staging-db local/database transaction_rollback yes
Validations (3)
Name Command Mode
----------------------- ------------------------------------- -----------
local/run-tests pytest --cov=src --cov-fail-under=80 required
local/lint-check ruff check . required
local/check-bundle-size node scripts/check-bundle-size.js informational
[OK] Project loaded
╭─ Project Details ──────────────╮
│ Name: local/api-service │
│ Description: Backend API │
│ Resources: 2 │
│ Remote: no │
│ Created: 2026-02-08 12:46 │
╰────────────────────────────────╯
╭─ Linked Resources ──────────────────────────────────────────────────────╮
│ Resource Type Sandbox Read-Only │
│ ──────────────── ────────────── ──────────────────── ───────── │
│ local/api-repo git-checkout git_worktree no │
│ local/staging-db local/database transaction_rollback yes │
╰─────────────────────────────────────────────────────────────────────────╯
╭─ Validations (3) ──────────────────────────────────────────────────────────────╮
│ Name Command Mode │
│ ─────────────────────── ───────────────────────────────────── ─────────── │
│ local/run-tests pytest --cov=src --cov-fail-under=80 required │
│ local/lint-check ruff check . required │
│ local/check-bundle-size node scripts/check-bundle-size.js informational │
╰────────────────────────────────────────────────────────────────────────────────╯
✓ OK Project loaded
{
"command": "project show",
"status": "ok",
"exit_code": 0,
"data": {
"project_details": {
"Name": "local/api-service",
"Description": "Backend API",
"Resources": "2",
"Remote": "no",
"Created": "2026-02-08 12:46"
},
"linked_resources": [
{
"Resource": "local/api-repo",
"Type": "git-checkout",
"Sandbox": "git_worktree",
"Read-Only": "no"
},
{
"Resource": "local/staging-db",
"Type": "local/database",
"Sandbox": "transaction_rollback",
"Read-Only": "yes"
}
],
"validations": [
{
"Name": "local/run-tests",
"Command": "pytest --cov=src --cov-fail-under=80",
"Mode": "required"
},
{
"Name": "local/lint-check",
"Command": "ruff check .",
"Mode": "required"
},
{
"Name": "local/check-bundle-size",
"Command": "node scripts/check-bundle-size.js",
"Mode": "informational"
}
]
},
"timing": { "duration_ms": 42 },
"messages": [
{ "level": "ok", "text": "Project loaded" }
]
}
async def cmd_resource_list(session: OutputSession, project: str | None) -> None:
"""Implementation of 'agents resource list'."""
# Create the table handle — it will accumulate rows as we stream them
table = session.table("Resources", columns=[
ColumnDef(name="Name", type="string", style_hint="identifier"),
ColumnDef(name="Type"),
ColumnDef(name="Project"),
ColumnDef(name="Sandbox"),
ColumnDef(name="Status"),
], sort_key="Name")
# Create a progress indicator for the fetch operation
progress = session.progress("Fetching resources...", indeterminate=True)
# Stream pages from the API
count = 0
async for page in api.list_resources_paginated(project=project):
for resource in page.items:
table.add_row({
"Name": resource.name,
"Type": resource.type,
"Project": resource.project,
"Sandbox": resource.sandbox_strategy,
"Status": resource.status,
})
count += 1
# Update progress label with count so far
progress.set_label(f"Fetching resources... ({count} found)")
# Close the progress indicator (it has served its purpose)
progress.close()
# Set summary and close the table
table.set_summary({"total": count})
table.close()
# Final status
session.status(f"{count} resources listed", level="ok")
Fetching resources... (47 found) [done]
Resources
Name Type Project Sandbox Status
-------------------- -------------- ----------------- -------------------- --------
local/api-repo git-checkout local/api-service git_worktree active
local/staging-db local/database local/api-service transaction_rollback active
local/docs-repo git-checkout local/docs-site git_worktree active
... (44 more rows)
Total: 47
[OK] 47 resources listed
⠙ Fetching resources... (23 found)
╭─ Resources ────────────────────────────────────────────────────────────────────────────╮
│ Name Type Project Sandbox Status │
│ ──────────────────── ────────────── ───────────────── ──────────────────── ────── │
│ local/api-repo git-checkout local/api-service git_worktree active │
│ local/staging-db local/database local/api-service transaction_rollback active │
│ local/docs-repo git-checkout local/docs-site git_worktree active │
│ ... │
│ local/test-fixtures git-checkout local/api-service git_worktree active │
│ │
│ Showing 1-23 of 23 (fetching...) │
╰────────────────────────────────────────────────────────────────────────────────────────╯
async def cmd_plan_status(session: OutputSession, plan_id: str) -> None:
"""Implementation of 'agents plan status <plan_id>'.
This command fetches plan metadata, then concurrently streams two data
sources: resource statuses and active tool call logs. Both data sources
are long-running — they produce results over several seconds as the
backend resolves each item.
"""
plan = await api.get_plan(plan_id)
# Panel: Plan metadata (created and closed synchronously)
with session.panel("Plan") as panel:
panel.set_entries({
"Plan ID": plan.id,
"Phase": plan.phase,
"State": plan.state,
"Action": plan.action,
"Project": plan.project,
"Started": plan.started_at.strftime("%H:%M:%S"),
}, style_hints={
"Plan ID": "identifier",
"Phase": "info",
"State": "warning" if plan.state == "processing" else "success",
})
# Create both table handles BEFORE starting concurrent producers.
# Declaration order determines rendering order in sequential formats.
resource_table = session.table("Resource Status", columns=[
ColumnDef(name="Resource", style_hint="identifier"),
ColumnDef(name="Type"),
ColumnDef(name="Status"),
ColumnDef(name="Latency", type="string", alignment="right"),
])
tool_table = session.table("Tool Call Log", columns=[
ColumnDef(name="#", type="number", alignment="right"),
ColumnDef(name="Tool"),
ColumnDef(name="Target"),
ColumnDef(name="Result"),
ColumnDef(name="Duration", type="string", alignment="right"),
])
# --- Run two producers concurrently ---
# Each producer writes to its own handle. Neither producer knows
# which format is active. The materialization strategy handles
# the coordination.
async def stream_resources():
"""Producer A: streams resource status checks."""
async for status in api.stream_resource_statuses(plan.id):
resource_table.add_row({
"Resource": status.resource_name,
"Type": status.resource_type,
"Status": status.status,
"Latency": f"{status.latency_ms}ms",
})
resource_table.close()
async def stream_tool_calls():
"""Producer B: streams tool call results."""
async for call in api.stream_tool_calls(plan.id):
tool_table.add_row({
"#": call.sequence_number,
"Tool": call.tool_name,
"Target": call.target,
"Result": call.result_summary,
"Duration": f"{call.duration_ms}ms",
})
tool_table.close()
# Launch both producers concurrently
await asyncio.gather(stream_resources(), stream_tool_calls())
# Final status
session.status(f"Plan {plan_id} status retrieved", level="ok")
Plan
Plan ID: 01HXM7A9
Phase: execute
State: processing
Action: local/code-coverage
Project: local/api-service
Started: 12:58:10
Resource Status
Resource Type Status Latency
---------------- -------------- ------- -------
local/api-repo git-checkout ready 42ms
local/staging-db local/database ready 128ms
Tool Call Log
# Tool Target Result Duration
-- ---------- ---------------------- ------------- --------
1 read_file src/auth/__init__.py 200 lines 0.1s
2 read_file src/auth/session.py 340 lines 0.1s
3 write_file tests/test_auth.py created 0.2s
4 edit_file src/auth/session.py 12 lines +/- 0.3s
5 run_tests pytest tests/test_auth 3 passed 2.1s
[OK] Plan 01HXM7A9 status retrieved
╭─ Plan ──────────────────────────────╮
│ Plan ID: 01HXM7A9 │
│ Phase: execute │
│ State: processing │
│ Action: local/code-coverage │
│ Project: local/api-service │
│ Started: 12:58:10 │
╰─────────────────────────────────────╯
╭─ Resource Status ⠙ ───────────────────────────────────────────╮
│ Resource Type Status Latency │
│ ──────────────── ────────────── ─────── ─────── │
│ local/api-repo git-checkout ready 42ms │
│ local/staging-db local/database ready 128ms │
│ │
│ 2 resources (streaming...) │
╰───────────────────────────────────────────────────────────────╯
╭─ Tool Call Log ⠙ ────────────────────────────────────────────────────╮
│ # Tool Target Result Duration │
│ ── ────────── ────────────────────── ───────────── ──────── │
│ 1 read_file src/auth/__init__.py 200 lines 0.1s │
│ 2 read_file src/auth/session.py 340 lines 0.1s │
│ 3 write_file tests/test_auth.py created 0.2s │
│ │
│ 3 calls (streaming...) │
╰──────────────────────────────────────────────────────────────────────╯
{
"command": "plan status",
"status": "ok",
"exit_code": 0,
"data": {
"plan": {
"Plan ID": "01HXM7A9",
"Phase": "execute",
"State": "processing",
"Action": "local/code-coverage",
"Project": "local/api-service",
"Started": "12:58:10"
},
"resource_status": [
{ "Resource": "local/api-repo", "Type": "git-checkout", "Status": "ready", "Latency": "42ms" },
{ "Resource": "local/staging-db", "Type": "local/database", "Status": "ready", "Latency": "128ms" }
],
"tool_call_log": [
{ "#": 1, "Tool": "read_file", "Target": "src/auth/__init__.py", "Result": "200 lines", "Duration": "0.1s" },
{ "#": 2, "Tool": "read_file", "Target": "src/auth/session.py", "Result": "340 lines", "Duration": "0.1s" },
{ "#": 3, "Tool": "write_file", "Target": "tests/test_auth.py", "Result": "created", "Duration": "0.2s" },
{ "#": 4, "Tool": "edit_file", "Target": "src/auth/session.py", "Result": "12 lines +/-", "Duration": "0.3s" },
{ "#": 5, "Tool": "run_tests", "Target": "pytest tests/test_auth", "Result": "3 passed", "Duration": "2.1s" }
]
},
"timing": { "duration_ms": 3200 },
"messages": [
{ "level": "ok", "text": "Plan 01HXM7A9 status retrieved" }
]
}
async def cmd_plan_execute(session: OutputSession, plan_id: str) -> None:
"""Implementation of 'agents plan execute <plan_id>'."""
plan = await api.get_plan(plan_id)
# Panel: Execution metadata
with session.panel("Execution") as panel:
panel.set_entries({
"Plan": plan.id,
"Phase": "execute",
"Sandbox": plan.sandbox_strategy,
"Worker": plan.worker,
"Started": datetime.now().strftime("%H:%M:%S"),
})
# Progress indicator with named steps
progress = session.progress("Executing plan", total=4, steps=[
"Collect context",
"Run tools",
"Build changeset",
"Validate",
])
# Step 1: Collect context
progress.set_step_status("Collect context", "active")
context = await api.collect_context(plan.id)
progress.set_step_status("Collect context", "done")
progress.set_progress(1, 4)
# Step 2: Run tools (parallel sub-operations)
progress.set_step_status("Run tools", "active")
tool_results = await api.run_tools(plan.id, context)
progress.set_step_status("Run tools", "done")
progress.set_progress(2, 4)
# Step 3: Build changeset
progress.set_step_status("Build changeset", "active")
changeset = await api.build_changeset(plan.id, tool_results)
progress.set_step_status("Build changeset", "done")
progress.set_progress(3, 4)
# Step 4: Validate
progress.set_step_status("Validate", "active")
validation = await api.validate_changeset(plan.id, changeset)
progress.set_step_status("Validate", "done")
progress.set_progress(4, 4)
progress.close()
# Summary panel
with session.panel("Strategy Summary") as panel:
panel.set_entries({
"Decisions": str(changeset.decision_count),
"Invariants": str(changeset.invariant_count),
"Planned Child Plans": f"{changeset.child_plan_count}+",
"Estimated Files": f"~{changeset.file_count}",
"Risk": changeset.risk_level,
})
# Final status
if validation.passed:
session.status("Execution complete — all validations passed", level="ok")
else:
session.status(
f"Execution complete — {validation.failure_count} validation(s) failed",
level="warn",
detail=validation.summary,
)
Execution
Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J
Phase: execute
Sandbox: git_worktree
Worker: local/executor
Started: 12:58:10
Executing plan [4/4]
[x] Collect context
[x] Run tools
[x] Build changeset
[x] Validate
Strategy Summary
Decisions: 8
Invariants: 2
Planned Child Plans: 2+
Estimated Files: ~12
Risk: low
[OK] Execution complete — all validations passed
╭─ Execution ──────────────────────╮
│ Plan: 01HXM8C2ZK4Q7C2B3F2R4VYV6J │
│ Phase: execute │
│ Sandbox: git_worktree │
│ Worker: local/executor │
│ Started: 12:58:10 │
╰──────────────────────────────────╯
Executing plan ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 50% elapsed 0:00:13
✓ Collect context .................. 0.8s
✓ Run tools ...................... 12.4s
⠙ Build changeset ................. (running)
○ Validate ........................ (pending)
async def cmd_resource_verify(session: OutputSession, project: str) -> None:
"""Verify all resources in a project. Some verifications may fail."""
resources = await api.list_project_resources(project)
# Create a table that will be populated concurrently
results_table = session.table("Verification Results", columns=[
ColumnDef(name="Resource", style_hint="identifier"),
ColumnDef(name="Type"),
ColumnDef(name="Check"),
ColumnDef(name="Status"),
ColumnDef(name="Detail"),
])
# Progress indicator
progress = session.progress(
"Verifying resources",
total=len(resources),
steps=[r.name for r in resources],
)
# Verify each resource concurrently
async def verify_one(resource):
progress.set_step_status(resource.name, "active")
try:
result = await api.verify_resource(resource.id)
results_table.add_row({
"Resource": resource.name,
"Type": resource.type,
"Check": result.check_name,
"Status": "pass" if result.passed else "fail",
"Detail": result.detail,
})
progress.set_step_status(
resource.name,
"done" if result.passed else "error",
)
except ApiError as e:
results_table.add_row({
"Resource": resource.name,
"Type": resource.type,
"Check": "connection",
"Status": "error",
"Detail": str(e),
})
progress.set_step_status(resource.name, "error")
progress.increment()
# Launch all verifications concurrently
await asyncio.gather(
*[verify_one(r) for r in resources],
return_exceptions=True, # Don't fail fast — collect all results
)
progress.close()
results_table.close()
# Summarize
snapshot = results_table.element
pass_count = sum(1 for r in snapshot.rows if r["Status"] == "pass")
fail_count = sum(1 for r in snapshot.rows if r["Status"] in ("fail", "error"))
if fail_count == 0:
session.status(f"All {pass_count} resources verified", level="ok")
else:
session.status(
f"{fail_count} of {pass_count + fail_count} resources failed verification",
level="error",
)
Verifying resources [3/3]
[x] local/api-repo
[!] local/staging-db
[x] local/docs-repo
Verification Results
Resource Type Check Status Detail
---------------- -------------- ---------- ------ ----------------------------------
local/api-repo git-checkout integrity pass All refs valid
local/staging-db local/database connection error Connection refused (port 5432)
local/docs-repo git-checkout integrity pass All refs valid
[ERROR] 1 of 3 resources failed verification
Verifying resources [3/3]
[x] local/api-repo
[!] local/staging-db
[x] local/docs-repo
Verification Results
Resource Type Check Status Detail
---------------- -------------- ---------- ------ ----------------------------------
local/api-repo git-checkout integrity pass All refs valid
local/staging-db local/database connection error Connection refused (port 5432)
local/docs-repo git-checkout integrity pass All refs valid
[ERROR] 1 of 3 resources failed verification
command: resource verify
status: error
exit_code: 1
data:
verification_results:
- Resource: local/api-repo
Type: git-checkout
Check: integrity
Status: pass
Detail: All refs valid
- Resource: local/staging-db
Type: local/database
Check: connection
Status: error
Detail: "Connection refused (port 5432)"
- Resource: local/docs-repo
Type: git-checkout
Check: integrity
Status: pass
Detail: All refs valid
timing:
duration_ms: 2840
messages:
- level: error
text: "1 of 3 resources failed verification"
# File: profiles/careful-auto.yaml
name: local/careful-auto
description: "Autonomous execution with mandatory sandbox and manual apply"
# Confidence thresholds (0.0 = always auto, 1.0 = always manual)
auto_strategize: 0.0
auto_execute: 0.0
auto_apply: 1.0
auto_decisions_strategize: 0.0
auto_decisions_execute: 0.0
auto_validation_fix: 0.0
auto_strategy_revision: 1.0
auto_reversion_from_apply: 1.0
auto_child_plans: 0.0
auto_retry_transient: 0.0
auto_checkpoint_restore: 0.0
# Safety flags (boolean)
require_sandbox: true
require_checkpoints: true
allow_unsafe_tools: false
# File: profiles/nuanced-auto.yaml
name: local/nuanced-auto
description: "Nuanced automation with graduated confidence thresholds"
auto_strategize: 0.0 # Always auto-strategize
auto_execute: 0.5 # Auto-execute when confidence >= 0.5
auto_apply: 1.0 # Always require manual apply
auto_decisions_strategize: 0.3 # Low bar for strategy decisions
auto_decisions_execute: 0.7 # Higher bar for execution decisions
auto_validation_fix: 0.5 # Auto-fix when reasonably confident
auto_strategy_revision: 0.8 # High confidence needed for auto-revision
auto_reversion_from_apply: 0.9 # Very high bar for late-stage reversion
auto_child_plans: 0.5 # Auto-spawn when moderately confident
auto_retry_transient: 0.0 # Always auto-retry transient errors
auto_checkpoint_restore: 0.6 # Auto-restore when fairly confident
require_sandbox: true
require_checkpoints: true
allow_unsafe_tools: false
agents automation-profile add --config ./profiles/careful-auto.yaml
class AutonomyController:
def should_proceed_automatically(self, decision, context, profile):
"""Determine whether to proceed automatically or escalate to user."""
factors = {
'past_success_rate': self.get_historical_success(decision.type),
'codebase_familiarity': self.get_familiarity_score(context.project),
'risk_assessment': self.evaluate_risk(decision),
'invariant_complexity': self.analyze_invariants(decision)
}
confidence = self.compute_confidence(factors) # Returns 0.0–1.0
threshold = profile.get_threshold(decision.flag) # e.g., auto_decisions_execute
if confidence >= threshold:
# Confidence meets or exceeds the profile threshold — proceed
return ProceedAutonomously(decision, confidence)
else:
# Confidence below threshold — escalate to human
return RequestHumanGuidance(decision, confidence, threshold, factors)
Decision B.superseded_by = new_decision_id
# View decision tree
agents plan tree <plan_id>
agents --format=json plan tree <plan_id> # For visualization tools
# Inspect a specific decision
agents plan explain <decision_id>
# Shows: question, chosen option, alternatives, rationale, downstream impact
# Correct via revert-and-replay
agents plan correct <decision_id> --mode=revert --guidance "<what the decision should be>"
# Re-executes from that point with the new guidance
# Correct via append (add fix at end)
agents plan correct <decision_id> --mode=append --guidance "<description of the fix>"
# Creates a new child plan to fix the outcome without rewriting history
# Compare old vs new after correction
agents plan diff --correction <correction_attempt_id>
core.format # top-level "core" group, "format" key
core.log.level # "core" group, "log" subgroup, "level" key
index.text.backend # "index" group, "text" subgroup, "backend" key
$ agents config set core.format table
$ agents config get plan.budget.per-plan
$ agents config list plan.*
# Inline dot notation (convenient for single keys)
index.text.backend = "tantivy"
# Or as nested TOML tables (better for groups)
[index.text]
backend = "tantivy"
[index.vector]
backend = "faiss"
# Set a global default
$ agents config set core.automation-profile trusted
# Override for a specific project — same key, scoped to the project
$ agents config set core.automation-profile manual --project local/production-api
# Project-scoped keys under any group work the same way
$ agents config set plan.budget.per-plan 2.00 --project local/production-api
$ agents config set sandbox.strategy git_worktree --project local/production-api
$ agents config set context.hot.max-tokens 32000 --project local/large-codebase
# Show the full resolution chain for a single key
$ agents config get sandbox.checkpoint.enabled
# List all keys in a group
$ agents config list index.*
# List all keys with their current effective values
$ agents config list
# ~/.cleveragents/config.toml
[core]
data-dir = "/home/alex/.cleveragents"
format = "rich"
namespace = "local"
automation-profile = "supervised"
[core.log]
level = "FATAL"
terminal = "auto"
terminal-stream = "stderr"
file-enabled = true
retention-days = 30
[core.backup]
retention-days = 7
[server]
# url = "https://agents.example.com"
# token = "tok_01HXR..."
[actor.default]
strategy = "local/strategist"
execution = "local/executor"
invariant = "local/invariant-resolver"
# estimation = "local/estimator"
# orchestrator = "local/orchestrator"
[plan]
concurrency = 4
max-child-depth = 5
[plan.budget]
per-plan = 5.00
per-session = 25.00
warn-threshold = 0.8
[plan.tool]
max-calls-per-step = 25
max-retries = 3
retry-backoff = "exponential"
[sandbox]
strategy = "git_worktree"
cleanup = "on_apply"
[sandbox.checkpoint]
enabled = true
max-per-plan = 50
[index.text]
backend = "tantivy"
[index.vector]
backend = "faiss"
[index.graph]
backend = "none"
[index.embedding]
provider = "openai"
model = "text-embedding-3-small"
[context.hot]
max-tokens = 16000
[context.warm]
max-decisions = 100
[context.cold]
max-decisions = 500
[context.query]
limit = 20
min-relevance = 0.3
[context.file]
max-size = 1048576
max-total-size = 52428800
[context.summarize]
enabled = true
max-tokens = 1000
# Provider keys — prefer environment variables for secrets
[provider.openai]
# api-key = "sk-..."
[provider.anthropic]
# api-key = "sk-ant-..."
# Project-scoped overrides
[project."local/production-api"]
"core.automation-profile" = "manual"
"plan.budget.per-plan" = 2.00
"sandbox.strategy" = "git_worktree"
"sandbox.checkpoint.enabled" = true
[project."local/docs"]
"core.automation-profile" = "auto"
"plan.budget.per-plan" = 10.00
"context.hot.max-tokens" = 32000
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://cleveragents.dev/schemas/actor-config.json",
"title": "CleverAgents Actor Configuration",
"description": "Configuration file schema for defining CleverAgents actors — intelligent agents composed of LLMs, tools, and graph topologies.",
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$",
"description": "Namespaced actor name in <namespace>/<name> format (e.g., 'local/reviewer', 'myorg/deploy-agent'). Required. When the actor is added via the CLI, this value is used as the registered name."
},
"cleveragents": {
"type": "object",
"description": "Metadata block containing schema version, logging, template engine, and safety settings.",
"properties": {
"version": {
"type": "string",
"description": "Schema version for this configuration file.",
"default": "3.0"
},
"logging": {
"type": "object",
"properties": {
"level": {
"type": "string",
"enum": ["DEBUG", "INFO", "WARNING", "ERROR"],
"default": "INFO",
"description": "Logging level."
}
},
"additionalProperties": false
},
"template_engine": {
"type": "string",
"enum": ["JINJA2", "NONE"],
"default": "JINJA2",
"description": "Template engine for string interpolation."
},
"unsafe": {
"type": "boolean",
"default": false,
"description": "When true, allows actors to perform operations flagged as unsafe. Requires --unsafe CLI flag."
},
"default_actor": {
"type": "string",
"description": "Name of the default actor when multiple actors are defined."
}
},
"additionalProperties": false
},
"actors": {
"$ref": "#/$defs/actorMap"
},
"agents": {
"$ref": "#/$defs/actorMap",
"description": "Alias for 'actors'. Both keys are accepted; use one or the other."
},
"routes": {
"type": "object",
"description": "Map of route names to their definitions. Routes connect actors via stream or graph topologies.",
"additionalProperties": {
"$ref": "#/$defs/route"
}
},
"merges": {
"type": "array",
"description": "Stream merge operations combining multiple streams into one.",
"items": {
"type": "object",
"properties": {
"sources": {
"type": "array",
"items": { "type": "string" },
"description": "Source stream names to merge."
},
"target": {
"type": "string",
"description": "Target stream name for merged output."
}
},
"required": ["sources", "target"],
"additionalProperties": false
}
},
"splits": {
"type": "array",
"description": "Stream split operations dividing one stream into multiple.",
"items": {
"type": "object",
"properties": {
"source": {
"type": "string",
"description": "Source stream name to split."
},
"targets": {
"type": "array",
"items": { "type": "string" },
"description": "Target stream names for split output."
}
},
"required": ["source", "targets"],
"additionalProperties": false
}
},
"templates": {
"type": "object",
"description": "Reusable template definitions for Jinja2 template inheritance.",
"additionalProperties": true
},
"instances": {
"type": "object",
"description": "Instantiated templates with bound parameters.",
"additionalProperties": true
},
"global_context": {
"type": "object",
"description": "Key-value pairs available to all actors via {{ context.key }} in templates.",
"additionalProperties": true
},
"prompts": {
"type": "object",
"description": "Named prompt templates that can be referenced by actors.",
"additionalProperties": { "type": "string" }
},
"pipelines": {
"type": "object",
"description": "Hybrid pipeline definitions combining stream and graph stages.",
"additionalProperties": {
"type": "object",
"properties": {
"stages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": { "type": "string" },
"type": { "type": "string" },
"config": { "type": "object", "additionalProperties": true }
},
"required": ["name", "type"]
}
},
"metadata": { "type": "object", "additionalProperties": true }
},
"required": ["stages"]
}
}
},
"required": ["name"],
"oneOf": [
{ "required": ["actors"] },
{ "required": ["agents"] }
],
"additionalProperties": false,
"$defs": {
"actorMap": {
"type": "object",
"description": "Map of actor names to their definitions.",
"additionalProperties": {
"$ref": "#/$defs/actorDefinition"
}
},
"actorDefinition": {
"type": "object",
"description": "A single actor definition.",
"properties": {
"type": {
"type": "string",
"enum": ["llm", "tool"],
"description": "Actor type: 'llm' for language model actors, 'tool' for tool-based actors."
},
"config": {
"type": "object",
"description": "Actor configuration. Fields depend on actor type.",
"properties": {
"provider": {
"type": "string",
"description": "LLM provider identifier: openai, anthropic, google, azure, openrouter, etc."
},
"model": {
"type": "string",
"description": "Model identifier within the provider: gpt-4, claude-3.5-sonnet, gemini-pro, etc."
},
"actor": {
"type": "string",
"description": "Combined provider/model format (e.g., 'anthropic/claude-3.5-sonnet'). Alternative to specifying provider and model separately."
},
"system_prompt": {
"type": "string",
"description": "System prompt text. Supports Jinja2 template syntax for dynamic content."
},
"temperature": {
"type": "number",
"minimum": 0.0,
"maximum": 2.0,
"description": "Sampling temperature. Lower values are more deterministic."
},
"max_tokens": {
"type": "integer",
"minimum": 1,
"description": "Maximum number of tokens in the generated response."
},
"memory_enabled": {
"type": "boolean",
"default": false,
"description": "Enable conversation memory for multi-turn interactions."
},
"max_history": {
"type": "integer",
"default": 50,
"minimum": 1,
"description": "Maximum number of conversation turns retained in memory."
},
"unsafe": {
"type": "boolean",
"default": false,
"description": "Allow this specific actor to perform unsafe operations."
},
"options": {
"type": "object",
"description": "Provider-specific options passed through to the underlying LLM API.",
"additionalProperties": true
},
"tools": {
"type": "array",
"description": "List of inline tool definitions for tool-type actors.",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Tool name."
},
"code": {
"type": "string",
"description": "Inline Python code defining the tool's behavior."
}
},
"required": ["name", "code"],
"additionalProperties": false
}
},
"response_format": {
"type": "object",
"description": "JSON schema for structured output from the LLM. When set, the model is constrained to produce output matching this schema.",
"additionalProperties": true
}
},
"additionalProperties": false
},
"skills": {
"type": "array",
"description": "List of skill names this actor can use. Each entry is a namespaced skill name (e.g., 'local/file-ops'). Skills provide tool capabilities to the actor.",
"items": { "type": "string", "pattern": "^[a-z0-9_-]+/[a-z0-9_-]+$" }
}
},
"required": ["type", "config"],
"additionalProperties": false
},
"route": {
"type": "object",
"description": "A route definition — either a stream or a graph topology.",
"properties": {
"type": {
"type": "string",
"enum": ["stream", "graph"],
"description": "Route type."
},
"stream_type": {
"type": "string",
"enum": ["cold", "hot", "replay"],
"default": "cold",
"description": "Stream type (stream routes only)."
},
"operators": {
"type": "array",
"description": "Processing operators (stream routes).",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": ["map", "graph_execute"],
"description": "Operator type."
},
"params": {
"type": "object",
"properties": {
"agent": { "type": "string", "description": "Actor name for map operators." },
"graph": { "type": "string", "description": "Graph route name for graph_execute operators." }
},
"additionalProperties": true
}
},
"required": ["type"]
}
},
"subscriptions": {
"type": "array",
"items": { "type": "string" },
"description": "Input stream subscriptions."
},
"publications": {
"type": "array",
"items": { "type": "string" },
"description": "Output stream publications."
},
"agents": {
"type": "array",
"items": { "type": "string" },
"description": "Actor names used by this route."
},
"initial_value": {
"description": "Initial stream value."
},
"buffer_size": {
"type": "integer",
"default": 10,
"minimum": 1,
"description": "Stream buffer size."
},
"template_config": {
"type": "object",
"description": "Template-specific configuration.",
"additionalProperties": true
},
"bridge": {
"type": "object",
"description": "Bridge configuration for stream-to-graph upgrades.",
"properties": {
"upgrade_conditions": { "type": "object", "additionalProperties": true },
"downgrade_conditions": { "type": "object", "additionalProperties": true },
"state_extractor": { "type": "string" },
"state_flattener": { "type": "string" },
"preserve_subscriptions": { "type": "boolean", "default": true },
"preserve_checkpointing": { "type": "boolean", "default": true }
},
"additionalProperties": false
},
"metadata": {
"type": "object",
"additionalProperties": true
},
"nodes": {
"type": "object",
"description": "Graph nodes (required for graph routes).",
"additionalProperties": {
"$ref": "#/$defs/graphNode"
}
},
"edges": {
"type": "array",
"description": "Graph edges (required for graph routes).",
"items": {
"$ref": "#/$defs/graphEdge"
}
},
"entry_point": {
"type": "string",
"description": "Entry point node name (required for graph routes)."
},
"checkpointing": {
"type": "boolean",
"default": false,
"description": "Enable graph checkpointing."
},
"checkpoint_dir": {
"type": "string",
"description": "Directory for checkpoint storage."
},
"enable_time_travel": {
"type": "boolean",
"default": false,
"description": "Enable time travel debugging."
},
"parallel_execution": {
"type": "boolean",
"default": false,
"description": "Allow parallel node execution."
},
"state_class": {
"type": "string",
"description": "Custom state class name."
}
},
"required": ["type"],
"additionalProperties": false
},
"graphNode": {
"type": "object",
"description": "A graph node definition.",
"properties": {
"type": {
"type": "string",
"enum": ["agent", "function", "tool", "conditional", "subgraph", "start", "end", "message_router"],
"description": "Node type."
},
"agent": { "type": "string", "description": "Actor name for agent nodes." },
"function": { "type": "string", "description": "Function name for function nodes." },
"tools": {
"type": "array",
"items": { "type": "string" },
"description": "Tool references for tool nodes."
},
"condition": { "type": "object", "additionalProperties": true, "description": "Condition for conditional nodes." },
"subgraph": { "type": "string", "description": "Route name for subgraph nodes." },
"retry_policy": { "type": "object", "additionalProperties": true, "description": "Retry configuration." },
"timeout": { "type": "integer", "minimum": 1, "description": "Timeout in seconds." },
"parallel": { "type": "boolean", "default": false, "description": "Allow parallel execution." },
"metadata": { "type": "object", "additionalProperties": true }
},
"required": ["type"],
"additionalProperties": false
},
"graphEdge": {
"type": "object",
"description": "A graph edge connecting two nodes.",
"properties": {
"source": { "type": "string", "description": "Source node name." },
"target": { "type": "string", "description": "Target node name." },
"condition": { "type": "object", "additionalProperties": true, "description": "Edge condition for conditional routing." },
"metadata": { "type": "object", "additionalProperties": true }
},
"required": ["source", "target"],
"additionalProperties": false
}
}
}
# ─── Name ───────────────────────────────────────────────────────────
name: <namespace>/<actor-name> # Namespaced actor name (required). Used as the registered name.
# Must follow <namespace>/<name> format (e.g., local/reviewer).
# ─── Metadata ───────────────────────────────────────────────────────
cleveragents:
version: "3.0" # Schema version (optional, default: latest)
logging:
level: "INFO" # Log level: DEBUG, INFO, WARNING, ERROR (optional)
template_engine: "JINJA2" # Template engine: JINJA2 or NONE (optional, default: JINJA2)
unsafe: false # Allow unsafe operations (optional, default: false)
default_actor: <actor_name> # Default actor to use when multiple are defined (optional)
# ─── Actor Definitions ──────────────────────────────────────────────
# The top-level key can be either "actors" or "agents" (both accepted).
actors:
<actor_name>:
type: llm | tool # Actor type (required)
config:
# ── For type: llm ──────────────────────────────────────────
provider: <string> # Provider identifier: openai, anthropic, google, azure, openrouter, etc. (required for LLM)
model: <string> # Model identifier: gpt-4, claude-3.5-sonnet, etc. (required for LLM)
# OR use the combined format:
actor: "<provider>/<model>" # Combined provider/model (alternative to provider + model)
system_prompt: | # System prompt text, supports Jinja2 templates (optional)
You are a helpful assistant.
Project: {{ context.project_name }}
temperature: 0.7 # Sampling temperature 0.0-2.0 (optional, default: provider default)
max_tokens: 4096 # Maximum output tokens (optional, default: provider default)
memory_enabled: true # Enable conversation memory (optional, default: false)
max_history: 50 # Maximum conversation turns to retain (optional, default: 50)
unsafe: false # Allow unsafe operations for this actor (optional, default: false)
options: # Additional provider-specific options (optional)
top_p: 1.0
frequency_penalty: 0.0
presence_penalty: 0.0
stop_sequences: ["END"]
seed: 42
# ── For type: tool ─────────────────────────────────────────
tools:
- name: <tool_name> # Tool name (required per tool)
code: | # Inline Python code (required per tool)
def run(input_data):
return {"result": input_data["query"]}
response_format: {} # JSON schema for structured LLM output (optional, LLM only)
# ── Skills (both LLM and tool actors) ────────────────────────
skills: # Skill references providing tool capabilities (optional)
- <namespace>/<skill-name> # e.g., local/file-ops, local/git-ops
# ─── Routes ─────────────────────────────────────────────────────────
routes:
<route_name>:
type: stream | graph # Route type (required)
# ── Stream route fields ──────────────────────────────────────
stream_type: cold | hot | replay # Stream type (optional, default: cold)
operators: # Processing operators (optional)
- type: map | graph_execute # Operator type
params: # Operator parameters
agent: <actor_name> # Actor to use (for map)
graph: <route_name> # Graph to execute (for graph_execute)
subscriptions: # Input subscriptions (optional)
- <stream_name>
publications: # Output publications (optional)
- <stream_name>
agents: # Actors used by this route (optional)
- <actor_name>
initial_value: <any> # Initial stream value (optional)
buffer_size: 10 # Stream buffer size (optional, default: 10)
template_config: {} # Template-specific configuration (optional)
bridge: # Bridge configuration for stream↔graph upgrades (optional)
upgrade_conditions: {} # Conditions to upgrade from stream to graph
downgrade_conditions: {} # Conditions to downgrade from graph to stream
state_extractor: <string> # Function to extract state during upgrade
state_flattener: <string> # Function to flatten state during downgrade
preserve_subscriptions: true # Keep subscriptions during transition (optional)
preserve_checkpointing: true # Keep checkpoints during transition (optional)
metadata: {} # Arbitrary metadata (optional)
# ── Graph route fields ───────────────────────────────────────
nodes: # Graph nodes (required for graph routes)
<node_name>:
type: agent | function | tool | conditional | subgraph | start | end | message_router
agent: <actor_name> # Actor for agent nodes
function: <function_name> # Function for function nodes
tools: # Tools for tool nodes
- <tool_ref>
condition: {} # Condition for conditional nodes
subgraph: <route_name> # Subgraph for subgraph nodes
retry_policy: {} # Retry configuration (optional)
timeout: 30 # Timeout in seconds (optional)
parallel: false # Allow parallel execution (optional)
metadata: {} # Arbitrary metadata (optional)
edges: # Graph edges (required for graph routes)
- source: <node_name> # Source node (required)
target: <node_name> # Target node (required)
condition: {} # Edge condition (optional)
metadata: {} # Arbitrary metadata (optional)
entry_point: <node_name> # Entry point node (required for graph routes)
checkpointing: false # Enable graph checkpointing (optional, default: false)
checkpoint_dir: <path> # Checkpoint directory (optional)
enable_time_travel: false # Enable time travel debugging (optional, default: false)
parallel_execution: false # Allow parallel node execution (optional, default: false)
state_class: <string> # Custom state class name (optional)
metadata: {} # Arbitrary metadata (optional)
# ─── Merges & Splits ────────────────────────────────────────────────
merges: # Stream merge definitions (optional)
- sources: # Source streams to merge
- <stream_name>
target: <stream_name> # Target stream for merged output
splits: # Stream split definitions (optional)
- source: <stream_name> # Source stream to split
targets: # Target streams for split output
- <stream_name>
# ─── Templates & Context ────────────────────────────────────────────
templates: {} # Reusable template definitions (optional)
instances: {} # Template instances (optional)
global_context: {} # Global context available to all actors (optional)
prompts: {} # Named prompt templates (optional)
# ─── Pipelines ──────────────────────────────────────────────────────
pipelines: # Hybrid pipeline definitions (optional)
<pipeline_name>:
stages:
- name: <stage_name>
type: <stage_type>
config: {}
metadata: {}
# minimal-chat.yaml
# Register: agents actor add --config minimal-chat.yaml
name: local/chat
actors:
chat:
type: llm
config:
provider: anthropic
model: claude-3.5-sonnet
system_prompt: "You are a helpful assistant."
routes:
main:
type: stream
operators:
- type: map
params:
agent: chat
publications:
- output
merges:
- sources: [output]
target: final
# code-reviewer.yaml
# Register: agents actor add --config code-reviewer.yaml
name: local/reviewer
cleveragents:
version: "3.0"
logging:
level: "INFO"
actors:
reviewer:
type: llm
config:
provider: openai
model: gpt-4
temperature: 0.2
max_tokens: 4096
system_prompt: |
You are a senior code reviewer. Analyze code for:
- Security vulnerabilities
- Performance issues
- Code style violations
- Missing error handling
Provide specific, actionable feedback with file and line references.
file_reader:
type: tool
config:
tools:
- name: read_file
code: |
def run(input_data):
path = input_data.get("path", "")
with open(path, "r") as f:
return {"content": f.read(), "path": path}
routes:
review_graph:
type: graph
nodes:
analyze:
type: agent
agent: reviewer
read:
type: tool
tools: [read_file]
report:
type: agent
agent: reviewer
edges:
- source: analyze
target: read
- source: read
target: report
- source: analyze
target: report
condition:
no_files_needed: true
entry_point: analyze
checkpointing: false
output_stream:
type: stream
operators:
- type: graph_execute
params:
graph: review_graph
publications:
- review_output
merges:
- sources: [review_output]
target: final
# research-pipeline.yaml
# Register: agents actor add --config research-pipeline.yaml --unsafe
name: local/research
cleveragents:
version: "3.0"
logging:
level: "DEBUG"
template_engine: "JINJA2"
unsafe: true
default_actor: orchestrator
actors:
orchestrator:
type: llm
config:
provider: anthropic
model: claude-3.5-sonnet
temperature: 0.7
max_tokens: 8192
memory_enabled: true
max_history: 100
system_prompt: |
You are an orchestrator managing a research pipeline for {{ context.project_name }}.
Topic: {{ context.research_topic }}
Your job is to:
1. Break down the research question into sub-questions
2. Delegate to specialist researchers
3. Synthesize findings into a coherent report
{% if context.deadline %}
Deadline: {{ context.deadline }}. Prioritize breadth over depth.
{% endif %}
researcher:
type: llm
config:
provider: openai
model: gpt-4
temperature: 0.3
max_tokens: 4096
system_prompt: |
You are a domain expert researcher. Provide thorough, factual analysis.
Always cite sources and note confidence levels.
synthesizer:
type: llm
config:
provider: anthropic
model: claude-3.5-sonnet
temperature: 0.5
max_tokens: 16384
system_prompt: |
You are an expert at synthesizing multiple research reports into coherent narratives.
Resolve contradictions, highlight consensus, and note gaps.
web_searcher:
type: tool
config:
tools:
- name: search_web
code: |
import os, json
def run(input_data):
api_key = os.environ.get("SEARCH_API_KEY", "")
query = input_data.get("query", "")
# Simulated web search
return {"results": [], "query": query}
- name: fetch_url
code: |
def run(input_data):
url = input_data.get("url", "")
return {"content": f"Content from {url}", "url": url}
routes:
research_graph:
type: graph
nodes:
plan:
type: agent
agent: orchestrator
research_parallel:
type: agent
agent: researcher
parallel: true
search:
type: tool
tools: [search_web, fetch_url]
synthesize:
type: agent
agent: synthesizer
review:
type: agent
agent: orchestrator
edges:
- source: plan
target: research_parallel
- source: plan
target: search
- source: research_parallel
target: synthesize
- source: search
target: synthesize
- source: synthesize
target: review
- source: review
target: plan
condition:
needs_more_research: true
entry_point: plan
checkpointing: true
checkpoint_dir: "${CHECKPOINT_DIR:/tmp/research_checkpoints}"
enable_time_travel: true
parallel_execution: true
progress_stream:
type: stream
stream_type: hot
operators:
- type: map
params:
agent: orchestrator
subscriptions:
- research_updates
publications:
- progress_output
buffer_size: 50
output_stream:
type: stream
operators:
- type: graph_execute
params:
graph: research_graph
publications:
- research_output
merges:
- sources: [progress_output, research_output]
target: final
global_context:
project_name: "AI Safety Research"
research_topic: "Alignment techniques in large language models"
deadline: "2026-03-01"
prompts:
deep_dive: "Provide an in-depth analysis of {topic} with at least 5 sources."
summary: "Summarize the following research in 500 words: {content}"
templates:
research_section:
template: |
## {{ section_title }}
{{ section_content }}
**Confidence:** {{ confidence_level }}
**Sources:** {{ sources | join(', ') }}
# echo-actor.yaml
# Register: agents actor add --config echo-actor.yaml
name: local/echo
cleveragents:
version: "3.0"
actors:
echo:
type: tool
config:
tools:
- name: echo_tool
code: |
def run(input_data):
message = input_data.get("content", "")
return {"response": f"Echo: {message}"}
routes:
main:
type: stream
operators:
- type: map
params:
agent: echo
publications:
- output
merges:
- sources: [output]
target: final
# classifier-router.yaml
# Register: agents actor add --config classifier-router.yaml
name: local/smart-router
actors:
classifier:
type: llm
config:
provider: openai
model: gpt-4
temperature: 0.0
max_tokens: 100
system_prompt: |
Classify the user's request into exactly one category:
CODING, WRITING, ANALYSIS, or GENERAL.
Respond with only the category name.
coding_expert:
type: llm
config:
provider: anthropic
model: claude-3.5-sonnet
temperature: 0.2
system_prompt: "You are an expert software engineer. Write clean, well-tested code."
writing_expert:
type: llm
config:
provider: openai
model: gpt-4
temperature: 0.7
system_prompt: "You are a professional writer. Produce clear, engaging prose."
analyst:
type: llm
config:
provider: anthropic
model: claude-3.5-sonnet
temperature: 0.3
system_prompt: "You are a data analyst. Provide thorough, evidence-based analysis."
generalist:
type: llm
config:
provider: openai
model: gpt-4
temperature: 0.5
system_prompt: "You are a helpful general-purpose assistant."
routes:
router_graph:
type: graph
nodes:
classify:
type: agent
agent: classifier
code:
type: agent
agent: coding_expert
write:
type: agent
agent: writing_expert
analyze:
type: agent
agent: analyst
general:
type: agent
agent: generalist
edges:
- source: classify
target: code
condition:
category: "CODING"
- source: classify
target: write
condition:
category: "WRITING"
- source: classify
target: analyze
condition:
category: "ANALYSIS"
- source: classify
target: general
condition:
category: "GENERAL"
entry_point: classify
main:
type: stream
operators:
- type: graph_execute
params:
graph: router_graph
publications:
- output
merges:
- sources: [output]
target: final
# support-bot.yaml
# Register: agents actor add --config support-bot.yaml
#
# Jinja2 preprocessing (Phase 1) resolves {{ }} and {% %} at load time.
# Phase 2: env var interpolation resolves ${VAR} after parsing.
name: local/support-bot
cleveragents:
version: "3.0"
template_engine: "JINJA2"
actors:
support:
type: llm
config:
# Phase 2: environment variables with defaults and type coercion
provider: ${LLM_PROVIDER:anthropic}
model: ${LLM_MODEL:claude-3.5-sonnet}
temperature: 0.4
max_tokens: ${MAX_TOKENS:4096} # coerced to int automatically
memory_enabled: ${ENABLE_MEMORY:true} # coerced to bool automatically
system_prompt: |
You are a {{ context.role }} for {{ context.company }}.
{% if context.tier == "enterprise" %}
This is an enterprise customer. Provide priority support with
detailed technical explanations and offer to escalate issues
to the engineering team when needed.
{% else %}
Provide friendly, concise support. Direct complex issues to
the documentation at {{ context.docs_url }}.
{% endif %}
Always respond in {{ context.language | default("English") }}.
routes:
main:
type: stream
operators:
- type: map
params:
agent: support
publications:
- output
merges:
- sources: [output]
target: final
# global_context populates the {{ context.* }} namespace at load time
global_context:
company: "Acme Corp"
role: "technical support specialist"
tier: "enterprise"
docs_url: "https://docs.acme.example.com"
# paper-writer.yaml
# Register: agents actor add --config paper-writer.yaml
#
# IMPORTANT: This file is NOT valid YAML as written. Jinja2 directives
# ({% for %}, {% if %}, {% endif %}, {% endfor %}) appear at the structural
# level — where YAML keys and list items would normally be — making the
# raw file unparseable by any YAML parser. Phase 1 (Jinja2 preprocessing)
# renders these directives into static YAML text BEFORE the YAML parser
# ever sees the file. Jinja2 syntax inside system_prompt fields is
# preserved for deferred runtime rendering.
name: local/paper-writer
cleveragents:
version: "3.0"
template_engine: "JINJA2"
logging:
level: "${LOG_LEVEL:INFO}"
unsafe: ${ALLOW_UNSAFE:false} # Phase 2: coerced to bool
default_actor: orchestrator
{# ─── Template comment: stripped from output, never reaches YAML parser ─── #}
actors:
# ── Orchestrator: uses deferred Jinja2 in system_prompt ─────────────
orchestrator:
type: llm
config:
provider: ${LLM_PROVIDER:anthropic}
model: ${PRIMARY_MODEL:claude-3.5-sonnet}
temperature: 0.7
max_tokens: ${MAX_TOKENS:8192}
memory_enabled: true
max_history: ${MAX_HISTORY:100}
system_prompt: |
You are the lead orchestrator for a research paper.
Topic: {{ context.paper_details.topic | tojson }}
Audience: {{ context.paper_details.audience | tojson }}
Max length: {{ context.paper_details.length | tojson }} words
{# ── Vetted sources: for-loop with type test, .get(), slicing ── #}
{% if context.vetted_sources and context.vetted_sources|length > 0 %}
The following {{ context.vetted_sources|length }} vetted sources:
{% for source in context.vetted_sources %}
{{ loop.index }}.
{% if source is mapping %}
{{ source.get('citation', 'Untitled') }}
{% if source.get('summary') %}
— {{ source.get('summary')[:200] }}
{% if source.get('summary')|length > 200 %}
...
{% endif %}
{% endif %}
{% else %}
{{ source }}
{% endif %}
{% endfor %}
{% else %}
No vetted sources are available yet. Begin with the discovery phase.
{% endif %}
{% if context.deadline %}
DEADLINE: {{ context.deadline }}. Prioritize accordingly.
{% endif %}
{# ── Section plan: ternary expression highlights current section ── #}
Section plan:
{% for section in context.sections %}
{% set m = ">>> " if section == context.current_section else " " %}
{{ m }}{{ loop.index }}. {{ section }}
{% endfor %}
{# ── Arithmetic in expressions ── #}
Progress: section {{ context.current_section_index + 1 }}
of {{ context.sections|length }}.
# ── Writer: deferred templates with nested conditionals ─────────────
writer:
type: llm
config:
provider: ${LLM_PROVIDER:anthropic}
model: ${PRIMARY_MODEL:claude-3.5-sonnet}
temperature: 0.5
max_tokens: 16384
system_prompt: |
You are writing section "{{ context.current_section }}" of a paper
on {{ context.paper_details.topic }}.
{% if context.section_content %}
Previous draft:
{% set sec = context.current_section %}
{{ context.section_content.get(sec, 'No prior draft.') }}
{% endif %}
{# ── Nested: loop inside conditional ── #}
{% if context.review_feedback and context.review_feedback|length > 0 %}
Reviewer feedback to address:
{% for fb in context.review_feedback %}
[{{ fb.reviewer }}] ({{ fb.severity }}): {{ fb.comment }}
{% endfor %}
{% endif %}
Format: {{ context.paper_details.get('format', 'markdown') | upper }}
# ── STRUCTURAL {% if %}: the entire assembler actor definition — its YAML
# ── key and all nested content — is conditionally included. The {% if %}
# ── and {% endif %} lines occupy positions where YAML keys would be,
# ── making this raw text invalid YAML. After Phase 1 rendering, either
# ── the full assembler: block appears or nothing does.
{% if context.enable_assembly %}
assembler:
type: llm
config:
actor: anthropic/claude-3.5-sonnet
temperature: 0.3
max_tokens: 32768
system_prompt: |
Assemble the final paper from these completed sections:
{% for path in context.sections %}
--- {{ path }} ---
{{ context.section_content.get(path, '[MISSING]') }}
{% endfor %}
Total sections: {{ context.sections|length }}
Target length: {{ context.paper_details.length }} words
{% if context.latex_errors %}
Previous compilation errors (last 2000 chars):
{{ context.latex_errors[-2000:] }}
{% endif %}
{% endif %}
# ── STRUCTURAL {% for %}: GENERATE one reviewer actor per entry in
# ── context.reviewers. The {% for %} line sits where a YAML key would
# ── be — not inside any string value. A YAML parser would reject this.
# This {% for %} runs at Phase 1 and produces static YAML actor definitions.
# With 3 reviewers in global_context, the rendered YAML contains 3 actors:
# reviewer_methods, reviewer_domain, reviewer_style.
{% for reviewer in context.reviewers %}
reviewer_{{ reviewer.id }}:
type: llm
config:
provider: {{ reviewer.get('provider', 'openai') }}
model: {{ reviewer.get('model', 'gpt-4') }}
temperature: 0.2
max_tokens: 4096
system_prompt: |
You are {{ reviewer.name }}, an expert reviewer
specializing in {{ reviewer.specialty }}.
Evaluate the paper section for:
{# ── Nested loop: iterate criteria inside reviewer loop ── #}
{% for criterion in reviewer.criteria %}
- {{ criterion }}
{% endfor %}
Severity ratings: Critical, Major, Minor, Suggestion.
{% if context.review_mode == "strict" %}
Apply strict academic standards. Flag all unsupported claims.
{% else %}
Focus on substantive issues. Ignore minor style preferences.
{% endif %}
{% endfor %}
# ── Routes: load-time loop generates graph nodes and edges ──────────
routes:
writing_graph:
type: graph
nodes:
plan:
type: agent
agent: orchestrator
draft:
type: agent
agent: writer
# STRUCTURAL {% for %}: generates review_methods, review_domain,
# review_style as concrete YAML keys — invalid YAML until rendered
{% for reviewer in context.reviewers %}
review_{{ reviewer.id }}:
type: agent
agent: reviewer_{{ reviewer.id }}
{% endfor %}
# STRUCTURAL {% if %}: the assemble node only exists when assembly
# is enabled — matches the conditional assembler actor above
{% if context.enable_assembly %}
assemble:
type: agent
agent: assembler
{% endif %}
edges:
- source: plan
target: draft
# STRUCTURAL {% for %}: generates edge sets for each reviewer.
# Contains a NESTED STRUCTURAL {% if %} — the assemble edge only
# appears when enable_assembly is true. Both directives sit where
# YAML list items would be — completely invalid YAML until rendered.
{% for reviewer in context.reviewers %}
- source: draft
target: review_{{ reviewer.id }}
- source: review_{{ reviewer.id }}
target: draft
condition:
has_critical_feedback: true
# {% if %} NESTED inside {% for %}: each reviewer gets an edge
# to assemble only when the assembler exists
{% if context.enable_assembly %}
- source: review_{{ reviewer.id }}
target: assemble
condition:
review_passed: true
{% endif %}
{% endfor %}
entry_point: plan
checkpointing: true
checkpoint_dir: "${CHECKPOINT_DIR:/tmp/paper_checkpoints}"
parallel_execution: true
output_stream:
type: stream
operators:
- type: graph_execute
params:
graph: writing_graph
publications:
- paper_output
# ── STRUCTURAL {% if %}: this entire route definition — the YAML key
# ── "progress_stream:" and all its children — only exists in the
# ── rendered output when enable_monitoring is true. A YAML parser
# ── would choke on the bare {% if %} line sitting where it expects
# ── a mapping key.
{% if context.enable_monitoring %}
progress_stream:
type: stream
stream_type: hot
operators:
- type: map
params:
agent: orchestrator
subscriptions:
- writing_updates
publications:
- progress_output
buffer_size: 50
{% endif %}
merges:
- sources:
- paper_output
# STRUCTURAL {% if %} inside a YAML list: this list item only
# appears in the rendered YAML when the condition is true.
# The raw file has a {% if %} line where a "- value" is expected.
{% if context.enable_monitoring %}
- progress_output
{% endif %}
target: final
# ── global_context: deeply nested structures drive all template rendering ──
global_context:
paper_details:
topic: "Alignment techniques in large language models"
audience: "ML researchers"
length: 8000
publication: "NeurIPS 2026"
format: "latex"
sections:
- "Abstract"
- "Introduction"
- "Related Work"
- "Methodology"
- "Experiments"
- "Results > Quantitative"
- "Results > Qualitative"
- "Discussion"
- "Conclusion"
current_section: "Introduction"
current_section_index: 1
deadline: "2026-06-01"
review_mode: "strict"
# These flags drive the structural {% if %} conditionals above.
# Set to false to exclude the assembler actor and monitoring route entirely.
enable_assembly: true
enable_monitoring: true
# The reviewers list drives the structural {% for %} loops that generate
# actor definitions, graph nodes, and graph edges at load time.
reviewers:
- id: methods
name: "Dr. Methods"
specialty: "research methodology"
provider: "openai"
model: "gpt-4"
criteria:
- "Statistical validity"
- "Reproducibility of experiments"
- "Clarity of methodology description"
- id: domain
name: "Dr. Domain"
specialty: "AI alignment"
provider: "anthropic"
model: "claude-3.5-sonnet"
criteria:
- "Technical accuracy"
- "Completeness of literature review"
- "Novelty of contributions"
- id: style
name: "Prof. Style"
specialty: "academic writing"
criteria:
- "Clarity and readability"
- "Logical flow between sections"
- "Proper citation format"
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://cleveragents.dev/schemas/skill-config.json",
"title": "CleverAgents Skill Configuration",
"description": "Configuration file schema for defining CleverAgents skills — reusable, namespaced collections of tools.",
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Fully qualified skill name in <namespace>/<name> format."
},
"description": {
"type": "string",
"description": "Human-readable description of what this skill provides."
},
"tools": {
"type": "array",
"description": "References to named tools from the Tool Registry.",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Fully qualified name of a tool registered in the Tool Registry."
},
"description": {
"type": "string",
"description": "Override the tool's registered description within this skill context."
},
"writes": {
"type": "boolean",
"description": "Override the tool's writes capability flag."
},
"checkpointable": {
"type": "boolean",
"description": "Override the tool's checkpointable capability flag."
}
},
"required": ["name"],
"additionalProperties": false
}
},
"inline_tools": {
"type": "array",
"description": "Anonymous tool definitions that exist only within this skill. Not registered in the Tool Registry.",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Tool name, unique within this skill."
},
"description": {
"type": "string",
"description": "Human-readable description of the tool's purpose."
},
"source": {
"type": "string",
"const": "custom",
"description": "Source type. Always 'custom' for inline tools."
},
"code": {
"type": "string",
"description": "Python code defining the tool's behavior. Must contain a run(input_data) function."
},
"input_schema": {
"$ref": "https://json-schema.org/draft/2020-12/schema",
"description": "JSON Schema describing the tool's input parameters."
},
"writes": {
"type": "boolean",
"default": false,
"description": "Whether this tool performs write operations."
},
"checkpointable": {
"type": "boolean",
"default": false,
"description": "Whether this tool supports checkpointing."
},
"side_effects": {
"type": "array",
"items": { "type": "string" },
"default": [],
"description": "Descriptions of side effects (e.g., 'network_call', 'schema_mutation')."
}
},
"required": ["name", "source", "code"],
"additionalProperties": false
}
},
"includes": {
"type": "array",
"description": "Other skills whose tools are merged into this skill.",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Fully qualified skill name to include."
},
"description": {
"type": "string",
"description": "Override the included skill's description."
}
},
"required": ["name"],
"additionalProperties": false
}
},
"mcp_servers": {
"type": "array",
"description": "MCP server specifications for exposing remote tools.",
"items": {
"$ref": "#/$defs/mcpServer"
}
},
"agent_skill_folders": {
"type": "array",
"description": "Agent Skills Standard folders to include.",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Path to the folder containing SKILL.md."
},
"name": {
"type": "string",
"description": "Override the skill bundle name."
}
},
"required": ["path"],
"additionalProperties": false
}
}
},
"required": ["name"],
"additionalProperties": false,
"$defs": {
"mcpServer": {
"type": "object",
"description": "An MCP server specification.",
"properties": {
"name": {
"type": "string",
"description": "Identifier for the MCP server."
},
"transport": {
"type": "string",
"enum": ["stdio", "sse", "streamable-http"],
"description": "Transport protocol."
},
"command": {
"type": "string",
"description": "Command to start the server (required for stdio transport)."
},
"args": {
"type": "array",
"items": { "type": "string" },
"description": "Command-line arguments for the server command."
},
"env": {
"type": "object",
"additionalProperties": { "type": "string" },
"description": "Environment variables to set when starting the server."
},
"url": {
"type": "string",
"format": "uri",
"description": "Server URL (required for sse and streamable-http transports)."
},
"headers": {
"type": "object",
"additionalProperties": { "type": "string" },
"description": "HTTP headers for remote server connections."
},
"tool_filter": {
"type": "object",
"properties": {
"include": {
"type": "array",
"items": { "type": "string" },
"description": "Whitelist of tool names to expose."
},
"exclude": {
"type": "array",
"items": { "type": "string" },
"description": "Blacklist of tool names to hide."
}
},
"additionalProperties": false
}
},
"required": ["name", "transport"],
"additionalProperties": false
}
}
}
# ─── Skill Metadata ─────────────────────────────────────────────────
name: <namespace>/<name> # Fully qualified skill name (required)
description: <string> # Human-readable description (optional)
# ─── Tool References ────────────────────────────────────────────────
# Named tools from the Tool Registry, referenced by fully-qualified name.
tools:
- name: <namespace>/<tool_name> # Reference to a registered tool (required)
description: <string> # Override the tool's description (optional)
writes: <boolean> # Override the tool's writes flag (optional)
checkpointable: <boolean> # Override the tool's checkpointable flag (optional)
# ─── Inline (Anonymous) Tools ───────────────────────────────────────
# Tools defined directly within this skill. These are NOT registered
# in the Tool Registry and cannot be reused outside this skill.
inline_tools:
- name: <string> # Tool name (unique within this skill, required)
description: <string> # Tool description (optional)
source: custom # Source type (required, always "custom" for inline)
code: | # Inline Python code (required)
def run(input_data):
return {"result": "value"}
input_schema: # JSON Schema for tool inputs (optional)
type: object
properties:
param_name:
type: string
description: "Parameter description"
required: ["param_name"]
writes: false # Whether this tool writes (optional, default: false)
checkpointable: false # Whether this tool supports checkpointing (optional, default: false)
side_effects: [] # List of side effect descriptions (optional)
# ─── Included Skills ────────────────────────────────────────────────
# Other skills whose tools are merged into this skill.
includes:
- name: <namespace>/<skill_name> # Fully qualified skill name to include (required)
description: <string> # Override the included skill's description (optional)
# ─── MCP Server Specifications ──────────────────────────────────────
# MCP servers whose tools are exposed through this skill.
mcp_servers:
- name: <string> # Server name for identification (required)
transport: stdio | sse | streamable-http # Transport protocol (required)
command: <string> # Server command (required for stdio)
args: # Command arguments (optional)
- <string>
env: # Environment variables for the server (optional)
KEY: "value"
url: <string> # Server URL (required for sse/streamable-http)
headers: {} # HTTP headers (optional, for sse/streamable-http)
tool_filter: # Filter which tools to expose (optional)
include: # Include only these tools (optional)
- <tool_name>
exclude: # Exclude these tools (optional)
- <tool_name>
# ─── Agent Skills Standard Folders ──────────────────────────────────
# References to Agent Skills Standard (SKILL.md-based) tool bundles.
agent_skill_folders:
- path: <string> # Path to the folder containing SKILL.md (required)
name: <string> # Override the skill bundle name (optional)
# file-reader-skill.yaml
# Register: agents skill add --config file-reader-skill.yaml
name: local/file-reader
description: "Basic file reading operations"
tools:
- name: builtin/read_file
- name: builtin/list_directory
- name: builtin/search_files
# git-and-github-skill.yaml
# Register: agents skill add --config git-and-github-skill.yaml
name: local/git-github
description: "Git operations and GitHub integration"
tools:
- name: builtin/git_status
- name: builtin/git_diff
- name: builtin/git_log
- name: builtin/git_blame
includes:
- name: local/file-reader
mcp_servers:
- name: github
transport: stdio
command: npx
args:
- "-y"
- "@modelcontextprotocol/server-github"
env:
GITHUB_PERSONAL_ACCESS_TOKEN: "${GITHUB_TOKEN}"
tool_filter:
include:
- create_issue
- create_pull_request
- list_repos
- get_file_contents
# devops-toolkit.yaml
# Register: agents skill add --config devops-toolkit.yaml
name: local/devops-toolkit
description: "Full-stack development and operations toolkit"
tools:
- name: builtin/shell_execute
description: "Execute shell commands in the project sandbox"
- name: local/validate-api-compat
description: "Check API backward compatibility"
includes:
- name: local/file-reader
- name: local/git-github
- name: local/docker-tools
inline_tools:
- name: run_migrations
description: "Run database migrations with rollback support"
source: custom
code: |
import subprocess
def run(input_data):
direction = input_data.get("direction", "up")
count = input_data.get("count", 1)
result = subprocess.run(
["alembic", direction, str(count)],
capture_output=True, text=True
)
return {
"success": result.returncode == 0,
"stdout": result.stdout,
"stderr": result.stderr
}
input_schema:
type: object
properties:
direction:
type: string
enum: ["up", "down"]
description: "Migration direction"
count:
type: integer
default: 1
description: "Number of migrations to run"
required: ["direction"]
writes: true
checkpointable: true
side_effects: ["schema_mutation"]
- name: health_check
description: "Check service health endpoints"
source: custom
code: |
import urllib.request
def run(input_data):
url = input_data.get("url", "http://localhost:8000/health")
try:
resp = urllib.request.urlopen(url, timeout=10)
return {"status": resp.status, "healthy": resp.status == 200}
except Exception as e:
return {"status": 0, "healthy": False, "error": str(e)}
input_schema:
type: object
properties:
url:
type: string
description: "Health check URL"
writes: false
mcp_servers:
- name: linear
transport: stdio
command: npx
args: ["-y", "@modelcontextprotocol/server-linear"]
env:
LINEAR_API_KEY: "${LINEAR_API_KEY}"
agent_skill_folders:
- path: ./skills/deploy-to-staging
name: deploy-staging
- path: ./skills/code-review-bundle
name: code-review
# text-processing-skill.yaml
# Register: agents skill add --config text-processing-skill.yaml
name: local/text-processing
description: "Simple text transformation utilities"
inline_tools:
- name: word_count
description: "Count words in text"
source: custom
code: |
def run(input_data):
text = input_data.get("text", "")
return {"count": len(text.split())}
input_schema:
type: object
properties:
text:
type: string
description: "Text to count words in"
required: ["text"]
writes: false
- name: to_uppercase
description: "Convert text to uppercase"
source: custom
code: |
def run(input_data):
return {"result": input_data.get("text", "").upper()}
input_schema:
type: object
properties:
text:
type: string
required: ["text"]
writes: false
- name: extract_urls
description: "Extract URLs from text"
source: custom
code: |
import re
def run(input_data):
text = input_data.get("text", "")
urls = re.findall(r'https?://[^\s<>"{}|\\^`\[\]]+', text)
return {"urls": urls, "count": len(urls)}
writes: false
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://cleveragents.dev/schemas/action-config.json",
"title": "CleverAgents Action Configuration",
"description": "Configuration file schema for defining CleverAgents actions — reusable plan templates that specify work to be applied to projects.",
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Fully qualified action name in <namespace>/<name> format."
},
"description": {
"type": "string",
"description": "Short (one-line) description of the action."
},
"long_description": {
"type": "string",
"description": "Detailed multi-line description explaining purpose, usage, and expected outcomes."
},
"strategy_actor": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Actor to use during the Strategize phase. Must reference a registered actor."
},
"execution_actor": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Actor to use during the Execute phase. Must reference a registered actor."
},
"estimation_actor": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Actor for effort and cost estimation before execution."
},
"review_actor": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Actor for reviewing execution results."
},
"apply_actor": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Actor to use during the Apply phase."
},
"invariant_actor": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Actor for reconciling conflicting invariants across scopes."
},
"definition_of_done": {
"type": "string",
"description": "Clear, measurable criteria that define when the action's work is complete."
},
"reusable": {
"type": "boolean",
"default": true,
"description": "Whether the action persists after being used."
},
"read_only": {
"type": "boolean",
"default": false,
"description": "Whether the action is restricted to read-only operations."
},
"state": {
"type": "string",
"enum": ["available", "archived"],
"default": "available",
"description": "State of the action."
},
"arguments": {
"type": "array",
"description": "Typed parameters that users supply when using the action via agents plan use --arg name=value.",
"items": {
"$ref": "#/$defs/argument"
}
},
"automation_profile": {
"type": "string",
"description": "Default automation profile for plans created from this action."
},
"invariants": {
"type": "array",
"items": { "type": "string" },
"description": "Constraints carried forward as plan-level invariants when the action is used."
}
},
"required": ["name", "description", "strategy_actor", "execution_actor", "definition_of_done"],
"additionalProperties": false,
"$defs": {
"argument": {
"type": "object",
"description": "A typed parameter for the action.",
"properties": {
"name": {
"type": "string",
"description": "Argument name. Used as the key in --arg name=value."
},
"type": {
"type": "string",
"enum": ["string", "integer", "float", "boolean", "list"],
"description": "Data type of the argument."
},
"required": {
"type": "boolean",
"default": false,
"description": "Whether the argument must be provided."
},
"description": {
"type": "string",
"description": "Human-readable description shown in help text."
},
"default": {
"description": "Default value when the argument is not provided. Type must match the 'type' field."
},
"validation_pattern": {
"type": "string",
"description": "Regex pattern for validating string arguments."
},
"min_value": {
"type": "number",
"description": "Minimum acceptable value for integer and float arguments."
},
"max_value": {
"type": "number",
"description": "Maximum acceptable value for integer and float arguments."
}
},
"required": ["name", "type"],
"additionalProperties": false
}
}
}
# ─── Action Identity ────────────────────────────────────────────────
name: <namespace>/<name> # Fully qualified action name (required)
description: <string> # Short description (required)
long_description: | # Detailed description (optional)
Multi-line detailed explanation of what this action does,
when to use it, and what outcomes to expect.
# ─── Lifecycle Actors ───────────────────────────────────────────────
strategy_actor: <namespace>/<name> # Actor for the Strategize phase (required)
execution_actor: <namespace>/<name> # Actor for the Execute phase (required)
estimation_actor: <namespace>/<name> # Actor for effort/cost estimation (optional)
review_actor: <namespace>/<name> # Actor for reviewing results (optional)
apply_actor: <namespace>/<name> # Actor for the Apply phase (optional)
invariant_actor: <namespace>/<name> # Invariant Reconciliation Actor (optional)
# ─── Completion Criteria ────────────────────────────────────────────
definition_of_done: | # Criteria for when the action is complete (required)
Clear, measurable criteria that define success.
Multiple criteria can be listed.
# ─── Action Properties ──────────────────────────────────────────────
reusable: true # Keep action after use (optional, default: true)
read_only: false # Restrict to read-only operations (optional, default: false)
state: available # State of the action: available or archived (optional, default: available)
# ─── Arguments ──────────────────────────────────────────────────────
# Arguments are typed parameters that must be supplied when using
# the action via `agents plan use --arg name=value`.
arguments:
- name: <string> # Argument name (required)
type: string | integer | float | boolean | list # Argument type (required)
required: true # Whether the argument must be provided (optional, default: false)
description: <string> # Human-readable description (optional)
default: <value> # Default value when not provided (optional)
validation_pattern: <regex> # Regex pattern for string validation (optional)
min_value: <number> # Minimum value for numeric types (optional)
max_value: <number> # Maximum value for numeric types (optional)
# ─── Automation ─────────────────────────────────────────────────────
automation_profile: <string> # Default automation profile name (optional)
# ─── Invariants ─────────────────────────────────────────────────────
# Invariants carried forward as plan-level invariants when this action is used.
invariants:
- <string> # Invariant text
# lint-check.yaml
# Create: agents action create --config lint-check.yaml
name: local/lint-check
description: "Run linting checks on the project"
strategy_actor: local/strategist
execution_actor: local/executor
definition_of_done: |
All linting checks pass with zero errors.
reusable: true
read_only: true
state: available
# code-coverage.yaml
# Create: agents action create --config code-coverage.yaml
name: local/code-coverage
description: "Increase test coverage to a target percentage"
long_description: |
Analyzes the current test coverage of a project, identifies
modules with low coverage, and generates comprehensive test
suites to meet the target coverage percentage.
The action prioritizes:
1. Business-critical modules (auth, payments)
2. Recently modified code
3. Error-prone areas based on git history
strategy_actor: local/strategist
execution_actor: local/executor
estimation_actor: local/estimator
definition_of_done: |
Test coverage reaches the target_coverage_percent threshold
across all specified modules. All generated tests pass.
No existing tests are broken by the changes.
reusable: true
read_only: false
arguments:
- name: target_coverage_percent
type: integer
required: true
description: "Target test coverage percentage (1-100)"
min_value: 1
max_value: 100
- name: test_command
type: string
required: false
description: "Test framework command to use"
default: "pytest --cov"
- name: exclude_patterns
type: list
required: false
description: "File patterns to exclude from coverage analysis"
default: ["**/migrations/**", "**/conftest.py"]
- name: focus_modules
type: list
required: false
description: "Specific modules to prioritize for coverage"
automation_profile: trusted
invariants:
- "Generated tests must not import production secrets or credentials"
- "Test files must follow the project's existing test naming conventions"
- "All database interactions in tests must use mocks or fixtures"
# security-audit.yaml
# Create: agents action create --config security-audit.yaml
name: local/security-audit
description: "Comprehensive security audit of a project"
long_description: |
Performs a thorough security audit covering:
- Dependency vulnerability scanning (CVEs)
- Static Application Security Testing (SAST)
- Authentication and authorization review
- Input validation and injection prevention
- Secrets detection and credential scanning
- API security (rate limiting, CORS, headers)
- Data handling and privacy compliance
Generates a detailed report with severity ratings (Critical,
High, Medium, Low, Informational) and remediation guidance.
Optionally creates fix plans for identified issues.
strategy_actor: local/security-strategist
execution_actor: local/security-scanner
estimation_actor: local/estimator
review_actor: local/security-reviewer
invariant_actor: local/invariant-resolver
definition_of_done: |
All critical and high severity findings have been identified.
A complete security report has been generated with:
- Severity classification for each finding
- Remediation steps for each finding
- Risk score for the overall project
If auto_fix is enabled, all critical findings have remediation
plans created as child plans.
reusable: true
read_only: false
state: available
arguments:
- name: severity_threshold
type: string
required: false
description: "Minimum severity to include in report"
default: "low"
validation_pattern: "^(critical|high|medium|low|informational)$"
- name: auto_fix
type: boolean
required: false
description: "Automatically create fix plans for critical findings"
default: false
- name: scan_dependencies
type: boolean
required: false
description: "Include dependency vulnerability scanning"
default: true
- name: compliance_frameworks
type: list
required: false
description: "Compliance frameworks to check against"
default: ["owasp-top-10"]
- name: max_findings
type: integer
required: false
description: "Maximum number of findings to report"
default: 100
min_value: 1
max_value: 1000
- name: ignore_paths
type: list
required: false
description: "Paths to exclude from scanning"
default: ["**/node_modules/**", "**/vendor/**", "**/.git/**"]
automation_profile: supervised
invariants:
- "Never modify production database schemas during audit"
- "Never execute discovered exploit code against live systems"
- "All findings must include reproducible steps"
- "Secrets found during scanning must be redacted in reports"
- "Remediation fixes must not break existing tests"
# db-migrate.yaml
# Create: agents action create --config db-migrate.yaml
name: local/db-migrate
description: "Plan and execute database schema migrations"
strategy_actor: local/db-strategist
execution_actor: local/db-executor
definition_of_done: |
All migration scripts are generated and pass dry-run validation.
Rollback scripts are generated for each migration.
The migration can be applied without data loss.
reusable: true
read_only: false
arguments:
- name: migration_tool
type: string
required: false
description: "Migration tool to use"
default: "alembic"
validation_pattern: "^(alembic|flyway|django|knex)$"
- name: dry_run
type: boolean
required: false
description: "Only generate and validate, do not apply"
default: true
- name: target_schema
type: string
required: false
description: "Target schema version identifier"
automation_profile: supervised
invariants:
- "All migrations must include corresponding rollback scripts"
- "Data migrations must preserve existing data integrity"
- "Schema changes must maintain backward compatibility for 24 hours"
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://cleveragents.dev/schemas/tool-config.json",
"title": "CleverAgents Tool Configuration",
"description": "Configuration file schema for defining CleverAgents tools — namespaced, independently registered, callable operations.",
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Fully qualified tool name in <namespace>/<name> format."
},
"description": {
"type": "string",
"description": "Human-readable description of the tool's purpose and behavior."
},
"source": {
"type": "string",
"enum": ["custom", "mcp", "agent_skill", "builtin"],
"description": "Tool source type. Determines which implementation fields are required."
},
"code": {
"type": "string",
"description": "Python code implementing the tool. Required when source is 'custom'. Must define a run(input_data) function."
},
"mcp_server": {
"type": "string",
"description": "Name of the MCP server exposing this tool. Required when source is 'mcp'."
},
"mcp_tool_name": {
"type": "string",
"description": "Name of the tool on the MCP server. Required when source is 'mcp'."
},
"agent_skill_path": {
"type": "string",
"description": "Path to the Agent Skills Standard folder containing SKILL.md. Required when source is 'agent_skill'."
},
"input_schema": {
"$ref": "https://json-schema.org/draft/2020-12/schema",
"description": "JSON Schema describing the tool's input parameters."
},
"output_schema": {
"$ref": "https://json-schema.org/draft/2020-12/schema",
"description": "JSON Schema describing the tool's output format."
},
"writes": {
"type": "boolean",
"default": false,
"description": "Whether the tool performs any write operations."
},
"write_scope": {
"type": "string",
"description": "Scope of write operations (e.g., 'filesystem', 'database:migrations', 'api:github')."
},
"checkpointable": {
"type": "boolean",
"default": false,
"description": "Whether the tool supports checkpointing — saving state before execution and restoring on failure."
},
"checkpoint_scope": {
"type": "string",
"enum": ["file", "transaction", "snapshot", "composite"],
"description": "The checkpointing strategy."
},
"side_effects": {
"type": "array",
"items": { "type": "string" },
"default": [],
"description": "Side effects that cannot be undone by checkpointing alone (e.g., 'network_call', 'schema_mutation', 'email_sent')."
},
"idempotent": {
"type": "boolean",
"default": false,
"description": "Whether the tool is safe to retry — calling it multiple times with the same input produces the same result."
},
"read_only": {
"type": "boolean",
"default": false,
"description": "Whether the tool only reads data without modifying anything."
},
"unsafe": {
"type": "boolean",
"default": false,
"description": "Whether the tool is flagged as unsafe. Requires allow_unsafe_tools: true in the automation profile."
},
"timeout": {
"type": "integer",
"default": 300,
"minimum": 1,
"description": "Default execution timeout in seconds."
},
"resource_slots": {
"type": "array",
"description": "Declared resource dependencies for this tool.",
"items": {
"$ref": "#/$defs/resourceSlot"
}
},
"lifecycle": {
"type": "object",
"description": "Lifecycle hook implementations.",
"properties": {
"discover": {
"type": "string",
"description": "Python code or function name run during tool discovery."
},
"activate": {
"type": "string",
"description": "Python code or function name run when the tool is activated."
},
"deactivate": {
"type": "string",
"description": "Python code or function name run when the tool is deactivated."
}
},
"additionalProperties": false
},
},
"required": ["name", "description", "source"],
"allOf": [
{
"if": { "properties": { "source": { "const": "custom" } } },
"then": { "required": ["code"] }
},
{
"if": { "properties": { "source": { "const": "mcp" } } },
"then": { "required": ["mcp_server", "mcp_tool_name"] }
},
{
"if": { "properties": { "source": { "const": "agent_skill" } } },
"then": { "required": ["agent_skill_path"] }
}
],
"additionalProperties": false,
"$defs": {
"resourceSlot": {
"type": "object",
"description": "A declared resource dependency slot.",
"properties": {
"name": {
"type": "string",
"description": "Identifier for this resource slot."
},
"resource_type": {
"type": "string",
"description": "The resource type this slot requires (e.g., 'git-checkout', 'fs-directory')."
},
"access": {
"type": "string",
"enum": ["read_only", "read_write"],
"description": "Access level needed."
},
"description": {
"type": "string",
"description": "Human-readable description of how the tool uses this resource."
},
"binding": {
"type": "string",
"enum": ["contextual", "static", "parameter"],
"default": "contextual",
"description": "How the slot is resolved at runtime."
},
"static_resource": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Fully qualified name of a specific resource. Required when binding is 'static'."
}
},
"required": ["name", "resource_type", "access"],
"if": { "properties": { "binding": { "const": "static" } } },
"then": { "required": ["name", "resource_type", "access", "static_resource"] },
"additionalProperties": false
}
}
}
# ─── Tool Identity ──────────────────────────────────────────────────
name: <namespace>/<name> # Fully qualified tool name (required)
description: <string> # Human-readable description (required)
# ─── Source and Implementation ──────────────────────────────────────
source: custom | mcp | agent_skill | builtin # Tool source type (required)
# For source: custom — inline Python implementation
code: | # Python code with a run(input_data) function (required for custom)
def run(input_data):
param = input_data.get("param_name", "default")
# ... tool logic ...
return {"result": "value"}
# For source: mcp — tool exposed by an MCP server
mcp_server: <string> # MCP server name (required for mcp)
mcp_tool_name: <string> # Tool name on the MCP server (required for mcp)
# For source: agent_skill — tool from an Agent Skills Standard folder
agent_skill_path: <string> # Path to the SKILL.md folder (required for agent_skill)
# ─── Input/Output Schema ────────────────────────────────────────────
input_schema: # JSON Schema for tool inputs (optional but recommended)
type: object
properties:
param_name:
type: string
description: "Parameter description"
enum: ["value1", "value2"] # Enumerated valid values (optional)
default: "value1" # Default value (optional)
numeric_param:
type: integer
description: "A numeric parameter"
minimum: 0 # Minimum value (optional)
maximum: 100 # Maximum value (optional)
required: ["param_name"] # Required parameters
output_schema: # JSON Schema for tool outputs (optional)
type: object
properties:
result:
type: string
success:
type: boolean
# ─── Capability Metadata ────────────────────────────────────────────
writes: false # Whether the tool performs write operations (optional, default: false)
write_scope: <string> # Scope of writes, e.g. "filesystem", "database:migrations" (optional)
checkpointable: false # Whether the tool supports checkpointing (optional, default: false)
checkpoint_scope: <string> # Checkpointing strategy: "file", "transaction", "snapshot", "composite" (optional)
side_effects: # List of side effect types (optional)
- <string> # e.g. "network_call", "schema_mutation", "process_spawn"
idempotent: false # Whether the tool is safe to retry (optional, default: false)
read_only: false # Whether the tool only reads (optional, default: false)
unsafe: false # Whether the tool is flagged as unsafe (optional, default: false)
timeout: 300 # Default execution timeout in seconds (optional, default: 300)
# ─── Resource Bindings ──────────────────────────────────────────────
# Declare which resources this tool operates on.
resource_slots:
- name: <string> # Slot name for reference (required)
resource_type: <string> # Required resource type, e.g. "git-checkout", "fs-directory" (required)
access: read_only | read_write # Access level needed (required)
description: <string> # Description of how the resource is used (optional)
binding: contextual | static | parameter # How the slot is resolved (optional, default: contextual)
static_resource: <namespace>/<name> # Specific resource (required when binding is static)
# ─── Lifecycle Hooks ────────────────────────────────────────────────
lifecycle:
discover: <string> # Python function or code for tool discovery (optional)
activate: <string> # Python function or code run when tool is activated (optional)
deactivate: <string> # Python function or code run when tool is deactivated (optional)
# read-config-file.yaml
# Register: agents tool add --config read-config-file.yaml
name: local/read-config
description: "Read and parse a configuration file (JSON, YAML, or TOML)"
source: custom
code: |
import json, os
def run(input_data):
path = input_data["path"]
if not os.path.exists(path):
return {"error": f"File not found: {path}", "success": False}
with open(path, "r") as f:
content = f.read()
ext = os.path.splitext(path)[1].lower()
if ext == ".json":
parsed = json.loads(content)
elif ext in (".yaml", ".yml"):
import yaml
parsed = yaml.safe_load(content)
else:
parsed = None
return {"content": content, "parsed": parsed, "path": path, "success": True}
input_schema:
type: object
properties:
path:
type: string
description: "Path to the configuration file"
required: ["path"]
output_schema:
type: object
properties:
content:
type: string
parsed:
type: object
success:
type: boolean
writes: false
read_only: true
idempotent: true
# run-migrations.yaml
# Register: agents tool add --config run-migrations.yaml
name: local/run-migrations
description: "Run database migrations with direction control and rollback support"
source: custom
code: |
import subprocess
def run(input_data):
direction = input_data.get("direction", "up")
count = input_data.get("count", 1)
dry_run = input_data.get("dry_run", False)
cmd = ["alembic"]
if dry_run:
cmd.append("--sql")
cmd.extend([direction, str(count)])
result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
return {
"success": result.returncode == 0,
"stdout": result.stdout,
"stderr": result.stderr,
"direction": direction,
"count": count,
"dry_run": dry_run,
"return_code": result.returncode
}
input_schema:
type: object
properties:
direction:
type: string
enum: ["up", "down"]
description: "Migration direction: 'up' to apply, 'down' to rollback"
count:
type: integer
default: 1
minimum: 1
maximum: 50
description: "Number of migrations to run"
dry_run:
type: boolean
default: false
description: "Generate SQL without executing"
required: ["direction"]
writes: true
write_scope: "database:migrations"
checkpointable: true
checkpoint_scope: "transaction"
side_effects:
- "schema_mutation"
idempotent: false
timeout: 120
resource_slots:
- name: database
resource_type: "local/database"
access: read_write
description: "The database to run migrations against"
binding: contextual
# github-create-issue.yaml
# Register: agents tool add --config github-create-issue.yaml
name: local/github-create-issue
description: "Create a GitHub issue via the GitHub MCP server"
source: mcp
mcp_server: github
mcp_tool_name: create_issue
input_schema:
type: object
properties:
owner:
type: string
description: "Repository owner"
repo:
type: string
description: "Repository name"
title:
type: string
description: "Issue title"
body:
type: string
description: "Issue body (Markdown)"
labels:
type: array
items:
type: string
description: "Labels to apply"
required: ["owner", "repo", "title"]
writes: true
write_scope: "api:github"
checkpointable: false
side_effects:
- "network_call"
idempotent: false
# deploy-staging.yaml
# Register: agents tool add --config deploy-staging.yaml
name: local/deploy-staging
description: "Deploy the current build to the staging environment with health checks"
source: custom
code: |
import subprocess, time, urllib.request, json
def run(input_data):
service = input_data["service"]
version = input_data.get("version", "latest")
wait_healthy = input_data.get("wait_healthy", True)
health_timeout = input_data.get("health_timeout", 120)
# Build the deployment command
cmd = ["kubectl", "set", "image",
f"deployment/{service}",
f"{service}={service}:{version}",
"--namespace=staging"]
result = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
if result.returncode != 0:
return {"success": False, "error": result.stderr, "phase": "deploy"}
# Wait for rollout
rollout = subprocess.run(
["kubectl", "rollout", "status", f"deployment/{service}",
"--namespace=staging", f"--timeout={health_timeout}s"],
capture_output=True, text=True, timeout=health_timeout + 10
)
if rollout.returncode != 0:
return {"success": False, "error": rollout.stderr, "phase": "rollout"}
# Health check
if wait_healthy:
health_url = f"http://{service}.staging.svc.cluster.local/health"
start = time.time()
while time.time() - start < health_timeout:
try:
resp = urllib.request.urlopen(health_url, timeout=5)
if resp.status == 200:
body = json.loads(resp.read())
if body.get("status") == "healthy":
return {
"success": True,
"service": service,
"version": version,
"health": body
}
except Exception:
pass
time.sleep(5)
return {"success": False, "error": "Health check timeout", "phase": "health"}
return {"success": True, "service": service, "version": version}
input_schema:
type: object
properties:
service:
type: string
description: "Name of the service to deploy"
version:
type: string
default: "latest"
description: "Docker image version tag"
wait_healthy:
type: boolean
default: true
description: "Wait for health check to pass"
health_timeout:
type: integer
default: 120
minimum: 10
maximum: 600
description: "Health check timeout in seconds"
required: ["service"]
output_schema:
type: object
properties:
success:
type: boolean
service:
type: string
version:
type: string
error:
type: string
phase:
type: string
writes: true
write_scope: "infrastructure:kubernetes"
checkpointable: true
checkpoint_scope: "composite"
side_effects:
- "network_call"
- "process_spawn"
- "infrastructure_mutation"
idempotent: false
unsafe: true
timeout: 300
resource_slots:
- name: repo
resource_type: git-checkout
access: read_only
description: "Source repository for build artifacts"
binding: contextual
- name: cluster_config
resource_type: fs-file
access: read_only
description: "Kubernetes cluster configuration (kubeconfig)"
binding: static
static_resource: local/staging-kubeconfig
lifecycle:
activate: |
def activate(context):
import subprocess
result = subprocess.run(["kubectl", "cluster-info"], capture_output=True, text=True)
if result.returncode != 0:
raise RuntimeError("Cannot connect to Kubernetes cluster")
return {"cluster": "connected"}
deactivate: |
def deactivate(context):
pass # No cleanup needed
# validate-api-compat.yaml
# Register: agents tool add --config validate-api-compat.yaml
name: local/validate-api-compat
description: "Validate that API changes maintain backward compatibility with existing clients"
source: custom
code: |
import subprocess, json
def run(input_data):
spec_path = input_data.get("spec_path", "openapi.yaml")
base_branch = input_data.get("base_branch", "main")
# Get the base spec from the main branch
base_result = subprocess.run(
["git", "show", f"{base_branch}:{spec_path}"],
capture_output=True, text=True
)
if base_result.returncode != 0:
return {"compatible": True, "reason": "No base spec found (new API)", "changes": []}
# Run OpenAPI diff
diff_result = subprocess.run(
["oasdiff", "breaking", "--format", "json",
"--base", "/dev/stdin", "--revision", spec_path],
input=base_result.stdout,
capture_output=True, text=True
)
if diff_result.returncode == 0:
return {"compatible": True, "changes": [], "reason": "No breaking changes"}
try:
breaking = json.loads(diff_result.stdout)
except json.JSONDecodeError:
breaking = [{"description": diff_result.stdout}]
return {
"compatible": False,
"changes": breaking,
"reason": f"Found {len(breaking)} breaking change(s)"
}
input_schema:
type: object
properties:
spec_path:
type: string
default: "openapi.yaml"
description: "Path to the OpenAPI specification file"
base_branch:
type: string
default: "main"
description: "Branch to compare against for backward compatibility"
required: []
writes: false
read_only: true
checkpointable: false
idempotent: true
timeout: 60
resource_slots:
- name: repo
resource_type: git-checkout
access: read_only
description: "Git repository containing the API spec"
binding: contextual
# validations/run-tests.yaml
# Register: agents validation add --config validations/run-tests.yaml
name: local/run-tests
description: "Run unit tests with coverage and report pass/fail"
source: custom
code: |
import subprocess, json
def run(input_data):
threshold = input_data.get("coverage_threshold", 80)
result = subprocess.run(
["pytest", "--cov=src", f"--cov-fail-under={threshold}", "--tb=short", "-q"],
capture_output=True, text=True
)
passed = result.returncode == 0
return {
"passed": passed,
"message": "All tests passed" if passed else f"Tests failed (exit code {result.returncode})",
"data": {
"stdout": result.stdout,
"stderr": result.stderr,
"returncode": result.returncode,
"coverage_threshold": threshold
}
}
validation:
mode: required
input_schema:
type: object
properties:
coverage_threshold:
type: integer
default: 80
description: "Minimum coverage percentage required"
read_only: true
idempotent: true
timeout: 600
resource_slots:
- name: repo
resource_type: git-checkout
access: read_only
binding: contextual
# validations/lint-check.yaml
name: local/lint-check
description: "Run linter and report pass/fail"
source: custom
code: |
import subprocess
def run(input_data):
result = subprocess.run(["ruff", "check", "."], capture_output=True, text=True)
passed = result.returncode == 0
return {
"passed": passed,
"message": "Lint clean" if passed else f"Lint errors found",
"data": {"stdout": result.stdout, "stderr": result.stderr}
}
validation:
mode: required
read_only: true
idempotent: true
timeout: 300
# validations/check-bundle-size.yaml
name: local/check-bundle-size
description: "Check bundle size (advisory — does not block execution)"
source: custom
code: |
import subprocess, json
def run(input_data):
result = subprocess.run(["node", "scripts/check-bundle-size.js"], capture_output=True, text=True)
try:
size_data = json.loads(result.stdout)
except json.JSONDecodeError:
size_data = {"raw_output": result.stdout}
passed = result.returncode == 0
return {
"passed": passed,
"message": "Bundle size within limits" if passed else "Bundle size exceeds advisory threshold",
"data": size_data
}
validation:
mode: informational
read_only: true
timeout: 120
# validations/security-scan.yaml
name: local/security-scan
description: "Run security vulnerability scan via MCP"
source: mcp
mcp_server: "npx @security/mcp-scanner"
mcp_tool_name: scan_vulnerabilities
validation:
mode: required
read_only: true
timeout: 300
# validations/tests-pass.yaml
# Assumes local/run-tests is already registered as a Tool that runs
# the test suite and returns {returncode, tests_run, tests_passed, ...}
name: local/tests-pass
description: "Validate that all unit tests pass (wraps local/run-tests)"
wraps: local/run-tests
transform: |
def transform(tool_output):
passed = tool_output.get("returncode") == 0
tests_run = tool_output.get("tests_run", 0)
tests_passed = tool_output.get("tests_passed", 0)
return {
"passed": passed,
"message": f"{tests_passed}/{tests_run} tests passed" if passed
else f"{tests_run - tests_passed} tests failed",
"data": tool_output
}
validation:
mode: required
timeout: 600
# validations/coverage-check.yaml
name: local/coverage-check
description: "Check test coverage exceeds threshold (advisory)"
wraps: local/run-tests
transform: |
def transform(tool_output):
coverage = tool_output.get("coverage_percent", 0)
threshold = 80
return {
"passed": coverage >= threshold,
"message": f"Coverage: {coverage:.1f}% (threshold: {threshold}%)",
"data": {
"coverage_percent": coverage,
"threshold": threshold,
"above_threshold": coverage >= threshold
}
}
validation:
mode: informational
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://cleveragents.dev/schemas/resource-type-config.json",
"title": "CleverAgents Resource Type Configuration",
"description": "Configuration file schema for defining custom resource types that extend the built-in resource types.",
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Fully qualified resource type name in <namespace>/<name> format."
},
"description": {
"type": "string",
"description": "Human-readable description of what this resource type represents."
},
"physical": {
"type": "boolean",
"description": "true for physical types (concrete manifestations), false for virtual types (abstract identity linking equivalent physical resources)."
},
"user_addable": {
"type": "boolean",
"default": true,
"description": "Whether users can create instances directly via 'agents resource add <type>'."
},
"cli_args": {
"type": "array",
"description": "Arguments accepted by 'agents resource add <type>'.",
"items": {
"$ref": "#/$defs/cliArg"
}
},
"child_types": {
"type": "array",
"description": "Resource types that can be children of this type.",
"items": {
"$ref": "#/$defs/childType"
}
},
"parent_types": {
"type": "array",
"description": "Resource types that can be parents of this type. If omitted, the resource can be top-level.",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "Parent resource type name."
},
"description": {
"type": "string",
"description": "Description of the parent-child relationship from the child's perspective."
}
},
"required": ["type"],
"additionalProperties": false
}
},
"sandbox_strategy": {
"type": "string",
"enum": ["git_worktree", "copy_on_write", "transaction_rollback", "snapshot", "none"],
"description": "Sandbox strategy for instances of this type."
},
"handler": {
"type": "object",
"description": "The Python handler class that implements resource operations.",
"properties": {
"class": {
"type": "string",
"description": "Python class name that implements the resource handler interface."
},
"module": {
"type": "string",
"description": "Python module path where the handler class is defined."
},
"config": {
"type": "object",
"description": "Arbitrary configuration passed to the handler constructor.",
"additionalProperties": true
}
},
"required": ["class", "module"],
"additionalProperties": false
},
"auto_discovery": {
"type": "object",
"description": "Controls automatic child resource discovery when a resource of this type is created.",
"properties": {
"enabled": {
"type": "boolean",
"default": true,
"description": "Whether auto-discovery runs when a resource of this type is created."
},
"scan_depth": {
"type": "integer",
"default": 3,
"minimum": 1,
"description": "Maximum recursion depth for scanning."
},
"include_patterns": {
"type": "array",
"items": { "type": "string" },
"description": "Glob patterns for resources to discover."
},
"exclude_patterns": {
"type": "array",
"items": { "type": "string" },
"description": "Glob patterns for resources to skip during discovery."
}
},
"additionalProperties": false
},
"equivalence": {
"type": "object",
"description": "Equivalence criteria for virtual types. Only applicable when physical is false.",
"properties": {
"criteria": {
"type": "array",
"items": { "type": "string" },
"description": "Fields used to determine equivalence (e.g., 'content_hash', 'filename', 'permissions', 'url')."
},
"description": {
"type": "string",
"description": "Human-readable description of the equivalence rule."
}
},
"required": ["criteria"],
"additionalProperties": false
},
},
"required": ["name", "description", "physical", "sandbox_strategy", "handler"],
"if": {
"properties": { "physical": { "const": false } }
},
"then": {
"required": ["name", "description", "physical", "sandbox_strategy", "handler", "equivalence"]
},
"additionalProperties": false,
"$defs": {
"cliArg": {
"type": "object",
"description": "A CLI argument definition for 'agents resource add <type>'.",
"properties": {
"name": {
"type": "string",
"description": "Argument name. Becomes --<name> on the CLI."
},
"type": {
"type": "string",
"enum": ["string", "path", "integer", "boolean", "url"],
"description": "Argument type. 'path' validates that the path exists; 'url' validates URL format."
},
"required": {
"type": "boolean",
"default": false,
"description": "Whether the argument must be provided."
},
"description": {
"type": "string",
"description": "Description shown in --help."
},
"default": {
"description": "Default value when the argument is not provided."
},
"validation_pattern": {
"type": "string",
"description": "Regex pattern for validating string and url type arguments."
}
},
"required": ["name", "type"],
"additionalProperties": false
},
"childType": {
"type": "object",
"description": "An allowed child resource type relationship.",
"properties": {
"type": {
"type": "string",
"description": "Child resource type name."
},
"auto_discover": {
"type": "boolean",
"default": false,
"description": "Whether children of this type are automatically created when the parent resource is registered."
},
"manual_link": {
"type": "boolean",
"default": true,
"description": "Whether manual 'agents resource link-child' is allowed for this relationship."
},
"description": {
"type": "string",
"description": "Description of the parent-child relationship."
},
"max_count": {
"type": ["integer", "null"],
"minimum": 1,
"description": "Maximum number of children of this type. null or omitted means unlimited."
}
},
"required": ["type"],
"additionalProperties": false
}
}
}
# ─── Resource Type Identity ─────────────────────────────────────────
name: <namespace>/<name> # Fully qualified resource type name (required)
description: <string> # Human-readable description (required)
# ─── Type Classification ────────────────────────────────────────────
physical: true # Whether instances are physical or virtual (required)
# Physical: a specific, concrete manifestation (this file at this path)
# Virtual: an abstract identity linking equivalent physical resources
user_addable: true # Whether users can create instances directly (optional, default: true)
# ─── CLI Arguments ──────────────────────────────────────────────────
# Define the arguments accepted by `agents resource add <type>`.
cli_args:
- name: <string> # Argument name (becomes --<name> on CLI) (required)
type: string | path | integer | boolean | url # Argument type (required)
required: true # Whether the argument is required (optional, default: false)
description: <string> # Description shown in help text (optional)
default: <value> # Default value (optional)
validation_pattern: <regex> # Regex validation for string/url types (optional)
# ─── Parent/Child Type Relationships ────────────────────────────────
# Define which resource types can be children of this type.
child_types:
- type: <string> # Child resource type name (required)
auto_discover: true # Automatically create children when parent is created (optional, default: false)
manual_link: true # Allow manual parent-child linking (optional, default: true)
description: <string> # Description of the relationship (optional)
max_count: <integer> # Maximum number of children of this type (optional, null = unlimited)
# Define which resource types can be parents of this type.
parent_types:
- type: <string> # Parent resource type name (required)
description: <string> # Description of the relationship (optional)
# If parent_types is omitted, the resource can be top-level (no parent required).
# ─── Sandbox Strategy ──────────────────────────────────────────────
sandbox_strategy: <string> # Sandbox strategy for instances of this type (required)
# Built-in strategies: "git_worktree", "copy_on_write",
# "transaction_rollback", "snapshot", "none"
# ─── Handler Implementation ────────────────────────────────────────
handler:
class: <string> # Python class implementing the resource handler (required)
module: <string> # Python module path (required)
config: {} # Handler-specific configuration (optional)
# ─── Auto-Discovery Configuration ──────────────────────────────────
auto_discovery:
enabled: true # Whether child auto-discovery runs on creation (optional, default: true)
scan_depth: <integer> # Max depth for recursive scanning (optional, default: 3)
include_patterns: # Glob patterns for resources to auto-discover (optional)
- <string>
exclude_patterns: # Glob patterns to exclude from auto-discovery (optional)
- <string>
# ─── Virtual Type Configuration ─────────────────────────────────────
# Only applicable when physical: false (virtual types).
equivalence:
criteria: # Fields used to determine equivalence (required for virtual)
- <string> # e.g. "content_hash", "filename", "permissions", "url"
description: <string> # Human-readable description of the equivalence rule (optional)
# svn-type.yaml
# Register: agents resource type add --config svn-type.yaml
name: local/svn
description: "A Subversion (SVN) repository checkout"
physical: true
user_addable: true
cli_args:
- name: url
type: url
required: true
description: "SVN repository URL"
validation_pattern: "^svn(\\+ssh)?://.*|^https?://.*"
- name: checkout-path
type: path
required: true
description: "Local checkout directory"
- name: revision
type: string
required: false
description: "Specific revision to checkout"
default: "HEAD"
child_types:
- type: fs-directory
auto_discover: true
description: "Working copy directory tree"
- type: local/svn-revision
auto_discover: true
description: "SVN revision history"
sandbox_strategy: copy_on_write
handler:
class: SVNHandler
module: cleveragents.resources.handlers.svn
config:
svn_binary: "svn"
trust_server_cert: true
auto_discovery:
enabled: true
scan_depth: 2
exclude_patterns:
- "**/.svn/**"
# s3-bucket-type.yaml
# Register: agents resource type add --config s3-bucket-type.yaml
name: local/s3-bucket
description: "An Amazon S3 bucket with prefix-based object organization"
physical: true
user_addable: true
cli_args:
- name: bucket
type: string
required: true
description: "S3 bucket name"
validation_pattern: "^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$"
- name: region
type: string
required: false
description: "AWS region"
default: "us-east-1"
- name: prefix
type: string
required: false
description: "Key prefix to scope resource to a 'subdirectory'"
default: ""
- name: profile
type: string
required: false
description: "AWS CLI profile name"
default: "default"
child_types:
- type: local/s3-prefix
auto_discover: true
description: "S3 key prefixes (virtual directories)"
max_count: 1000
- type: local/s3-object
auto_discover: true
description: "S3 objects (files)"
sandbox_strategy: copy_on_write
handler:
class: S3BucketHandler
module: cleveragents.resources.handlers.s3
config:
max_object_size: 104857600 # 100 MB
default_acl: "private"
auto_discovery:
enabled: true
scan_depth: 3
include_patterns:
- "**/*.json"
- "**/*.yaml"
- "**/*.yml"
- "**/*.py"
- "**/*.sql"
exclude_patterns:
- "**/*.log"
- "**/*.tmp"
- "**/node_modules/**"
# database-type.yaml
# Register: agents resource type add --config database-type.yaml
name: local/database
description: "A relational database (PostgreSQL, MySQL, SQLite)"
physical: true
user_addable: true
cli_args:
- name: connection-string
type: string
required: true
description: "Database connection string (e.g., postgresql://user:pass@host/db)"
- name: engine
type: string
required: false
description: "Database engine"
default: "postgresql"
validation_pattern: "^(postgresql|mysql|sqlite|mssql)$"
- name: read-only
type: boolean
required: false
description: "Connect in read-only mode"
default: false
- name: schema
type: string
required: false
description: "Database schema to scope to"
default: "public"
child_types:
- type: local/db-table
auto_discover: true
description: "Database tables"
- type: local/db-view
auto_discover: true
description: "Database views"
- type: local/db-migration
auto_discover: false
manual_link: true
description: "Migration scripts linked to this database"
parent_types:
- type: git-checkout
description: "Repository containing the application that owns this database"
sandbox_strategy: transaction_rollback
handler:
class: DatabaseHandler
module: cleveragents.resources.handlers.database
config:
connection_pool_size: 5
statement_timeout: 30000 # 30 seconds
log_queries: true
auto_discovery:
enabled: true
scan_depth: 1
# virtual-config-file-type.yaml
# Register: agents resource type add --config virtual-config-file-type.yaml
name: local/config-file
description: "Virtual type linking equivalent configuration files across repositories"
physical: false
user_addable: false
child_types:
- type: fs-file
auto_discover: false
manual_link: true
description: "Physical file instances"
- type: git-tree-entry
auto_discover: false
manual_link: true
description: "Git tree entries representing the same config file"
sandbox_strategy: none
handler:
class: VirtualConfigFileHandler
module: cleveragents.resources.handlers.virtual_config
config:
track_content_drift: true
equivalence:
criteria:
- content_hash
- filename
description: "Two physical resources represent the same config file when they share the same filename and content hash"
# docker-registry-type.yaml
# Register: agents resource type add --config docker-registry-type.yaml
name: local/docker-registry
description: "A Docker container registry with image and tag discovery"
physical: true
user_addable: true
cli_args:
- name: registry-url
type: url
required: true
description: "Docker registry URL (e.g., registry.example.com, ghcr.io/org)"
validation_pattern: "^[a-zA-Z0-9][a-zA-Z0-9.-]+(:[0-9]+)?(/[a-zA-Z0-9._-]+)*$"
- name: username
type: string
required: false
description: "Registry username for authentication"
- name: password-env
type: string
required: false
description: "Environment variable name containing the registry password"
- name: namespace
type: string
required: false
description: "Image namespace or organization filter"
child_types:
- type: local/docker-image
auto_discover: true
description: "Docker images in the registry"
max_count: 500
- type: local/docker-tag
auto_discover: true
description: "Image tags"
sandbox_strategy: none
handler:
class: DockerRegistryHandler
module: cleveragents.resources.handlers.docker
config:
api_version: "v2"
page_size: 100
cache_ttl: 300
auto_discovery:
enabled: true
scan_depth: 2
include_patterns:
- "**/latest"
- "**/main"
- "**/release-*"
exclude_patterns:
- "**/sha256:*"
- "**/*-dirty"
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://cleveragents.dev/schemas/context-view-config.json",
"title": "CleverAgents Context View Configuration",
"description": "Configuration file schema for defining context views that control how project resources are filtered and presented to actors during plan phases.",
"type": "object",
"properties": {
"project": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Fully qualified project name this view applies to."
},
"view": {
"type": "string",
"enum": ["default", "strategize", "execute", "apply"],
"description": "Phase view. 'default' is the fallback for all phases; phase-specific views override 'default'."
},
"include_resources": {
"type": "array",
"items": { "type": "string" },
"description": "Whitelist of resource names to include. When specified, only these resources provide context."
},
"exclude_resources": {
"type": "array",
"items": { "type": "string" },
"description": "Blacklist of resource names to exclude. Applied after include_resources."
},
"include_paths": {
"type": "array",
"items": { "type": "string" },
"description": "Glob patterns for file paths to include. When specified, only matching files are included."
},
"exclude_paths": {
"type": "array",
"items": { "type": "string" },
"description": "Glob patterns for file paths to exclude. Applied after include_paths."
},
"hot_max_tokens": {
"type": ["integer", "null"],
"minimum": 1,
"description": "Soft cap on the number of tokens in hot (immediate) context. null means no soft cap."
},
"warm_max_decisions": {
"type": "integer",
"minimum": 1,
"description": "Maximum number of decisions retained in warm context."
},
"cold_max_decisions": {
"type": "integer",
"minimum": 1,
"description": "Maximum number of decisions retained in cold context."
},
"query_limit": {
"type": "integer",
"default": 20,
"minimum": 1,
"description": "Maximum number of retrieval results per query against the cold tier."
},
"max_file_size": {
"type": "integer",
"default": 1048576,
"minimum": 1,
"description": "Maximum individual file size in bytes that will be included in context. Default: 1 MB."
},
"max_total_size": {
"type": "integer",
"default": 52428800,
"minimum": 1,
"description": "Maximum aggregate size in bytes across all included files. Default: 50 MB."
},
"summarize": {
"type": "boolean",
"default": false,
"description": "When true, large context segments are automatically summarized rather than excluded."
},
"summary_max_tokens": {
"type": "integer",
"minimum": 1,
"description": "Maximum tokens for each generated summary. Only applies when summarize is true."
},
"strategy": {
"type": "array",
"items": { "type": "string" },
"description": "Ordered list of ACMS context strategies to use for this view. Overrides the global strategy list. Valid built-in values: simple-keyword, semantic-embedding, breadth-depth-navigator, arce, temporal-archaeology, plan-decision-context."
},
"default_breadth": {
"type": "integer",
"minimum": 0,
"default": 2,
"description": "Default number of hops from focus nodes in the UKO graph for context expansion. 0 = focus nodes only."
},
"default_depth": {
"oneOf": [
{ "type": "integer", "minimum": 0 },
{ "type": "string", "pattern": "^[A-Z][A-Z0-9_]*$" }
],
"default": 3,
"description": "Default detail depth for context fragments. May be a non-negative integer or a named level string from the active domain's DetailLevelMap (e.g., 'SIGNATURES', 'FULL_SOURCE'). Named levels are resolved to integers via the DetailLevelMap inheritance chain. Default: 3."
},
"depth_gradient": {
"type": "object",
"additionalProperties": {
"oneOf": [
{ "type": "integer", "minimum": 0 },
{ "type": "string", "pattern": "^[A-Z][A-Z0-9_]*$" }
]
},
"description": "Per-hop detail depth overrides. Key is the hop distance (0 = focus node), value is an integer depth or named level string. Hops not listed use default_depth."
},
"skeleton_ratio": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0,
"default": 0.15,
"description": "Fraction of the context budget reserved for inherited plan skeleton context. 0.0 = no skeleton inheritance; 1.0 = all budget to skeleton."
},
"temporal_scope": {
"type": "string",
"enum": ["current", "recent", "all"],
"default": "current",
"description": "Temporal scope for UKO node resolution. 'current' = only isCurrent nodes; 'recent' = current + nodes valid within warm retention window; 'all' = include historical versions."
},
"auto_refresh": {
"type": "boolean",
"default": true,
"description": "When true, the ACMS automatically re-assembles context when the available budget changes by more than the refresh threshold (default 30%). When false, context is only assembled on explicit request."
}
},
"required": ["project", "view"],
"additionalProperties": false
}
# ─── Context View Identity ──────────────────────────────────────────
project: <namespace>/<name> # Project this context view applies to (required)
view: default | strategize | execute | apply # Which phase view (required)
# ─── Resource Filtering ─────────────────────────────────────────────
include_resources: # Resources to include (whitelist, optional)
- <resource_name>
exclude_resources: # Resources to exclude (blacklist, optional)
- <resource_name>
# ─── Path Filtering ─────────────────────────────────────────────────
include_paths: # Glob patterns for files to include (optional)
- "src/**/*.py"
- "tests/**/*.py"
exclude_paths: # Glob patterns for files to exclude (optional)
- "**/node_modules/**"
- "**/__pycache__/**"
- "**/.git/**"
- "**/dist/**"
# ─── Token and Size Budgets ─────────────────────────────────────────
hot_max_tokens: <integer> # Soft cap on hot context tokens (optional, null = no limit)
warm_max_decisions: <integer> # Max decisions in warm context (optional)
cold_max_decisions: <integer> # Max decisions in cold context (optional)
query_limit: <integer> # Max retrieval results per query (optional, default: 20)
max_file_size: <integer> # Max file size in bytes to include (optional, default: 1048576)
max_total_size: <integer> # Max total size across all included files (optional, default: 52428800)
# ─── Summarization ──────────────────────────────────────────────────
summarize: true # Enable summarization for large context segments (optional)
summary_max_tokens: <integer> # Token limit for generated summaries (optional)
# ─── ACMS Strategy & Context Assembly ───────────────────────────────
strategy: # ACMS strategies to use (optional, overrides global list)
- simple-keyword
- semantic-embedding
- breadth-depth-navigator
default_breadth: <integer> # Default hop count for UKO graph expansion (optional, default: 2)
default_depth: 3 # Default detail depth — integer or named level (optional, default: 3)
depth_gradient: # Per-hop detail depth overrides (optional)
0: 9 # Focus nodes get depth 9 (FULL_SOURCE for code)
1: 4 # 1-hop neighbors get depth 4 (SIGNATURES for code)
2: 0 # 2-hop neighbors get depth 0 (MODULE_LISTING for code)
skeleton_ratio: <float> # Fraction of budget for inherited plan skeleton (optional, default: 0.15)
temporal_scope: current | recent | all # Temporal scope for UKO node resolution (optional, default: current)
auto_refresh: true # Auto re-assemble context on budget change (optional, default: true)
# context-default.yaml
# Apply: agents project context set --view default --include-path "src/**" \
# --exclude-path "**/node_modules/**" local/api-service
# Or import this file and apply via the CLI.
project: local/api-service
view: default
exclude_paths:
- "**/node_modules/**"
- "**/__pycache__/**"
- "**/.git/**"
max_file_size: 1048576 # 1 MB
# context-strategize.yaml
project: local/api-service
view: strategize
include_resources:
- local/api-repo
exclude_resources:
- local/staging-db
include_paths:
- "src/**/*.py"
- "docs/architecture/**"
- "README.md"
- "pyproject.toml"
exclude_paths:
- "**/node_modules/**"
- "**/test_fixtures/**"
- "**/__pycache__/**"
- "**/migrations/**"
hot_max_tokens: 12000
warm_max_decisions: 50
cold_max_decisions: 200
query_limit: 20
max_file_size: 524288 # 512 KB
max_total_size: 10485760 # 10 MB
summarize: true
summary_max_tokens: 800
# context-execute.yaml
project: local/api-service
view: execute
include_resources:
- local/api-repo
- local/staging-db
include_paths:
- "src/**"
- "tests/**"
- "config/**"
- "scripts/**"
- "Makefile"
- "pyproject.toml"
- "requirements*.txt"
exclude_paths:
- "**/node_modules/**"
- "**/__pycache__/**"
- "**/dist/**"
- "**/*.pyc"
hot_max_tokens: 24000
warm_max_decisions: 100
cold_max_decisions: 500
query_limit: 30
max_file_size: 2097152 # 2 MB
max_total_size: 104857600 # 100 MB
summarize: true
summary_max_tokens: 1200
# context-apply.yaml
project: local/api-service
view: apply
include_paths:
- "src/**"
- "tests/**"
exclude_paths:
- "**/__pycache__/**"
hot_max_tokens: 8000
warm_max_decisions: 20
cold_max_decisions: 50
summarize: false
# context-monorepo-strategize.yaml
project: local/platform
view: strategize
include_resources:
- local/platform-repo
include_paths:
- "packages/auth/**/*.ts"
- "packages/auth/**/*.tsx"
- "packages/shared/**/*.ts"
- "packages/api-gateway/**/*.ts"
- "docs/architecture/**"
- "package.json"
- "tsconfig.json"
- "lerna.json"
exclude_paths:
- "**/node_modules/**"
- "**/dist/**"
- "**/coverage/**"
- "**/*.test.ts"
- "**/*.spec.ts"
- "**/*.stories.tsx"
- "**/fixtures/**"
- "**/__snapshots__/**"
- "**/generated/**"
hot_max_tokens: 16000
warm_max_decisions: 30
cold_max_decisions: 150
query_limit: 15
max_file_size: 262144 # 256 KB - aggressive for a monorepo
max_total_size: 5242880 # 5 MB
summarize: true
summary_max_tokens: 600
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://cleveragents.dev/schemas/automation-profile-config.json",
"title": "CleverAgents Automation Profile Configuration",
"description": "Configuration file schema for defining automation profiles — named collections of confidence thresholds (0.0-1.0) and boolean safety flags controlling which operations are automated vs. requiring human approval.",
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Fully qualified profile name in <namespace>/<name> format."
},
"description": {
"type": "string",
"description": "Human-readable description of the profile's purpose and behavior."
},
"auto_strategize": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0,
"description": "Confidence threshold (0.0-1.0) for automatically transitioning from Action to Strategize. 0.0 = always automatic, 1.0 = always manual."
},
"auto_execute": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0,
"description": "Confidence threshold (0.0-1.0) for automatically transitioning from Strategize to Execute. 0.0 = always automatic, 1.0 = always manual."
},
"auto_apply": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0,
"description": "Confidence threshold (0.0-1.0) for automatically applying changes after execution completes. 0.0 = always automatic, 1.0 = always manual."
},
"auto_decisions_strategize": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0,
"description": "Confidence threshold (0.0-1.0) for autonomously making decisions during Strategize. 0.0 = always automatic, 1.0 = always manual."
},
"auto_decisions_execute": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0,
"description": "Confidence threshold (0.0-1.0) for autonomously making decisions during Execute. 0.0 = always automatic, 1.0 = always manual."
},
"auto_validation_fix": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0,
"description": "Confidence threshold (0.0-1.0) for automatically attempting to fix validation failures. 0.0 = always automatic, 1.0 = always manual."
},
"auto_strategy_revision": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0,
"description": "Confidence threshold (0.0-1.0) for automatically revising the strategy when execution reveals issues. 0.0 = always automatic, 1.0 = always manual."
},
"auto_reversion_from_apply": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0,
"description": "Confidence threshold (0.0-1.0) for automatically reverting from a constrained Apply phase to Strategize. 0.0 = always automatic, 1.0 = always manual."
},
"auto_retry_transient": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0,
"description": "Confidence threshold (0.0-1.0) for automatically retrying operations that fail due to transient errors. 0.0 = always automatic, 1.0 = always manual."
},
"auto_checkpoint_restore": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0,
"description": "Confidence threshold (0.0-1.0) for automatically restoring from the most recent checkpoint on failure. 0.0 = always automatic, 1.0 = always manual."
},
"auto_child_plans": {
"type": "number",
"minimum": 0.0,
"maximum": 1.0,
"description": "Confidence threshold (0.0-1.0) for automatically spawning child plans decided during Strategize. 0.0 = always automatic, 1.0 = always manual."
},
"require_sandbox": {
"type": "boolean",
"description": "When true, all write operations must execute within a sandbox. Execution fails if no sandbox strategy is available."
},
"require_checkpoints": {
"type": "boolean",
"description": "When true, checkpoints must be created before any write operation, enabling rollback."
},
"allow_unsafe_tools": {
"type": "boolean",
"description": "When true, tools flagged as unsafe can be invoked. When false, unsafe tool invocations are blocked."
}
},
"required": [
"name",
"description",
"auto_strategize",
"auto_execute",
"auto_apply",
"auto_decisions_strategize",
"auto_decisions_execute",
"auto_validation_fix",
"auto_strategy_revision",
"auto_reversion_from_apply",
"auto_retry_transient",
"auto_checkpoint_restore",
"auto_child_plans",
"require_sandbox",
"require_checkpoints",
"allow_unsafe_tools"
],
"additionalProperties": false
}
# ─── Profile Identity ───────────────────────────────────────────────
name: <namespace>/<name> # Fully qualified profile name (required)
description: <string> # Human-readable description (required)
# ─── Phase Transition Thresholds ────────────────────────────────────
# Confidence thresholds controlling phase transitions.
# 0.0 = always automatic, 1.0 = always manual.
auto_strategize: <float: 0.0–1.0> # Confidence threshold for Action → Strategize (required, 0.0=auto, 1.0=manual)
auto_execute: <float: 0.0–1.0> # Confidence threshold for Strategize → Execute (required, 0.0=auto, 1.0=manual)
auto_apply: <float: 0.0–1.0> # Confidence threshold for Execute → Apply (required, 0.0=auto, 1.0=manual)
# ─── Decision Thresholds ────────────────────────────────────────────
# Confidence thresholds controlling decisions within each phase.
# 0.0 = always automatic, 1.0 = always manual.
auto_decisions_strategize: <float: 0.0–1.0> # Confidence threshold for decisions during Strategize (required, 0.0=auto, 1.0=manual)
auto_decisions_execute: <float: 0.0–1.0> # Confidence threshold for decisions during Execute (required, 0.0=auto, 1.0=manual)
# ─── Self-Repair Thresholds ─────────────────────────────────────────
auto_validation_fix: <float: 0.0–1.0> # Confidence threshold for auto-fixing validation failures (required, 0.0=auto, 1.0=manual)
auto_strategy_revision: <float: 0.0–1.0> # Confidence threshold for auto-revising strategy when Execute hits constraints (required, 0.0=auto, 1.0=manual)
auto_reversion_from_apply: <float: 0.0–1.0> # Confidence threshold for auto-reverting from constrained Apply to Strategize (required, 0.0=auto, 1.0=manual)
auto_retry_transient: <float: 0.0–1.0> # Confidence threshold for auto-retrying transient errors (required, 0.0=auto, 1.0=manual)
auto_checkpoint_restore: <float: 0.0–1.0> # Confidence threshold for auto-restoring from checkpoints (required, 0.0=auto, 1.0=manual)
# ─── Execution Control Thresholds ──────────────────────────────────
auto_child_plans: <float: 0.0–1.0> # Confidence threshold for auto-spawning child plans (required, 0.0=auto, 1.0=manual)
# ─── Safety Requirements ────────────────────────────────────────────
require_sandbox: <boolean> # Require sandbox for all write operations (required)
require_checkpoints: <boolean> # Require checkpoint creation before write operations (required)
allow_unsafe_tools: <boolean> # Allow tools flagged as unsafe (required)
# careful-auto.yaml
# Register: agents automation-profile add --config careful-auto.yaml
name: local/careful-auto
description: "Autonomous execution with mandatory sandbox and manual apply"
auto_strategize: 0.0
auto_execute: 0.0
auto_apply: 1.0
auto_decisions_strategize: 0.0
auto_decisions_execute: 0.0
auto_validation_fix: 0.0
auto_strategy_revision: 1.0
auto_reversion_from_apply: 1.0
auto_retry_transient: 0.0
auto_checkpoint_restore: 0.0
auto_child_plans: 0.0
require_sandbox: true
require_checkpoints: true
allow_unsafe_tools: false
# ci-pipeline.yaml
# Register: agents automation-profile add --config ci-pipeline.yaml
name: local/ci-pipeline
description: "Full automation for CI/CD pipelines. All phases automated, sandbox required."
auto_strategize: 0.0
auto_execute: 0.0
auto_apply: 0.0
auto_decisions_strategize: 0.0
auto_decisions_execute: 0.0
auto_validation_fix: 0.0
auto_strategy_revision: 0.0
auto_reversion_from_apply: 0.0
auto_retry_transient: 0.0
auto_checkpoint_restore: 0.0
auto_child_plans: 0.0
require_sandbox: true
require_checkpoints: true
allow_unsafe_tools: false
# review-heavy.yaml
# Register: agents automation-profile add --config review-heavy.yaml
name: local/review-heavy
description: "Maximum human oversight. Every decision and phase requires approval."
auto_strategize: 0.0
auto_execute: 1.0
auto_apply: 1.0
auto_decisions_strategize: 1.0
auto_decisions_execute: 1.0
auto_validation_fix: 1.0
auto_strategy_revision: 1.0
auto_reversion_from_apply: 1.0
auto_retry_transient: 1.0
auto_checkpoint_restore: 1.0
auto_child_plans: 1.0
require_sandbox: true
require_checkpoints: true
allow_unsafe_tools: false
# dev-sandbox.yaml
# Register: agents automation-profile add --config dev-sandbox.yaml
name: local/dev-sandbox
description: "Fast iteration for local development. Relaxed safety, auto execution."
auto_strategize: 0.0
auto_execute: 0.0
auto_apply: 1.0
auto_decisions_strategize: 0.0
auto_decisions_execute: 0.0
auto_validation_fix: 0.0
auto_strategy_revision: 0.0
auto_reversion_from_apply: 1.0
auto_retry_transient: 0.0
auto_checkpoint_restore: 0.0
auto_child_plans: 0.0
require_sandbox: false
require_checkpoints: false
allow_unsafe_tools: true
# production-deploy.yaml
# Register: agents automation-profile add --config production-deploy.yaml
name: local/production-deploy
description: |
Production deployment profile. Fully autonomous execution
with maximum safety guarantees. All phases require sandbox
and checkpoint. Apply requires manual approval. Strategy
revision is enabled to adapt to deployment issues.
auto_strategize: 0.0
auto_execute: 0.0
auto_apply: 1.0
auto_decisions_strategize: 0.0
auto_decisions_execute: 0.0
auto_validation_fix: 0.0
auto_strategy_revision: 0.0
auto_reversion_from_apply: 1.0
auto_retry_transient: 0.0
auto_checkpoint_restore: 0.0
auto_child_plans: 0.0
require_sandbox: true
require_checkpoints: true
allow_unsafe_tools: false
# Initialize CleverAgents (first-time setup)
$ agents init --yes
╭─ Initialized ────────────────────────────────────────────╮
│ Data Dir: /home/dev/.cleveragents (created) │
│ Config: /home/dev/.cleveragents/config.toml │
│ Database: initialized (schema v3) │
│ Directories: logs, cache, sessions, contexts │
╰──────────────────────────────────────────────────────────╯
✓ OK Initialized (non-interactive)
# Register the git checkout as a resource
$ agents resource add git-checkout local/api-repo \
--path /home/dev/projects/api-service \
--branch main
╭─ Resource ──────────────────────────────────────────╮
│ Name: local/api-repo │
│ ID: 01HXR1A1B2C3D4E5F6G7H8J9K0 │
│ Type: git-checkout │
│ Physical/Virtual: physical │
│ Path: /home/dev/projects/api-service │
│ Branch: main │
│ Created: 2026-02-11 09:15 │
╰─────────────────────────────────────────────────────╯
╭─ Auto-discovered Children ─────────────────────────────────────────╮
│ ID Type Status │
│ ─────────────── ────────────── ───────────────── │
│ 01HXR1A1B2C3… git created │
│ 01HXR1A1B2C4… git-remote created │
│ 01HXR1A1B2C5… git-branch created │
│ 01HXR1A1B2C6… fs-directory created │
│ + 32 git-commit resources │
│ + 187 git-tree-entry resources │
│ + 5 fs-directory + 41 fs-file │
╰────────────────────────────────────────────────────────────────────╯
╭─ Capabilities ─────────────────╮
│ Readable: yes │
│ Writable: yes │
│ Sandboxable: yes │
│ Checkpointable: yes │
│ Sandbox Strategy: git_worktree │
╰────────────────────────────────╯
✓ OK Resource registered (270 child resources discovered)
# Create the project and link the resource
$ agents project create \
--description "REST API service" \
--resource local/api-repo \
local/api-service
╭─ Project Created ──────────────────────────╮
│ Name: local/api-service │
│ Description: REST API service │
│ Type: local │
│ Created: 2026-02-11 09:15 │
╰────────────────────────────────────────────╯
╭─ Linked Resources ───────────────────────────────────────╮
│ Name Type Read-Only │
│ ───────────────── ────────────── ───────── │
│ local/api-repo git-checkout no │
╰──────────────────────────────────────────────────────────╯
╭─ Defaults ──────────────────────────────╮
│ Sandbox: git_worktree │
│ Validations: 0 │
│ Context Filters: none │
│ Automation Profile: (inherits global) │
╰─────────────────────────────────────────╯
✓ OK Project created
# Register a required validation (tests must pass)
$ agents validation add \
--config validations/unit-tests.yaml \
--required \
local/unit-tests
╭─ Validation Registered ─────────────────────────────────────╮
│ Name: local/unit-tests │
│ Command: pytest tests/ │
│ Description: Unit tests │
│ Mode: required │
│ Timeout: 300s (default) │
╰─────────────────────────────────────────────────────────────╯
✓ OK Validation registered
# Attach the validation to the project
$ agents validation attach --project local/api-service local/unit-tests
✓ OK Validation attached to project local/api-service
name: local/fix-bug
description: "Fix a reported bug in the codebase"
long_description: |
Analyze the bug description, locate the relevant code,
implement a fix, and add or update tests to cover the fix.
definition_of_done: |
- The described bug no longer reproduces
- All existing tests pass
- At least one new test covers the fixed behavior
- No unrelated code is modified
strategy_actor: anthropic/claude-3.5-sonnet
execution_actor: anthropic/claude-3.5-sonnet
reusable: true
state: available
args:
- name: bug_description
type: string
required: true
description: "Description of the bug to fix"
- name: affected_file
type: string
required: false
description: "File path where the bug is suspected (optional hint)"
# Register the action
$ agents action create --config ./actions/fix-bug.yaml
╭─ Action Created ─────────────────────────────╮
│ Name: local/fix-bug │
│ ID: 01HXR1B1C2D3E4F5G6H7I8J9K0 │
│ State: available │
│ Strategy Actor: anthropic/claude-3.5-sonnet │
│ Execution Actor: anthropic/claude-3.5-sonnet │
│ Reusable: yes │
│ Read Only: no │
│ Created: 2026-02-11 09:16 │
╰──────────────────────────────────────────────╯
╭─ Definition of Done ──────────────────────────────────╮
│ - The described bug no longer reproduces │
│ - All existing tests pass │
│ - At least one new test covers the fixed behavior │
│ - No unrelated code is modified │
╰───────────────────────────────────────────────────────╯
╭─ Arguments ───────────────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ─────────────── ────── ──────── ────────────────────────────────────── │
│ bug_description string yes Description of the bug to fix │
│ affected_file string no File path where the bug is suspected │
╰───────────────────────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────╮
│ Profile: (inherits global) │
│ Source: default │
╰───────────────────────────────────────╯
╭─ Usage ──────────────────────────────────────────────────────────────────╮
│ agents plan use local/fix-bug local/api-service │
│ --arg bug_description="..." │
╰──────────────────────────────────────────────────────────────────────────╯
✓ OK Action created
# Bind the action to the project with the manual profile for full oversight
$ agents plan use \
--automation-profile manual \
--arg bug_description="The /health endpoint returns HTTP 500 when the database \
connection is unavailable. It should return HTTP 200 with {\"status\": \"degraded\", \
\"database\": \"unavailable\"} instead of crashing." \
--arg affected_file="src/routes/health.py" \
local/fix-bug local/api-service
╭─ Plan Created ──────────────────────────╮
│ Plan ID: 01HXR1C1D2E3F4G5H6I7J8K9L0 │
│ Phase: strategize │
│ Action: local/fix-bug │
│ Project: local/api-service │
│ Automation: manual │
│ Attempt: 1 │
╰─────────────────────────────────────────╯
╭─ Inputs ──────────────────────────────────────────────────────────────╮
│ - bug_description="The /health endpoint returns HTTP 500 when the │
│ database connection is unavailable. It should return HTTP 200 with │
│ {\"status\": \"degraded\", \"database\": \"unavailable\"} instead │
│ of crashing." │
│ - affected_file="src/routes/health.py" │
│ - automation_profile=manual │
╰───────────────────────────────────────────────────────────────────────╯
╭─ Actors ──────────────────────────────────────╮
│ Strategy: anthropic/claude-3.5-sonnet │
│ Execution: anthropic/claude-3.5-sonnet │
│ Estimation: (none) │
╰───────────────────────────────────────────────╯
╭─ Automation ──────────────────────────╮
│ Profile: manual │
│ Source: plan override │
│ Read-Only: no │
╰───────────────────────────────────────╯
╭─ Context ─────────────────────────╮
│ Resources: 1 (git-checkout) │
│ Indexed Files: 41 │
│ View: strategize │
│ Hot Token Budget: 8,000 │
╰───────────────────────────────────╯
╭─ Next Steps ───────────────────────────────────────╮
│ - agents plan execute 01HXR1C1D2E3F4G5H6I7J8K9L0 │
│ - agents plan status 01HXR1C1D2E3F4G5H6I7J8K9L0 │
│ - agents plan tree 01HXR1C1D2E3F4G5H6I7J8K9L0 │
╰────────────────────────────────────────────────────╯
✓ OK Plan created
# Manually trigger Strategize → the strategy actor analyzes the codebase
$ agents plan execute 01HXR1C1D2E3F4G5H6I7J8K9L0
╭─ Execution ─────────────────────────────╮
│ Plan: 01HXR1C1D2E3F4G5H6I7J8K9L0 │
│ Phase: strategize │
│ Sandbox: git_worktree │
│ Worker: anthropic/claude-3.5-sonnet │
│ Started: 09:17:02 │
│ Attempt: 1 │
╰─────────────────────────────────────────╯
╭─ Sandbox ───────────────────────────────────────────────────────╮
│ Strategy: git_worktree │
│ Path: /home/dev/projects/api-service/.worktrees/plan-01HXR1C1 │
│ Branch: cleveragents/plan-01HXR1C1D2 │
│ Status: active │
╰─────────────────────────────────────────────────────────────────╯
╭─ Strategy Summary ────────────────╮
│ Decisions: 4 │
│ Invariants: 0 │
│ Planned Child Plans: 0 │
│ Estimated Files: ~2 │
│ Risk: low │
╰───────────────────────────────────╯
╭─ Progress ────────╮
│ ✓ Collect context │
│ ✓ Build strategy │
│ • Awaiting review │
╰───────────────────╯
✓ OK Strategize complete — awaiting manual approval
# Review the decision tree
$ agents plan tree 01HXR1C1D2E3F4G5H6I7J8K9L0
╭─ Decision Tree ───────────────────────────────────────────────────────────────────────────╮
│ Plan: 01HXR1C1D2E3F4G5H6I7J8K9L0 │
│ ├─ [prompt_definition] "Fix /health endpoint to return 200 when DB unavailable" │
│ ├─ [strategy_choice] "Wrap DB call in try/except, return degraded status" (conf: 0.95) │
│ ├─ [strategy_choice] "Modify src/routes/health.py only" (conf: 0.91) │
│ └─ [strategy_choice] "Add test_health_db_unavailable to tests/test_health.py" (conf: 0.93)│
╰───────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Tree Summary ─────────────╮
│ Nodes: 4 │
│ Depth: 1 │
│ Child Plans: 0 │
│ Invariants: 0 │
│ Superseded: 0 (hidden) │
╰────────────────────────────╯
╭─ Decision IDs (for correction) ──────────────────╮
│ Root: 01HXR1D1A2B3C4D5E6F7G8H9 │
│ Strategy 1: 01HXR1D2A2B3C4D5E6F7G8H9 │
│ Strategy 2: 01HXR1D3A2B3C4D5E6F7G8H9 │
│ Strategy 3: 01HXR1D4A2B3C4D5E6F7G8H9 │
╰──────────────────────────────────────────────────╯
✓ OK Decision tree rendered
# Inspect the main strategy decision in detail
$ agents plan explain 01HXR1D2A2B3C4D5E6F7G8H9
╭─ Decision ──────────────────────────────────────────────────────────────╮
│ ID: 01HXR1D2A2B3C4D5E6F7G8H9 │
│ Type: strategy_choice │
│ Question: How should the /health endpoint handle database failures? │
│ Chosen: Wrap DB call in try/except, return degraded status │
│ Confidence: 0.95 │
│ Plan: 01HXR1C1D2E3F4G5H6I7J8K9L0 │
│ Sequence: 1 of 3 │
│ Created: 2026-02-11 09:17 │
╰─────────────────────────────────────────────────────────────────────────╯
╭─ Alternatives Considered ──────────────────────────────────────────────────╮
│ 1. Wrap DB call in try/except, return degraded status (chosen) │
│ 2. Add a circuit breaker middleware for all DB-dependent routes │
│ 3. Return HTTP 503 Service Unavailable with retry-after header │
╰────────────────────────────────────────────────────────────────────────────╯
╭─ Impact ──────────────────────╮
│ Downstream Decisions: 2 │
│ Downstream Child Plans: 0 │
│ Artifacts Produced: 2 │
│ Correction Impact: low │
╰───────────────────────────────╯
╭─ Rationale ──────────────────────────────────────────────────╮
│ The bug description explicitly requires HTTP 200 with a │
│ degraded status JSON body. A try/except around the DB call │
│ in the health endpoint is the minimal, targeted fix. A │
│ circuit breaker would be over-engineering for a single │
│ endpoint. HTTP 503 contradicts the requested behavior. │
╰──────────────────────────────────────────────────────────────╯
╭─ Correction ─────────────────────────────────────────────────╮
│ agents plan correct 01HXR1D2A2B3C4D5E6F7G8H9 │
│ --mode revert --guidance "Use a different approach..." │
╰──────────────────────────────────────────────────────────────╯
✓ OK Decision explained
# Approve and proceed to Execute (manual profile requires explicit trigger)
$ agents plan execute 01HXR1C1D2E3F4G5H6I7J8K9L0
╭─ Execution ─────────────────────────────╮
│ Plan: 01HXR1C1D2E3F4G5H6I7J8K9L0 │
│ Phase: execute │
│ Sandbox: git_worktree │
│ Worker: anthropic/claude-3.5-sonnet │
│ Started: 09:18:30 │
│ Attempt: 1 │
╰─────────────────────────────────────────╯
╭─ Sandbox ───────────────────────────────────────────────────────╮
│ Strategy: git_worktree │
│ Path: /home/dev/projects/api-service/.worktrees/plan-01HXR1C1 │
│ Branch: cleveragents/plan-01HXR1C1D2 │
│ Status: active │
╰─────────────────────────────────────────────────────────────────╯
╭─ Progress ────────────────────────────────╮
│ ✓ Collect context (0.4s) │
│ ✓ Modify src/routes/health.py (1.2s) │
│ ✓ Add tests/test_health.py test (2.1s) │
│ ✓ Validate: pytest tests/ (3.8s) │
╰───────────────────────────────────────────╯
✓ OK Execution complete — awaiting apply
# Review the changes
$ agents plan diff 01HXR1C1D2E3F4G5H6I7J8K9L0
╭─ Diff Summary ──────────────────────────────────╮
│ Plan: 01HXR1C1D2E3F4G5H6I7J8K9L0 │
│ Project: local/api-service │
│ Files Changed: 2 │
│ Insertions: 19 │
│ Deletions: 3 │
│ Net Change: +16 lines │
╰─────────────────────────────────────────────────╯
╭─ Files ────────────────────────────────────╮
│ Path Change Status │
│ ─────────────────────── ────── ──────── │
│ src/routes/health.py +8 -3 modified │
│ tests/test_health.py +11 -0 modified │
╰────────────────────────────────────────────╯
╭─ Patch Preview ──────────────────────────────────────────────────╮
│ --- a/src/routes/health.py │
│ +++ b/src/routes/health.py │
│ @@ -8,6 +8,11 @@ │
│ @app.get("/health") │
│ def health_check(): │
│ - db_status = check_database_connection() │
│ - return {"status": "ok", "database": db_status} │
│ + try: │
│ + db_status = check_database_connection() │
│ + return {"status": "ok", "database": "available"} │
│ + except ConnectionError: │
│ + return {"status": "degraded", "database": "unavailable"}│
│ --- a/tests/test_health.py │
│ +++ b/tests/test_health.py │
│ @@ -15,0 +16,11 @@ │
│ +def test_health_db_unavailable(client, monkeypatch): │
│ + def mock_check(): │
│ + raise ConnectionError("DB unreachable") │
│ + monkeypatch.setattr("src.routes.health.check_database…") │
│ + response = client.get("/health") │
│ + assert response.status_code == 200 │
│ + data = response.json() │
│ + assert data["status"] == "degraded" │
│ + assert data["database"] == "unavailable" │
╰──────────────────────────────────────────────────────────────────╯
╭─ Risk Assessment ────────────────╮
│ API Compatibility: preserved │
│ Test Coverage: increased │
│ Breaking Changes: none detected │
╰──────────────────────────────────╯
✓ OK Diff generated
# Check plan status (should be execute/complete, awaiting apply)
$ agents plan status 01HXR1C1D2E3F4G5H6I7J8K9L0
╭─ Plan Status ───────────────────────────╮
│ Plan: 01HXR1C1D2E3F4G5H6I7J8K9L0 │
│ Phase: execute │
│ State: complete │
│ Action: local/fix-bug │
│ Project: local/api-service │
│ Automation: manual │
│ Attempt: 1 │
╰─────────────────────────────────────────╯
╭─ Progress ───────────╮
│ ✓ Strategize │
│ ✓ Execute │
│ • Apply (awaiting) │
╰──────────────────────╯
╭─ Timing ───────────────────────────╮
│ Started: 2026-02-11 09:17:02 │
│ Elapsed: 00:01:42 │
│ ETA: awaiting manual apply │
╰────────────────────────────────────╯
╭─ Execution Detail ──────────╮
│ Sandbox: git_worktree │
│ Tool Calls: 5 │
│ Files Modified: 2 │
│ Child Plans: 0 │
│ Checkpoints: 1 created │
╰─────────────────────────────╯
╭─ Cost ───────────────╮
│ Tokens Used: 6,840 │
│ Cost So Far: $0.023 │
│ Estimated: $0.025 │
╰──────────────────────╯
✓ OK Status refreshed
# Apply the changes to the real repository
$ agents plan apply --yes 01HXR1C1D2E3F4G5H6I7J8K9L0
╭─ Apply Summary ──────────────────────────╮
│ Plan: 01HXR1C1D2E3F4G5H6I7J8K9L0 │
│ Artifacts: 2 files updated │
│ Changes: 19 insertions, 3 deletions │
│ Project: local/api-service │
│ Applied At: 2026-02-11 09:19 │
╰──────────────────────────────────────────╯
╭─ Validation ───────────────────╮
│ Tests: passed (14/14) │
│ Duration: 3.8s │
╰────────────────────────────────╯
╭─ Sandbox Cleanup ──────────────────────╮
│ Worktree: removed │
│ Branch: merged to main │
│ Checkpoint: archived │
╰────────────────────────────────────────╯
╭─ Plan Lifecycle ──────────────────────╮
│ Phase: apply │
│ State: applied │
│ Total Duration: 00:01:58 │
│ Total Cost: $0.025 │
│ Decisions Made: 4 │
│ Child Plans: 0 │
╰───────────────────────────────────────╯
╭─ Next Steps ──────╮
│ - Review git diff │
│ - Commit changes │
╰───────────────────╯
✓ OK Changes applied
# Register a coverage validation
# (project local/api-service and resource local/api-service-repo already exist)
$ agents validation add \
--config validations/auth-coverage.yaml \
--required \
local/auth-coverage
╭─ Validation Registered ──────────────────────────────────────╮
│ Name: local/auth-coverage │
│ Command: pytest --cov=src/auth --cov-fail-under=80 │
│ tests/test_auth/ │
│ Description: Coverage must be at least 80% │
│ Mode: required │
│ Timeout: 600s │
╰──────────────────────────────────────────────────────────────╯
✓ OK Validation registered
$ agents validation attach --project local/api-service local/auth-coverage
✓ OK Validation attached to project local/api-service
# Automation profile will be set per-plan via --automation-profile on plan use
name: local/generate-tests
description: "Generate comprehensive tests for a module"
long_description: |
Analyze the target module's code paths, identify untested branches,
edge cases, and error conditions, then generate thorough test cases.
Uses the project's existing test framework and conventions.
definition_of_done: |
- Coverage of the target module reaches the specified threshold
- All new tests pass
- All existing tests continue to pass
- Tests follow existing project conventions (fixtures, naming, structure)
- No production code is modified
strategy_actor: anthropic/claude-3.5-sonnet
execution_actor: anthropic/claude-3.5-sonnet
reusable: true
state: available
read_only: false
args:
- name: target_module
type: string
required: true
description: "Module path to generate tests for (e.g., src/auth)"
- name: coverage_target
type: integer
required: false
description: "Target coverage percentage"
default: 80
invariants:
- "Do not modify any production code — only add or modify test files"
- "Follow the existing test file naming convention (test_<module>.py)"
- "Use the project's existing test fixtures and conftest.py patterns"
$ agents action create --config ./actions/generate-tests.yaml
╭─ Action Created ───────────────────────────────────╮
│ Name: local/generate-tests │
│ ID: 01HXR2B1C2D3E4F5G6H7I8J9K0 │
│ State: available │
│ Strategy Actor: anthropic/claude-3.5-sonnet │
│ Execution Actor: anthropic/claude-3.5-sonnet │
│ Reusable: yes │
│ Read Only: no │
│ Config: ./actions/generate-tests.yaml │
│ Created: 2026-02-11 09:15 │
╰────────────────────────────────────────────────────╯
╭─ Definition of Done ──────────────────────────────────────────────╮
│ - Coverage of the target module reaches the specified threshold │
│ - All new tests pass │
│ - All existing tests continue to pass │
│ - Tests follow existing project conventions │
│ - No production code is modified │
╰───────────────────────────────────────────────────────────────────╯
╭─ Arguments ───────────────────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ──────────────── ─────── ──────── ─────────────────────────────────────── │
│ target_module string yes Module path to generate tests for │
│ coverage_target integer no Target coverage percentage (default 80) │
╰───────────────────────────────────────────────────────────────────────────────╯
╭─ Invariants ──────────────────────────────────────────────────────────────────╮
│ 1. Do not modify any production code — only add or modify test files │
│ 2. Follow the existing test file naming convention (test_<module>.py) │
│ 3. Use the project's existing test fixtures and conftest.py patterns │
╰───────────────────────────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────╮
│ Profile: supervised │
│ Source: default │
╰───────────────────────────────────────╯
✓ OK Action created
# With trusted profile: Strategize and Execute run automatically,
# only Apply requires human approval
$ agents plan use \
--automation-profile trusted \
--arg target_module="src/auth" \
--arg coverage_target=80 \
local/generate-tests local/api-service
╭─ Plan Created ──────────────────────────────────────╮
│ Plan: 01HXR2B3C4D5E6F7G8H9J0K1L2 │
│ Phase: strategize │
│ State: processing │
│ Action: local/generate-tests │
│ Project: local/api-service │
│ Automation: trusted │
│ Attempt: 1 │
╰─────────────────────────────────────────────────────╯
╭─ Inputs ────────────────────────────╮
│ - target_module=src/auth │
│ - coverage_target=80 │
│ - automation_profile=trusted │
╰─────────────────────────────────────╯
╭─ Actors ────────────────────────────────────────╮
│ Strategy: anthropic/claude-3.5-sonnet │
│ Execution: anthropic/claude-3.5-sonnet │
│ Estimation: (none) │
╰─────────────────────────────────────────────────╯
╭─ Automation ───────────────────────────╮
│ Profile: trusted │
│ Source: plan override │
│ Read-Only: no │
╰────────────────────────────────────────╯
╭─ Context ────────────────────────╮
│ Resources: 1 (repo) │
│ Indexed Files: 214 │
│ View: strategize │
│ Hot Token Budget: 8,000 │
╰──────────────────────────────────╯
╭─ Next Steps ─────────────────────────────────────────────────────────╮
│ Trusted profile — strategize and execute will proceed automatically. │
│ - agents plan status 01HXR2B3C4D5E6F7G8H9J0K1L2 │
│ - agents plan tree 01HXR2B3C4D5E6F7G8H9J0K1L2 │
╰──────────────────────────────────────────────────────────────────────╯
✓ OK Plan created
# Check progress while it runs
$ agents plan status 01HXR2B3C4D5E6F7G8H9J0K1L2
╭─ Plan Status ───────────────────────────────╮
│ Plan: 01HXR2B3C4D5E6F7G8H9J0K1L2 │
│ Phase: execute │
│ State: processing │
│ Action: local/generate-tests │
│ Project: local/api-service │
│ Automation: trusted │
│ Attempt: 1 │
╰─────────────────────────────────────────────╯
╭─ Progress ───────╮
│ ✓ Strategize │
│ ⏳ Execute │
│ • Apply (queued) │
╰──────────────────╯
╭─ Timing ──────────╮
│ Started: 09:15:42 │
│ Elapsed: 00:02:18 │
│ ETA: 00:04:30 │
╰───────────────────╯
╭─ Execution Detail ──────────╮
│ Sandbox: git_worktree │
│ Tool Calls: 14 │
│ Files Modified: 5 │
│ Child Plans: 0 │
│ Checkpoints: 3 created │
╰─────────────────────────────╯
╭─ Cost ───────────────╮
│ Tokens Used: 18,740 │
│ Cost So Far: $0.062 │
│ Estimated: $0.110 │
╰──────────────────────╯
✓ OK Status refreshed
# When complete, review the generated tests
$ agents plan diff 01HXR2B3C4D5E6F7G8H9J0K1L2
╭─ Diff Summary ─────────────────────────────────────╮
│ Plan: 01HXR2B3C4D5E6F7G8H9J0K1L2 │
│ Project: local/api-service │
│ Files Changed: 5 │
│ Insertions: 287 │
│ Deletions: 3 │
│ Net Change: +284 lines │
╰────────────────────────────────────────────────────╯
╭─ Files ────────────────────────────────────────────────╮
│ Path Change Status │
│ ────────────────────────────── ──────── ────────── │
│ tests/test_auth/test_login.py +72 -0 new file │
│ tests/test_auth/test_tokens.py +68 -0 new file │
│ tests/test_auth/test_session.py +54 -0 new file │
│ tests/test_auth/test_rbac.py +41 -0 new file │
│ tests/test_auth/conftest.py +52 -3 modified │
╰────────────────────────────────────────────────────────╯
╭─ Patch Preview ───────────────────────────────────────────╮
│ --- /dev/null │
│ +++ b/tests/test_auth/test_login.py │
│ @@ -0,0 +1,72 @@ │
│ + import pytest │
│ + from src.auth.login import authenticate, verify_mfa │
│ + ... │
│ --- a/tests/test_auth/conftest.py │
│ +++ b/tests/test_auth/conftest.py │
│ @@ -1,5 +1,54 @@ │
│ - # minimal fixtures │
│ + # shared auth test fixtures │
│ + @pytest.fixture │
│ + def mock_user_db(): ... │
╰───────────────────────────────────────────────────────────╯
╭─ Risk Assessment ────────────────╮
│ API Compatibility: preserved │
│ Test Coverage: 45% → 83% │
│ Breaking Changes: none detected │
╰──────────────────────────────────╯
✓ OK Diff generated
$ agents plan artifacts 01HXR2B3C4D5E6F7G8H9J0K1L2
╭─ Artifacts ──────────────────────────────────────────────────────────╮
│ Path Type Size Change Child Plan │
│ ──────────────────────────────── ───── ────── ────── ─────── │
│ tests/test_auth/test_login.py write 3.8 KB +72 -0 root │
│ tests/test_auth/test_tokens.py write 3.4 KB +68 -0 root │
│ tests/test_auth/test_session.py write 2.7 KB +54 -0 root │
│ tests/test_auth/test_rbac.py write 2.1 KB +41 -0 root │
│ tests/test_auth/conftest.py edit 2.6 KB +52 -3 root │
╰──────────────────────────────────────────────────────────────────────╯
╭─ Summary ────────────╮
│ Total: 5 │
│ Writes: 4 (new) │
│ Edits: 1 (modified) │
│ Deletes: 0 │
│ Total Size: 14.6 KB │
╰──────────────────────╯
✓ OK 5 artifacts listed
# Apply the generated tests to the real repository
$ agents plan apply --yes 01HXR2B3C4D5E6F7G8H9J0K1L2
╭─ Apply Summary ──────────────────────────╮
│ Plan: 01HXR2B3C4D5E6F7G8H9J0K1L2 │
│ Artifacts: 5 files updated │
│ Changes: 287 insertions, 3 deletions │
│ Project: local/api-service │
│ Applied At: 2026-02-11 09:22 │
╰──────────────────────────────────────────╯
╭─ Validation ──────────────────────────╮
│ ✓ Coverage: passed (83% ≥ 80%) │
│ ✓ All tests: passed (47/47) │
│ Duration: 18.2s │
╰───────────────────────────────────────╯
╭─ Sandbox Cleanup ─────────╮
│ Worktree: removed │
│ Branch: merged to main │
│ Checkpoint: archived │
╰───────────────────────────╯
╭─ Plan Lifecycle ─────────────────────────╮
│ Phase: apply │
│ State: applied │
│ Total Duration: 00:06:38 │
│ Total Cost: $0.107 │
│ Decisions Made: 12 │
│ Child Plans: 0 │
╰──────────────────────────────────────────╯
╭─ Next Steps ──────╮
│ - Review git diff │
│ - Commit changes │
╰───────────────────╯
✓ OK Changes applied
$ agents invariant add --global "All public APIs must maintain backward compatibility"
╭─ Invariant Added ──────────────────────────────────────────────────────╮
│ Invariant: All public APIs must maintain backward compatibility │
│ Scope: global │
│ ID: inv_01HXR3A1B │
╰────────────────────────────────────────────────────────────────────────╯
✓ OK Invariant added
$ agents invariant add --project local/api-service \
"Database queries must use the SQLAlchemy ORM, not raw SQL"
╭─ Invariant Added ───────────────────────────────────────────────────────╮
│ Project: local/api-service │
│ Invariant: Database queries must use the SQLAlchemy ORM, not raw SQL │
│ Scope: project │
│ ID: inv_01HXR3A2C │
╰─────────────────────────────────────────────────────────────────────────╯
✓ OK Invariant added
$ agents invariant list --project local/api-service --effective
╭─ Effective Invariants (Project local/api-service) ─────────────────────────────────────╮
│ ID Source Text │
│ ────────────── ──────── ────────────────────────────────────────────────────── │
│ inv_01HXR3A1B global All public APIs must maintain backward compatibility │
│ inv_01HXR3A2C project Database queries must use the SQLAlchemy ORM, not raw SQL │
╰────────────────────────────────────────────────────────────────────────────────────────╯
✓ OK 2 effective invariants (1 global, 1 project)
name: local/refactoring-strategist
cleveragents:
version: "3.0"
actors:
strategist:
type: llm
config:
provider: anthropic
model: claude-3.5-sonnet
temperature: 0.2
system_prompt: |
You are an expert software architect specializing in database layer refactoring.
You analyze codebases to plan safe, incremental refactoring strategies.
You always preserve backward compatibility and plan for comprehensive testing.
Project: {{ context.project_name }}
Resources: {{ context.resources | join(', ') }}
memory_enabled: true
max_history: 100
$ agents actor add --config ./actors/refactoring-strategist.yaml
╭─ Actor Added ────────────────────────────────────╮
│ Name: local/refactoring-strategist │
│ Provider: anthropic │
│ Model: claude-3.5-sonnet │
│ Default: yes │
│ Unsafe: no │
│ Type: graph │
╰──────────────────────────────────────────────────╯
╭─ Config ────────────────────────────────────────────────────╮
│ Path: ./actors/refactoring-strategist.yaml │
│ Hash: 7a1e4c9 │
│ Options: 3 │
│ Nodes: 1 │
│ Edges: 0 │
╰─────────────────────────────────────────────────────────────╯
╭─ Capabilities ────────────────╮
│ - database layer refactoring │
│ - incremental strategy │
│ - backward compatibility │
╰───────────────────────────────╯
✓ OK Actor added
name: local/refactor-to-orm
description: "Refactor raw SQL queries to use SQLAlchemy ORM"
long_description: |
Systematically replace all raw SQL queries in the target module with
SQLAlchemy ORM equivalents. Create ORM model definitions, replace
query construction, update transaction handling, and ensure all
existing behavior is preserved.
definition_of_done: |
- Zero raw SQL strings remain in the target module
- All ORM models are defined with proper relationships
- All existing tests pass without modification
- New integration tests verify ORM query correctness
- API response formats are unchanged
- Database migration script is generated
strategy_actor: local/refactoring-strategist
execution_actor: anthropic/claude-3.5-sonnet
estimation_actor: anthropic/claude-3.5-sonnet
reusable: true
state: available
automation_profile: cautious
args:
- name: target_module
type: string
required: true
description: "Module to refactor"
invariants:
- "Each file must be refactored in a separate commit-sized change"
- "ORM models must be defined before queries are converted"
- "All raw SQL must be replaced — no partial conversion"
$ agents action create --config ./actions/refactor-to-orm.yaml
╭─ Action Created ─────────────────────────────────────────────╮
│ Name: local/refactor-to-orm │
│ ID: 01HXR3B1D2E3F4G5H6J7K8L9M0 │
│ State: available │
│ Strategy Actor: local/refactoring-strategist │
│ Execution Actor: anthropic/claude-3.5-sonnet │
│ Reusable: yes │
│ Read Only: no │
│ Created: 2026-02-11 09:14 │
╰──────────────────────────────────────────────────────────────╯
╭─ Definition of Done ──────────────────────────────────────────╮
│ - Zero raw SQL strings remain in the target module │
│ - All ORM models are defined with proper relationships │
│ - All existing tests pass without modification │
│ - New integration tests verify ORM query correctness │
│ - API response formats are unchanged │
│ - Database migration script is generated │
╰───────────────────────────────────────────────────────────────╯
╭─ Arguments ──────────────────────────────────────────────╮
│ Name Type Required Description │
│ ────────────── ────── ──────── ───────────────────── │
│ target_module string yes Module to refactor │
╰──────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────╮
│ Profile: cautious │
│ Source: action config │
╰───────────────────────────────────────╯
╭─ Action Invariants ──────────────────────────────────────────────────────╮
│ 1. Each file must be refactored in a separate commit-sized change │
│ 2. ORM models must be defined before queries are converted │
│ 3. All raw SQL must be replaced — no partial conversion │
╰──────────────────────────────────────────────────────────────────────────╯
╭─ Usage ───────────────────────────────────────────────────────────────────╮
│ agents plan use local/refactor-to-orm local/api-service │
│ --arg target_module="src/auth" │
╰───────────────────────────────────────────────────────────────────────────╯
✓ OK Action created
$ agents plan use \
--arg target_module="src/auth" \
local/refactor-to-orm local/api-service
╭─ Plan Created ───────────────────────────────────────╮
│ Plan: 01HXR3C4D5E6F7G8H9J0K1L2M3 │
│ Action: local/refactor-to-orm │
│ Project: local/api-service │
│ Automation: cautious │
│ Attempt: 1 │
╰──────────────────────────────────────────────────────╯
╭─ Inputs ────────────────────────╮
│ - target_module="src/auth" │
│ - automation_profile=cautious │
╰─────────────────────────────────╯
╭─ Actors ───────────────────────────────────────╮
│ Strategy: local/refactoring-strategist │
│ Execution: anthropic/claude-3.5-sonnet │
│ Estimation: anthropic/claude-3.5-sonnet │
╰────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────────╮
│ Profile: cautious │
│ Source: action config │
│ Read-Only: no │
╰───────────────────────────────────────────╯
╭─ Context ───────────────────────╮
│ Resources: 2 (repo, db) │
│ Indexed Files: 214 │
│ View: strategize │
│ Hot Token Budget: 16,000 │
╰─────────────────────────────────╯
╭─ Next Steps ──────────────────────────────────────────╮
│ - agents plan execute 01HXR3C4D5E6F7G8H9J0K1L2M3 │
│ - agents plan status 01HXR3C4D5E6F7G8H9J0K1L2M3 │
│ - agents plan tree 01HXR3C4D5E6F7G8H9J0K1L2M3 │
╰───────────────────────────────────────────────────────╯
✓ OK Plan created
# The system pauses at a decision where confidence is below threshold.
# Review the decision tree:
$ agents plan tree 01HXR3C4D5E6F7G8H9J0K1L2M3
╭─ Decision Tree ────────────────────────────────────────────────────────────────────────────╮
│ Plan: 01HXR3C4D5E6F7G8H9J0K1L2M3 │
│ ├─ [prompt_definition] "Refactor raw SQL in src/auth to SQLAlchemy ORM" │
│ ├─ [invariant_enforced] "All public APIs must maintain backward compatibility" │
│ ├─ [invariant_enforced] "Database queries must use the SQLAlchemy ORM" │
│ ├─ [invariant_enforced] "Each file refactored in a separate commit-sized change" │
│ ├─ [invariant_enforced] "ORM models must be defined before queries are converted" │
│ ├─ [strategy_choice] "Define ORM models first, then convert queries" (conf: 0.85) │
│ ├─ [strategy_choice] "Place models inline in route files" (conf: 0.48) ⏸ PAUSED │
│ └─ • (awaiting input — confidence below threshold) │
╰────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Tree Summary ─────────────╮
│ Nodes: 8 │
│ Depth: 2 │
│ Child Plans: 0 │
│ Invariants: 4 │
│ Superseded: 0 (hidden) │
╰────────────────────────────╯
╭─ Decision IDs (for correction) ──────────────────────╮
│ Root: 01HXR3D1A2B3C4D5E6F7G8H9 │
│ Invariant 1: 01HXR3D1B3C4D5E6F7G8H9J0 │
│ Invariant 2: 01HXR3D1C4D5E6F7G8H9J0K1 │
│ Invariant 3: 01HXR3D1D5E6F7G8H9J0K1L2 │
│ Invariant 4: 01HXR3D1E6F7G8H9J0K1L2M3 │
│ Strategy 1: 01HXR3D2E3F4G5H6I7J8K9L0 │
│ Strategy 2: 01HXR3D5F6G7H8I9J0K1L2M3 (paused) │
╰──────────────────────────────────────────────────────╯
✓ OK Decision tree rendered
# The paused decision is about model placement. Inspect it:
$ agents plan explain 01HXR3D5F6G7H8I9J0K1L2M3
╭─ Decision ──────────────────────────────────────────────╮
│ ID: 01HXR3D5F6G7H8I9J0K1L2M3 │
│ Type: strategy_choice │
│ Question: Where should ORM model classes be placed? │
│ Chosen: Place models inline in route files │
│ Confidence: 0.48 │
│ Plan: 01HXR3C4D5E6F7G8H9J0K1L2M3 │
│ Sequence: 6 of 7 │
│ Created: 2026-02-11 09:15 │
╰─────────────────────────────────────────────────────────╯
╭─ Alternatives Considered ─────────────────────────────────────╮
│ 1. Place models inline in route files (chosen) │
│ 2. Separate models/ directory with one model per file │
│ 3. Single models.py file alongside routes │
╰───────────────────────────────────────────────────────────────╯
╭─ Impact ──────────────────────╮
│ Downstream Decisions: 4 │
│ Downstream Child Plans: 0 │
│ Artifacts Produced: 0 │
│ Correction Impact: high │
╰───────────────────────────────╯
╭─ Rationale ────────────────────────────────────────────────────────╮
│ Placing models inline minimizes import changes and keeps related │
│ code co-located. However, this conflicts with project conventions │
│ and may make models harder to reuse across modules. The low │
│ confidence reflects genuine uncertainty about the trade-off. │
╰────────────────────────────────────────────────────────────────────╯
╭─ Correction ───────────────────────────────────────────────────────╮
│ agents plan correct 01HXR3D5F6G7H8I9J0K1L2M3 │
│ --mode revert --guidance "Use separate models/ directory..." │
╰────────────────────────────────────────────────────────────────────╯
✓ OK Decision explained
# Provide guidance via the plan prompt command
$ agents plan prompt 01HXR3C4D5E6F7G8H9J0K1L2M3 \
"Convert the User model first, then Session, then Token. \
Use Alembic for the migration script."
╭─ Guidance Added ─────────────────────────────────────────────────────────╮
│ Plan: 01HXR3C4D5E6F7G8H9J0K1L2M3 │
│ Guidance: Convert the User model first, then Session, then Token. │
│ Use Alembic for the migration script. │
│ Scope: next execution step │
│ Phase: strategize │
│ State: awaiting_input → processing │
╰──────────────────────────────────────────────────────────────────────────╯
╭─ Decision Created ───────────────────────────╮
│ Type: user_intervention │
│ ID: 01HXR3E1A2B3C4D5E6F7G8H9 │
│ Parent: 01HXR3D5F6G7H8I9J0K1L2M3 │
╰──────────────────────────────────────────────╯
╭─ Queue ────╮
│ Pending: 1 │
│ Applied: 0 │
╰────────────╯
✓ OK Guidance queued
# Execution continues. Monitor progress:
$ agents plan status 01HXR3C4D5E6F7G8H9J0K1L2M3
╭─ Plan Status ───────────────────────────────────╮
│ Plan: 01HXR3C4D5E6F7G8H9J0K1L2M3 │
│ Phase: execute │
│ State: processing │
│ Action: local/refactor-to-orm │
│ Project: local/api-service │
│ Automation: cautious │
│ Attempt: 1 │
╰─────────────────────────────────────────────────╯
╭─ Progress ───────╮
│ ✓ Strategize │
│ ⏳ Execute │
│ • Apply (queued) │
╰──────────────────╯
╭─ Timing ──────────╮
│ Started: 09:14:22 │
│ Elapsed: 00:02:38 │
│ ETA: 00:05:10 │
╰───────────────────╯
╭─ Execution Detail ──────────╮
│ Sandbox: git_worktree │
│ Tool Calls: 14 │
│ Files Modified: 4 │
│ Child Plans: 0/0 complete │
│ Checkpoints: 3 created │
╰─────────────────────────────╯
╭─ Cost ───────────────╮
│ Tokens Used: 18,740 │
│ Cost So Far: $0.062 │
│ Estimated: $0.128 │
╰──────────────────────╯
✓ OK Status refreshed
# Find the decision that chose inline models
$ agents plan tree --show-superseded 01HXR3C4D5E6F7G8H9J0K1L2M3
╭─ Decision Tree ────────────────────────────────────────────────────────────────────────────╮
│ Plan: 01HXR3C4D5E6F7G8H9J0K1L2M3 │
│ ├─ [prompt_definition] "Refactor raw SQL in src/auth to SQLAlchemy ORM" │
│ ├─ [invariant_enforced] "All public APIs must maintain backward compatibility" │
│ ├─ [invariant_enforced] "Database queries must use the SQLAlchemy ORM" │
│ ├─ [invariant_enforced] "Each file refactored in a separate commit-sized change" │
│ ├─ [invariant_enforced] "ORM models must be defined before queries are converted" │
│ ├─ [strategy_choice] "Define ORM models first, then convert queries" (conf: 0.85) │
│ ├─ [strategy_choice] "Place models inline in route files" (superseded) │
│ ├─ [user_intervention] "Convert User first, then Session, then Token" │
│ ├─ [strategy_choice] "Create User ORM model in routes/auth.py" (conf: 0.74) │
│ ├─ [tool_invocation] write_file src/auth/routes/auth.py │
│ └─ [tool_invocation] write_file src/auth/routes/session.py │
╰────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Tree Summary ─────────────╮
│ Nodes: 11 │
│ Depth: 3 │
│ Child Plans: 0 │
│ Invariants: 4 │
│ Superseded: 1 (shown) │
╰────────────────────────────╯
╭─ Decision IDs (for correction) ──────────────────────╮
│ Root: 01HXR3D1A2B3C4D5E6F7G8H9 │
│ Strategy 1: 01HXR3D2E3F4G5H6I7J8K9L0 │
│ Strategy 2: 01HXR3D5F6G7H8I9J0K1L2M3 (superseded) │
│ Intervention: 01HXR3E1A2B3C4D5E6F7G8H9 │
│ Strategy 3: 01HXR3F1A2B3C4D5E6F7G8H9 │
│ Tool 1: 01HXR3F2B3C4D5E6F7G8H9J0 │
│ Tool 2: 01HXR3F3C4D5E6F7G8H9J0K1 │
╰──────────────────────────────────────────────────────╯
✓ OK Decision tree rendered
# Correct it — revert mode replays from that decision
$ agents plan correct 01HXR3F1A2B3C4D5E6F7G8H9 \
--mode revert \
--guidance "Place ORM models in src/auth/models/ with one model per file. \
Import them in src/auth/models/__init__.py." --yes
╭─ Correction ────────────────────────────────────────────────╮
│ Mode: revert │
│ Impact: 2 decisions, 0 child plans, 2 artifacts │
│ New Decision: 01HXR3G1A2B3C4D5E6F7G8H9 │
│ Corrects: 01HXR3F1A2B3C4D5E6F7G8H9 │
│ Attempt: 2 │
│ Correction ID: 01HXR3CORR1A2B3C4D5E6 │
╰─────────────────────────────────────────────────────────────╯
╭─ Affected Subtree ──────────────╮
│ Decisions Invalidated: 2 │
│ Child Plans Rolled Back: 0 │
│ Artifacts Archived: 2 │
│ Unaffected Decisions: 6 │
╰─────────────────────────────────╯
╭─ Sandbox Rollback ─────────────╮
│ Checkpoint: cp_01HXR3C4 │
│ Files Reverted: 2 │
│ Status: restored │
╰────────────────────────────────╯
╭─ Recompute ───────────────╮
│ Queued: re-execute │
│ ETA: 3m │
╰───────────────────────────╯
╭─ History ───────────────────────────────────────────────╮
│ - Original decision superseded │
│ - Prior artifacts archived for comparison │
│ - agents plan diff --correction 01HXR3CORR1A2B3C4D5E6 │
╰─────────────────────────────────────────────────────────╯
✓ OK Correction applied
# The affected subtree is recomputed. Review the new approach:
$ agents plan diff --correction 01HXR3CORR1A2B3C4D5E6
╭─ Correction Diff ────────────────────────────────────────────╮
│ Correction: 01HXR3CORR1A2B3C4D5E6 │
│ Original Decision: 01HXR3F1A2B3C4D5E6F7G8H9 │
│ Mode: revert │
│ Files Changed: 5 │
│ New Insertions: 84 │
│ New Deletions: 36 │
╰──────────────────────────────────────────────────────────────╯
╭─ Comparison ──────────────────────────────────────────────────────────────╮
│ File Before (original) After (corrected) │
│ ────────────────────────────── ──────────────── ──────────────────── │
│ src/auth/routes/auth.py +42 -8 (inline) +6 -8 (imports only) │
│ src/auth/routes/session.py +28 -6 (inline) +4 -6 (imports only) │
│ src/auth/models/__init__.py (did not exist) (new file) │
│ src/auth/models/user.py (did not exist) (new file, +38) │
│ src/auth/models/session.py (did not exist) (new file, +26) │
╰───────────────────────────────────────────────────────────────────────────╯
╭─ Patch Preview (corrected vs original) ───────────────────────────╮
│ --- a/src/auth/routes/auth.py (original) │
│ +++ b/src/auth/routes/auth.py (corrected) │
│ @@ -1,42 +1,6 @@ │
│ - class User(Base): # was inline │
│ - __tablename__ = "users" │
│ - id = Column(Integer, primary_key=True) │
│ + from src.auth.models import User │
│ ... │
│ +++ b/src/auth/models/user.py (new file) │
│ @@ -0,0 +1,38 @@ │
│ + from sqlalchemy import Column, Integer, String │
│ + from sqlalchemy.orm import relationship │
│ + class User(Base): │
│ + __tablename__ = "users" │
│ ... │
╰───────────────────────────────────────────────────────────────────╯
✓ OK Correction diff generated
$ agents plan diff 01HXR3C4D5E6F7G8H9J0K1L2M3
╭─ Diff Summary ───────────────────────────────────────╮
│ Plan: 01HXR3C4D5E6F7G8H9J0K1L2M3 │
│ Project: local/api-service │
│ Files Changed: 9 │
│ Insertions: 186 │
│ Deletions: 94 │
│ Net Change: +92 lines │
╰──────────────────────────────────────────────────────╯
╭─ Files ───────────────────────────────────────────────╮
│ Path Change Status │
│ ────────────────────────────── ──────── ────────── │
│ src/auth/models/__init__.py +8 new file │
│ src/auth/models/user.py +38 new file │
│ src/auth/models/session.py +26 new file │
│ src/auth/models/token.py +22 new file │
│ src/auth/routes/auth.py +12 -28 modified │
│ src/auth/routes/session.py +8 -22 modified │
│ src/auth/routes/token.py +6 -18 modified │
│ src/auth/db.py +14 -26 modified │
│ alembic/versions/001_orm.py +52 new file │
╰───────────────────────────────────────────────────────╯
╭─ Risk Assessment ────────────────╮
│ API Compatibility: preserved │
│ Test Coverage: maintained │
│ Breaking Changes: none detected │
╰──────────────────────────────────╯
✓ OK Diff generated
$ agents plan apply --yes 01HXR3C4D5E6F7G8H9J0K1L2M3
╭─ Apply Summary ───────────────────────────────────╮
│ Plan: 01HXR3C4D5E6F7G8H9J0K1L2M3 │
│ Artifacts: 9 files updated │
│ Changes: 186 insertions, 94 deletions │
│ Project: local/api-service │
│ Applied At: 2026-02-11 09:23 │
╰───────────────────────────────────────────────────╯
╭─ Validation ───────────────────────╮
│ Tests: passed (47/47) │
│ Lint: passed (0 warnings) │
│ Type Check: passed (0 errors) │
│ Duration: 18.6s │
╰────────────────────────────────────╯
╭─ Sandbox Cleanup ─────────╮
│ Worktree: removed │
│ Branch: merged to main │
│ Checkpoint: archived │
╰───────────────────────────╯
╭─ Plan Lifecycle ───────────────────────────────╮
│ Phase: apply │
│ State: applied │
│ Total Duration: 00:08:42 │
│ Total Cost: $0.128 │
│ Decisions Made: 11 │
│ Corrections: 1 │
│ Child Plans: 0 │
╰────────────────────────────────────────────────╯
╭─ Next Steps ──────╮
│ - Review git diff │
│ - Commit changes │
╰───────────────────╯
✓ OK Changes applied
# Register the common-lib resource (full output shown)
$ agents resource add git-checkout local/common-lib-repo --path /repos/common-lib --branch main
╭─ Resource ──────────────────────────────────────╮
│ Name: local/common-lib-repo │
│ ID: 01HXR4A1B2C3D4E5F6G7H8J9K0 │
│ Type: git-checkout │
│ Physical/Virtual: physical │
│ Path: /repos/common-lib │
│ Branch: main │
│ Created: 2026-02-11 10:00 │
╰─────────────────────────────────────────────────╯
╭─ Auto-discovered Children ─────────────────────────────────────────╮
│ ID Type Status │
│ ─────────────── ────────────── ───────────────── │
│ 01HXR4A1B2C3… git created │
│ 01HXR4A1B2C4… git-remote created │
│ 01HXR4A1B2C5… git-branch created │
│ + 31 git-commit resources │
│ + 186 git-tree-entry resources │
│ + 2 fs-directory + 14 fs-file │
╰────────────────────────────────────────────────────────────────────╯
╭─ Capabilities ─────────────────╮
│ Readable: yes │
│ Writable: yes │
│ Sandboxable: yes │
│ Checkpointable: yes │
│ Sandbox Strategy: git_worktree │
╰────────────────────────────────╯
✓ OK Resource registered (236 child resources discovered)
# Register the remaining 3 service resources (condensed output)
$ agents resource add git-checkout local/user-service-repo --path /repos/user-service --branch main
✓ OK Resource registered — Name: local/user-service-repo (312 children)
$ agents resource add git-checkout local/order-service-repo --path /repos/order-service --branch main
✓ OK Resource registered — Name: local/order-service-repo (287 children)
$ agents resource add git-checkout local/billing-service-repo --path /repos/billing-service --branch main
✓ OK Resource registered — Name: local/billing-service-repo (264 children)
# Create the common-lib project (full output shown)
$ agents project create -d "Shared common library" \
--resource local/common-lib-repo local/common-lib
╭─ Project Created ─────────────────────────╮
│ Name: local/common-lib │
│ Description: Shared common library │
│ Type: local │
│ Created: 2026-02-11 10:01 │
╰───────────────────────────────────────────╯
╭─ Linked Resources ───────────────────────────────────────╮
│ Resource Type Read-Only │
│ ───────────────────── ────────────── ───────── │
│ local/common-lib-repo git-checkout no │
╰──────────────────────────────────────────────────────────╯
╭─ Defaults ──────────────────────────────╮
│ Sandbox: git_worktree │
│ Validations: 0 │
│ Context Filters: none │
│ Automation Profile: (inherits global) │
╰─────────────────────────────────────────╯
✓ OK Project created
# Create the remaining 3 service projects (condensed output)
$ agents project create -d "User microservice" \
--resource local/user-service-repo local/user-service
✓ OK Project created — Name: local/user-service
$ agents project create -d "Order microservice" \
--resource local/order-service-repo local/order-service
✓ OK Project created — Name: local/order-service
$ agents project create -d "Billing microservice" \
--resource local/billing-service-repo local/billing-service
✓ OK Project created — Name: local/billing-service
# Register a shared validation — first one with full output
$ agents validation add --config validations/pytest-mypy.yaml --required local/pytest-mypy
╭─ Validation Registered ─────────────────────────────╮
│ Name: local/pytest-mypy │
│ Command: pytest tests/ && mypy src/ │
│ Mode: required │
│ Timeout: 300s │
╰─────────────────────────────────────────────────────╯
✓ OK Validation registered
# Attach the validation to all 4 projects
$ agents validation attach --project local/common-lib local/pytest-mypy
✓ OK Validation attached to project local/common-lib
$ agents validation attach --project local/user-service local/pytest-mypy
✓ OK Validation attached to project local/user-service
$ agents validation attach --project local/order-service local/pytest-mypy
✓ OK Validation attached to project local/order-service
$ agents validation attach --project local/billing-service local/pytest-mypy
✓ OK Validation attached to project local/billing-service
name: local/coordinated-dep-update
description: "Update a shared dependency across multiple projects"
long_description: |
When a shared library introduces a breaking change, this action coordinates
the update across all dependent projects. It analyzes the breaking changes,
creates per-project update plans as child plans, validates each independently,
and produces a coordinated changeset.
definition_of_done: |
- The shared library is updated to the target version
- All dependent projects compile and pass tests with the new version
- API contracts between services remain compatible
- Migration guides are generated for each project if needed
- All changes can be applied atomically or rolled back as a unit
strategy_actor: anthropic/claude-3.5-sonnet
execution_actor: anthropic/claude-3.5-sonnet
automation_profile: supervised
reusable: true
state: available
args:
- name: library_name
type: string
required: true
description: "Name of the shared library to update"
- name: target_version
type: string
required: true
description: "Target version to update to"
- name: changelog_url
type: string
required: false
description: "URL to the library changelog or migration guide"
invariants:
- "Each dependent project must be updated in its own child plan"
- "All child plans must pass validation before any can be applied"
- "The library update in common-lib must be applied first"
$ agents action create --config ./actions/coordinated-dependency-update.yaml
╭─ Action Created ─────────────────────────────────────────────╮
│ Name: local/coordinated-dep-update │
│ ID: 01HXR4B1D2E3F4G5H6J7K8L9M0 │
│ State: available │
│ Strategy Actor: anthropic/claude-3.5-sonnet │
│ Execution Actor: anthropic/claude-3.5-sonnet │
│ Reusable: yes │
│ Read Only: no │
│ Created: 2026-02-11 10:02 │
╰──────────────────────────────────────────────────────────────╯
╭─ Definition of Done ──────────────────────────────────────────────────╮
│ - The shared library is updated to the target version │
│ - All dependent projects compile and pass tests with the new version │
│ - API contracts between services remain compatible │
│ - Migration guides are generated for each project if needed │
│ - All changes can be applied atomically or rolled back as a unit │
╰───────────────────────────────────────────────────────────────────────╯
╭─ Arguments ──────────────────────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ────────────── ────── ──────── ────────────────────────────────────────── │
│ library_name string yes Name of the shared library to update │
│ target_version string yes Target version to update to │
│ changelog_url string no URL to the library changelog or migration │
╰──────────────────────────────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────╮
│ Profile: supervised │
│ Source: action config │
╰───────────────────────────────────────╯
╭─ Action Invariants ──────────────────────────────────────────────────────────────╮
│ 1. Each dependent project must be updated in its own child plan │
│ 2. All child plans must pass validation before any can be applied │
│ 3. The library update in common-lib must be applied first │
╰──────────────────────────────────────────────────────────────────────────────────╯
╭─ Usage ───────────────────────────────────────────────────────────────────────────╮
│ agents plan use local/coordinated-dep-update local/common-lib │
│ --arg library_name="authlib" --arg target_version="2.0.0" │
╰───────────────────────────────────────────────────────────────────────────────────╯
✓ OK Action created
# Create a plan targeting all four projects
$ agents plan use \
--automation-profile supervised \
--arg library_name="authlib" \
--arg target_version="2.0.0" \
--arg changelog_url="https://authlib.org/changelog/2.0" \
local/coordinated-dep-update \
local/common-lib local/user-service local/order-service local/billing-service
╭─ Plan Created ────────────────────────────────────────────╮
│ Plan: 01HXR4D5E6F7G8H9J0K1L2M3N4 │
│ Action: local/coordinated-dep-update │
│ Projects: local/common-lib, local/user-service, │
│ local/order-service, local/billing-service │
│ Automation: supervised │
│ Attempt: 1 │
╰───────────────────────────────────────────────────────────╯
╭─ Inputs ───────────────────────────────────────────────────────────╮
│ - library_name="authlib" │
│ - target_version="2.0.0" │
│ - changelog_url="https://authlib.org/changelog/2.0" │
│ - automation_profile=supervised │
╰────────────────────────────────────────────────────────────────────╯
╭─ Actors ───────────────────────────────────────╮
│ Strategy: anthropic/claude-3.5-sonnet │
│ Execution: anthropic/claude-3.5-sonnet │
╰────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────────╮
│ Profile: supervised │
│ Source: CLI override │
│ Read-Only: no │
╰───────────────────────────────────────────╯
╭─ Context ──────────────────────────╮
│ Resources: 4 (git-checkout) │
│ Indexed Files: 1,099 │
│ View: strategize │
│ Hot Token Budget: 24,000 │
╰────────────────────────────────────╯
╭─ Next Steps ──────────────────────────────────────────────╮
│ - agents plan tree 01HXR4D5E6F7G8H9J0K1L2M3N4 │
│ - agents plan status 01HXR4D5E6F7G8H9J0K1L2M3N4 │
│ - agents plan execute 01HXR4D5E6F7G8H9J0K1L2M3N4 │
╰───────────────────────────────────────────────────────────╯
✓ OK Plan created
# Review the strategy before execution begins
$ agents plan tree 01HXR4D5E6F7G8H9J0K1L2M3N4
╭─ Decision Tree ─────────────────────────────────────────────────────────────────────────────────────╮
│ Plan: 01HXR4D5E6F7G8H9J0K1L2M3N4 │
│ ├─ [prompt_definition] "Update authlib to 2.0.0 across 4 projects" │
│ ├─ [invariant_enforced] "Each dependent project must be updated in its own child plan" │
│ ├─ [invariant_enforced] "All child plans must pass validation before any can be applied" │
│ ├─ [invariant_enforced] "The library update in common-lib must be applied first" │
│ ├─ [strategy_choice] "Analyze changelog for breaking API changes" (conf: 0.92) │
│ ├─ [strategy_choice] "Update common-lib first, then services in parallel" (conf: 0.88) │
│ ├─ [strategy_choice] "Create 4 child plans: common-lib, user-svc, order-svc, billing-svc" │
│ │ (conf: 0.90) │
│ └─ • (awaiting execution approval — supervised profile) │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Tree Summary ──────────────╮
│ Nodes: 8 │
│ Depth: 2 │
│ Child Plans: 0 (planned: 4) │
│ Invariants: 3 │
│ Superseded: 0 (hidden) │
╰─────────────────────────────╯
╭─ Decision IDs (for correction) ──────────────────────────╮
│ Root: 01HXR4D6A1B2C3D4E5F6G7H8 │
│ Invariant 1: 01HXR4D6B2C3D4E5F6G7H8J9 │
│ Invariant 2: 01HXR4D6C3D4E5F6G7H8J9K0 │
│ Invariant 3: 01HXR4D6D4E5F6G7H8J9K0L1 │
│ Strategy 1: 01HXR4D7E5F6G7H8I9J0K1L2 │
│ Strategy 2: 01HXR4D7F6G7H8I9J0K1L2M3 │
│ Strategy 3: 01HXR4D7G7H8I9J0K1L2M3N4 │
╰──────────────────────────────────────────────────────────╯
✓ OK Decision tree rendered
$ agents plan status 01HXR4D5E6F7G8H9J0K1L2M3N4
╭─ Plan Status ──────────────────────────────────────────╮
│ Plan: 01HXR4D5E6F7G8H9J0K1L2M3N4 │
│ Phase: strategize → execute (pending approval) │
│ State: awaiting_input │
│ Action: local/coordinated-dep-update │
│ Projects: 4 │
│ Automation: supervised │
│ Attempt: 1 │
╰────────────────────────────────────────────────────────╯
╭─ Progress ────────────────────────────╮
│ ✓ Strategize │
│ ⏸ Execute (awaiting approval) │
│ • Apply (queued) │
╰───────────────────────────────────────╯
╭─ Timing ──────────╮
│ Started: 10:02:14 │
│ Elapsed: 00:01:42 │
│ ETA: 00:12:00 │
╰───────────────────╯
╭─ Cost ───────────────╮
│ Tokens Used: 8,420 │
│ Cost So Far: $0.028 │
│ Estimated: $0.340 │
╰──────────────────────╯
✓ OK Status refreshed
# Manually approve execution (supervised requires explicit approval)
$ agents plan execute 01HXR4D5E6F7G8H9J0K1L2M3N4
╭─ Execution Started ──────────────────────────────────────╮
│ Plan: 01HXR4D5E6F7G8H9J0K1L2M3N4 │
│ Phase: execute │
│ State: processing │
│ Automation: supervised │
╰──────────────────────────────────────────────────────────╯
╭─ Child Plans Spawned ───────────────────────────────────────────────────╮
│ Plan ID Project Status │
│ ────────────────────────── ─────────────────── ──────────────── │
│ 01HXR4C1D2E3F4G5H6I7J8K9 local/common-lib executing │
│ 01HXR4C2E3F4G5H6I7J8K9L0 local/user-service waiting (common) │
│ 01HXR4C3F4G5H6I7J8K9L0M1 local/order-service waiting (common) │
│ 01HXR4C4G5H6I7J8K9L0M1N2 local/billing-service waiting (common) │
╰─────────────────────────────────────────────────────────────────────────╯
╭─ Execution Order ──────────────────────────────────────────╮
│ Phase 1: common-lib (blocking) │
│ Phase 2: user-service, order-service, billing-service │
│ (parallel, after common-lib completes) │
╰────────────────────────────────────────────────────────────╯
✓ OK Execution started (4 child plans spawned)
# Review common-lib changes first (must be applied before services)
$ agents plan diff 01HXR4C1D2E3F4G5H6I7J8K9
╭─ Diff Summary ───────────────────────────────────────╮
│ Plan: 01HXR4C1D2E3F4G5H6I7J8K9 │
│ Project: local/common-lib │
│ Files Changed: 4 │
│ Insertions: 62 │
│ Deletions: 38 │
│ Net Change: +24 lines │
╰──────────────────────────────────────────────────────╯
╭─ Files ───────────────────────────────────────────────────────╮
│ Path Change Status │
│ ──────────────────────────────── ──────── ────────── │
│ requirements.txt +1 -1 modified │
│ src/common/auth.py +28 -19 modified │
│ src/common/token_validator.py +18 -12 modified │
│ tests/test_auth.py +15 -6 modified │
╰───────────────────────────────────────────────────────────────╯
╭─ Patch Preview ───────────────────────────────────────────────────╮
│ --- a/requirements.txt │
│ +++ b/requirements.txt │
│ @@ -3,1 +3,1 @@ │
│ - authlib==1.3.2 │
│ + authlib==2.0.0 │
│ --- a/src/common/auth.py │
│ +++ b/src/common/auth.py │
│ @@ -1,6 +1,8 @@ │
│ - from authlib.integrations.requests_client import OAuth2Session │
│ + from authlib.integrations.httpx_client import AsyncOAuth2Client │
│ ... │
╰───────────────────────────────────────────────────────────────────╯
╭─ Validation ────────────────────────╮
│ pytest tests/ && mypy src/: passed │
│ Duration: 12.4s │
╰─────────────────────────────────────╯
✓ OK Diff generated
$ agents plan apply --yes 01HXR4C1D2E3F4G5H6I7J8K9
╭─ Apply Summary ──────────────────────────────────────╮
│ Plan: 01HXR4C1D2E3F4G5H6I7J8K9 │
│ Artifacts: 4 files updated │
│ Changes: 62 insertions, 38 deletions │
│ Project: local/common-lib │
│ Applied At: 2026-02-11 10:14 │
╰──────────────────────────────────────────────────────╯
╭─ Validation ───────────────────────╮
│ Tests: passed (24/24) │
│ Type Check: passed (0 errors) │
│ Duration: 12.4s │
╰────────────────────────────────────╯
╭─ Sandbox Cleanup ─────────╮
│ Worktree: removed │
│ Branch: merged to main │
│ Checkpoint: archived │
╰───────────────────────────╯
╭─ Plan Lifecycle ───────────────────────────────╮
│ Phase: apply │
│ State: applied │
│ Total Duration: 00:03:18 │
│ Total Cost: $0.064 │
╰────────────────────────────────────────────────╯
✓ OK Changes applied
# Once common-lib is applied, review the 3 service child plans.
# Full diff shown for user-service; order-service and billing-service condensed.
$ agents plan diff 01HXR4C2E3F4G5H6I7J8K9L0
╭─ Diff Summary ───────────────────────────────────────╮
│ Plan: 01HXR4C2E3F4G5H6I7J8K9L0 │
│ Project: local/user-service │
│ Files Changed: 6 │
│ Insertions: 84 │
│ Deletions: 52 │
│ Net Change: +32 lines │
╰──────────────────────────────────────────────────────╯
╭─ Files ───────────────────────────────────────────────────────╮
│ Path Change Status │
│ ──────────────────────────────── ──────── ────────── │
│ requirements.txt +1 -1 modified │
│ src/auth/middleware.py +22 -14 modified │
│ src/auth/oauth.py +18 -12 modified │
│ src/auth/token.py +16 -11 modified │
│ tests/test_middleware.py +14 -8 modified │
│ tests/test_oauth.py +13 -6 modified │
╰───────────────────────────────────────────────────────────────╯
╭─ Validation ────────────────────────╮
│ pytest tests/ && mypy src/: passed │
│ Duration: 18.2s │
╰─────────────────────────────────────╯
✓ OK Diff generated
$ agents plan diff 01HXR4C3F4G5H6I7J8K9L0M1
╭─ Diff Summary ───────────────────────────────────────╮
│ Plan: 01HXR4C3F4G5H6I7J8K9L0M1 │
│ Project: local/order-service │
│ Files Changed: 5 │
│ Insertions: 71 │
│ Deletions: 46 │
│ Net Change: +25 lines │
╰──────────────────────────────────────────────────────╯
╭─ Validation ────────────────────────╮
│ pytest tests/ && mypy src/: passed │
│ Duration: 14.7s │
╰─────────────────────────────────────╯
✓ OK Diff generated
$ agents plan diff 01HXR4C4G5H6I7J8K9L0M1N2
╭─ Diff Summary ───────────────────────────────────────╮
│ Plan: 01HXR4C4G5H6I7J8K9L0M1N2 │
│ Project: local/billing-service │
│ Files Changed: 4 │
│ Insertions: 58 │
│ Deletions: 34 │
│ Net Change: +24 lines │
╰──────────────────────────────────────────────────────╯
╭─ Validation ────────────────────────╮
│ pytest tests/ && mypy src/: passed │
│ Duration: 11.3s │
╰─────────────────────────────────────╯
✓ OK Diff generated
# Apply all 3 service child plans
$ agents plan apply --yes 01HXR4C2E3F4G5H6I7J8K9L0
╭─ Apply Summary ──────────────────────────────────────╮
│ Plan: 01HXR4C2E3F4G5H6I7J8K9L0 │
│ Artifacts: 6 files updated │
│ Changes: 84 insertions, 52 deletions │
│ Project: local/user-service │
│ Applied At: 2026-02-11 10:16 │
╰──────────────────────────────────────────────────────╯
╭─ Validation ───────────────────────╮
│ Tests: passed (89/89) │
│ Type Check: passed (0 errors) │
│ Duration: 18.2s │
╰────────────────────────────────────╯
╭─ Sandbox Cleanup ─────────╮
│ Worktree: removed │
│ Branch: merged to main │
│ Checkpoint: archived │
╰───────────────────────────╯
╭─ Plan Lifecycle ───────────────────────────────╮
│ Phase: apply │
│ State: applied │
│ Total Duration: 00:04:12 │
│ Total Cost: $0.082 │
╰────────────────────────────────────────────────╯
✓ OK Changes applied
$ agents plan apply --yes 01HXR4C3F4G5H6I7J8K9L0M1
╭─ Apply Summary ──────────────────────────────────────╮
│ Plan: 01HXR4C3F4G5H6I7J8K9L0M1 │
│ Artifacts: 5 files updated │
│ Changes: 71 insertions, 46 deletions │
│ Project: local/order-service │
│ Applied At: 2026-02-11 10:17 │
╰──────────────────────────────────────────────────────╯
╭─ Validation ───────────────────────╮
│ Tests: passed (76/76) │
│ Type Check: passed (0 errors) │
│ Duration: 14.7s │
╰────────────────────────────────────╯
╭─ Plan Lifecycle ───────────────────────────────╮
│ Phase: apply │
│ State: applied │
│ Total Duration: 00:03:48 │
│ Total Cost: $0.074 │
╰────────────────────────────────────────────────╯
✓ OK Changes applied
$ agents plan apply --yes 01HXR4C4G5H6I7J8K9L0M1N2
╭─ Apply Summary ──────────────────────────────────────╮
│ Plan: 01HXR4C4G5H6I7J8K9L0M1N2 │
│ Artifacts: 4 files updated │
│ Changes: 58 insertions, 34 deletions │
│ Project: local/billing-service │
│ Applied At: 2026-02-11 10:18 │
╰──────────────────────────────────────────────────────╯
╭─ Validation ───────────────────────╮
│ Tests: passed (63/63) │
│ Type Check: passed (0 errors) │
│ Duration: 11.3s │
╰────────────────────────────────────╯
╭─ Plan Lifecycle ───────────────────────────────╮
│ Phase: apply │
│ State: applied │
│ Total Duration: 00:03:22 │
│ Total Cost: $0.068 │
╰────────────────────────────────────────────────╯
╭─ Parent Plan Complete ──────────────────────────────────╮
│ Plan: 01HXR4D5E6F7G8H9J0K1L2M3N4 │
│ Phase: apply │
│ State: applied │
│ Child Plans: 4/4 complete │
│ Total Duration: 00:16:04 │
│ Total Cost: $0.340 │
│ All Validations: passed │
╰─────────────────────────────────────────────────────────╯
✓ OK Changes applied
# Register the custom postgres-db resource type
$ agents resource type add --config ./resource-types/postgres-db.yaml
╭─ Resource Type ─────────────────────────╮
│ Name: local/postgres-db │
│ Physical/Virtual: physical │
│ User Addable: yes │
│ Registered: 2026-02-11 09:01 │
╰─────────────────────────────────────────╯
╭─ CLI Arguments ──────────────────────────────────────────╮
│ Argument Required Description │
│ ──────────── ──────── ────────────────────────────── │
│ --host yes Database hostname │
│ --port no Port (default: 5432) │
│ --database yes Database name │
│ --schema no Schema (default: public) │
╰──────────────────────────────────────────────────────────╯
╭─ Sandbox ──────────────────────────────╮
│ Strategy: transaction_rollback │
│ Handler: PostgresHandler (custom) │
╰────────────────────────────────────────╯
✓ OK Resource type registered
ℹ New subcommand available: agents resource add local/postgres-db
# Register the production database instance
$ agents resource add local/postgres-db local/prod-users-db \
--host db.internal.example.com \
--port 5432 \
--database users_db \
--schema public
╭─ Resource ───────────────────────────────────────╮
│ Name: local/prod-users-db │
│ ID: 01HXR5D3E4F5G6H7J8K9L0M1N2 │
│ Type: local/postgres-db │
│ Physical/Virtual: physical │
│ Host: db.internal.example.com │
│ Port: 5432 │
│ Database: users_db │
│ Schema: public │
│ Created: 2026-02-11 09:02 │
╰──────────────────────────────────────────────────╯
╭─ Capabilities ──────────────────────────╮
│ Readable: yes │
│ Writable: yes │
│ Sandboxable: yes │
│ Checkpointable: yes │
│ Sandbox Strategy: transaction_rollback │
╰─────────────────────────────────────────╯
✓ OK Resource registered
# Link the database resource to the project
$ agents project link-resource local/api-service local/prod-users-db
╭─ Resource Linked ────────────────────────────╮
│ Project: local/api-service │
│ Resource: local/prod-users-db │
│ Type: local/postgres-db │
│ Read-Only: no │
╰──────────────────────────────────────────────╯
╭─ Access ─────────────────╮
│ Read: allowed │
│ Write: allowed │
│ Apply: requires approval │
╰──────────────────────────╯
╭─ Project Resources ─────────────────────────────────────────────╮
│ ID Type Status │
│ ────────────────────────────── ──────────────── ────────── │
│ 01HXR1A1B2C3D4E5F6G7H8J9K0 git-checkout linked │
│ 01HXR5D3E4F5G6H7J8K9L0M1N2 local/postgres-db linked (new) │
╰─────────────────────────────────────────────────────────────────╯
✓ OK Resource linked to project
name: local/database-ops
description: "Safe database operations with transaction support"
tools:
- name: query_db
description: "Execute a read-only SQL query and return results"
input_schema:
type: object
properties:
sql:
type: string
description: "SQL SELECT query"
params:
type: array
description: "Query parameters"
required: [sql]
writes: false
checkpointable: false
resource_slots:
- name: database
type: local/postgres-db
binding: contextual
- name: execute_migration
description: "Execute a DDL migration within a transaction"
input_schema:
type: object
properties:
up_sql:
type: string
description: "Forward migration SQL"
down_sql:
type: string
description: "Rollback migration SQL"
description:
type: string
description: "Human-readable description"
required: [up_sql, down_sql, description]
writes: true
checkpointable: true
resource_slots:
- name: database
type: local/postgres-db
binding: contextual
- name: backfill_column
description: "Batch-update a column using a source query"
input_schema:
type: object
properties:
table:
type: string
column:
type: string
source_query:
type: string
description: "Query that returns (id, value) pairs"
batch_size:
type: integer
default: 10000
required: [table, column, source_query]
writes: true
checkpointable: true
resource_slots:
- name: database
type: local/postgres-db
binding: contextual
$ agents skill add --config ./skills/database-ops.yaml
╭─ Skill Registered ─────────────────────────────────────────────╮
│ Name: local/database-ops │
│ Description: Safe database operations with transaction support │
│ Config: ./skills/database-ops.yaml │
│ Created: 2026-02-11 09:04 │
╰────────────────────────────────────────────────────────────────╯
╭─ Tool Sources ──────────────────────────────────────╮
│ Source Count Details │
│ ──────── ───── ──────────────────────────── │
│ custom 3 query_db, execute_migration, │
│ backfill_column │
│ ──────── ───── ──────────────────────────── │
│ Total: 3 │
╰─────────────────────────────────────────────────────╯
╭─ Resource Slots ───────────────────────────────────╮
│ Tool Slot Type │
│ ───────────────── ──────── ────────────────── │
│ query_db database local/postgres-db │
│ execute_migration database local/postgres-db │
│ backfill_column database local/postgres-db │
╰────────────────────────────────────────────────────╯
✓ OK Skill registered with 3 tools
name: local/add-column-with-backfill
description: "Add a column, backfill data, and update application code"
definition_of_done: |
- Database migration adds the column with a sensible default
- Backfill completes for all rows using the specified source
- Application code reads/writes the new column
- All tests pass with the new schema
- A rollback migration is available and tested
strategy_actor: anthropic/claude-3.5-sonnet
execution_actor: anthropic/claude-3.5-sonnet
automation_profile: review
reusable: true
state: available
args:
- name: table_name
type: string
required: true
- name: column_name
type: string
required: true
- name: column_type
type: string
required: true
- name: backfill_source
type: string
required: true
description: "Description of where to source backfill data"
invariants:
- "Migration must be backward-compatible (add column, don't rename or drop)"
- "Backfill must be batched to avoid locking the table"
- "Rollback migration must be provided and tested"
- "Application code must handle both old (null) and new values gracefully"
$ agents action create --config ./actions/add-column-with-backfill.yaml
╭─ Action Created ────────────────────────────────────╮
│ Name: local/add-column-with-backfill │
│ State: available │
│ Strategy Actor: anthropic/claude-3.5-sonnet │
│ Execution Actor: anthropic/claude-3.5-sonnet │
│ Reusable: yes │
│ Read Only: no │
│ Config: ./actions/add-column-with-backfill.yaml │
│ Created: 2026-02-11 09:05 │
╰─────────────────────────────────────────────────────╯
╭─ Definition of Done ─────────────────────────────────────────────╮
│ - Database migration adds the column with a sensible default │
│ - Backfill completes for all rows using the specified source │
│ - Application code reads/writes the new column │
│ - All tests pass with the new schema │
│ - A rollback migration is available and tested │
╰──────────────────────────────────────────────────────────────────╯
╭─ Arguments ────────────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ──────────────── ────── ──────── ───────────────────────────────── │
│ table_name string yes (none) │
│ column_name string yes (none) │
│ column_type string yes (none) │
│ backfill_source string yes Where to source backfill data │
╰────────────────────────────────────────────────────────────────────────╯
╭─ Invariants ──────────────────────────────────────────────────────────────────────╮
│ 1. Migration must be backward-compatible (add column, don't rename or drop) │
│ 2. Backfill must be batched to avoid locking the table │
│ 3. Rollback migration must be provided and tested │
│ 4. Application code must handle both old (null) and new values gracefully │
╰───────────────────────────────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────╮
│ Profile: review │
│ Source: action config │
╰───────────────────────────────────╯
╭─ Usage ─────────────────────────────────────────────────────────────────────────╮
│ agents plan use local/add-column-with-backfill local/api-service │
│ --arg table_name=TABLE --arg column_name=COL │
│ --arg column_type=TYPE --arg backfill_source=SOURCE │
╰─────────────────────────────────────────────────────────────────────────────────╯
✓ OK Action created
$ agents plan use local/add-column-with-backfill local/api-service \
--arg table_name="users" \
--arg column_name="last_login_at" \
--arg column_type="TIMESTAMP WITH TIME ZONE" \
--arg backfill_source="audit_log table, event_type='login', max(created_at) per user_id"
╭─ Plan Created ──────────────────────────────────────╮
│ Plan ID: 01HXR5E6F7G8H9J0K1L2M3N4O5 │
│ Phase: strategize │
│ Action: local/add-column-with-backfill │
│ Project: local/api-service │
│ Automation: review │
│ Attempt: 1 │
╰─────────────────────────────────────────────────────╯
╭─ Inputs ────────────────────────────────────────────────────────────────────────────╮
│ - table_name=users │
│ - column_name=last_login_at │
│ - column_type=TIMESTAMP WITH TIME ZONE │
│ - backfill_source=audit_log table, event_type='login', max(created_at) per user_id │
╰─────────────────────────────────────────────────────────────────────────────────────╯
╭─ Actors ───────────────────────────────────╮
│ Strategy: anthropic/claude-3.5-sonnet │
│ Execution: anthropic/claude-3.5-sonnet │
│ Estimation: (none) │
╰────────────────────────────────────────────╯
╭─ Plan Invariants ──────────────────────────────────────────────────────────────╮
│ Scope Source Invariant │
│ ──────── ─────── ────────────────────────────────────────────────────── │
│ plan action Migration must be backward-compatible │
│ plan action Backfill must be batched to avoid locking the table │
│ plan action Rollback migration must be provided and tested │
│ plan action Application code must handle both old (null) and new values │
╰────────────────────────────────────────────────────────────────────────────────╯
╭─ Context ──────────────────────────────╮
│ Resources: 2 (git-checkout, postgres) │
│ Indexed Files: 347 │
│ View: strategize │
│ Hot Token Budget: 12,000 │
╰────────────────────────────────────────╯
╭─ Next Steps ───────────────────────────────────────╮
│ - agents plan execute 01HXR5E6F7G8H9J0K1L2M3N4O5 │
│ - agents plan status 01HXR5E6F7G8H9J0K1L2M3N4O5 │
│ - agents plan tree 01HXR5E6F7G8H9J0K1L2M3N4O5 │
╰────────────────────────────────────────────────────╯
✓ OK Plan created
# Monitor the migration execution
$ agents plan status 01HXR5E6F7G8H9J0K1L2M3N4O5
╭─ Plan Status ───────────────────────────────────────╮
│ Plan: 01HXR5E6F7G8H9J0K1L2M3N4O5 │
│ Phase: execute │
│ State: processing │
│ Action: local/add-column-with-backfill │
│ Project: local/api-service │
│ Automation: review │
│ Attempt: 1 │
╰─────────────────────────────────────────────────────╯
╭─ Progress ─────────────────╮
│ ✓ Strategize │
│ ⏳ Execute (phase 3 of 5) │
│ • Apply (queued) │
╰────────────────────────────╯
╭─ Child Plans ────────────────────────────────────────────────────────────╮
│ Phase Description Status │
│ ───── ─────────────────────────────────── ────────────────────── │
│ 1 Generate Alembic migration ✓ complete │
│ 2 Generate rollback migration ✓ complete │
│ 3 Backfill from audit_log ⏳ batch 620/1,000 │
│ 4 Update ORM model and application code ○ waiting │
│ 5 Run tests with new schema ○ waiting │
╰──────────────────────────────────────────────────────────────────────────╯
╭─ Execution Detail ──────────────────────╮
│ Sandbox: transaction_rollback │
│ Tool Calls: 14 │
│ Files Modified: 2 │
│ Rows Backfilled: 6,200,000 / 10,000,000 │
│ Checkpoints: 4 created │
╰─────────────────────────────────────────╯
╭─ Timing ──────────────╮
│ Started: 09:06:01 │
│ Elapsed: 00:04:32 │
│ ETA: 00:02:50 │
╰───────────────────────╯
╭─ Cost ───────────────╮
│ Tokens Used: 18,940 │
│ Cost So Far: $0.063 │
│ Estimated: $0.110 │
╰──────────────────────╯
✓ OK Status refreshed
# If something goes wrong during backfill, rollback to the pre-backfill checkpoint
$ agents plan rollback --yes 01HXR5E6F7G8H9J0K1L2M3N4O5 cp_01HXR5CP3
╭─ Rollback Summary ───────────────────────────────────╮
│ Plan: 01HXR5E6F7G8H9J0K1L2M3N4O5 │
│ Checkpoint: cp_01HXR5CP3 │
│ Label: before backfill (after migration applied) │
│ Files: 2 reverted │
╰──────────────────────────────────────────────────────╯
╭─ Changes Reverted ──────────────────────────────────────────╮
│ File Action │
│ ─────────────────────────────────────────── ────────── │
│ alembic/versions/20260211_add_last_login.py restored │
│ alembic/versions/20260211_rollback.py restored │
╰─────────────────────────────────────────────────────────────╯
╭─ Database Rollback ─────────────────────────────────────────╮
│ Transaction: rolled back │
│ Rows Affected: 6,200,000 updates reverted │
│ Schema State: restored to pre-backfill │
╰─────────────────────────────────────────────────────────────╯
╭─ Impact ──────────────────────────────────────╮
│ Child Plans Invalidated: 1 (backfill phase) │
│ Sandbox: restored to cp_01HXR5CP3 │
│ Decisions After CP: 3 discarded │
│ Tool Calls After CP: 8 undone │
╰───────────────────────────────────────────────╯
╭─ Post-Rollback State ──────────╮
│ Phase: execute │
│ State: queued (awaiting input) │
│ Checkpoints Remaining: 3 │
╰────────────────────────────────╯
✓ OK Rollback complete
name: local/generate-docs
description: "Generate comprehensive documentation from codebase analysis"
long_description: |
Analyze the project codebase to produce developer documentation:
API reference, architecture overview, module guides, and onboarding
material. Uses code intelligence (search, vector similarity, graph
queries) to understand structure and relationships.
definition_of_done: |
- API reference covers all public endpoints/functions
- Architecture document shows module dependencies and data flow
- Each major module has a developer guide
- An onboarding document provides setup and contribution instructions
- All generated docs are accurate to the current codebase
- Documentation is written in Markdown format
strategy_actor: anthropic/claude-3.5-sonnet
execution_actor: anthropic/claude-3.5-sonnet
read_only: false
reusable: true
state: available
args:
- name: doc_types
type: string
required: true
description: "Comma-separated list: api-reference, architecture, module-guides, onboarding"
- name: output_dir
type: string
required: false
default: "docs/"
description: "Output directory for generated docs"
invariants:
- "Do not modify any source code files — only create or update files in the output directory"
- "All code examples in documentation must be actual code from the project, not fabricated"
- "Architecture diagrams must reflect actual module dependencies, not aspirational ones"
$ agents action create --config ./actions/generate-docs.yaml
╭─ Action Created ──────────────────────────────────────────────────────────────────╮
│ Name: local/generate-docs │
│ State: available │
│ Strategy Actor: anthropic/claude-3.5-sonnet │
│ Execution Actor: anthropic/claude-3.5-sonnet │
│ Reusable: yes │
│ Read Only: no │
│ Created: 2026-02-11 10:30 │
╰───────────────────────────────────────────────────────────────────────────────────╯
╭─ Definition of Done ──────────────────────────────────────────────────────────────╮
│ - API reference covers all public endpoints/functions │
│ - Architecture document shows module dependencies and data flow │
│ - Each major module has a developer guide │
│ - An onboarding document provides setup and contribution instructions │
│ - All generated docs are accurate to the current codebase │
│ - Documentation is written in Markdown format │
╰───────────────────────────────────────────────────────────────────────────────────╯
╭─ Arguments ───────────────────────────────────────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ────────── ────── ──────── ────────────────────────────────────────────────────────────── │
│ doc_types string yes Comma-separated list: api-reference, architecture, module-guides… │
│ output_dir string no Output directory for generated docs (default: docs/) │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Invariants ───────────────────────────────────────────────────────────────────────────────────────╮
│ 1. Do not modify any source code files — only create or update files in the output directory │
│ 2. All code examples in documentation must be actual code from the project, not fabricated │
│ 3. Architecture diagrams must reflect actual module dependencies, not aspirational ones │
╰────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────╮
│ Profile: (inherits global) │
│ Source: default │
╰───────────────────────────────────────╯
╭─ Usage ────────────────────────────────────────────────────────────────────────────╮
│ agents plan use local/generate-docs local/api-service │
│ --arg doc_types="api-reference,architecture,module-guides,onboarding" │
╰────────────────────────────────────────────────────────────────────────────────────╯
✓ OK Action created
# Set a generous context policy for the strategize view (needs to see architecture)
$ agents project context set --view strategize \
--include-resource 01HXR6A1B2C3D4E5F6G7H8J9K0 \
--exclude-path "**/node_modules/**" \
--exclude-path "**/.git/**" \
--exclude-path "**/dist/**" \
--hot-max-tokens 32000 \
--warm-max-decisions 200 \
--query-limit 50 \
--max-file-size 2097152 \
--summarize \
--summary-max-tokens 1500 \
local/api-service
╭─ Context Policy ────────────────────────────────────────╮
│ Project: local/api-service │
│ View: strategize │
│ Include: 01HXR6A1B2C3D4E5F6G7H8J9K0 │
│ Exclude: **/node_modules/**, **/.git/**, **/dist/** │
╰─────────────────────────────────────────────────────────╯
╭─ Limits ──────────────────────────╮
│ Hot Tokens: 32000 (soft cap) │
│ Warm Decisions: 200 │
│ Query Limit: 50 │
│ Max File Size: 2 MB │
│ Max Total Size: 50 MB │
╰───────────────────────────────────╯
╭─ Summarization ──────╮
│ Enabled: yes │
│ Max Tokens: 1500 │
╰──────────────────────╯
╭─ Other Views ──────────╮
│ execute: (default) │
│ apply: (default) │
│ default: (unset) │
╰────────────────────────╯
✓ OK Context policy updated
# Execution view can be narrower (writing docs, not analyzing all code)
$ agents project context set --view execute \
--include-resource 01HXR6A1B2C3D4E5F6G7H8J9K0 \
--hot-max-tokens 16000 \
--query-limit 30 \
--summarize \
local/api-service
╭─ Context Policy ────────────────────────────────────────╮
│ Project: local/api-service │
│ View: execute │
│ Include: 01HXR6A1B2C3D4E5F6G7H8J9K0 │
╰─────────────────────────────────────────────────────────╯
╭─ Limits ──────────────────────────╮
│ Hot Tokens: 16000 (soft cap) │
│ Query Limit: 30 │
│ Max File Size: 1 MB │
│ Max Total Size: 50 MB │
╰───────────────────────────────────╯
╭─ Summarization ─╮
│ Enabled: yes │
│ Max Tokens: 800 │
╰─────────────────╯
╭─ Other Views ──────────────╮
│ strategize: configured │
│ apply: (default) │
│ default: (unset) │
╰────────────────────────────╯
✓ OK Context policy updated
$ agents plan use \
--automation-profile trusted \
--arg doc_types="api-reference,architecture,module-guides,onboarding" \
--arg output_dir="docs/generated/" \
local/generate-docs local/api-service
╭─ Plan Created ──────────────────────────────────────╮
│ Plan: 01HXR6F7G8H9J0K1L2M3N4O5P6 │
│ Phase: strategize │
│ State: processing │
│ Action: local/generate-docs │
│ Project: local/api-service │
│ Automation: trusted │
│ Attempt: 1 │
╰─────────────────────────────────────────────────────╯
╭─ Inputs ─────────────────────────────────────────────────────────────────────╮
│ - doc_types="api-reference,architecture,module-guides,onboarding" │
│ - output_dir="docs/generated/" │
│ - automation_profile=trusted │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Actors ────────────────────────────────────────╮
│ Strategy: anthropic/claude-3.5-sonnet │
│ Execution: anthropic/claude-3.5-sonnet │
│ Estimation: (none) │
╰─────────────────────────────────────────────────╯
╭─ Automation ───────────────────────────╮
│ Profile: trusted │
│ Source: plan override │
│ Read-Only: no │
╰────────────────────────────────────────╯
╭─ Context ──────────────────────────╮
│ Resources: 1 (git-checkout) │
│ Indexed Files: 487 │
│ View: strategize │
│ Hot Token Budget: 32,000 │
╰────────────────────────────────────╯
╭─ Next Steps ─────────────────────────────────────────────────────────╮
│ Trusted profile — strategize and execute will proceed automatically. │
│ - agents plan status 01HXR6F7G8H9J0K1L2M3N4O5P6 │
│ - agents plan tree 01HXR6F7G8H9J0K1L2M3N4O5P6 │
╰──────────────────────────────────────────────────────────────────────╯
✓ OK Plan created
# Review generated docs
$ agents plan artifacts 01HXR6F7G8H9J0K1L2M3N4O5P6
╭─ Artifacts ───────────────────────────────────────────────────────────────────────────╮
│ Path Type Size Change Child Plan │
│ ──────────────────────────────────────── ───── ─────── ──────── ─────── │
│ docs/generated/api-reference.md write 18.2 KB +412 -0 root │
│ docs/generated/architecture.md write 12.6 KB +284 -0 root │
│ docs/generated/modules/auth.md write 6.4 KB +148 -0 root │
│ docs/generated/modules/billing.md write 5.8 KB +131 -0 root │
│ docs/generated/modules/notifications.md write 4.2 KB +97 -0 root │
│ docs/generated/modules/data-pipeline.md write 5.1 KB +118 -0 root │
│ docs/generated/onboarding.md write 8.9 KB +201 -0 root │
╰───────────────────────────────────────────────────────────────────────────────────────╯
╭─ Summary ─────────────╮
│ Total: 7 │
│ Writes: 7 (new) │
│ Edits: 0 │
│ Deletes: 0 │
│ Total Size: 61.2 KB │
╰───────────────────────╯
✓ OK 7 artifacts listed
$ agents plan diff 01HXR6F7G8H9J0K1L2M3N4O5P6
╭─ Diff Summary ─────────────────────────────────────╮
│ Plan: 01HXR6F7G8H9J0K1L2M3N4O5P6 │
│ Project: local/api-service │
│ Files Changed: 7 │
│ Insertions: 1,391 │
│ Deletions: 0 │
│ Net Change: +1,391 lines │
╰────────────────────────────────────────────────────╯
╭─ Files ──────────────────────────────────────────────────────────╮
│ Path Change Status │
│ ──────────────────────────────────────── ───────── ───────── │
│ docs/generated/api-reference.md +412 -0 new file │
│ docs/generated/architecture.md +284 -0 new file │
│ docs/generated/modules/auth.md +148 -0 new file │
│ docs/generated/modules/billing.md +131 -0 new file │
│ docs/generated/modules/notifications.md +97 -0 new file │
│ docs/generated/modules/data-pipeline.md +118 -0 new file │
│ docs/generated/onboarding.md +201 -0 new file │
╰──────────────────────────────────────────────────────────────────╯
╭─ Patch Preview ───────────────────────────────────────────────────────╮
│ --- /dev/null │
│ +++ b/docs/generated/api-reference.md │
│ @@ -0,0 +1,412 @@ │
│ + # API Reference │
│ + ## Authentication │
│ + ### POST /auth/login │
│ + ... │
│ --- /dev/null │
│ +++ b/docs/generated/architecture.md │
│ @@ -0,0 +1,284 @@ │
│ + # Architecture Overview │
│ + ## Module Dependency Graph │
│ + ... │
╰───────────────────────────────────────────────────────────────────────╯
╭─ Risk Assessment ─────────────────╮
│ Source Code: unmodified │
│ Breaking Changes: none detected │
│ New Files Only: yes │
╰───────────────────────────────────╯
✓ OK Diff generated
# Apply the documentation to the project
$ agents plan apply --yes 01HXR6F7G8H9J0K1L2M3N4O5P6
╭─ Apply Summary ──────────────────────────────╮
│ Plan: 01HXR6F7G8H9J0K1L2M3N4O5P6 │
│ Artifacts: 7 files created │
│ Changes: 1,391 insertions, 0 deletions │
│ Project: local/api-service │
│ Applied At: 2026-02-11 10:38 │
╰──────────────────────────────────────────────╯
╭─ Validation ────────────────────────────────╮
│ ✓ Invariant: no source files modified │
│ ✓ Invariant: code examples verified │
│ ✓ Invariant: architecture matches codebase │
│ Duration: 4.1s │
╰─────────────────────────────────────────────╯
╭─ Sandbox Cleanup ─────────╮
│ Worktree: removed │
│ Branch: merged to main │
│ Checkpoint: archived │
╰───────────────────────────╯
╭─ Plan Lifecycle ─────────────────────────╮
│ Phase: apply │
│ State: applied │
│ Total Duration: 00:08:12 │
│ Total Cost: $0.184 │
│ Decisions Made: 18 │
│ Child Plans: 0 │
╰──────────────────────────────────────────╯
╭─ Next Steps ──────╮
│ - Review git diff │
│ - Commit changes │
╰───────────────────╯
✓ OK Changes applied
# Set CI-appropriate configuration
$ agents config set core.automation-profile ci
╭─ Config Updated ───────────────────────────╮
│ Key: core.automation-profile │
│ Value: ci │
│ Previous: (not set) │
│ Source: config │
│ Scope: global │
╰────────────────────────────────────────────╯
╭─ Effective ────────────────────────╮
│ Sessions: new sessions │
│ Plans: future plans (unless set) │
│ Existing: unchanged │
╰────────────────────────────────────╯
╭─ Saved To ──────────────────────────╮
│ File: ~/.cleveragents/config.toml │
│ Line: 3 │
╰─────────────────────────────────────╯
✓ OK Config updated
$ agents config set core.format json
╭─ Config Updated ─────────────────╮
│ Key: core.format │
│ Value: json │
│ Previous: (not set) │
│ Source: config │
│ Scope: global │
╰──────────────────────────────────╯
╭─ Saved To ──────────────────────────╮
│ File: ~/.cleveragents/config.toml │
│ Line: 4 │
╰─────────────────────────────────────╯
✓ OK Config updated
$ agents config set core.log.level WARN
╭─ Config Updated ──────────────────╮
│ Key: core.log.level │
│ Value: WARN │
│ Previous: FATAL │
│ Source: config │
│ Scope: global │
╰───────────────────────────────────╯
╭─ Saved To ──────────────────────────╮
│ File: ~/.cleveragents/config.toml │
│ Line: 5 │
╰─────────────────────────────────────╯
✓ OK Config updated
name: local/review-pr
description: "Automatically review a PR and fix issues"
definition_of_done: |
- All lint issues are resolved
- Type checking passes
- Test coverage does not decrease
- Security scan passes
- All fixes are committed to the PR branch
strategy_actor: anthropic/claude-3.5-sonnet
execution_actor: anthropic/claude-3.5-sonnet
automation_profile: ci
reusable: true
state: available
args:
- name: pr_branch
type: string
required: true
description: "Branch name of the PR"
- name: base_branch
type: string
required: false
default: "main"
description: "Base branch to compare against"
invariants:
- "Only modify files that are already changed in the PR"
- "Do not change the intent of any code — only fix style, types, and test issues"
- "All fixes must include a comment explaining what was changed and why"
$ agents action create --config ./actions/review-pr.yaml
╭─ Action Created ──────────────────────────────╮
│ Name: local/review-pr │
│ State: available │
│ Strategy Actor: anthropic/claude-3.5-sonnet │
│ Execution Actor: anthropic/claude-3.5-sonnet │
│ Reusable: yes │
│ Read Only: no │
│ Created: 2026-02-11 14:00 │
╰───────────────────────────────────────────────╯
╭─ Definition of Done ─────────────────────────────────────╮
│ - All lint issues are resolved │
│ - Type checking passes │
│ - Test coverage does not decrease │
│ - Security scan passes │
│ - All fixes are committed to the PR branch │
╰──────────────────────────────────────────────────────────╯
╭─ Arguments ──────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ────────── ────── ──────── ────────────────────────────────── │
│ pr_branch string yes Branch name of the PR │
│ base_branch string no Base branch to compare against │
╰──────────────────────────────────────────────────────────────────╯
╭─ Invariants ─────────────────────────────────────────────────────────────────────╮
│ 1. Only modify files that are already changed in the PR │
│ 2. Do not change the intent of any code — only fix style, types, and test │
│ issues │
│ 3. All fixes must include a comment explaining what was changed and why │
╰──────────────────────────────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────╮
│ Profile: ci │
│ Source: action config │
╰───────────────────────────────╯
╭─ Usage ──────────────────────────────────────────────────────────────────╮
│ agents plan use local/review-pr <PROJECT> │
│ --arg pr_branch="..." │
╰──────────────────────────────────────────────────────────────────────────╯
✓ OK Action created
#!/bin/bash
# ci-review.sh — called by CI when a PR is opened or updated
set -euo pipefail
PR_BRANCH="${1:?Usage: ci-review.sh <branch>}"
BASE_BRANCH="${2:-main}"
# Register the resource pointing to the CI workspace.
RESOURCE_NAME="local/ci-${PR_BRANCH}"
agents resource add git-checkout "$RESOURCE_NAME" \
--path "$GITHUB_WORKSPACE" \
--branch "$PR_BRANCH"
echo "Registered resource: $RESOURCE_NAME"
# Create a project for this CI run, linking the resource by name.
# If the project already exists from a previous run, ignore the error.
agents --format json project create -d "CI workspace for PR $PR_BRANCH" \
--resource "$RESOURCE_NAME" \
local/ci-workspace 2>/dev/null || true
# Register and attach validations (idempotent — duplicates are ignored)
agents --format json validation add \
--config validations/lint.yaml --required local/ci-lint 2>/dev/null || true
agents --format json validation add \
--config validations/typecheck.yaml --required local/ci-typecheck 2>/dev/null || true
agents --format json validation add \
--config validations/tests.yaml --required local/ci-tests 2>/dev/null || true
agents --format json validation attach \
--project local/ci-workspace local/ci-lint 2>/dev/null || true
agents --format json validation attach \
--project local/ci-workspace local/ci-typecheck 2>/dev/null || true
agents --format json validation attach \
--project local/ci-workspace local/ci-tests 2>/dev/null || true
# Run the plan — ci profile means full automation including apply
PLAN_OUTPUT=$(agents --format json plan use \
--automation-profile ci \
--arg pr_branch="$PR_BRANCH" \
--arg base_branch="$BASE_BRANCH" \
local/review-pr local/ci-workspace)
PLAN_ID=$(echo "$PLAN_OUTPUT" | jq -r '.plan_id')
echo "Plan started: $PLAN_ID"
# Wait for completion (ci profile runs everything automatically)
while true; do
STATUS=$(agents --format json plan status "$PLAN_ID" | jq -r '.state')
case "$STATUS" in
applied)
echo "PR review complete. Changes applied."
break
;;
failed|cancelled)
echo "PR review failed."
agents --format json plan status "$PLAN_ID"
exit 1
;;
*)
sleep 10
;;
esac
done
# Output the diff for the CI log
agents --format json plan diff "$PLAN_ID"
{
"id": "01HXR7G1A2B3C4D5E6F7H8J9K0",
"type": "git-checkout",
"physical": true,
"path": "/home/runner/work/acme-api/acme-api",
"branch": "fix/handle-null-users",
"created": "2026-02-11T14:05:32Z",
"children_discovered": 247,
"capabilities": {
"readable": true,
"writable": true,
"sandboxable": true,
"checkpointable": true,
"sandbox_strategy": "git_worktree"
}
}
{
"plan_id": "01HXR7H2B3C4D5E6F7G8J9K0L1",
"phase": "strategize",
"action": "local/review-pr",
"project": "local/ci-workspace",
"automation_profile": "ci",
"attempt": 1,
"args": {
"pr_branch": "fix/handle-null-users",
"base_branch": "main"
},
"resources": ["01HXR7G1A2B3C4D5E6F7H8J9K0"]
}
name: local/terraform-state
description: "Terraform state file resource type"
physical: true
user_addable: true
sandbox_strategy: filesystem_copy
cli_args:
- name: state-path
type: string
required: true
description: "Path to terraform.tfstate or remote state configuration"
- name: workspace
type: string
required: false
default: "default"
description: "Terraform workspace name"
handler: local/terraform-state-handler
child_types:
- type: fs-file
relationship: contains
name: local/terraform-ops
description: "Terraform infrastructure operations"
tools:
- name: terraform_plan
description: "Run terraform plan and return the execution plan"
input_schema:
type: object
properties:
target:
type: string
description: "Specific resource to target (optional)"
required: []
writes: false
checkpointable: false
- name: terraform_show
description: "Show current state of a Terraform resource"
input_schema:
type: object
properties:
resource_address:
type: string
description: "Terraform resource address (e.g., aws_instance.web)"
required: [resource_address]
writes: false
checkpointable: false
- name: cloud_metrics
description: "Fetch CloudWatch/cloud monitoring metrics for a resource"
input_schema:
type: object
properties:
resource_id:
type: string
metric:
type: string
description: "e.g., CPUUtilization, NetworkIn, RequestCount"
period_days:
type: integer
default: 30
required: [resource_id, metric]
writes: false
checkpointable: false
include_skills:
- local/file-ops
$ agents resource type add --config ./resource-types/terraform-state.yaml
╭─ Resource Type ──────────────────────────────╮
│ Name: local/terraform-state │
│ Physical/Virtual: physical │
│ User Addable: yes │
│ Registered: 2026-02-11 14:30 │
╰──────────────────────────────────────────────╯
╭─ CLI Arguments ──────────────────────────────────────────────────────────────╮
│ Argument Required Description │
│ ────────────── ──────── ────────────────────────────────────────────── │
│ --state-path yes Path to terraform.tfstate or remote state config │
│ --workspace no Terraform workspace name (default: "default") │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Child Types ──────────────╮
│ Auto-discover: fs-file │
╰────────────────────────────╯
╭─ Sandbox ───────────────────────────────────────────╮
│ Strategy: filesystem_copy │
│ Handler: local/terraform-state-handler (custom) │
╰─────────────────────────────────────────────────────╯
✓ OK Resource type registered
ℹ New subcommand available: agents resource add local/terraform-state
$ agents skill add --config ./skills/terraform-ops.yaml
╭─ Skill ──────────────────────────────────────────╮
│ Name: local/terraform-ops │
│ Description: Terraform infrastructure operations │
│ Config: ./skills/terraform-ops.yaml │
│ Created: 2026-02-11 14:31 │
╰──────────────────────────────────────────────────╯
╭─ Includes ────────────────────╮
│ local/file-ops (registered) │
╰───────────────────────────────╯
╭─ Tool Sources ───────────────────────────────────────────────────────╮
│ Source Count Details │
│ ──────── ───── ────────────────────────────────────────────── │
│ custom 3 terraform_plan, terraform_show, cloud_metrics │
│ included 5 local/file-ops (5) │
│ ──────── ───── ────────────────────────────────────────────── │
│ Total: 8 │
╰──────────────────────────────────────────────────────────────────────╯
✓ OK Skill registered with 8 tools
# Register the infrastructure git checkout
$ agents resource add git-checkout local/infra-repo \
--path /repos/infrastructure --branch main
╭─ Resource ──────────────────────────────────────╮
│ Name: local/infra-repo │
│ ID: 01HXR8A1B2C3D4E5F6G7H8J9K0 │
│ Type: git-checkout │
│ Physical/Virtual: physical │
│ Path: /repos/infrastructure │
│ Branch: main │
│ Created: 2026-02-11 14:32 │
╰─────────────────────────────────────────────────╯
╭─ Auto-discovered Children ─────────────────────────────────────────╮
│ ID Type Status │
│ ─────────────── ────────────── ───────────────── │
│ 01HXR8A1B2C3… git created │
│ 01HXR8A1B2C4… git-remote created │
│ 01HXR8A1B2C5… git-branch created │
│ 01HXR8A1B2C6… fs-directory created │
│ + 18 git-commit resources │
│ + 84 git-tree-entry resources │
│ + 6 fs-directory + 42 fs-file │
╰────────────────────────────────────────────────────────────────────╯
╭─ Capabilities ─────────────────╮
│ Readable: yes │
│ Writable: yes │
│ Sandboxable: yes │
│ Checkpointable: yes │
│ Sandbox Strategy: git_worktree │
╰────────────────────────────────╯
✓ OK Resource registered (155 child resources discovered)
# Register the Terraform state for the production workspace
$ agents resource add local/terraform-state local/prod-tfstate \
--state-path /repos/infrastructure/environments/prod/terraform.tfstate \
--workspace production
╭─ Resource ──────────────────────────────────────────────────────────────────╮
│ Name: local/prod-tfstate │
│ ID: 01HXR8B2C3D4E5F6G7H8J9K0L1 │
│ Type: local/terraform-state │
│ Physical/Virtual: physical │
│ State Path: /repos/infrastructure/environments/prod/terraform.tfstate │
│ Workspace: production │
│ Created: 2026-02-11 14:32 │
╰─────────────────────────────────────────────────────────────────────────────╯
╭─ Auto-discovered Children ─────────────╮
│ + 1 fs-file (terraform.tfstate) │
╰────────────────────────────────────────╯
╭─ Capabilities ──────────────────────╮
│ Readable: yes │
│ Writable: yes │
│ Sandboxable: yes │
│ Checkpointable: yes │
│ Sandbox Strategy: filesystem_copy │
╰─────────────────────────────────────╯
✓ OK Resource registered (1 child resource discovered)
# Create the project, linking both resources by name
$ agents project create -d "Production infrastructure" \
--resource local/infra-repo \
--resource local/prod-tfstate \
--invariant "Never delete or modify resources tagged with 'critical: true'" \
--invariant "All changes must be backward-compatible with running services" \
--invariant "Cost changes must be documented in the PR description" \
local/infra-prod
╭─ Project Created ─────────────────────────────╮
│ Name: local/infra-prod │
│ Description: Production infrastructure │
│ Remote: no │
╰───────────────────────────────────────────────╯
╭─ Linked Resources ──────────────────────────────────────────────────╮
│ Resource Type Read-Only │
│ ──────────────────────────── ────────────────────── ───────── │
│ local/infra-repo git-checkout no │
│ local/prod-tfstate local/terraform-state no │
╰─────────────────────────────────────────────────────────────────────╯
╭─ Invariants ──────────────────────────────────────────────────────────────╮
│ 1. Never delete or modify resources tagged with 'critical: true' │
│ 2. All changes must be backward-compatible with running services │
│ 3. Cost changes must be documented in the PR description │
╰───────────────────────────────────────────────────────────────────────────╯
✓ OK Project created
$ agents validation add --config validations/tf-validate.yaml --required local/tf-validate
╭─ Validation Registered ────────────────────────────────────────────╮
│ Name: local/tf-validate │
│ Command: cd environments/prod && terraform validate │
│ Mode: required │
│ Timeout: 300s │
╰────────────────────────────────────────────────────────────────────╯
✓ OK Validation registered
$ agents validation attach --project local/infra-prod local/tf-validate
✓ OK Validation attached to project local/infra-prod
$ agents validation add --config validations/tf-plan.yaml --informational local/tf-plan
╭─ Validation Registered ─────────────────────────────────────────────────────────╮
│ Name: local/tf-plan │
│ Command: cd environments/prod && terraform plan -detailed-exitcode │
│ Mode: informational │
│ Timeout: 300s │
╰─────────────────────────────────────────────────────────────────────────────────╯
✓ OK Validation registered
$ agents validation attach --project local/infra-prod local/tf-plan
✓ OK Validation attached to project local/infra-prod
name: local/infra-optimize
description: "Analyze and optimize cloud infrastructure costs"
definition_of_done: |
- Unused resources are identified and removal plans generated
- Over-provisioned resources are identified with right-sizing recommendations
- Terraform changes implement the approved optimizations
- terraform validate passes on all changes
- terraform plan shows no unexpected resource deletions
- Estimated monthly cost savings are documented
strategy_actor: local/refactoring-strategist
execution_actor: anthropic/claude-3.5-sonnet
automation_profile: supervised
reusable: true
state: available
args:
- name: optimization_targets
type: string
required: false
default: "all"
description: "Comma-separated: compute, storage, networking, database, all"
- name: min_savings_threshold
type: float
required: false
default: 10.0
description: "Minimum monthly savings (USD) to include an optimization"
invariants:
- "Changes to production databases require manual approval regardless of profile"
- "Instance type downgrades must verify current peak CPU < 70% of new capacity"
$ agents action create --config ./actions/infra-optimize.yaml
╭─ Action Created ──────────────────────────────────────╮
│ Name: local/infra-optimize │
│ ID: 01HXR8C3D4E5F6G7H8J9K0L1M2 │
│ State: available │
│ Strategy Actor: local/refactoring-strategist │
│ Execution Actor: anthropic/claude-3.5-sonnet │
│ Reusable: yes │
│ Read Only: no │
│ Config: ./actions/infra-optimize.yaml │
│ Created: 2026-02-11 14:33 │
╰───────────────────────────────────────────────────────╯
╭─ Definition of Done ──────────────────────────────────────────────────╮
│ - Unused resources are identified and removal plans generated │
│ - Over-provisioned resources identified with right-sizing recs │
│ - Terraform changes implement the approved optimizations │
│ - terraform validate passes on all changes │
│ - terraform plan shows no unexpected resource deletions │
│ - Estimated monthly cost savings are documented │
╰───────────────────────────────────────────────────────────────────────╯
╭─ Arguments ───────────────────────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ────────────────────── ────── ──────── ────────────────────────────────── │
│ optimization_targets string no Comma-separated: compute, storage, … │
│ min_savings_threshold float no Min monthly savings (USD) to include │
╰───────────────────────────────────────────────────────────────────────────────────╯
╭─ Invariants ──────────────────────────────────────────────────────────────────────────╮
│ 1. Changes to production databases require manual approval regardless of profile │
│ 2. Instance type downgrades must verify current peak CPU < 70% of new capacity │
╰───────────────────────────────────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────╮
│ Profile: supervised │
│ Source: action config │
╰───────────────────────────────────────╯
╭─ Usage ─────────────────────────────────────────────────────────────╮
│ agents plan use local/infra-optimize local/infra-prod │
│ --arg optimization_targets=TARGET --arg min_savings_threshold=N │
╰─────────────────────────────────────────────────────────────────────╯
✓ OK Action created
$ agents plan use \
--arg optimization_targets="compute,storage" \
--arg min_savings_threshold=25.0 \
local/infra-optimize local/infra-prod
╭─ Plan Created ─────────────────────────────────────────╮
│ Plan ID: 01HXR8D4E5F6G7H8J9K0L1M2N3 │
│ Phase: strategize │
│ Action: local/infra-optimize │
│ Project: local/infra-prod │
│ Automation: supervised │
│ Attempt: 1 │
╰────────────────────────────────────────────────────────╯
╭─ Inputs ──────────────────────────────────────╮
│ - optimization_targets=compute,storage │
│ - min_savings_threshold=25.0 │
╰───────────────────────────────────────────────╯
╭─ Actors ─────────────────────────────────────╮
│ Strategy: local/refactoring-strategist │
│ Execution: anthropic/claude-3.5-sonnet │
│ Estimation: (none) │
╰──────────────────────────────────────────────╯
╭─ Plan Invariants ──────────────────────────────────────────────────────────────────╮
│ Scope Source Invariant │
│ ──────── ──────── ───────────────────────────────────────────────────────── │
│ plan action Prod DB changes require manual approval regardless │
│ plan action Instance downgrades must verify peak CPU < 70% of new cap │
│ project config Never delete or modify resources tagged 'critical: true' │
│ project config All changes must be backward-compatible with running svcs │
│ project config Cost changes must be documented in PR description │
╰────────────────────────────────────────────────────────────────────────────────────╯
╭─ Context ──────────────────────────────────────────╮
│ Resources: 2 (git-checkout, terraform-state) │
│ Indexed Files: 156 │
│ View: strategize │
│ Hot Token Budget: 12,000 │
╰────────────────────────────────────────────────────╯
╭─ Next Steps ──────────────────────────────────────────╮
│ - agents plan execute 01HXR8D4E5F6G7H8J9K0L1M2N3 │
│ - agents plan status 01HXR8D4E5F6G7H8J9K0L1M2N3 │
│ - agents plan tree 01HXR8D4E5F6G7H8J9K0L1M2N3 │
╰───────────────────────────────────────────────────────╯
✓ OK Plan created
$ agents session create --actor anthropic/claude-3.5-sonnet
╭─ Session ────────────────────────────────╮
│ ID: 01HXR9A1B2C3D4E5F6G7H8I9J0 │
│ Actor: anthropic/claude-3.5-sonnet │
│ Created: 2026-02-11 09:15 │
│ Namespace: local │
╰──────────────────────────────────────────╯
╭─ Settings ─────────────╮
│ Automation: review │
│ Streaming: off │
│ Context: default │
│ Memory: enabled │
│ Max History: 50 turns │
╰────────────────────────╯
╭─ Actor Details ────────────────────────╮
│ Provider: anthropic │
│ Model: claude-3.5-sonnet │
│ Temperature: 0.7 │
│ Context Window: 200K tokens │
╰────────────────────────────────────────╯
✓ OK Session created
$ agents session tell --session 01HXR9A1B2C3D4E5F6G7H8I9J0 \
"I just joined the team and need to understand the api-service project. What are the main modules and how do they interact?"
╭─ Plan Request ──────────────────────────────────────────────────────────────────────────╮
│ Actor: anthropic/claude-3.5-sonnet │
│ Session: 01HXR9A1B2C3D4E5F6G7H8I9J0 │
│ Automation: review │
│ Prompt: I just joined the team and need to understand the api-service project. Wha... │
╰─────────────────────────────────────────────────────────────────────────────────────────╯
▍ The **api-service** project is organized into 5 core modules:
1. **`src/api/routes/`** — HTTP route definitions (REST + GraphQL). Each domain
entity has its own router file (e.g. `users.py`, `orders.py`, `products.py`).
2. **`src/api/services/`** — Business logic layer. Services are injected into
routes via dependency injection. Key files: `user_service.py`,
`order_service.py`, `notification_service.py`.
3. **`src/api/models/`** — SQLAlchemy ORM models and Pydantic schemas. The
models map 1:1 to database tables; schemas handle request/response validation.
4. **`src/api/auth/`** — Authentication and authorization. Implements JWT-based
auth with role-based access control. Middleware in `auth_middleware.py`
intercepts every request before it reaches a route handler.
5. **`src/api/workers/`** — Background task processors using Celery. Handles
async jobs like email dispatch, report generation, and webhook delivery.
**Data flow**: Routes → Services → Models → Database. Auth middleware gates
every route. Workers are dispatched by services for async operations.
╭─ Commands Executed ──────────────────────────────────────────────────────────────╮
│ - agents resource inspect local/api-service-repo --tree │
│ - agents resource inspect local/api-service-repo --file src/api/__init__.py │
╰──────────────────────────────────────────────────────────────────────────────────╯
╭─ Usage ─────────────────────╮
│ Input Tokens: 2,480 │
│ Output Tokens: 846 │
│ Cost: $0.0128 │
│ Duration: 4.1s │
│ Tool Calls: 2 │
╰─────────────────────────────╯
✓ OK Orchestrator completed 2 commands
$ agents session tell --session 01HXR9A1B2C3D4E5F6G7H8I9J0 \
"Show me how authentication works. What's the flow from request to response?"
╭─ Plan Request ───────────────────────────────────────────────────────────────────╮
│ Actor: anthropic/claude-3.5-sonnet │
│ Session: 01HXR9A1B2C3D4E5F6G7H8I9J0 │
│ Automation: review │
│ Prompt: Show me how authentication works. What's the flow from request to res... │
╰──────────────────────────────────────────────────────────────────────────────────╯
▍ Here is the authentication flow in **api-service**:
**1. Request arrives** → `auth_middleware.py:34` extracts the `Authorization`
header and parses the Bearer token.
**2. Token validation** → `token_service.py:71` decodes the JWT using the
public key from `config.AUTH_PUBLIC_KEY`. It verifies:
- Signature (RS256)
- Expiry (`exp` claim, default 3600s)
- Issuer (`iss` must match `api-service`)
**3. User resolution** → `user_service.py:45` loads the user record from the
database using the `sub` claim. Returns 401 if the user is inactive or deleted.
**4. Permission check** → `rbac.py:22` evaluates the user's roles against the
endpoint's required permissions (defined as decorators on each route, e.g.
`@require_role("admin")`). Returns 403 on insufficient permissions.
**5. Context injection** → The authenticated user object is attached to
`request.state.user` so downstream route handlers can access it without
repeating lookups.
**Key files**: `src/api/auth/auth_middleware.py`, `src/api/auth/token_service.py`,
`src/api/auth/rbac.py`, `src/api/services/user_service.py`.
╭─ Commands Executed ──────────────────────────────────────────────────────────────────────╮
│ - agents resource inspect local/api-service-repo --file src/api/auth/auth_middleware.py │
│ - agents resource inspect local/api-service-repo --file src/api/auth/token_service.py │
│ - agents resource inspect local/api-service-repo --file src/api/auth/rbac.py │
╰──────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Usage ─────────────────────╮
│ Input Tokens: 3,960 │
│ Output Tokens: 1,024 │
│ Cost: $0.0187 │
│ Duration: 5.3s │
│ Tool Calls: 3 │
╰─────────────────────────────╯
✓ OK Orchestrator completed 3 commands
$ agents session tell --session 01HXR9A1B2C3D4E5F6G7H8I9J0 \
"I notice the team manually runs a dependency lock refresh every week. Can you create an action that automates this?"
╭─ Plan Request ──────────────────────────────────────────────────────────────────────────╮
│ Actor: anthropic/claude-3.5-sonnet │
│ Session: 01HXR9A1B2C3D4E5F6G7H8I9J0 │
│ Automation: review │
│ Prompt: I notice the team manually runs a dependency lock refresh every week. Can... │
╰─────────────────────────────────────────────────────────────────────────────────────────╯
▍ I've created a **local/refresh-locks** action that automates the weekly
dependency lock refresh. Here's what it does:
1. Checks out the target project's repository
2. Runs `pip compile` / `poetry lock` (auto-detected from project config)
3. Runs the test suite to verify nothing broke
4. Commits the updated lock files on a new branch
5. Opens a pull request for review
The action is now available. You can review the generated config with
`agents action show local/refresh-locks`.
╭─ Commands Executed ──────────────────────────────────────────────────────╮
│ - agents action create --config ./actions/refresh-locks.yaml │
╰──────────────────────────────────────────────────────────────────────────╯
╭─ Result ────────────────────────────╮
│ Action: local/refresh-locks │
│ Steps: 5 │
│ Trigger: manual │
╰───────────────────────────────────────╯
╭─ Usage ─────────────────────╮
│ Input Tokens: 5,210 │
│ Output Tokens: 1,380 │
│ Cost: $0.0249 │
│ Duration: 6.7s │
│ Tool Calls: 1 │
╰─────────────────────────────╯
✓ OK Orchestrator completed 1 command
$ agents session show 01HXR9A1B2C3D4E5F6G7H8I9J0
╭─ Session Summary ─────────────────────────────╮
│ ID: 01HXR9A1B2C3D4E5F6G7H8I9J0 │
│ Actor: anthropic/claude-3.5-sonnet │
│ Messages: 6 │
│ Created: 2026-02-11 09:15 │
│ Updated: 2026-02-11 09:28 │
│ Automation: review │
╰───────────────────────────────────────────────╯
╭─ Recent Messages ──────────────────────────────────────────────────────────────────────╮
│ user I just joined the team and need to understand the api-service project... │
│ assistant The api-service project is organized into 5 core modules... │
│ user Show me how authentication works... │
│ assistant Here is the authentication flow in api-service... │
│ user I notice the team manually runs a dependency lock refresh... │
│ assistant I've created a local/refresh-locks action that automates... │
╰────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Linked Plans ──────────────────────────────────╮
│ Plan ID Phase State │
│ ─────────────────────────── ─────── ──────── │
│ 01HXR9K4M7N2P3Q5R6S8T9U0V1 execute complete │
╰─────────────────────────────────────────────────╯
╭─ Token Usage ──────────────╮
│ Input Tokens: 11,650 │
│ Output Tokens: 3,250 │
│ Estimated Cost: $0.0564 │
╰────────────────────────────╯
✓ OK Session details loaded
$ agents session export --output /tmp/onboarding-session.json 01HXR9A1B2C3D4E5F6G7H8I9J0
╭─ Session Export ────────────────────────────╮
│ Session: 01HXR9A1B2C3D4E5F6G7H8I9J0 │
│ Output: /tmp/onboarding-session.json │
│ Messages: 6 │
│ Size: 38 KB │
│ Format: JSON │
╰─────────────────────────────────────────────╯
╭─ Contents ─────────────────╮
│ Messages: 6 │
│ Plan References: 1 │
│ Metadata Keys: 3 │
│ Actor Config: included │
│ Schema Version: v3 │
╰────────────────────────────╯
╭─ Integrity ──────────────────╮
│ Checksum: sha256:3e8f...b7d2 │
│ Encrypted: no │
╰──────────────────────────────╯
✓ OK Export completed
name: local/format-codebase
description: "Apply code formatting and import sorting"
definition_of_done: |
- ruff format passes with zero changes remaining
- ruff check --select I passes (imports sorted)
- All existing tests pass
- No semantic changes to any code
strategy_actor: anthropic/claude-3.5-sonnet
execution_actor: anthropic/claude-3.5-sonnet
automation_profile: full-auto
reusable: true
state: available
args:
- name: formatter_config
type: string
required: false
default: "pyproject.toml"
description: "Path to the formatter configuration file"
invariants:
- "Only whitespace and import ordering changes — no semantic modifications"
- "Every package must pass its own test suite after formatting"
$ agents action create --config ./actions/format-codebase.yaml
╭─ Action Created ─────────────────────────────────╮
│ Name: local/format-codebase │
│ State: available │
│ Strategy Actor: anthropic/claude-3.5-sonnet │
│ Execution Actor: anthropic/claude-3.5-sonnet │
│ Reusable: yes │
│ Read Only: no │
│ Created: 2026-02-11 14:00 │
╰──────────────────────────────────────────────────╯
╭─ Definition of Done ──────────────────────────────────────╮
│ - ruff format passes with zero changes remaining │
│ - ruff check --select I passes (imports sorted) │
│ - All existing tests pass │
│ - No semantic changes to any code │
╰───────────────────────────────────────────────────────────╯
╭─ Arguments ──────────────────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ──────────────── ────── ──────── ────────────────────────────────────── │
│ formatter_config string no Path to the formatter configuration file │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Invariants ──────────────────────────────────────────────────────────────────────╮
│ 1. Only whitespace and import ordering changes — no semantic modifications │
│ 2. Every package must pass its own test suite after formatting │
╰───────────────────────────────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────╮
│ Profile: full-auto │
│ Source: action │
╰───────────────────────────────────────╯
╭─ Usage ─────────────────────────────────────────────────────────╮
│ agents plan use local/format-codebase local/<project> │
│ --arg formatter_config="pyproject.toml" (optional) │
╰─────────────────────────────────────────────────────────────────╯
✓ OK Action created
# Register all 15 packages as resources and projects.
# resource add accepts a name — use it to link to project create.
for pkg in auth billing common gateway inventory notifications \
orders payments reporting search shipping users webhooks \
workers analytics; do
agents resource add git-checkout "local/pkg-${pkg}-repo" \
--path "/repos/monorepo/packages/${pkg}" --branch main
agents project create -d "Package: ${pkg}" \
--resource "local/pkg-${pkg}-repo" \
"local/pkg-${pkg}"
agents validation add --config "validations/pkg-${pkg}.yaml" --required "local/pkg-${pkg}-test"
agents validation attach --project "local/pkg-${pkg}" "local/pkg-${pkg}-test"
done
# Loop output — first 2 iterations shown, remaining 13 condensed
# --- auth ---
$ agents resource add git-checkout local/pkg-auth-repo \
--path /repos/monorepo/packages/auth --branch main
╭─ Resource ──────────────────────────────────────────╮
│ Name: local/pkg-auth-repo │
│ ID: 01HXR7B1A2B3C4D5E6F7G8H9J0 │
│ Type: git-checkout │
│ Physical/Virtual: physical │
│ Path: /repos/monorepo/packages/auth │
│ Branch: main │
│ Created: 2026-02-11 14:01 │
╰─────────────────────────────────────────────────────╯
╭─ Auto-discovered Children ─────────────────────────────────────────╮
│ ID Type Status │
│ ─────────────── ────────────── ───────────────── │
│ 01HXR7B1A2B3… git created │
│ 01HXR7B1A2B4… git-remote created │
│ 01HXR7B1A2B5… git-branch created │
│ + 22 git-commit resources │
│ + 134 git-tree-entry resources │
│ + 2 fs-directory + 11 fs-file │
╰────────────────────────────────────────────────────────────────────╯
╭─ Capabilities ─────────────────╮
│ Readable: yes │
│ Writable: yes │
│ Sandboxable: yes │
│ Checkpointable: yes │
│ Sandbox Strategy: git_worktree │
╰────────────────────────────────╯
✓ OK Resource registered (172 child resources discovered)
$ agents project create -d "Package: auth" \
--resource local/pkg-auth-repo local/pkg-auth
╭─ Project Created ──────────────────────────────╮
│ Name: local/pkg-auth │
│ Description: Package: auth │
│ Type: local │
│ Created: 2026-02-11 14:01 │
╰────────────────────────────────────────────────╯
╭─ Linked Resources ───────────────────────────────────────╮
│ Resource Type Read-Only │
│ ───────────────── ────────────── ───────── │
│ local/pkg-auth-repo git-checkout no │
╰──────────────────────────────────────────────────────────╯
╭─ Defaults ──────────────────────────────╮
│ Sandbox: git_worktree │
│ Validations: 0 │
│ Context Filters: none │
│ Automation Profile: (inherits global) │
╰─────────────────────────────────────────╯
✓ OK Project created
$ agents validation add --config validations/pkg-auth.yaml --required local/pkg-auth-test
╭─ Validation Registered ─────────────────────────────────────────────────╮
│ Name: local/pkg-auth-test │
│ Command: cd /repos/monorepo/packages/auth && pytest tests/ │
│ Mode: required │
│ Timeout: 300s │
╰─────────────────────────────────────────────────────────────────────────╯
✓ OK Validation registered
$ agents validation attach --project local/pkg-auth local/pkg-auth-test
✓ OK Validation attached to project local/pkg-auth
# --- billing ---
$ agents resource add git-checkout local/pkg-billing-repo \
--path /repos/monorepo/packages/billing --branch main
✓ OK Resource registered — Name: local/pkg-billing-repo (189 children)
$ agents project create -d "Package: billing" \
--resource local/pkg-billing-repo local/pkg-billing
✓ OK Project created — Name: local/pkg-billing
$ agents validation add --config validations/pkg-billing.yaml --required local/pkg-billing-test
✓ OK Validation registered — Name: local/pkg-billing-test
$ agents validation attach --project local/pkg-billing local/pkg-billing-test
✓ OK Validation attached to project local/pkg-billing
# ... (common, gateway, inventory, notifications, orders, payments,
# reporting, search, shipping, users, webhooks, workers, analytics)
# Each iteration: resource add → project create → validation add → validation attach
# All 15 packages registered.
# Run formatting across all packages.
# full-auto: Strategize, Execute, AND Apply all run without human intervention.
# Capture plan IDs so we can check results afterward.
PLAN_IDS=()
for pkg in auth billing common gateway inventory notifications \
orders payments reporting search shipping users webhooks \
workers analytics; do
PID=$(agents --format json plan use \
--automation-profile full-auto \
local/format-codebase "local/pkg-${pkg}" \
| jq -r '.data.plan_id')
PLAN_IDS+=("$PID")
done
# Plan creation output — first 2 shown, remaining condensed
# --- auth ---
$ agents plan use \
--automation-profile full-auto \
local/format-codebase local/pkg-auth
╭─ Plan Created ───────────────────────────────────╮
│ Plan ID: 01HXR7D1A2B3C4D5E6F7G8H9J0 │
│ Phase: strategize (running) │
│ Action: local/format-codebase │
│ Project: local/pkg-auth │
│ Automation: full-auto │
│ Attempt: 1 │
╰──────────────────────────────────────────────────╯
╭─ Invariants ─────────────────────────────────────────────────────────────╮
│ Scope Source Invariant │
│ ────── ────── ───────────────────────────────────────────────────── │
│ plan action Only whitespace and import ordering changes — no se… │
│ plan action Every package must pass its own test suite after fo… │
╰──────────────────────────────────────────────────────────────────────────╯
✓ OK Plan created — full-auto: strategize → execute → apply will proceed automatically
# --- billing ---
$ agents plan use \
--automation-profile full-auto \
local/format-codebase local/pkg-billing
╭─ Plan Created ───────────────────────────────────╮
│ Plan ID: 01HXR7D2B3C4D5E6F7G8H9J0K1 │
│ Phase: strategize (running) │
│ Action: local/format-codebase │
│ Project: local/pkg-billing │
│ Automation: full-auto │
│ Attempt: 1 │
╰──────────────────────────────────────────────────╯
✓ OK Plan created — full-auto: strategize → execute → apply will proceed automatically
# ... (common, gateway, inventory, notifications, orders, payments,
# reporting, search, shipping, users, webhooks, workers, analytics)
# 15 plans launched — all running full-auto in background.
# Wait for all plans to finish, then check results
$ agents plan list --state applied
╭─ Plans ──────────────────────────────────────────────────────────────────────────────────────────────╮
│ ID Phase State Action Project Elapsed │
│ ──────── ─────── ──────── ───────────────────── ───────────────────── ───────── │
│ 01HXR7D1 apply applied local/format-codebase local/pkg-auth 00:02:14 │
│ 01HXR7D2 apply applied local/format-codebase local/pkg-billing 00:02:31 │
│ 01HXR7D3 apply applied local/format-codebase local/pkg-common 00:01:47 │
│ 01HXR7D4 apply applied local/format-codebase local/pkg-gateway 00:02:08 │
│ 01HXR7D5 apply applied local/format-codebase local/pkg-inventory 00:01:55 │
│ 01HXR7D6 apply applied local/format-codebase local/pkg-notifications 00:02:42 │
│ 01HXR7D7 apply applied local/format-codebase local/pkg-orders 00:02:19 │
│ 01HXR7D8 apply applied local/format-codebase local/pkg-payments 00:01:58 │
│ 01HXR7D9 apply applied local/format-codebase local/pkg-reporting 00:02:36 │
│ 01HXR7DA apply applied local/format-codebase local/pkg-search 00:01:41 │
│ 01HXR7DB apply applied local/format-codebase local/pkg-shipping 00:02:22 │
│ 01HXR7DC apply applied local/format-codebase local/pkg-users 00:01:49 │
│ 01HXR7DD apply applied local/format-codebase local/pkg-webhooks 00:02:05 │
│ 01HXR7DE apply applied local/format-codebase local/pkg-analytics 00:02:11 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Filters ───────────────────╮
│ Phase: (any) │
│ State: applied │
│ Project: (any) │
│ Action: (any) │
╰─────────────────────────────╯
╭─ Summary ─────────────╮
│ Total: 14 │
│ Processing: 0 │
│ Completed: 14 │
│ Errored: 0 │
╰───────────────────────╯
✓ OK 14 plans listed
$ agents plan list --state failed
╭─ Plans ──────────────────────────────────────────────────────────────────────────────────────────────╮
│ ID Phase State Action Project Elapsed │
│ ──────── ─────── ─────── ───────────────────── ─────────────────── ───────── │
│ 01HXR7DF execute errored local/format-codebase local/pkg-workers 00:03:07 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Filters ───────────────────╮
│ Phase: (any) │
│ State: failed │
│ Project: (any) │
│ Action: (any) │
╰─────────────────────────────╯
╭─ Summary ─────────────╮
│ Total: 1 │
│ Processing: 0 │
│ Completed: 0 │
│ Errored: 1 │
╰───────────────────────╯
✓ OK 1 plan listed
name: local/review-pipeline
cleveragents:
version: "3.0"
template_engine: JINJA2
default_actor: orchestrator
global_context:
review_standards: "Google Python Style Guide"
severity_levels: "critical, high, medium, low, info"
actors:
orchestrator:
type: llm
config:
actor: anthropic/claude-3.5-sonnet
temperature: 0.1
system_prompt: |
You are a code review orchestrator. You coordinate specialized reviewers
and synthesize their findings into a unified review report.
Standards: {{ context.review_standards }}
Severity levels: {{ context.severity_levels }}
memory_enabled: true
security_reviewer:
type: llm
config:
actor: anthropic/claude-3.5-sonnet
temperature: 0.0
system_prompt: |
You are a security-focused code reviewer. Analyze code for:
- Injection vulnerabilities (SQL, command, XSS)
- Authentication and authorization flaws
- Sensitive data exposure
- Insecure cryptographic practices
- Dependency vulnerabilities
Report findings with severity levels: {{ context.severity_levels }}
performance_reviewer:
type: llm
config:
actor: anthropic/claude-3.5-sonnet
temperature: 0.0
system_prompt: |
You are a performance-focused code reviewer. Analyze code for:
- N+1 query patterns
- Unbounded loops or recursion
- Memory leaks and excessive allocation
- Missing caching opportunities
- Blocking operations in async contexts
Report findings with severity levels: {{ context.severity_levels }}
style_reviewer:
type: llm
config:
actor: anthropic/claude-3.5-sonnet
temperature: 0.0
system_prompt: |
You are a code style and maintainability reviewer.
Standards: {{ context.review_standards }}
Analyze code for:
- Naming conventions
- Function/class design
- Documentation completeness
- Test coverage patterns
- Code duplication
routes:
review_graph:
type: graph
entry_point: dispatch
checkpointing: true
nodes:
dispatch:
type: agent
agent: orchestrator
security:
type: agent
agent: security_reviewer
performance:
type: agent
agent: performance_reviewer
style:
type: agent
agent: style_reviewer
synthesize:
type: agent
agent: orchestrator
edges:
- from: dispatch
to: security
- from: dispatch
to: performance
- from: dispatch
to: style
- from: security
to: synthesize
- from: performance
to: synthesize
- from: style
to: synthesize
parallel_execution: true
$ agents actor add --config ./actors/review-pipeline.yaml \
--skill local/code-analysis \
--skill local/file-ops
╭─ Actor Added ──────────────────────────────────╮
│ Name: local/review-pipeline │
│ Provider: anthropic │
│ Model: claude-3.5-sonnet │
│ Default: yes │
│ Unsafe: no │
│ Type: graph │
╰────────────────────────────────────────────────╯
╭─ Config ─────────────────────────────────────────────╮
│ Path: ./actors/review-pipeline.yaml │
│ Hash: 4f7a1e3 │
│ Options: 6 │
│ Nodes: 5 │
│ Edges: 6 │
╰──────────────────────────────────────────────────────╯
╭─ Graph ────────────────────────────────────────────────────╮
│ Route: review_graph │
│ Entry Point: dispatch │
│ Checkpointing: yes │
│ Parallel Execution: yes │
│ │
│ Node Type Agent │
│ ─────────── ───── ────────────────────────────── │
│ dispatch agent orchestrator │
│ security agent security_reviewer │
│ performance agent performance_reviewer │
│ style agent style_reviewer │
│ synthesize agent orchestrator │
│ │
│ From To │
│ ─────────── ─────────── │
│ dispatch security │
│ dispatch performance │
│ dispatch style │
│ security synthesize │
│ performance synthesize │
│ style synthesize │
╰────────────────────────────────────────────────────────────╯
╭─ Capabilities ──────────────────────╮
│ - multi-stage code review │
│ - security analysis │
│ - performance analysis │
│ - style and maintainability checks │
│ - unified report synthesis │
╰─────────────────────────────────────╯
╭─ Skills ──────────────────────────────────────────╮
│ Skill Status │
│ ─────────────────── ──────────────────────── │
│ local/code-analysis attached │
│ local/file-ops attached │
╰───────────────────────────────────────────────────╯
✓ OK Actor added
name: local/deep-review
description: "Multi-stage deep code review with specialized reviewers"
definition_of_done: |
- Security analysis complete with all findings classified by severity
- Performance analysis complete with all findings classified by severity
- Style analysis complete with all findings classified by severity
- Unified review report generated with prioritized action items
- Critical and high-severity issues have suggested fixes
strategy_actor: local/review-pipeline
execution_actor: local/review-pipeline
read_only: true
reusable: true
state: available
args:
- name: target_paths
type: string
required: true
description: "Comma-separated file or directory paths to review"
- name: review_depth
type: string
required: false
default: "standard"
description: "Review depth: quick, standard, thorough"
$ agents action create --config ./actions/deep-review.yaml
╭─ Action Created ─────────────────────────────────────────────╮
│ Name: local/deep-review │
│ State: available │
│ Strategy Actor: local/review-pipeline │
│ Execution Actor: local/review-pipeline │
│ Reusable: yes │
│ Read Only: yes │
│ Created: 2026-02-11 16:30 │
╰──────────────────────────────────────────────────────────────╯
╭─ Definition of Done ──────────────────────────────────────────────────────╮
│ - Security analysis complete with all findings classified by severity │
│ - Performance analysis complete with all findings classified by severity │
│ - Style analysis complete with all findings classified by severity │
│ - Unified review report generated with prioritized action items │
│ - Critical and high-severity issues have suggested fixes │
╰───────────────────────────────────────────────────────────────────────────╯
╭─ Arguments ───────────────────────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ──────────── ────── ──────── ────────────────────────────────────────────── │
│ target_paths string yes Comma-separated file or directory paths to review │
│ review_depth string no Review depth: quick, standard, thorough │
╰───────────────────────────────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────╮
│ Profile: supervised │
│ Source: default │
╰───────────────────────────────────────╯
╭─ Usage ────────────────────────────────────────────────────────────────────────╮
│ agents plan use local/deep-review local/<project> │
│ --arg target_paths="src/auth/,src/routes/" │
│ --arg review_depth="thorough" (optional, default: "standard") │
╰────────────────────────────────────────────────────────────────────────────────╯
✓ OK Action created
$ agents plan use \
--automation-profile trusted \
--arg target_paths="src/auth/,src/routes/" \
--arg review_depth="thorough" \
local/deep-review local/api-service
╭─ Plan Created ───────────────────────────────────────╮
│ Plan: 01HXR8D2E3F4G5H6J7K8L9M0N1 │
│ Phase: strategize │
│ State: processing │
│ Action: local/deep-review │
│ Project: local/api-service │
│ Automation: trusted │
│ Attempt: 1 │
╰──────────────────────────────────────────────────────╯
╭─ Inputs ───────────────────────────────────────╮
│ - target_paths="src/auth/,src/routes/" │
│ - review_depth="thorough" │
│ - automation_profile=trusted │
╰────────────────────────────────────────────────╯
╭─ Actors ────────────────────────────────────────╮
│ Strategy: local/review-pipeline │
│ Execution: local/review-pipeline │
│ Estimation: (none) │
│ Actor Type: graph (5 nodes, 6 edges) │
╰─────────────────────────────────────────────────╯
╭─ Automation ───────────────────────────╮
│ Profile: trusted │
│ Source: plan override │
│ Read-Only: yes │
╰────────────────────────────────────────╯
╭─ Context ──────────────────────────╮
│ Resources: 1 (git-checkout) │
│ Indexed Files: 312 │
│ View: strategize │
│ Hot Token Budget: 24,000 │
╰────────────────────────────────────╯
╭─ Next Steps ─────────────────────────────────────────────────────────╮
│ Trusted profile — strategize and execute will proceed automatically. │
│ - agents plan status 01HXR8D2E3F4G5H6J7K8L9M0N1 │
│ - agents plan tree 01HXR8D2E3F4G5H6J7K8L9M0N1 │
╰──────────────────────────────────────────────────────────────────────╯
✓ OK Plan created
# Register the API repo resource (full output shown)
$ agents resource add git-checkout local/api-repo --path /repos/api --branch main
╭─ Resource ──────────────────────────────────────╮
│ Name: local/api-repo │
│ ID: 01HXRA1A2B3C4D5E6F7G8H9J0K │
│ Type: git-checkout │
│ Physical/Virtual: physical │
│ Path: /repos/api │
│ Branch: main │
│ Created: 2026-02-11 14:00 │
╰─────────────────────────────────────────────────╯
╭─ Auto-discovered Children ─────────────────────────────────────────╮
│ ID Type Status │
│ ─────────────── ────────────── ───────────────── │
│ 01HXRA1A2B3C… git created │
│ 01HXRA1A2B3D… git-remote created │
│ 01HXRA1A2B3E… git-branch created │
│ + 48 git-commit resources │
│ + 312 git-tree-entry resources │
│ + 6 fs-directory + 42 fs-file │
╰────────────────────────────────────────────────────────────────────╯
╭─ Capabilities ─────────────────╮
│ Readable: yes │
│ Writable: yes │
│ Sandboxable: yes │
│ Checkpointable: yes │
│ Sandbox Strategy: git_worktree │
╰────────────────────────────────╯
✓ OK Resource registered (412 child resources discovered)
# Register the remaining 3 resources (condensed output)
$ agents resource add git-checkout local/worker-repo --path /repos/worker --branch main
✓ OK Resource registered — Name: local/worker-repo (278 children)
$ agents resource add git-checkout local/frontend-repo --path /repos/frontend --branch main
✓ OK Resource registered — Name: local/frontend-repo (524 children)
$ agents resource add git-checkout local/protos-repo --path /repos/protos --branch main
✓ OK Resource registered — Name: local/protos-repo (96 children)
# Create the Backend API project (full output shown)
$ agents project create -d "Backend API" \
--resource local/api-repo \
--resource local/protos-repo \
--invariant "All new endpoints must have OpenAPI docs" \
--invariant "All database changes require migration scripts" \
local/api
╭─ Project Created ─────────────────────────╮
│ Name: local/api │
│ Description: Backend API │
│ Type: local │
│ Created: 2026-02-11 14:01 │
╰───────────────────────────────────────────╯
╭─ Linked Resources ───────────────────────────────────────╮
│ Resource Type Read-Only │
│ ───────────────── ────────────── ───────── │
│ local/api-repo git-checkout no │
│ local/protos-repo git-checkout no │
╰──────────────────────────────────────────────────────────╯
╭─ Invariants ─────────────────────────────────────────────╮
│ 1. All new endpoints must have OpenAPI docs │
│ 2. All database changes require migration scripts │
╰──────────────────────────────────────────────────────────╯
╭─ Defaults ──────────────────────────────╮
│ Sandbox: git_worktree │
│ Validations: 0 │
│ Context Filters: none │
│ Automation Profile: (inherits global) │
╰─────────────────────────────────────────╯
✓ OK Project created
# Create the remaining 3 projects (condensed output)
$ agents project create -d "Background worker service" \
--resource local/worker-repo \
--resource local/protos-repo \
--invariant "Workers must be idempotent" \
--invariant "All queue consumers must implement dead-letter handling" \
local/worker
✓ OK Project created — Name: local/worker
$ agents project create -d "Frontend dashboard" \
--resource local/frontend-repo \
--invariant "All components must have Storybook stories" \
--invariant "Accessibility: WCAG 2.1 AA compliance required" \
local/frontend
✓ OK Project created — Name: local/frontend
$ agents project create -d "Shared protobuf definitions" \
--resource local/protos-repo \
--invariant "Proto changes must be backward-compatible (no field renumbering)" \
local/protos
✓ OK Project created — Name: local/protos
# Register validations — first one with full output
$ agents validation add --config validations/api-tests.yaml --required local/api-tests
╭─ Validation Registered ─────────────────────────────╮
│ Name: local/api-tests │
│ Command: pytest tests/ && mypy src/ │
│ Mode: required │
│ Timeout: 300s │
╰─────────────────────────────────────────────────────╯
✓ OK Validation registered
$ agents validation add --config validations/worker-tests.yaml --required local/worker-tests
✓ OK Validation registered — Name: local/worker-tests
$ agents validation add --config validations/frontend-tests.yaml --required local/frontend-tests
✓ OK Validation registered — Name: local/frontend-tests
$ agents validation add --config validations/proto-lint.yaml --required local/proto-lint
✓ OK Validation registered — Name: local/proto-lint
# Attach validations to their respective projects
$ agents validation attach --project local/api local/api-tests
✓ OK Validation attached to project local/api
$ agents validation attach --project local/worker local/worker-tests
✓ OK Validation attached to project local/worker
$ agents validation attach --project local/frontend local/frontend-tests
✓ OK Validation attached to project local/frontend
$ agents validation attach --project local/protos local/proto-lint
✓ OK Validation attached to project local/protos
# Global invariant for this effort
$ agents invariant add --global \
"All inter-service communication must use the shared proto definitions"
╭─ Invariant Added ──────────────────────────────────────────────────────────────╮
│ Invariant: All inter-service communication must use the shared proto defs. │
│ Scope: global │
│ ID: inv_01HXRI1A │
╰────────────────────────────────────────────────────────────────────────────────╯
✓ OK Invariant added
name: local/build-notification-system
description: "Build a complete notification system spanning multiple services"
long_description: |
Implement a full notification system with:
- Backend API: notification preferences, send endpoints, delivery tracking
- Message Queue: notification event schemas, routing rules
- Worker: email/SMS/push delivery workers with retry logic
- Frontend: notification center UI, preference settings, real-time updates
The system must be designed for reliability (at-least-once delivery),
scalability (async processing via queue), and user control (per-channel
preferences with quiet hours).
definition_of_done: |
- Proto definitions for notification events are complete and compatible
- API endpoints: CRUD for preferences, send notification, list history
- Worker processes: email, SMS, push delivery with retry and dead-letter
- Frontend: notification center, preference settings, real-time badge
- Integration tests verify end-to-end notification flow
- All per-project validations pass
- API docs updated, Storybook stories added
strategy_actor: local/refactoring-strategist
execution_actor: anthropic/claude-3.5-sonnet
estimation_actor: anthropic/claude-3.5-sonnet
invariant_actor: local/invariant-resolver
automation_profile: cautious
reusable: false
state: available
args:
- name: notification_channels
type: string
required: true
description: "Comma-separated: email, sms, push, in-app"
- name: priority_levels
type: string
required: false
default: "critical,high,normal,low"
- name: max_retry_attempts
type: integer
required: false
default: 5
invariants:
- "Proto definitions must be implemented and reviewed before any service code"
- "Each service must be deployable independently after its changes"
- "Frontend must gracefully degrade if the notification API is unavailable"
- "All notification delivery must be async — API endpoints return immediately"
$ agents action create --config ./actions/build-notification-system.yaml
╭─ Action Created ──────────────────────────────────────────────────╮
│ Name: local/build-notification-system │
│ ID: 01HXRB1A2B3C4D5E6F7G8H9J0 │
│ State: available │
│ Strategy Actor: local/refactoring-strategist │
│ Execution Actor: anthropic/claude-3.5-sonnet │
│ Estimation Actor: anthropic/claude-3.5-sonnet │
│ Invariant Actor: local/invariant-resolver │
│ Reusable: no │
│ Read Only: no │
│ Created: 2026-02-11 14:02 │
╰───────────────────────────────────────────────────────────────────╯
╭─ Definition of Done ───────────────────────────────────────────────────╮
│ - Proto definitions for notification events are complete/compatible │
│ - API endpoints: CRUD for preferences, send notification, list hist. │
│ - Worker: email, SMS, push delivery with retry and dead-letter │
│ - Frontend: notification center, preference settings, real-time badge │
│ - Integration tests verify end-to-end notification flow │
│ - All per-project validations pass │
│ - API docs updated, Storybook stories added │
╰────────────────────────────────────────────────────────────────────────╯
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ────────────────────── ──────── ──────── ────────────────────────────────── │
│ notification_channels string yes Comma-separated: email, sms, push │
│ priority_levels string no (default: critical,high,normal,low) │
│ max_retry_attempts integer no (default: 5) │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────╮
│ Profile: cautious │
│ Source: action config │
╰───────────────────────────────────────╯
╭─ Action Invariants ───────────────────────────────────────────────────────────────────╮
│ 1. Proto definitions must be implemented and reviewed before any service code │
│ 2. Each service must be deployable independently after its changes │
│ 3. Frontend must gracefully degrade if the notification API is unavailable │
│ 4. All notification delivery must be async — API endpoints return immediately │
╰───────────────────────────────────────────────────────────────────────────────────────╯
╭─ Usage ────────────────────────────────────────────────────────────────────────────╮
│ agents plan use local/build-notification-system local/protos │
│ --arg notification_channels="email,push,in-app" │
╰────────────────────────────────────────────────────────────────────────────────────╯
✓ OK Action created
$ agents plan use \
--arg notification_channels="email,push,in-app" \
--arg priority_levels="critical,high,normal,low" \
--arg max_retry_attempts=5 \
local/build-notification-system \
local/protos local/api local/worker local/frontend
╭─ Plan Created ────────────────────────────────────────────────╮
│ Plan: 01HXRF1A2B3C4D5E6F7G8H9J0 │
│ Action: local/build-notification-system │
│ Projects: local/protos, local/api, │
│ local/worker, local/frontend │
│ Automation: cautious │
│ Attempt: 1 │
╰───────────────────────────────────────────────────────────────╯
╭─ Inputs ───────────────────────────────────────────────────────────╮
│ - notification_channels="email,push,in-app" │
│ - priority_levels="critical,high,normal,low" │
│ - max_retry_attempts=5 │
│ - automation_profile=cautious │
╰────────────────────────────────────────────────────────────────────╯
╭─ Actors ────────────────────────────────────────────╮
│ Strategy: local/refactoring-strategist │
│ Execution: anthropic/claude-3.5-sonnet │
│ Estimation: anthropic/claude-3.5-sonnet │
│ Invariant: local/invariant-resolver │
╰─────────────────────────────────────────────────────╯
╭─ Automation ──────────────────────────────╮
│ Profile: cautious │
│ Source: action config │
│ Read-Only: no │
╰───────────────────────────────────────────╯
╭─ Context ──────────────────────────╮
│ Resources: 4 (git-checkout) │
│ Indexed Files: 1,310 │
│ View: strategize │
│ Hot Token Budget: 32,000 │
╰────────────────────────────────────╯
╭─ Next Steps ──────────────────────────────────────────────╮
│ - agents plan tree 01HXRF1A2B3C4D5E6F7G8H9J0 │
│ - agents plan status 01HXRF1A2B3C4D5E6F7G8H9J0 │
│ - agents plan execute 01HXRF1A2B3C4D5E6F7G8H9J0 │
╰───────────────────────────────────────────────────────────╯
✓ OK Plan created
# View the full plan tree with child plans
$ agents plan tree 01HXRF1A2B3C4D5E6F7G8H9J0
╭─ Decision Tree ─────────────────────────────────────────────────────────────────────────────────────────╮
│ Plan: 01HXRF1A2B3C4D5E6F7G8H9J0 │
│ ├─ [prompt_definition] "Build notification system across 4 projects" │
│ ├─ [invariant_enforced] "All inter-service communication must use shared proto defs" │
│ ├─ [invariant_enforced] "Proto definitions must be implemented before any service code" │
│ ├─ [invariant_enforced] "Each service must be deployable independently after its changes" │
│ ├─ [invariant_enforced] "Frontend must gracefully degrade if notification API unavailable" │
│ ├─ [invariant_enforced] "All notification delivery must be async" │
│ ├─ [strategy_choice] "Phase 1: proto definitions first (blocking)" (conf: 0.95) │
│ ├─ [strategy_choice] "Phase 2: API + worker skeleton in parallel" (conf: 0.88) │
│ ├─ [strategy_choice] "Phase 3: worker delivery + frontend UI in parallel" (conf: 0.84) │
│ ├─ [strategy_choice] "Phase 4: integration wiring and e2e tests" (conf: 0.90) │
│ ├─ [strategy_choice] "Queue topology: fan-out vs point-to-point?" (conf: 0.55 — PAUSED) │
│ ├─ [child_plan] 01HXRC1A2B3C4D5E6F7G8H9J0 (Phase 1: proto defs) [execute/complete] │
│ ├─ [child_plan] 01HXRC2B3C4D5E6F7G8H9J0K1 (Phase 2a: API endpoints) [execute/processing] │
│ ├─ [child_plan] 01HXRC3C4D5E6F7G8H9J0K1L2 (Phase 2b: worker skeleton) [execute/processing] │
│ ├─ [child_plan] 01HXRC4D5E6F7G8H9J0K1L2M3 (Phase 3a: worker delivery) [strategize/pending] │
│ ├─ [child_plan] 01HXRC5E6F7G8H9J0K1L2M3N4 (Phase 3b: frontend UI) [strategize/pending] │
│ └─ [child_plan] 01HXRC6F7G8H9J0K1L2M3N4P5 (Phase 4: integration) [strategize/pending] │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Tree Summary ──────────────────╮
│ Nodes: 17 │
│ Depth: 2 │
│ Child Plans: 6 (1 done, 2 exec) │
│ Invariants: 5 │
│ Superseded: 0 (hidden) │
╰─────────────────────────────────╯
╭─ Decision IDs (for correction) ──────────────────────────╮
│ Root: 01HXRD1A2B3C4D5E6F7G8H9J │
│ Invariant 1: 01HXRD1B3C4D5E6F7G8H9J0 │
│ Invariant 2: 01HXRD1C4D5E6F7G8H9J0K1 │
│ Invariant 3: 01HXRD1D5E6F7G8H9J0K1L2 │
│ Invariant 4: 01HXRD1E6F7G8H9J0K1L2M3 │
│ Invariant 5: 01HXRD1F7G8H9J0K1L2M3N4 │
│ Strategy 1: 01HXRD2A3B4C5D6E7F8G9H0 │
│ Strategy 2: 01HXRD2B4C5D6E7F8G9H0J1 │
│ Strategy 3: 01HXRD2C5D6E7F8G9H0J1K2 │
│ Strategy 4: 01HXRD2D6E7F8G9H0J1K2L3 │
│ Paused: 01HXRD2E7F8G9H0J1K2L3M4 │
╰──────────────────────────────────────────────────────────╯
✓ OK Decision tree rendered
# The system paused at a decision about queue topology (confidence 0.55 < threshold 0.7)
$ agents plan explain 01HXRD2E7F8G9H0J1K2L3M4
╭─ Decision ──────────────────────────────────────────────────╮
│ ID: 01HXRD2E7F8G9H0J1K2L3M4 │
│ Type: strategy_choice │
│ Question: Queue topology for notification delivery │
│ Chosen: (none — paused for user input) │
│ Confidence: 0.55 │
│ Plan: 01HXRF1A2B3C4D5E6F7G8H9J0 │
│ Sequence: 5 of 5 strategy choices │
│ Created: 2026-02-11 14:04 │
╰─────────────────────────────────────────────────────────────╯
╭─ Alternatives Considered ──────────────────────────────────────────────────────╮
│ 1. Fan-out exchange: one exchange per event type, separate queues per channel │
│ 2. Point-to-point: single queue, worker routes by notification type │
│ 3. Topic-based: single exchange with routing keys for channel + priority │
╰────────────────────────────────────────────────────────────────────────────────╯
╭─ Impact ─────────────────────────╮
│ Downstream Decisions: 4 │
│ Downstream Child Plans: 3 │
│ Artifacts Produced: 0 (pending) │
│ Correction Impact: high │
╰──────────────────────────────────╯
╭─ Rationale ──────────────────────────────────────────────────────────╮
│ The confidence is low because both fan-out and topic-based patterns │
│ are viable. Fan-out gives independent scaling per channel but adds │
│ more exchanges. Topic-based is simpler but couples routing logic. │
│ The existing codebase uses RabbitMQ but has no precedent for this │
│ pattern — no strong signal either way. │
╰──────────────────────────────────────────────────────────────────────╯
╭─ Correction ──────────────────────────────────────────────────╮
│ agents plan correct 01HXRD2E7F8G9H0J1K2L3M4 │
│ --mode revert --guidance "Use fan-out exchange pattern..." │
╰───────────────────────────────────────────────────────────────╯
✓ OK Decision explained
# Provide guidance to resolve the paused decision
$ agents plan prompt 01HXRF1A2B3C4D5E6F7G8H9J0 \
"Use a fan-out exchange pattern: one exchange per notification event type, \
with separate queues per delivery channel. This matches our existing \
RabbitMQ setup in the order service."
╭─ Guidance Added ────────────────────────────────────────────────────────╮
│ Plan: 01HXRF1A2B3C4D5E6F7G8H9J0 │
│ Guidance: Use a fan-out exchange pattern: one exchange per │
│ notification event type, with separate queues per delivery │
│ channel. This matches our existing RabbitMQ setup. │
│ Scope: next execution step │
│ Phase: strategize │
│ State: awaiting_input → processing │
╰─────────────────────────────────────────────────────────────────────────╯
╭─ Decision Created ────────────────────────╮
│ Type: user_intervention │
│ ID: 01HXRD3A2B3C4D5E6F7G8H9J │
│ Parent: 01HXRD2E7F8G9H0J1K2L3M4 │
╰───────────────────────────────────────────╯
╭─ Queue ────╮
│ Pending: 1 │
│ Applied: 0 │
╰────────────╯
✓ OK Guidance queued
# Check which child plan failed
$ agents plan status 01HXRC4D5E6F7G8H9J0K1L2M3
╭─ Plan Status ──────────────────────────────────────────────╮
│ Plan: 01HXRC4D5E6F7G8H9J0K1L2M3 │
│ Phase: execute │
│ State: errored │
│ Action: local/build-notification-system (child plan) │
│ Project: local/worker │
│ Automation: cautious │
│ Attempt: 1 │
│ Parent: 01HXRF1A2B3C4D5E6F7G8H9J0 │
╰────────────────────────────────────────────────────────────╯
╭─ Progress ───────────╮
│ ✓ Strategize │
│ ✗ Execute │
│ ○ Apply (skipped) │
╰──────────────────────╯
╭─ Error Detail ──────────────────────────────────────────────────────────╮
│ Error: Validation failed: ModuleNotFoundError: No module named │
│ 'twilio' — SMS provider SDK not installed │
│ Tool: execute_command (pip install check) │
│ Step: 3 of 8 │
│ Checkpoint: cp_01HXRC4D (sandbox state preserved) │
│ Recoverable: yes — use "agents plan prompt" to provide guidance │
╰─────────────────────────────────────────────────────────────────────────╯
╭─ Cost ───────────────╮
│ Tokens Used: 14,280 │
│ Cost So Far: $0.048 │
╰──────────────────────╯
✗ ERROR Plan errored — use `agents plan prompt` to resume or `agents plan cancel` to abort
# Correct the strategy — tell it to skip SMS for now
$ agents plan correct 01HXRD4A2B3C4D5E6F7G8H9J \
--mode append \
--guidance "Skip SMS delivery for the initial implementation. \
Add a placeholder worker that logs a warning. \
SMS support will be added in a follow-up action."
╭─ Correction ─────────────────────────────────────────────────╮
│ Mode: append │
│ Impact: adds to existing subtree, no rollback │
│ New Decision: 01HXRD5A2B3C4D5E6F7G8H9J │
│ Appended After: 01HXRD4A2B3C4D5E6F7G8H9J │
│ Attempt: 2 │
╰──────────────────────────────────────────────────────────────╯
╭─ Append Detail ────────────────────────────────────────────────────╮
│ Original decision preserved: yes │
│ Existing artifacts kept: yes │
│ Additional work: re-execute with SMS placeholder │
│ The worker delivery plan will be re-executed. Email and push │
│ workers are kept; SMS worker replaced with a logging stub. │
│ Other child plans (API, frontend, integration) are unaffected. │
╰────────────────────────────────────────────────────────────────────╯
╭─ Queued ──────────────╮
│ Re-execute: 1 child │
│ ETA: 3m │
╰───────────────────────╯
✓ OK Append correction queued
# Apply proto definitions first (other plans depend on this)
$ agents plan apply --yes 01HXRC1A2B3C4D5E6F7G8H9J0
╭─ Apply Summary ──────────────────────────────────────────╮
│ Plan: 01HXRC1A2B3C4D5E6F7G8H9J0 │
│ Artifacts: 3 files updated │
│ Changes: 84 insertions, 0 deletions │
│ Project: local/protos │
│ Applied At: 2026-02-11 14:18 │
╰──────────────────────────────────────────────────────────╯
╭─ Validation ──────────────────────────────────────────╮
│ buf lint: passed │
│ buf breaking: passed (no breaking changes) │
│ Duration: 2.1s │
╰───────────────────────────────────────────────────────╯
╭─ Sandbox Cleanup ─────────╮
│ Worktree: removed │
│ Branch: merged to main │
│ Checkpoint: archived │
╰───────────────────────────╯
╭─ Plan Lifecycle ─────────────────────────╮
│ Phase: apply │
│ State: applied │
│ Total Duration: 00:02:41 │
│ Total Cost: $0.024 │
│ Decisions Made: 4 │
│ Child Plans: 0 │
╰──────────────────────────────────────────╯
✓ OK Changes applied
# Apply API and worker in parallel
$ agents plan apply --yes 01HXRC2B3C4D5E6F7G8H9J0K1
✓ OK Changes applied — Plan: 01HXRC2B...J0K1 Project: local/api (8 files, +246 -12)
$ agents plan apply --yes 01HXRC3C4D5E6F7G8H9J0K1L2
✓ OK Changes applied — Plan: 01HXRC3C...K1L2 Project: local/worker (5 files, +178 -4)
# Apply worker delivery and frontend
$ agents plan apply --yes 01HXRC4D5E6F7G8H9J0K1L2M3
✓ OK Changes applied — Plan: 01HXRC4D...L2M3 Project: local/worker (6 files, +312 -18)
$ agents plan apply --yes 01HXRC5E6F7G8H9J0K1L2M3N4
✓ OK Changes applied — Plan: 01HXRC5E...M3N4 Project: local/frontend (12 files, +487 -22)
# Apply integration tests
$ agents plan apply --yes 01HXRC6F7G8H9J0K1L2M3N4P5
✓ OK Changes applied — Plan: 01HXRC6F...N4P5 Projects: local/api, local/worker (4 files, +156 -0)
# Apply the parent plan (finalizes everything)
$ agents plan apply --yes 01HXRF1A2B3C4D5E6F7G8H9J0
╭─ Apply Summary ───────────────────────────────────────────╮
│ Plan: 01HXRF1A2B3C4D5E6F7G8H9J0 │
│ Artifacts: 38 files across 4 projects │
│ Changes: 1,463 insertions, 56 deletions │
│ Projects: local/protos, local/api, │
│ local/worker, local/frontend │
│ Applied At: 2026-02-11 14:32 │
╰───────────────────────────────────────────────────────────╯
╭─ Validation ─────────────────────────────────────────╮
│ local/protos: passed (buf lint + breaking) │
│ local/api: passed (pytest 48/48, mypy 0 err) │
│ local/worker: passed (pytest 31/31, mypy 0) │
│ local/frontend: passed (tests + lint) │
│ Duration: 34.2s │
╰──────────────────────────────────────────────────────╯
╭─ Sandbox Cleanup ─────────╮
│ Worktrees: 4 removed │
│ Branches: merged to main │
│ Checkpoints: archived │
╰───────────────────────────╯
╭─ Plan Lifecycle ────────────────────────╮
│ Phase: apply │
│ State: applied │
│ Total Duration: 00:30:14 │
│ Total Cost: $0.847 │
│ Decisions Made: 42 │
│ Child Plans: 6 (all completed) │
│ Corrections: 1 │
╰─────────────────────────────────────────╯
╭─ Next Steps ──────╮
│ - Review git diff │
│ - Commit changes │
╰───────────────────╯
✓ OK Changes applied
name: local/db-cautious
description: "Auto for most tasks, manual for database and security decisions"
auto_strategize: 0.0
auto_execute: 0.3
auto_apply: 1.0
auto_decisions_strategize: 0.4
auto_decisions_execute: 0.6
auto_validation_fix: 0.5
auto_strategy_revision: 0.8
auto_reversion_from_apply: 0.9
auto_child_plans: 0.3
auto_retry_transient: 0.0
auto_checkpoint_restore: 0.0
require_sandbox: true
require_checkpoints: true
allow_unsafe_tools: false
$ agents automation-profile add --config ./profiles/db-cautious.yaml
╭─ Profile Registered ──────────────────────────────────────────────────────╮
│ Name: local/db-cautious │
│ Description: Auto for most tasks, manual for database and security │
│ decisions │
│ Created: 2026-02-11 09:00 │
╰───────────────────────────────────────────────────────────────────────────╯
╭─ Confidence Thresholds ────────────────╮
│ auto_strategize: 0.0 │
│ auto_execute: 0.3 │
│ auto_apply: 1.0 │
│ auto_decisions_strategize: 0.4 │
│ auto_decisions_execute: 0.6 │
│ auto_validation_fix: 0.5 │
│ auto_strategy_revision: 0.8 │
│ auto_child_plans: 0.3 │
│ auto_retry_transient: 0.0 │
│ auto_checkpoint_restore: 0.0 │
│ require_sandbox: true │
│ require_checkpoints: true │
│ allow_unsafe_tools: false │
╰────────────────────────────────────────╯
✓ OK Profile registered
$ agents config set core.automation-profile local/db-cautious --project local/api-service
╭─ Config Updated ─────────────────────────────────╮
│ Key: core.automation-profile │
│ Value: local/db-cautious │
│ Previous: review │
│ Source: config │
│ Scope: project (local/api-service) │
╰──────────────────────────────────────────────────╯
╭─ Effective ────────────────────────────────────╮
│ Sessions: new sessions on local/api-service │
│ Plans: future plans (unless overridden) │
│ Existing: unchanged │
╰────────────────────────────────────────────────╯
╭─ Saved To ──────────────────────────╮
│ File: ~/.cleveragents/config.toml │
│ Line: 24 │
╰─────────────────────────────────────╯
✓ OK Config updated
# Add invariants that force escalation on sensitive operations
$ agents invariant add --project local/api-service \
"Any change to database migration files requires explicit human approval"
╭─ Invariant Added ───────────────────────────────────────────────────────────────╮
│ Project: local/api-service │
│ Invariant: Any change to database migration files requires explicit human │
│ approval │
│ Scope: project │
│ ID: inv_01HXRBA1A │
╰─────────────────────────────────────────────────────────────────────────────────╯
✓ OK Invariant added
$ agents invariant add --project local/api-service \
"Changes to authentication or authorization logic require security review"
╭─ Invariant Added ───────────────────────────────────────────────────────────────╮
│ Project: local/api-service │
│ Invariant: Changes to authentication or authorization logic require │
│ security review │
│ Scope: project │
│ ID: inv_01HXRBA2B │
╰─────────────────────────────────────────────────────────────────────────────────╯
✓ OK Invariant added
$ agents plan use \
--arg target_module="src/auth" \
local/refactor-to-orm local/api-service
╭─ Plan Created ─────────────────────────────────────╮
│ Plan ID: 01HXRBG1H2I3J4K5L6M7N8O9P0 │
│ Phase: strategize (running) │
│ Action: local/refactor-to-orm │
│ Project: local/api-service │
│ Automation: local/db-cautious │
│ Attempt: 1 │
╰────────────────────────────────────────────────────╯
╭─ Inputs ─────────────────────╮
│ - target_module=src/auth │
╰──────────────────────────────╯
╭─ Actors ───────────────────────────────╮
│ Strategy: anthropic/claude-3.5-sonnet │
│ Execution: anthropic/claude-3.5-sonnet │
│ Invariant: local/invariant-resolver │
╰────────────────────────────────────────╯
╭─ Plan Invariants ──────────────────────────────────────────────────────────────╮
│ Scope Source Invariant │
│ ──────── ─────── ────────────────────────────────────────────────────── │
│ project config Any change to database migration files requires explicit │
│ human approval │
│ project config Changes to authentication or authorization logic require │
│ security review │
╰────────────────────────────────────────────────────────────────────────────────╯
╭─ Next Steps ─────────────────────────────────────────╮
│ - agents plan status 01HXRBG1H2I3J4K5L6M7N8O9P0 │
│ - agents plan tree 01HXRBG1H2I3J4K5L6M7N8O9P0 │
╰──────────────────────────────────────────────────────╯
✓ OK Plan created — strategize in progress
# The plan pauses — check why
$ agents plan status 01HXRBG1H2I3J4K5L6M7N8O9P0
╭─ Plan Status ───────────────────────────────────────╮
│ Plan: 01HXRBG1H2I3J4K5L6M7N8O9P0 │
│ Phase: execute │
│ State: awaiting_input │
│ Action: local/refactor-to-orm │
│ Project: local/api-service │
│ Automation: local/db-cautious │
│ Attempt: 1 │
╰─────────────────────────────────────────────────────╯
╭─ Progress ────────────────╮
│ ✓ Strategize │
│ ⏸ Execute (paused) │
│ ○ Apply (waiting) │
╰───────────────────────────╯
╭─ Escalation ───────────────────────────────────────────────────────────────╮
│ ⚠ Decision paused — invariant forced escalation │
│ Decision: 01HXRBD1E2F3G4H5I6J7K8L9 │
│ Type: implementation_choice │
│ Question: Create Alembic migration for users table schema change? │
│ Confidence: 0.82 (would auto-proceed, but invariant overrides) │
│ Invariant: "Any change to database migration files requires explicit │
│ human approval" │
╰────────────────────────────────────────────────────────────────────────────╯
╭─ Timing ───────────╮
│ Started: 09:05:12 │
│ Elapsed: 00:02:48 │
│ ETA: (paused) │
╰────────────────────╯
╭─ Cost ───────────────╮
│ Tokens Used: 18,740 │
│ Cost So Far: $0.062 │
│ Estimated: $0.095 │
╰──────────────────────╯
⚠ WARN Plan paused — awaiting human input for escalated decision
# Review the decision requiring approval
$ agents plan explain 01HXRBD1E2F3G4H5I6J7K8L9
╭─ Decision ───────────────────────────────────────────────────────────╮
│ ID: 01HXRBD1E2F3G4H5I6J7K8L9 │
│ Type: implementation_choice │
│ Question: Create Alembic migration for users table schema change? │
│ Chosen: Add nullable `orm_version` column with migration │
│ Confidence: 0.82 │
│ Plan: 01HXRBG1H2I3J4K5L6M7N8O9P0 │
│ Sequence: 4 of 7 │
│ Created: 2026-02-11 09:07 │
╰──────────────────────────────────────────────────────────────────────╯
╭─ Alternatives Considered ────────────────────────────────────────────╮
│ 1. Add nullable `orm_version` column with migration (chosen) │
│ 2. Use a shadow table approach (no schema change) │
│ 3. In-place column rename via ALTER (risky in production) │
╰──────────────────────────────────────────────────────────────────────╯
╭─ Escalation Reason ──────────────────────────────────────────────────╮
│ Invariant Override: inv_01HXRBA1A │
│ Text: "Any change to database migration files requires explicit │
│ human approval" │
│ Effect: Confidence 0.82 would normally auto-proceed (threshold │
│ 0.6), but invariant forces manual escalation regardless │
╰──────────────────────────────────────────────────────────────────────╯
╭─ Impact ─────────────────────────╮
│ Downstream Decisions: 3 │
│ Downstream Child Plans: 0 │
│ Artifacts Produced: 2 │
│ Correction Impact: medium │
╰──────────────────────────────────╯
╭─ Rationale ──────────────────────────────────────────────────────────╮
│ The auth module currently uses raw SQL queries. Refactoring to ORM │
│ requires an `orm_version` tracking column on the users table. │
│ Adding as nullable first avoids downtime; the backfill + NOT NULL │
│ constraint can follow in a second migration after data is populated. │
╰──────────────────────────────────────────────────────────────────────╯
╭─ Correction ────────────────────────────────────────────────╮
│ agents plan prompt 01HXRBG1H2I3J4K5L6M7N8O9P0 │
│ "Approved. <guidance>" │
│ agents plan correct 01HXRBD1E2F3G4H5I6J7K8L9 │
│ --mode revert --guidance "Use approach 2 instead..." │
╰─────────────────────────────────────────────────────────────╯
✓ OK Decision explained
# Approve the migration approach with specific guidance
$ agents plan prompt 01HXRBG1H2I3J4K5L6M7N8O9P0 \
"Approved. Use a two-phase migration: first add the column as nullable, \
then in a separate migration add the NOT NULL constraint after backfill."
╭─ Guidance Added ──────────────────────────────────────────────────────────╮
│ Plan: 01HXRBG1H2I3J4K5L6M7N8O9P0 │
│ Guidance: Approved. Use a two-phase migration: first add the column as │
│ nullable, then in a separate migration add the NOT NULL │
│ constraint after backfill. │
│ Scope: next execution step │
│ Phase: execute │
│ State: awaiting_input → processing │
╰───────────────────────────────────────────────────────────────────────────╯
╭─ Decision Created ──────────────────────────────╮
│ Type: user_intervention │
│ ID: 01HXRBE2F3G4H5I6J7K8L9M0 │
│ Parent: 01HXRBD1E2F3G4H5I6J7K8L9 │
╰─────────────────────────────────────────────────╯
╭─ Queue ────╮
│ Pending: 1 │
│ Applied: 0 │
╰────────────╯
✓ OK Guidance queued — execution resuming
# Configure server connection
$ agents config set server.url https://agents.example.com
╭─ Config Updated ──────────────────────────────╮
│ Key: server.url │
│ Value: https://agents.example.com │
│ Previous: (not set) │
│ Source: config │
│ Scope: global │
╰───────────────────────────────────────────────╯
╭─ Saved To ──────────────────────────╮
│ File: ~/.cleveragents/config.toml │
│ Line: 3 │
╰─────────────────────────────────────╯
✓ OK Config updated
$ agents config set server.token "tok_01HXR..."
╭─ Config Updated ──────────────────────────╮
│ Key: server.token │
│ Value: tok_01HXR... (redacted) │
│ Previous: (not set) │
│ Source: config │
│ Scope: global │
╰───────────────────────────────────────────╯
╭─ Saved To ──────────────────────────╮
│ File: ~/.cleveragents/config.toml │
│ Line: 4 │
╰─────────────────────────────────────╯
✓ OK Config updated
$ agents config set core.namespace myteam
╭─ Config Updated ──────────────────────╮
│ Key: core.namespace │
│ Value: myteam │
│ Previous: local │
│ Source: config │
│ Scope: global │
╰───────────────────────────────────────╯
╭─ Saved To ──────────────────────────╮
│ File: ~/.cleveragents/config.toml │
│ Line: 5 │
╰─────────────────────────────────────╯
✓ OK Config updated
# Verify connection
$ agents diagnostics
╭─ Checks ────────────────────────────────────────────────╮
│ Check Status Details │
│ ─────────────── ────── ─────────────────────── │
│ Config file OK readable │
│ Database OK writable │
│ Anthropic key OK configured │
│ OPENAI_API_KEY WARN missing │
│ Disk space OK 4.8 GB free │
│ Text index OK tantivy 0.22 │
│ Vector index OK faiss (CPU) │
│ Graph store OK neo4j 5.15 │
│ File permissions OK data dir r/w │
│ Git OK git 2.43.0 │
│ Server OK connected (agents.example.com) │
│ Namespace OK myteam (4 members) │
╰─────────────────────────────────────────────────────────╯
╭─ Summary ─────────╮
│ Checks: 12 total │
│ Warnings: 1 │
│ Errors: 0 │
│ Duration: 0.8s │
╰───────────────────╯
╭─ Server ────────────────────────────╮
│ URL: https://agents.example.com │
│ Auth: valid (tok_01HXR...) │
│ Namespace: myteam │
│ Members: 4 │
│ Shared Actions: 7 │
│ Shared Actors: 3 │
│ Latency: 42ms │
╰─────────────────────────────────────╯
╭─ Recommendations ──────────────────────────────╮
│ - Set OPENAI_API_KEY to enable OpenAI models │
╰────────────────────────────────────────────────╯
⚠ WARN 1 warning requires attention
# Publish an action to the team namespace (visible to all team members)
$ agents action create --config ./actions/generate-tests.yaml
╭─ Action Created ──────────────────────────────────────╮
│ Name: myteam/generate-tests │
│ ID: 01HXRC1A2B3C4D5E6F7G8H9J0K │
│ State: available │
│ Strategy Actor: anthropic/claude-3.5-sonnet │
│ Execution Actor: anthropic/claude-3.5-sonnet │
│ Reusable: yes │
│ Read Only: no │
│ Created: 2026-02-11 09:15 │
╰───────────────────────────────────────────────────────╯
╭─ Definition of Done ───────────────────────────────────╮
│ All target modules have test coverage above 80% │
│ Tests pass in CI without flaky failures │
╰────────────────────────────────────────────────────────╯
╭─ Arguments ─────────────────────────────────────────────────────╮
│ Name Type Required Description │
│ ────────────── ────── ──────── ─────────────────────── │
│ target_module string yes Module path to generate tests │
╰─────────────────────────────────────────────────────────────────╯
╭─ Automation ────────────────────────╮
│ Profile: supervised │
│ Source: action default │
╰─────────────────────────────────────╯
╭─ Usage ───────────────────────────────────────────────────────────╮
│ agents plan use myteam/generate-tests local/my-project │
│ --arg target_module="src/payments" │
╰───────────────────────────────────────────────────────────────────╯
✓ OK Action created
# Publish a shared actor
$ agents actor add --config ./actors/review-pipeline.yaml
╭─ Actor Added ──────────────────────────────────╮
│ Name: myteam/review-pipeline │
│ Provider: anthropic │
│ Model: claude-3.5-sonnet │
│ Default: no │
│ Unsafe: no │
│ Type: graph │
╰────────────────────────────────────────────────╯
╭─ Config ───────────────────────────────╮
│ Path: ./actors/review-pipeline.yaml │
│ Hash: 5a7c2e1 │
│ Options: 3 │
│ Nodes: 5 │
│ Edges: 6 │
╰────────────────────────────────────────╯
╭─ Capabilities ──────────────────╮
│ - multi-stage code review │
│ - security analysis │
│ - performance analysis │
│ - style checking │
╰─────────────────────────────────╯
╭─ Tools ────────────────────────╮
│ Tool Read-Only Safe │
│ ──────────── ───────── ──── │
│ read_file yes yes │
│ search_files yes yes │
│ git_diff yes yes │
│ run_tests yes yes │
╰────────────────────────────────╯
✓ OK Actor added
# List available actions (team namespace)
$ agents action list --namespace myteam
╭─ Actions ────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Name State Strategy Actor Execution Actor Reusable │
│ ──────────────────────── ───────── ─────────────────────────── ─────────────────────────── ──────── │
│ myteam/generate-tests available anthropic/claude-3.5-sonnet anthropic/claude-3.5-sonnet ✓ │
│ myteam/deep-review available myteam/review-pipeline myteam/review-pipeline ✓ │
│ myteam/format-codebase available anthropic/claude-3.5-sonnet anthropic/claude-3.5-sonnet ✓ │
│ myteam/security-audit available anthropic/claude-3.5-sonnet anthropic/claude-3.5-sonnet ✓ │
│ myteam/refactor-to-orm available anthropic/claude-3.5-sonnet anthropic/claude-3.5-sonnet ✗ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Filters ──────────────────╮
│ State: (any) │
│ Namespace: myteam │
╰────────────────────────────╯
╭─ Summary ──────────────────╮
│ Total: 5 │
│ Available: 5 │
│ Archived: 0 │
╰────────────────────────────╯
✓ OK 5 actions listed
# Configure server connection
$ agents config set server.url https://agents.example.com
╭─ Config Updated ──────────────────────────────╮
│ Key: server.url │
│ Value: https://agents.example.com │
│ Previous: (not set) │
│ Source: config │
│ Scope: global │
╰───────────────────────────────────────────────╯
✓ OK Config updated
$ agents config set server.token "tok_01HXS..."
╭─ Config Updated ──────────────────────────╮
│ Key: server.token │
│ Value: tok_01HXS... (redacted) │
│ Previous: (not set) │
│ Source: config │
│ Scope: global │
╰───────────────────────────────────────────╯
✓ OK Config updated
$ agents config set core.namespace myteam
╭─ Config Updated ──────────────────────╮
│ Key: core.namespace │
│ Value: myteam │
│ Previous: local │
│ Source: config │
│ Scope: global │
╰───────────────────────────────────────╯
✓ OK Config updated
# Use the team's shared action
$ agents plan use \
--arg target_module="src/payments" \
myteam/generate-tests local/payment-service
╭─ Plan Created ─────────────────────────────────────────╮
│ Plan ID: 01HXRC2B3C4D5E6F7G8H9J0K1L2 │
│ Phase: strategize (running) │
│ Action: myteam/generate-tests │
│ Project: local/payment-service │
│ Automation: supervised │
│ Attempt: 1 │
╰────────────────────────────────────────────────────────╯
╭─ Inputs ──────────────────────╮
│ - target_module=src/payments │
╰───────────────────────────────╯
╭─ Actors ──────────────────────────────────╮
│ Strategy: anthropic/claude-3.5-sonnet │
│ Execution: anthropic/claude-3.5-sonnet │
│ Source: server (myteam) │
╰───────────────────────────────────────────╯
╭─ Context ───────────────────────╮
│ Resources: 1 (repo) │
│ Indexed Files: 189 │
│ View: strategize │
│ Hot Token Budget: 12,000 │
╰─────────────────────────────────╯
╭─ Next Steps ──────────────────────────────────────────────╮
│ - agents plan status 01HXRC2B3C4D5E6F7G8H9J0K1L2 │
│ - agents plan tree 01HXRC2B3C4D5E6F7G8H9J0K1L2 │
╰───────────────────────────────────────────────────────────╯
✓ OK Plan created — strategize in progress
# List all plans across the team
$ agents plan list --namespace myteam
╭─ Plans ────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ID Phase State Action Project User Elapsed │
│ ──────── ──────── ────────── ────────────────────── ───────────────────── ─────── ───────── │
│ 01HXRC2B execute processing myteam/generate-tests local/payment-service jdoe 00:04:12 │
│ 01HXRC3C apply applied myteam/deep-review local/api-service asmith 00:08:47 │
│ 01HXRC4D execute processing myteam/generate-tests local/api-service mwong 00:02:35 │
│ 01HXRC5E apply applied myteam/format-codebase local/frontend blee 00:01:58 │
│ 01HXRC6F execute awaiting myteam/security-audit local/worker-service asmith 00:06:20 │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Filters ──────────────────╮
│ Phase: (any) │
│ State: (any) │
│ Namespace: myteam │
│ Project: (any) │
│ Action: (any) │
╰────────────────────────────╯
╭─ Summary ─────────────╮
│ Total: 5 │
│ Processing: 2 │
│ Completed: 2 │
│ Awaiting: 1 │
│ Errored: 0 │
╰───────────────────────╯
✓ OK 5 plans listed
# See who is running what — filter to executing state
$ agents plan list --namespace myteam --state processing
╭─ Plans ────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ID Phase State Action Project User Elapsed │
│ ──────── ─────── ────────── ───────────────────── ───────────────────── ─────── ───────── │
│ 01HXRC2B execute processing myteam/generate-tests local/payment-service jdoe 00:04:12 │
│ 01HXRC4D execute processing myteam/generate-tests local/api-service mwong 00:02:35 │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Filters ──────────────────────╮
│ Phase: (any) │
│ State: processing │
│ Namespace: myteam │
│ Project: (any) │
│ Action: (any) │
╰────────────────────────────────╯
╭─ Summary ─────────────╮
│ Total: 2 │
│ Processing: 2 │
│ Completed: 0 │
│ Errored: 0 │
╰───────────────────────╯
✓ OK 2 plans listed
# Check the plan status
$ agents plan status 01HXRCF1G2H3I4J5K6L7M8N9O0
╭─ Plan Status ───────────────────────────────────────╮
│ Plan: 01HXRCF1G2H3I4J5K6L7M8N9O0 │
│ Phase: apply │
│ State: errored │
│ Action: local/optimize-db-connections │
│ Project: local/api-service │
│ Automation: trusted │
│ Attempt: 1 │
╰─────────────────────────────────────────────────────╯
╭─ Progress ─────────────────────╮
│ ✓ Strategize │
│ ✓ Execute │
│ ✗ Apply (post-apply failure) │
╰────────────────────────────────╯
╭─ Timing ──────────────────────────╮
│ Started: 2026-02-11 08:30:00 │
│ Applied At: 2026-02-11 08:42:18 │
│ Failed At: 2026-02-11 08:44:05 │
│ Total Duration: 00:14:05 │
╰───────────────────────────────────╯
╭─ Result ───────────────────────────────────────────────╮
│ Decisions Made: 6 │
│ Child Plans: 0 │
│ Artifacts: 4 files updated │
│ Validations: 2/3 passed (1 FAILED post-apply) │
│ Total Cost: $0.072 │
╰────────────────────────────────────────────────────────╯
╭─ Error ──────────────────────────────────────────────────────────────────────╮
│ Post-apply health check failed: connection pool exhaustion detected │
│ Impact: API response times increased 10x, 503 errors in production │
│ Root Cause Decision: 01HXRCD3E4F5G6H7I8J9K0L1 │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Recovery Options ──────────────────────────────────────────────────╮
│ - agents plan rollback — restore to a previous checkpoint │
│ - agents plan correct — revert and re-execute with guidance │
│ - agents plan explain — investigate the root cause decision │
╰─────────────────────────────────────────────────────────────────────╯
✗ ERROR Plan applied but post-apply validation failed
# Review the decision tree to understand what was done
$ agents plan tree 01HXRCF1G2H3I4J5K6L7M8N9O0
╭─ Decision Tree ────────────────────────────────────────────────────────────────────────────────╮
│ Plan: 01HXRCF1G2H3I4J5K6L7M8N9O0 │
│ ├─ [prompt_definition] "Optimize database connection handling" │
│ ├─ [invariant_enforced] "All DB config changes must preserve existing pool limits" │
│ ├─ [strategy_choice] "Refactor connection pool configuration" (confidence: 0.91) │
│ ├─ [tool_invocation] write_file: src/db/pool_config.py │
│ ├─ [implementation_choice] "Increase pool size to 100" (confidence: 0.78) ← ROOT CAUSE │
│ └─ [tool_invocation] write_file: src/db/health_check.py │
╰────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Tree Summary ──────────────────╮
│ Nodes: 6 │
│ Depth: 2 │
│ Child Plans: 0 │
│ Invariants: 1 │
│ Superseded: 0 (hidden) │
╰─────────────────────────────────╯
╭─ Decision IDs (for correction) ──────────────────────╮
│ Root: 01HXRCC1D2E3F4G5H6I7J8K9 │
│ Invariant 1: 01HXRCC2E3F4G5H6I7J8K9L0 │
│ Strategy: 01HXRCC3F4G5H6I7J8K9L0M1 │
│ Tool 1: 01HXRCC4G5H6I7J8K9L0M1N2 │
│ Pool Size (root cause): 01HXRCD3E4F5G6H7I8J9K0L1 │
│ Tool 2: 01HXRCE4F5G6H7I8J9K0L1M2 │
╰──────────────────────────────────────────────────────╯
✓ OK Decision tree rendered
# Look at the specific changes that were applied
$ agents plan diff 01HXRCF1G2H3I4J5K6L7M8N9O0
╭─ Diff Summary ─────────────────────────────────────╮
│ Plan: 01HXRCF1G2H3I4J5K6L7M8N9O0 │
│ Project: local/api-service │
│ Files Changed: 4 │
│ Insertions: 38 │
│ Deletions: 12 │
│ Net Change: +26 lines │
╰────────────────────────────────────────────────────╯
╭─ Files ──────────────────────────────────────╮
│ Path Change Status │
│ ──────────────────────── ────── ──────── │
│ src/db/pool_config.py +14 -6 modified │
│ src/db/health_check.py +18 -0 new file │
│ src/db/__init__.py +4 -4 modified │
│ config/database.toml +2 -2 modified │
╰──────────────────────────────────────────────╯
╭─ Patch Preview ──────────────────────────────────╮
│ --- a/src/db/pool_config.py │
│ +++ b/src/db/pool_config.py │
│ @@ -8,6 +8,14 @@ │
│ - POOL_SIZE = 20 │
│ - POOL_MAX_OVERFLOW = 10 │
│ + POOL_SIZE = 100 │
│ + POOL_MAX_OVERFLOW = 50 │
│ + POOL_RECYCLE = 3600 │
│ + POOL_PRE_PING = True │
│ --- a/config/database.toml │
│ +++ b/config/database.toml │
│ @@ -3,2 +3,2 @@ │
│ - pool_size = 20 │
│ + pool_size = 100 │
╰──────────────────────────────────────────────────╯
╭─ Risk Assessment ──────────────────────────╮
│ API Compatibility: preserved │
│ Test Coverage: maintained │
│ Breaking Changes: pool size 5x increase │
│ Resource Impact: high (connection limit) │
╰────────────────────────────────────────────╯
✓ OK Diff generated
# Examine the decision that led to the problematic change
$ agents plan explain 01HXRCD3E4F5G6H7I8J9K0L1 --show-context --show-reasoning
╭─ Decision ───────────────────────────────────────────────────────────╮
│ ID: 01HXRCD3E4F5G6H7I8J9K0L1 │
│ Type: implementation_choice │
│ Question: What pool size should be configured? │
│ Chosen: Increase pool size from 20 to 100 │
│ Confidence: 0.78 │
│ Plan: 01HXRCF1G2H3I4J5K6L7M8N9O0 │
│ Sequence: 5 of 6 │
│ Created: 2026-02-11 08:38 │
╰──────────────────────────────────────────────────────────────────────╯
╭─ Alternatives Considered ─────────────────────────────────────╮
│ 1. Increase pool size from 20 to 100 (chosen) │
│ 2. Keep pool at 20, add connection health checks only │
│ 3. Increase to 50 with overflow to 75 │
╰───────────────────────────────────────────────────────────────╯
╭─ Impact ─────────────────────────╮
│ Downstream Decisions: 1 │
│ Downstream Child Plans: 0 │
│ Artifacts Produced: 2 │
│ Correction Impact: low │
╰──────────────────────────────────╯
╭─ Context Snapshot ────────────────────────────────────────────────╮
│ - Current pool_size=20 in config/database.toml │
│ - Database server: PostgreSQL 15, max_connections=150 │
│ - 3 application replicas running (total: 60 connections used) │
│ - Slow query logs show connection wait times of 200-500ms │
│ Hot Context Hash: sha256:9c4f...a1b2 │
╰───────────────────────────────────────────────────────────────────╯
╭─ Rationale ─────────────────────────────────────────────────────╮
│ Connection wait times of 200-500ms suggest pool exhaustion. │
│ Increasing to 100 connections per replica provides headroom │
│ for burst traffic and eliminates the queueing bottleneck. │
╰─────────────────────────────────────────────────────────────────╯
╭─ Model Reasoning (raw) ────────────────────────────────────────────────╮
│ The slow query logs show connection acquisition delays of 200-500ms │
│ which indicates the pool is frequently exhausted. Current config: │
│ pool_size=20, max_overflow=10 (total 30 per replica). │
│ │
│ With 3 replicas that's 90 connections max. The PostgreSQL server │
│ allows 150. I'll increase to 100 per replica (300 total with │
│ overflow). This exceeds the server's max_connections=150 but │
│ overflow connections are temporary and unlikely to all be active │
│ simultaneously. │
│ │
│ [NOTE: The model failed to account for 3 replicas × 100 = 300 │
│ exceeding PostgreSQL max_connections=150] │
╰────────────────────────────────────────────────────────────────────────╯
╭─ Correction ─────────────────────────────────────────────────╮
│ agents plan correct 01HXRCD3E4F5G6H7I8J9K0L1 │
│ --mode revert --guidance "Keep pool at 20, add health..." │
╰──────────────────────────────────────────────────────────────╯
✓ OK Decision explained
# List available checkpoints for this plan
$ agents plan artifacts 01HXRCF1G2H3I4J5K6L7M8N9O0
╭─ Artifacts ────────────────────────────────────────────────────────╮
│ Path Type Size Change Child Plan │
│ ─────────────────────── ───── ────── ─────── ────────── │
│ src/db/pool_config.py edit 1.4 KB +14 -6 root │
│ src/db/health_check.py write 2.1 KB +18 -0 root │
│ src/db/__init__.py edit 0.8 KB +4 -4 root │
│ config/database.toml edit 0.3 KB +2 -2 root │
╰────────────────────────────────────────────────────────────────────╯
╭─ Summary ───────────╮
│ Total: 4 │
│ Writes: 1 (new) │
│ Edits: 3 (modified) │
│ Deletes: 0 │
│ Total Size: 4.6 KB │
╰─────────────────────╯
╭─ Checkpoints ──────────────────────────────────────────────────────╮
│ ID Label Created │
│ ──────────────────── ─────────────────────────── ────────────── │
│ checkpoint_01HXRCP1 before pool config changes 08:36:12 │
│ checkpoint_01HXRCP2 before health check addition 08:39:45 │
│ checkpoint_01HXRCP3 pre-apply snapshot 08:42:00 │
╰────────────────────────────────────────────────────────────────────╯
╭─ By Plan ──────────────╮
│ Root Plan: 4 artifacts │
╰────────────────────────╯
✓ OK 4 artifacts listed
# Roll back to the checkpoint before the problematic pool config change
$ agents plan rollback --yes 01HXRCF1G2H3I4J5K6L7M8N9O0 checkpoint_01HXRCP1
╭─ Rollback Summary ─────────────────────────────────╮
│ Plan: 01HXRCF1G2H3I4J5K6L7M8N9O0 │
│ Checkpoint: checkpoint_01HXRCP1 │
│ Label: before pool config changes │
│ Files: 4 reverted │
╰────────────────────────────────────────────────────╯
╭─ Changes Reverted ──────────────────────╮
│ File Action │
│ ──────────────────────── ────────── │
│ src/db/pool_config.py restored │
│ src/db/health_check.py removed │
│ src/db/__init__.py restored │
│ config/database.toml restored │
╰─────────────────────────────────────────╯
╭─ Impact ──────────────────────────────────╮
│ Child Plans Invalidated: 0 │
│ Sandbox: restored to checkpoint_01HXRCP1 │
│ Decisions After CP: 2 discarded │
│ Tool Calls After CP: 3 undone │
╰───────────────────────────────────────────╯
╭─ Post-Rollback State ──────────╮
│ Phase: execute │
│ State: queued (awaiting input) │
│ Checkpoints Remaining: 1 │
╰────────────────────────────────╯
✓ OK Rollback complete
# Correct the decision that caused the issue
$ agents plan correct 01HXRCD3E4F5G6H7I8J9K0L1 \
--mode revert \
--guidance "The connection pool size change caused the outage. \
Keep the pool at 20 connections maximum and add \
connection health checks instead." --yes
╭─ Correction ──────────────────────────────────────────────╮
│ Mode: revert │
│ Impact: 1 decision, 0 child plans, 2 artifacts │
│ New Decision: 01HXRCCORR1A2B3C4D5 │
│ Corrects: 01HXRCD3E4F5G6H7I8J9K0L1 │
│ Attempt: 2 │
╰───────────────────────────────────────────────────────────╯
╭─ Affected Subtree ──────────────╮
│ Decisions Invalidated: 1 │
│ Child Plans Rolled Back: 0 │
│ Artifacts Archived: 2 │
│ Unaffected Decisions: 4 │
╰─────────────────────────────────╯
╭─ Sandbox Rollback ──────────────────╮
│ Checkpoint: checkpoint_01HXRCP1 │
│ Files Reverted: 2 │
│ Status: restored │
╰─────────────────────────────────────╯
╭─ Recompute ───────────╮
│ Queued: 1 re-execute │
│ ETA: 2m │
╰───────────────────────╯
╭─ History ───────────────────────────────────────────────╮
│ - Original decision superseded │
│ - Prior artifacts archived for comparison │
│ - agents plan diff --correction 01HXRCCORR1A2B3C4D5 │
╰─────────────────────────────────────────────────────────╯
✓ OK Correction applied — re-executing affected subtree
# The affected subtree is re-executed. Review the new changes.
$ agents plan diff --correction 01HXRCCORR1A2B3C4D5
╭─ Correction Diff ────────────────────────────────────╮
│ Correction: 01HXRCCORR1A2B3C4D5 │
│ Original Decision: 01HXRCD3E4F5G6H7I8J9K0L1 │
│ Mode: revert │
│ Files Changed: 3 │
│ New Insertions: 32 │
│ New Deletions: 4 │
╰──────────────────────────────────────────────────────╯
╭─ Comparison ─────────────────────────────────────────────────────────────╮
│ File Before (original) After (corrected) │
│ ──────────────────────── ────────────────── ────────────────────── │
│ src/db/pool_config.py +14 -6 (pool=100) +8 -2 (pool=20, checks) │
│ src/db/health_check.py +18 -0 (basic) +24 -0 (robust checks) │
│ config/database.toml +2 -2 (pool=100) (unchanged — pool=20) │
╰──────────────────────────────────────────────────────────────────────────╯
╭─ Patch Preview (corrected vs original) ───────────────────────╮
│ --- a/src/db/pool_config.py (original) │
│ +++ b/src/db/pool_config.py (corrected) │
│ @@ -8,6 +8,10 @@ │
│ - POOL_SIZE = 100 │
│ - POOL_MAX_OVERFLOW = 50 │
│ + POOL_SIZE = 20 │
│ + POOL_MAX_OVERFLOW = 10 │
│ + POOL_PRE_PING = True │
│ + POOL_HEALTH_CHECK_INTERVAL = 30 │
│ --- a/src/db/health_check.py (original) │
│ +++ b/src/db/health_check.py (corrected) │
│ @@ -1,18 +1,24 @@ │
│ + # Added: connection validation, stale connection eviction, │
│ + # periodic health probes, and circuit breaker pattern │
│ ... │
╰───────────────────────────────────────────────────────────────╯
✓ OK Correction diff generated
# Re-apply with the fix
$ agents plan apply --yes 01HXRCF1G2H3I4J5K6L7M8N9O0
╭─ Apply Summary ──────────────────────────╮
│ Plan: 01HXRCF1G2H3I4J5K6L7M8N9O0 │
│ Artifacts: 3 files updated │
│ Changes: 32 insertions, 4 deletions │
│ Project: local/api-service │
│ Applied At: 2026-02-11 09:02 │
╰──────────────────────────────────────────╯
╭─ Validation ───────────────────╮
│ Tests: passed (31/31) │
│ Lint: passed (0 warnings) │
│ Type Check: passed (0 errors) │
│ Health Check: passed │
│ Duration: 18.6s │
╰────────────────────────────────╯
╭─ Sandbox Cleanup ─────────╮
│ Worktree: removed │
│ Branch: merged to main │
│ Checkpoint: archived │
╰───────────────────────────╯
╭─ Plan Lifecycle ──────────────────────────╮
│ Phase: apply │
│ State: applied │
│ Total Duration: 00:32:02 (incl. rollback) │
│ Total Cost: $0.118 │
│ Decisions Made: 7 (1 corrected) │
│ Child Plans: 0 │
╰───────────────────────────────────────────╯
╭─ Next Steps ──────╮
│ - Review git diff │
│ - Commit changes │
╰───────────────────╯
✓ OK Changes applied
@prefix uko: <https://cleveragents.ai/ontology/uko#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
# ── Base Classes ──────────────────────────────────────────────────
uko:InformationUnit a owl:Class ;
rdfs:comment "The root of every UKO node. Anything that can appear in an actor's context." .
uko:Container a owl:Class ;
rdfs:subClassOf uko:InformationUnit ;
rdfs:comment "An information unit that contains other information units (file, module, class, section)." .
uko:Atom a owl:Class ;
rdfs:subClassOf uko:InformationUnit ;
rdfs:comment "A leaf-level information unit (function body, paragraph, config value)." .
uko:Annotation a owl:Class ;
rdfs:subClassOf uko:InformationUnit ;
rdfs:comment "Metadata attached to another information unit (comment, docstring, attribute)." .
uko:Boundary a owl:Class ;
rdfs:subClassOf uko:InformationUnit ;
rdfs:comment "An interface point between containers (export, API endpoint, public method signature)." .
# ── Core Relationships ────────────────────────────────────────────
uko:contains a owl:ObjectProperty ;
rdfs:domain uko:Container ;
rdfs:range uko:InformationUnit ;
rdfs:comment "Parent contains child (e.g., module contains class)." .
uko:references a owl:ObjectProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range uko:InformationUnit ;
rdfs:comment "Weak reference (e.g., a function mentions a type in a docstring)." .
uko:dependsOn a owl:ObjectProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range uko:InformationUnit ;
rdfs:comment "Strong dependency (e.g., import, inheritance, call)." .
# ── Content Properties ────────────────────────────────────────────
uko:hasRendering a owl:DatatypeProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range xsd:string ;
rdfs:comment "A rendered text representation of this node at a specific detail depth. Multiple renderings at different depths may exist for the same node. The depth is indicated by the associated uko:renderingDepth value." .
uko:renderingDepth a owl:DatatypeProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range xsd:nonNegativeInteger ;
rdfs:comment "The integer detail depth at which the associated uko:hasRendering was produced. Paired with uko:hasRendering via a blank node or reification." .
uko:hasFullContent a owl:DatatypeProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range xsd:string ;
rdfs:comment "Shorthand for the maximum-depth rendering of this node (complete, unabridged content). Equivalent to uko:hasRendering at the domain's maximum depth." .
# ── Provenance ────────────────────────────────────────────────────
uko:sourceResource a owl:ObjectProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:comment "The CleverAgents Resource (by ULID) this node was extracted from." .
uko:sourcePath a owl:DatatypeProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range xsd:string ;
rdfs:comment "Path within the resource (e.g., file path relative to the resource root)." .
uko:sourceRange a owl:DatatypeProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range xsd:string ;
rdfs:comment "Byte or line range within the source file (e.g., '42:1-87:0')." .
# ── Temporal ──────────────────────────────────────────────────────
uko:validFrom a owl:DatatypeProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range xsd:dateTime .
uko:validUntil a owl:DatatypeProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range xsd:dateTime .
uko:isCurrent a owl:DatatypeProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range xsd:boolean .
uko:isRevisionOf a owl:ObjectProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range uko:InformationUnit ;
rdfs:comment "Links a revised node to its predecessor." .
@prefix uko-code: <https://cleveragents.ai/ontology/uko/code#> .
uko-code:Module a owl:Class ;
rdfs:subClassOf uko:Container ;
rdfs:comment "A source code module (file, package, namespace)." .
uko-code:Callable a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "Any callable unit (function, method, procedure, lambda)." .
uko-code:TypeDefinition a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "A type or schema definition (class, struct, interface, enum, typedef)." .
uko-code:TestCase a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "A test case or test function." .
uko-code:Import a owl:Class ;
rdfs:subClassOf uko:Annotation ;
rdfs:comment "An import/include/require statement." .
uko-code:hasReturnType a owl:DatatypeProperty ;
rdfs:domain uko-code:Callable ;
rdfs:range xsd:string .
uko-code:hasParameters a owl:DatatypeProperty ;
rdfs:domain uko-code:Callable ;
rdfs:range xsd:string ;
rdfs:comment "JSON-encoded parameter list." .
uko-code:testsCallable a owl:ObjectProperty ;
rdfs:domain uko-code:TestCase ;
rdfs:range uko-code:Callable ;
rdfs:comment "Links a test case to the callable it tests." .
@prefix uko-doc: <https://cleveragents.ai/ontology/uko/doc#> .
# ── Container Classes ──────────────────────────────────────────────
uko-doc:Document a owl:Class ;
rdfs:subClassOf uko:Container ;
rdfs:comment "A complete document (article, report, manual, specification)." .
uko-doc:Part a owl:Class ;
rdfs:subClassOf uko:Container ;
rdfs:comment "A top-level division of a document (e.g., Part I, Part II)." .
uko-doc:Chapter a owl:Class ;
rdfs:subClassOf uko:Container ;
rdfs:comment "A chapter within a document or part." .
uko-doc:Section a owl:Class ;
rdfs:subClassOf uko:Container ;
rdfs:comment "A numbered or titled section within a chapter." .
uko-doc:Subsection a owl:Class ;
rdfs:subClassOf uko-doc:Section ;
rdfs:comment "A subsection nested within a section (arbitrary depth)." .
# ── Atom Classes ───────────────────────────────────────────────────
uko-doc:Paragraph a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "A paragraph of prose text." .
uko-doc:CodeBlock a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "An inline code listing or example within a document." .
uko-doc:Figure a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "A figure, diagram, or image with an optional caption." .
uko-doc:Table a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "A tabular data element within a document." .
uko-doc:BlockQuote a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "A quoted passage from another source." .
uko-doc:ListBlock a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "An ordered or unordered list." .
# ── Annotation Classes ─────────────────────────────────────────────
uko-doc:Footnote a owl:Class ;
rdfs:subClassOf uko:Annotation ;
rdfs:comment "A footnote or endnote." .
uko-doc:Citation a owl:Class ;
rdfs:subClassOf uko:Annotation ;
rdfs:comment "A bibliographic citation or reference." .
uko-doc:Comment a owl:Class ;
rdfs:subClassOf uko:Annotation ;
rdfs:comment "An editorial comment or annotation (e.g., HTML comment, review note)." .
# ── Boundary Classes ───────────────────────────────────────────────
uko-doc:TableOfContents a owl:Class ;
rdfs:subClassOf uko:Boundary ;
rdfs:comment "The document's table of contents — an interface into the document's structure." .
uko-doc:Index a owl:Class ;
rdfs:subClassOf uko:Boundary ;
rdfs:comment "A back-of-book index or keyword index." .
uko-doc:Glossary a owl:Class ;
rdfs:subClassOf uko:Boundary ;
rdfs:comment "A glossary of terms defined in the document." .
# ── Document-Specific Relationships ────────────────────────────────
uko-doc:discussesTopic a owl:ObjectProperty ;
rdfs:subPropertyOf uko:references ;
rdfs:domain uko:InformationUnit ;
rdfs:range uko:InformationUnit ;
rdfs:comment "Semantic relationship: this unit discusses a topic that is the subject of another unit. Inferred by the document analyzer even when no explicit link exists." .
uko-doc:cites a owl:ObjectProperty ;
rdfs:subPropertyOf uko:references ;
rdfs:domain uko:InformationUnit ;
rdfs:range uko-doc:Citation ;
rdfs:comment "This unit cites a bibliographic reference." .
uko-doc:crossReferences a owl:ObjectProperty ;
rdfs:subPropertyOf uko:references ;
rdfs:domain uko:InformationUnit ;
rdfs:range uko:InformationUnit ;
rdfs:comment "Explicit cross-reference (e.g., 'see Section 3.2')." .
uko-doc:precedes a owl:ObjectProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range uko:InformationUnit ;
rdfs:comment "Reading order: this unit comes before the target unit." .
# ── Document-Specific Properties ───────────────────────────────────
uko-doc:headingLevel a owl:DatatypeProperty ;
rdfs:domain uko-doc:Section ;
rdfs:range xsd:integer ;
rdfs:comment "The nesting depth of this section (1 = top-level, 2 = subsection, etc.)." .
uko-doc:headingText a owl:DatatypeProperty ;
rdfs:domain uko-doc:Section ;
rdfs:range xsd:string ;
rdfs:comment "The title/heading text of this section." .
uko-doc:wordCount a owl:DatatypeProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range xsd:integer ;
rdfs:comment "Word count of the text content in this unit." .
uko-doc:language a owl:DatatypeProperty ;
rdfs:domain uko-doc:Document ;
rdfs:range xsd:string ;
rdfs:comment "Natural language of the document (e.g., 'en', 'fr')." .
uko-doc:topicKeywords a owl:DatatypeProperty ;
rdfs:domain uko:InformationUnit ;
rdfs:range xsd:string ;
rdfs:comment "JSON-encoded list of topic keywords extracted from this unit." .
@prefix uko-data: <https://cleveragents.ai/ontology/uko/data#> .
# ── Container Classes ──────────────────────────────────────────────
uko-data:Database a owl:Class ;
rdfs:subClassOf uko:Container ;
rdfs:comment "A database instance containing schemas." .
uko-data:Schema a owl:Class ;
rdfs:subClassOf uko:Container ;
rdfs:comment "A database schema (namespace for tables, views, etc.)." .
uko-data:Table a owl:Class ;
rdfs:subClassOf uko:Container ;
rdfs:comment "A database table containing columns." .
uko-data:View a owl:Class ;
rdfs:subClassOf uko:Container ;
rdfs:comment "A database view (virtual table defined by a query)." .
# ── Atom Classes ───────────────────────────────────────────────────
uko-data:Column a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "A column within a table or view." .
uko-data:StoredProcedure a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "A stored procedure or function in the database." .
uko-data:Trigger a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "A database trigger." .
uko-data:Migration a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "A schema migration (DDL change script)." .
# ── Annotation Classes ─────────────────────────────────────────────
uko-data:Constraint a owl:Class ;
rdfs:subClassOf uko:Annotation ;
rdfs:comment "A column or table constraint (NOT NULL, UNIQUE, CHECK, etc.)." .
uko-data:Index a owl:Class ;
rdfs:subClassOf uko:Annotation ;
rdfs:comment "A database index on one or more columns." .
uko-data:ColumnComment a owl:Class ;
rdfs:subClassOf uko:Annotation ;
rdfs:comment "A COMMENT ON COLUMN annotation in the database." .
# ── Boundary Classes ───────────────────────────────────────────────
uko-data:ForeignKey a owl:Class ;
rdfs:subClassOf uko:Boundary ;
rdfs:comment "A foreign key constraint — an interface point between tables." .
uko-data:APIEndpoint a owl:Class ;
rdfs:subClassOf uko:Boundary ;
rdfs:comment "A database-level API endpoint (e.g., PostgREST, GraphQL)." .
# ── Data-Specific Relationships ────────────────────────────────────
uko-data:foreignKeyTo a owl:ObjectProperty ;
rdfs:subPropertyOf uko:dependsOn ;
rdfs:domain uko-data:Column ;
rdfs:range uko-data:Column ;
rdfs:comment "Foreign key relationship from this column to a column in another table." .
uko-data:viewReferences a owl:ObjectProperty ;
rdfs:subPropertyOf uko:dependsOn ;
rdfs:domain uko-data:View ;
rdfs:range uko-data:Table ;
rdfs:comment "This view's query references columns from the target table." .
uko-data:procedureAccesses a owl:ObjectProperty ;
rdfs:subPropertyOf uko:dependsOn ;
rdfs:domain uko-data:StoredProcedure ;
rdfs:range uko-data:Table ;
rdfs:comment "This stored procedure reads from or writes to the target table." .
uko-data:triggerFires a owl:ObjectProperty ;
rdfs:subPropertyOf uko:dependsOn ;
rdfs:domain uko-data:Trigger ;
rdfs:range uko-data:Table ;
rdfs:comment "This trigger fires on events on the target table." .
uko-data:migrationAlters a owl:ObjectProperty ;
rdfs:subPropertyOf uko:dependsOn ;
rdfs:domain uko-data:Migration ;
rdfs:range uko-data:Table ;
rdfs:comment "This migration modifies the schema of the target table." .
# ── Data-Specific Properties ──────────────────────────────────────
uko-data:dataType a owl:DatatypeProperty ;
rdfs:domain uko-data:Column ;
rdfs:range xsd:string ;
rdfs:comment "SQL data type (e.g., 'VARCHAR(255)', 'INTEGER', 'JSONB')." .
uko-data:isNullable a owl:DatatypeProperty ;
rdfs:domain uko-data:Column ;
rdfs:range xsd:boolean .
uko-data:isPrimaryKey a owl:DatatypeProperty ;
rdfs:domain uko-data:Column ;
rdfs:range xsd:boolean .
uko-data:rowEstimate a owl:DatatypeProperty ;
rdfs:domain uko-data:Table ;
rdfs:range xsd:long ;
rdfs:comment "Estimated row count from database statistics." .
uko-data:viewDefinition a owl:DatatypeProperty ;
rdfs:domain uko-data:View ;
rdfs:range xsd:string ;
rdfs:comment "The SQL query that defines this view." .
uko-data:procedureBody a owl:DatatypeProperty ;
rdfs:domain uko-data:StoredProcedure ;
rdfs:range xsd:string ;
rdfs:comment "The SQL/PL body of the stored procedure." .
@prefix uko-infra: <https://cleveragents.ai/ontology/uko/infra#> .
# ── Container Classes ──────────────────────────────────────────────
uko-infra:Service a owl:Class ;
rdfs:subClassOf uko:Container ;
rdfs:comment "A deployable service or application." .
uko-infra:ConfigBlock a owl:Class ;
rdfs:subClassOf uko:Container ;
rdfs:comment "A configuration block or section (e.g., a YAML map, TOML table)." .
uko-infra:DeploymentUnit a owl:Class ;
rdfs:subClassOf uko:Container ;
rdfs:comment "A deployment unit (e.g., Kubernetes Deployment, Docker Compose service)." .
# ── Atom Classes ───────────────────────────────────────────────────
uko-infra:ConfigKey a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "A configuration key-value pair." .
uko-infra:EnvironmentVariable a owl:Class ;
rdfs:subClassOf uko:Atom ;
rdfs:comment "An environment variable definition." .
# ── Boundary Classes ───────────────────────────────────────────────
uko-infra:Endpoint a owl:Class ;
rdfs:subClassOf uko:Boundary ;
rdfs:comment "A network endpoint (HTTP route, gRPC service, message queue)." .
uko-infra:Port a owl:Class ;
rdfs:subClassOf uko:Boundary ;
rdfs:comment "A network port binding." .
# ── Infrastructure-Specific Relationships ──────────────────────────
uko-infra:connectsTo a owl:ObjectProperty ;
rdfs:subPropertyOf uko:dependsOn ;
rdfs:domain uko-infra:Service ;
rdfs:range uko-infra:Service ;
rdfs:comment "This service connects to or depends on the target service." .
uko-infra:exposes a owl:ObjectProperty ;
rdfs:domain uko-infra:Service ;
rdfs:range uko-infra:Endpoint ;
rdfs:comment "This service exposes the target endpoint." .
@prefix uko-oo: <https://cleveragents.ai/ontology/uko/oo#> .
uko-oo:Class a owl:Class ;
rdfs:subClassOf uko-code:TypeDefinition, uko:Container ;
rdfs:comment "An OO class that contains methods and attributes." .
uko-oo:Interface a owl:Class ;
rdfs:subClassOf uko-code:TypeDefinition, uko:Boundary ;
rdfs:comment "An interface or abstract base class." .
uko-oo:Method a owl:Class ;
rdfs:subClassOf uko-code:Callable .
uko-oo:Attribute a owl:Class ;
rdfs:subClassOf uko:Atom .
uko-oo:inheritsFrom a owl:ObjectProperty ;
rdfs:subPropertyOf uko:dependsOn ;
rdfs:domain uko-oo:Class ;
rdfs:range uko-oo:Class .
uko-oo:implements a owl:ObjectProperty ;
rdfs:subPropertyOf uko:dependsOn ;
rdfs:domain uko-oo:Class ;
rdfs:range uko-oo:Interface .
@prefix uko-func: <https://cleveragents.ai/ontology/uko/func#> .
uko-func:PureFunction a owl:Class ;
rdfs:subClassOf uko-code:Callable .
uko-func:TypeClass a owl:Class ;
rdfs:subClassOf uko-code:TypeDefinition, uko:Boundary .
uko-func:Monad a owl:Class ;
rdfs:subClassOf uko-code:TypeDefinition .
# "Find all containers that depend on this atom" — works for Python classes,
# TypeScript modules, Rust crates, SQL tables, document sections, or config blocks.
SELECT ?container WHERE {
?container a uko:Container .
?container uko:dependsOn <target_atom> .
}
uko-py:class/AuthManager
uko:sourceResource <resource-ulid-01HXM7...>
uko:sourcePath "src/auth/manager.py"
uko:sourceRange "15:1-87:0"
uko:validFrom "2026-01-15T10:30:00Z"
uko:isCurrent true
# Before code change:
uko-py:class/AuthManager_v1
uko:isCurrent true ;
uko:validFrom "2026-01-10T00:00:00Z"^^xsd:dateTime .
# After code change:
uko-py:class/AuthManager_v1
uko:isCurrent false ;
uko:validFrom "2026-01-10T00:00:00Z"^^xsd:dateTime ;
uko:validUntil "2026-01-15T10:30:00Z"^^xsd:dateTime .
uko-py:class/AuthManager_v2
uko:isCurrent true ;
uko:validFrom "2026-01-15T10:30:00Z"^^xsd:dateTime ;
uko:isRevisionOf uko-py:class/AuthManager_v1 .
class ResourceScopeResolver:
"""Determines which resources a plan can see."""
def resolve(self, plan: Plan) -> ResourceScope:
# 1. Get all projects this plan targets
projects = plan.target_projects
# 2. Collect all resources linked to those projects
resources = set()
for project in projects:
resources.update(project.linked_resources)
# 3. Expand to include child resources (DAG traversal)
expanded = set()
for resource in resources:
expanded.add(resource)
expanded.update(self.registry.get_descendants(resource))
# 4. Apply context view filters (include/exclude)
view = self._resolve_view(plan)
filtered = self._apply_filters(expanded, view)
return ResourceScope(resources=filtered, projects=projects)
class UKOSubgraphProjector:
"""Projects the UKO graph to only include nodes from scoped resources."""
def project(self, scope: ResourceScope,
graph_backend: GraphBackend) -> ProjectedGraph:
# Only include UKO nodes whose sourceResource is in scope
return graph_backend.subgraph_by_resources(
resource_ulids=[r.ulid for r in scope.resources],
include_temporal=scope.temporal_scope,
)
class ScopedBackendView:
"""Wraps a backend to restrict queries to a resource scope."""
def __init__(self, backend, scope: ResourceScope):
self.backend = backend
self.scope = scope
self._resource_filter = {r.ulid for r in scope.resources}
def search(self, query, **kwargs):
# Inject the resource filter into the backend query
results = self.backend.search(
query,
resource_filter=self._resource_filter,
**kwargs,
)
return results
class TextBackend(Protocol):
def search(self, query: str, *, resource_filter: set[str],
limit: int = 20) -> list[TextResult]: ...
def index(self, resource_ulid: str, content: str,
metadata: dict) -> None: ...
class VectorBackend(Protocol):
def search(self, embedding: list[float], *, resource_filter: set[str],
limit: int = 20, threshold: float = 0.3) -> list[VectorResult]: ...
def index(self, resource_ulid: str, chunks: list[EmbeddingChunk]) -> None: ...
class GraphBackend(Protocol):
def query_sparql(self, sparql: str, *, resource_filter: set[str]) -> list[dict]: ...
def add_triples(self, triples: list[Triple]) -> None: ...
def subgraph_by_resources(self, resource_ulids: list[str],
include_temporal: TemporalScope) -> ProjectedGraph: ...
def traverse(self, start_uri: str, max_hops: int,
edge_types: list[str], resource_filter: set[str]) -> SubGraph: ...
@dataclass
class TextResult:
resource_ulid: str
path: str
line_range: tuple[int, int]
content: str
score: float
@dataclass
class VectorResult:
resource_ulid: str
uko_node: str
content: str
similarity: float
metadata: dict
Pipeline Component Resolution Order:
plan scope ──► project scope ──► global scope ──► built-in default
(most specific) (least specific)
# ── Phase 1: Strategy Orchestration ────────────────────────────────
@runtime_checkable
class StrategySelectorProtocol(Protocol):
"""Decides which strategies to invoke and with what confidence.
Applies request preferences and backend availability filtering."""
def select(
self,
strategies: Sequence[ContextStrategy],
request: ContextRequest,
backends: BackendSet,
) -> list[tuple[ContextStrategy, float]]:
"""Returns (strategy, confidence) pairs, sorted by priority.
Confidence is 0.0-1.0. Strategies with 0.0 are excluded."""
...
@runtime_checkable
class BudgetAllocatorProtocol(Protocol):
"""Distributes the token budget across selected strategies.
May use proportional, priority-weighted, or custom allocation schemes."""
def allocate(
self,
candidates: list[tuple[ContextStrategy, float]],
total_budget: int,
request: ContextRequest,
) -> list[tuple[ContextStrategy, float, int]]:
"""Returns (strategy, confidence, allocated_tokens) triples.
Sum of allocated_tokens must not exceed total_budget."""
...
@runtime_checkable
class StrategyExecutorProtocol(Protocol):
"""Controls how strategies are invoked — parallelism model,
timeout handling, circuit breaking, and error recovery."""
def execute(
self,
allocations: list[tuple[ContextStrategy, float, int]],
request: ContextRequest,
backends: BackendSet,
plan_context: PlanContext,
) -> list[ContextFragment]:
"""Executes strategies and collects all fragments.
Must handle strategy failures gracefully (log and continue)."""
...
# ── Phase 2: Fragment Fusion ────────────────────────────────────────
@runtime_checkable
class FragmentDeduplicatorProtocol(Protocol):
"""Removes duplicate fragments from the merged strategy output.
Deduplication can be identity-based, content-hash-based, or semantic."""
def deduplicate(
self,
fragments: list[ContextFragment],
) -> list[ContextFragment]:
"""Returns deduplicated fragments. When duplicates are found,
the fragment with the highest relevance_score is retained."""
...
@runtime_checkable
class DetailDepthResolverProtocol(Protocol):
"""Resolves conflicts when the same UKO node appears at different
detail depths across strategy outputs."""
def resolve(
self,
fragments: list[ContextFragment],
budget: int,
) -> list[ContextFragment]:
"""Returns fragments with depth conflicts resolved.
Default: keep highest depth that fits within budget."""
...
@runtime_checkable
class FragmentScorerProtocol(Protocol):
"""Computes a composite score for each fragment, used for ranking
during budget packing. Applies hierarchical weighting, strategy
quality weighting, and recency bonuses."""
def score(
self,
fragments: list[ContextFragment],
plan_context: PlanContext,
) -> list[ScoredFragment]:
"""Returns fragments annotated with composite scores.
ScoredFragment adds a `composite_score: float` field."""
...
@runtime_checkable
class BudgetPackerProtocol(Protocol):
"""Fits scored fragments into the token budget using a packing
algorithm. Supports depth fallback — if a fragment doesn't fit
at its current depth, it can be re-rendered at a lower depth."""
def pack(
self,
scored_fragments: list[ScoredFragment],
budget: int,
detail_level_maps: DetailLevelMapRegistry,
) -> list[ContextFragment]:
"""Returns the subset of fragments that fit within budget,
possibly re-rendered at lower depths. Ordered by score."""
...
@runtime_checkable
class FragmentOrdererProtocol(Protocol):
"""Orders the packed fragments for optimal coherence in the
actor's context window. Ordering may be by relevance, by
topological dependency, or by a hybrid coherence heuristic."""
def order(
self,
fragments: list[ContextFragment],
) -> list[ContextFragment]:
"""Returns fragments in the final presentation order."""
...
# ── Phase 3: Context Finalization ──────────────────────────────────
@runtime_checkable
class PreambleGeneratorProtocol(Protocol):
"""Generates the preamble prepended to assembled context — a
structured summary of what's included, why, and from where."""
def generate(
self,
fragments: list[ContextFragment],
strategies_used: list[str],
budget_used: float,
max_tokens: int,
) -> str | None:
"""Returns the preamble string, or None if preamble is disabled."""
...
@runtime_checkable
class SkeletonCompressorProtocol(Protocol):
"""Compresses a parent plan's assembled context into a compact
skeleton representation for inheritance by child plans."""
def compress(
self,
parent_context: AssembledContext,
child_focus: list[str],
skeleton_budget: int,
) -> AssembledContext:
"""Returns a compressed version of the parent context that
fits within skeleton_budget tokens. Typically reduces all
fragments to depth 0-1 (e.g., MODULE_LISTING / TITLE_ONLY)."""
...
@dataclass(frozen=True)
class ScoredFragment:
"""A ContextFragment annotated with a composite score by the FragmentScorer."""
fragment: ContextFragment
composite_score: float # 0.0-1.0 composite ranking score
score_components: dict[str, float] # Breakdown: {"relevance": 0.9, "hierarchy": 0.8, ...}
@dataclass
class PipelineConfig:
"""Resolved configuration for the context assembly pipeline.
Each field holds the concrete plugin instance to use for that stage.
Resolved via the scope chain: plan > project > global > built-in."""
strategy_selector: StrategySelectorProtocol
budget_allocator: BudgetAllocatorProtocol
strategy_executor: StrategyExecutorProtocol
fragment_deduplicator: FragmentDeduplicatorProtocol
detail_depth_resolver: DetailDepthResolverProtocol
fragment_scorer: FragmentScorerProtocol
budget_packer: BudgetPackerProtocol
fragment_orderer: FragmentOrdererProtocol
preamble_generator: PreambleGeneratorProtocol
skeleton_compressor: SkeletonCompressorProtocol
class ContextAssemblyPipeline:
"""Mediator that orchestrates the 10-stage context assembly pipeline.
Each stage is a pluggable component resolved from the scope chain."""
def __init__(self, config: PipelineConfig, strategies: Sequence[ContextStrategy]):
self._config = config
self._strategies = strategies
def assemble(
self,
request: ContextRequest,
backends: BackendSet,
budget: int,
plan_context: PlanContext,
) -> AssembledContext:
# ── Phase 1: Strategy Orchestration ──────────────────────
# 1. Select strategies
candidates = self._config.strategy_selector.select(
self._strategies, request, backends,
)
# 2. Allocate budget
allocations = self._config.budget_allocator.allocate(
candidates, budget, request,
)
# 3. Execute strategies
raw_fragments = self._config.strategy_executor.execute(
allocations, request, backends, plan_context,
)
# ── Phase 2: Fragment Fusion ──────────────────────────────
# 4. Deduplicate
deduped = self._config.fragment_deduplicator.deduplicate(raw_fragments)
# 5. Resolve depth conflicts
resolved = self._config.detail_depth_resolver.resolve(deduped, budget)
# 6. Score fragments
scored = self._config.fragment_scorer.score(resolved, plan_context)
# 7. Pack into budget
packed = self._config.budget_packer.pack(
scored, budget, self._detail_level_maps,
)
# 8. Order for coherence
ordered = self._config.fragment_orderer.order(packed)
# ── Phase 3: Context Finalization ─────────────────────────
# 9. Generate preamble
strategies_used = [s.name for s, _, _ in allocations]
preamble = self._config.preamble_generator.generate(
ordered, strategies_used,
budget_used=sum(f.token_count for f in ordered) / budget,
max_tokens=self._preamble_max_tokens,
)
return AssembledContext(
fragments=ordered,
total_tokens=sum(f.token_count for f in ordered),
budget_used=sum(f.token_count for f in ordered) / budget,
strategies_used=strategies_used,
context_hash=self._compute_hash(ordered),
preamble=preamble,
provenance_map={f.uko_node: f.provenance for f in ordered},
)
class PipelineConfigResolver:
"""Resolves the effective PipelineConfig for a given context assembly.
Implements the Chain of Responsibility pattern across three scopes."""
def resolve(
self,
plan: Plan | None,
project: Project | None,
global_config: GlobalConfig,
) -> PipelineConfig:
# 1. Start with built-in defaults
config = self._builtin_defaults()
# 2. Apply global overrides from config.toml
config = self._apply_scope(config, global_config.pipeline_overrides)
# 3. Apply project-level overrides (if any)
if project and project.pipeline_overrides:
config = self._apply_scope(config, project.pipeline_overrides)
# 4. Apply plan-level overrides (if any)
if plan and plan.pipeline_overrides:
config = self._apply_scope(config, plan.pipeline_overrides)
return config
def _apply_scope(self, base: PipelineConfig, overrides: dict) -> PipelineConfig:
"""Merges overrides into the base config using the Prototype pattern.
Only non-None overrides replace the base component."""
return PipelineConfig(**{
field: overrides.get(field, getattr(base, field))
for field in PipelineConfig.__dataclass_fields__
})
# ── Global config.toml ────────────────────────────────────────────
[context.pipeline]
# Override any pipeline component globally (values are "module:ClassName")
strategy-selector = "builtin:ConfidenceWeightedSelector" # default
budget-allocator = "builtin:ProportionalBudgetAllocator" # default
strategy-executor = "builtin:ParallelStrategyExecutor" # default
fragment-deduplicator = "builtin:ContentHashDeduplicator" # default
detail-depth-resolver = "builtin:MaxDepthResolver" # default
fragment-scorer = "builtin:WeightedCompositeScorer" # default
budget-packer = "builtin:GreedyKnapsackPacker" # default
fragment-orderer = "builtin:RelevanceCoherenceOrderer" # default
preamble-generator = "builtin:ProvenancePreambleGenerator" # default
skeleton-compressor = "builtin:DepthReductionCompressor" # default
# ── Per-component configuration ────────────────────────────────────
[context.pipeline.strategy-executor]
timeout-seconds = 30
max-workers = 4
circuit-breaker-threshold = 3
[context.pipeline.fragment-scorer]
relevance-weight = 0.4
hierarchy-weight = 0.3
quality-weight = 0.2
recency-weight = 0.1
[context.pipeline.budget-packer]
depth-fallback-steps = [9, 4, 2, 0] # depths to try during fallback
min-fragment-tokens = 10 # fragments below this are excluded
# ── Project-level context view YAML ────────────────────────────────
project: local/api-service
view: strategize
pipeline:
fragment-scorer: "my_extensions.scorers:DomainAwareScorer"
budget-packer: "my_extensions.packers:PriorityPreservingPacker"
class InitialContextAssembler:
"""Produces the starting context for an actor invocation."""
def assemble(self, plan: Plan, actor: Actor,
token_budget: int) -> AssembledContext:
# 1. Resolve resource scope
scope = self.scope_resolver.resolve(plan)
# 2. Get inherited context from parent plan (if any)
inherited = self._get_inherited_context(plan)
# 3. Create scoped backend views
backends = self.bal.create_scoped_views(scope)
# 4. Build the initial context request from plan metadata
initial_request = self._build_initial_request(plan, actor, inherited)
# 5. Run through the Context Assembly Pipeline
result = self.pipeline.assemble(
request=initial_request,
backends=backends,
budget=token_budget,
plan_context=PlanContext(
plan=plan,
parent_context=inherited,
depth_in_tree=plan.depth_in_tree,
),
)
return result
class PlanContextInheritance:
"""Manages how child plans inherit and refine parent context.
Uses the pipeline's SkeletonCompressor component to produce
compact parent context for child plan inheritance."""
def compute_child_context(self, parent_plan, child_plan, parent_context):
# 1. Determine the child's focus from the parent's decisions
child_focus = self._extract_child_focus(parent_plan, child_plan)
# 2. Compute depth/breadth adjustments
depth_delta = child_plan.depth_in_tree - parent_plan.depth_in_tree
child_detail = self._increase_detail(self._avg_detail(parent_context), depth_delta)
child_breadth = max(1, parent_context.avg_breadth - depth_delta)
# 3. Compute skeleton budget from the child's token budget
skeleton_budget = int(child_plan.token_budget * self.config.skeleton_ratio)
# 4. Use the pipeline's SkeletonCompressor to build the parent skeleton
skeleton = self.pipeline.skeleton_compressor.compress(
parent_context=parent_context,
child_focus=child_focus,
skeleton_budget=skeleton_budget,
)
# 5. Build the inherited context request with parent skeleton
return ContextRequest(
focus=child_focus,
breadth=child_breadth,
depth=child_detail,
depth_gradient=True,
metadata={
"parent_context_hash": parent_context.context_hash,
"parent_skeleton": skeleton,
"inherited_decisions": self._relevant_parent_decisions(parent_plan, child_focus),
},
)
Parent's hot context (32K tokens):
┌─ Module: src/auth/ [depth 3/MEMBER_SUMMARY: 2K tokens]
├─ Module: src/core/ [depth 3/MEMBER_SUMMARY: 2K tokens]
├─ Module: src/api/ [depth 3/MEMBER_SUMMARY: 2K tokens]
├─ Module: src/services/ [depth 3/MEMBER_SUMMARY: 2K tokens]
└─ ... 12 more modules [depth 3/MEMBER_SUMMARY: 24K tokens]
Child's hot context (32K tokens):
┌─ [SKELETON from parent] [depth 0/MODULE_LISTING: 3K tokens]
│ Module: src/auth/ [just name + member names]
│ Module: src/core/ [just name + member names]
│ Module: src/api/ [just name + member names]
│ ... etc.
├─ [CHILD FOCUS AREA] [depth 9/FULL_SOURCE: 25K tokens]
│ Class: AuthManager [depth 9: all methods with bodies]
│ Class: TokenValidator [depth 9: referenced by AuthManager]
│ Class: User [depth 4/SIGNATURES: used as parameter type]
└─ [INHERITED DECISIONS] [4K tokens]
Decision: "Use async patterns for all auth operations"
Decision: "Maintain backward compat with sync callers"
class ContextBudgetCalculator:
"""Computes the effective context budget for each assembly cycle."""
def compute(self, actor: Actor, plan: Plan,
conversation_history_tokens: int) -> int:
# 1. Get the actor's hard context window limit
model_limit = actor.model_config.context_window_tokens
# 2. Reserve space for system prompt, history, tools, response
reserved = (self._count_tokens(actor.system_prompt) +
conversation_history_tokens +
self._estimate_tool_tokens(actor.skills) +
actor.model_config.max_output_tokens)
# 3. Apply the soft cap from context view policy
soft_cap = self._resolve_view(plan).hot_max_tokens or float('inf')
# 4. Calculate available budget
effective_budget = max(0, min(model_limit - reserved, soft_cap))
return effective_budget
class UKOIndexer:
"""Produces UKO triples from resources using pluggable analyzers."""
def index_resource(self, resource: Resource):
# 1. Determine the best analyzer for this resource
analyzer = self.analyzers.get_for_resource(resource)
# 2. Produce UKO triples using the most specific vocabulary
triples = analyzer.analyze(resource)
# 3. Add provenance
for triple in triples:
self._add_provenance(triple, resource)
# 4. Store in graph backend
self.graph_backend.add_triples(triples)
# 5. Also index into text and vector backends
self.text_indexer.index(resource, triples)
self.vector_indexer.index(resource, triples)
-- Plans table: the fundamental unit of orchestration
CREATE TABLE plans (
plan_id TEXT PRIMARY KEY, -- ULID
parent_plan_id TEXT REFERENCES plans(plan_id),
root_plan_id TEXT NOT NULL REFERENCES plans(plan_id),
action_name TEXT NOT NULL, -- namespaced action name
phase TEXT NOT NULL DEFAULT 'strategize', -- action|strategize|execute|apply
state TEXT NOT NULL DEFAULT 'queued', -- queued|processing|errored|complete|cancelled
attempt INTEGER NOT NULL DEFAULT 1,
automation_profile_name TEXT NOT NULL,
effective_profile_snapshot TEXT NOT NULL, -- JSON: frozen profile at creation
arguments TEXT, -- JSON: action arguments
project_names TEXT NOT NULL, -- JSON array of project names
strategy_actor_name TEXT,
execution_actor_name TEXT,
estimation_actor_name TEXT,
invariant_actor_name TEXT,
created_by TEXT, -- session ID or user identity
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f', 'now')),
completed_at TEXT,
error_message TEXT,
error_traceback TEXT,
cost_estimate_usd REAL,
cost_actual_usd REAL,
token_count_input INTEGER DEFAULT 0,
token_count_output INTEGER DEFAULT 0
);
CREATE INDEX idx_plans_parent ON plans(parent_plan_id);
CREATE INDEX idx_plans_root ON plans(root_plan_id);
CREATE INDEX idx_plans_phase_state ON plans(phase, state);
CREATE INDEX idx_plans_action ON plans(action_name);
CREATE INDEX idx_plans_created ON plans(created_at);
-- Decisions table: the decision tree
CREATE TABLE decisions (
decision_id TEXT PRIMARY KEY, -- ULID
plan_id TEXT NOT NULL REFERENCES plans(plan_id),
parent_decision_id TEXT REFERENCES decisions(decision_id),
decision_type TEXT NOT NULL, -- prompt_definition|invariant_enforced|
-- strategy_choice|subplan_spawn|
-- subplan_parallel_spawn|implementation_choice
question TEXT NOT NULL,
chosen_option TEXT NOT NULL,
alternatives_considered TEXT, -- JSON array of alternative options
confidence_score REAL, -- 0.0-1.0
rationale TEXT,
context_snapshot TEXT NOT NULL, -- JSON: hot_context_hash, relevant_resources,
-- actor_state_ref
downstream_plan_ids TEXT, -- JSON array of child plan ULIDs
artifacts_produced TEXT, -- JSON array of artifact references
is_correction BOOLEAN DEFAULT FALSE,
corrects_decision_id TEXT REFERENCES decisions(decision_id),
superseded_by TEXT REFERENCES decisions(decision_id),
sequence_number INTEGER NOT NULL, -- ordering within this plan
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f', 'now'))
);
CREATE INDEX idx_decisions_plan ON decisions(plan_id);
CREATE INDEX idx_decisions_parent ON decisions(parent_decision_id);
CREATE INDEX idx_decisions_type ON decisions(decision_type);
CREATE INDEX idx_decisions_superseded ON decisions(superseded_by) WHERE superseded_by IS NOT NULL;
-- Resources table: the resource registry
CREATE TABLE resources (
resource_id TEXT PRIMARY KEY, -- ULID
name TEXT, -- namespaced name (NULL for auto-discovered children)
resource_type_name TEXT NOT NULL, -- namespaced type name
classification TEXT NOT NULL, -- physical|virtual
description TEXT,
properties TEXT, -- JSON: type-specific properties
location TEXT, -- physical resources only
content_hash TEXT, -- for equivalence tracking
sandbox_strategy TEXT, -- override per resource
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f', 'now'))
);
CREATE UNIQUE INDEX idx_resources_name ON resources(name) WHERE name IS NOT NULL;
CREATE INDEX idx_resources_type ON resources(resource_type_name);
CREATE INDEX idx_resources_classification ON resources(classification);
-- Resource DAG: parent/child relationships
CREATE TABLE resource_links (
parent_id TEXT NOT NULL REFERENCES resources(resource_id),
child_id TEXT NOT NULL REFERENCES resources(resource_id),
link_type TEXT DEFAULT 'contains', -- contains|references|derived_from
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f', 'now')),
PRIMARY KEY (parent_id, child_id)
);
CREATE INDEX idx_resource_links_child ON resource_links(child_id);
-- Project-resource linkage
CREATE TABLE project_resources (
project_name TEXT NOT NULL,
resource_id TEXT NOT NULL REFERENCES resources(resource_id),
read_only BOOLEAN DEFAULT FALSE,
linked_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f', 'now')),
PRIMARY KEY (project_name, resource_id)
);
-- Checkpoint metadata (actual data on filesystem)
CREATE TABLE checkpoint_metadata (
checkpoint_id TEXT PRIMARY KEY, -- ULID
plan_id TEXT NOT NULL REFERENCES plans(plan_id),
decision_id TEXT REFERENCES decisions(decision_id),
checkpoint_type TEXT NOT NULL, -- pre_write|post_step|manual
resource_id TEXT REFERENCES resources(resource_id),
filesystem_path TEXT NOT NULL, -- relative path within checkpoint dir
size_bytes INTEGER,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f', 'now'))
);
CREATE INDEX idx_checkpoints_plan ON checkpoint_metadata(plan_id);
-- Correction attempts
CREATE TABLE correction_attempts (
correction_attempt_id TEXT PRIMARY KEY, -- ULID
plan_id TEXT NOT NULL REFERENCES plans(plan_id),
original_decision_id TEXT NOT NULL REFERENCES decisions(decision_id),
new_decision_id TEXT REFERENCES decisions(decision_id),
mode TEXT NOT NULL, -- revert|append
guidance TEXT NOT NULL,
archived_artifacts_path TEXT, -- filesystem path to archived originals
state TEXT NOT NULL DEFAULT 'pending', -- pending|executing|complete|failed
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f', 'now')),
completed_at TEXT
);
CREATE INDEX idx_corrections_plan ON correction_attempts(plan_id);
-- Audit log for apply operations
CREATE TABLE audit_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_type TEXT NOT NULL, -- plan_applied|plan_cancelled|resource_modified|
-- correction_applied|config_changed
plan_id TEXT,
project_name TEXT,
actor_name TEXT,
user_identity TEXT,
details TEXT NOT NULL, -- JSON: event-specific details
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f', 'now'))
);
CREATE INDEX idx_audit_event ON audit_log(event_type);
CREATE INDEX idx_audit_plan ON audit_log(plan_id) WHERE plan_id IS NOT NULL;
CREATE INDEX idx_audit_created ON audit_log(created_at);
~/.cleveragents/
├── config.toml # Global configuration
├── cleveragents.db # SQLite database (WAL mode)
├── cleveragents.db-wal # WAL file (auto-managed by SQLite)
├── cleveragents.db-shm # Shared memory file (auto-managed)
├── logs/
│ ├── cleveragents.log # Current log file (structured JSON)
│ ├── cleveragents.log.1 # Rotated log files
│ └── ...
├── cache/
│ ├── models/ # Cached model artifacts
│ ├── tools/ # Cached tool downloads
│ └── templates/ # Compiled Jinja2 templates
├── backups/
│ ├── 2026-02-08T12-30-00/ # Timestamped backup snapshots
│ └── ...
├── checkpoints/
│ ├── 01HXR1C1D2E3F4G5H6I7.../ # Per-plan checkpoint directories
│ │ ├── chk_01HXR1E1.tar.gz # Compressed checkpoint snapshots
│ │ └── ...
│ └── ...
├── artifacts/
│ ├── 01HXR1C1D2E3F4G5H6I7.../ # Per-plan artifact directories
│ │ ├── src/routes/health.py # Generated/modified artifacts
│ │ └── ...
│ └── ...
├── index/
│ ├── text/
│ │ ├── local_api-service/ # Per-project Tantivy indexes
│ │ └── ...
│ ├── vector/
│ │ ├── local_api-service/ # Per-project FAISS indexes
│ │ └── ...
│ └── graph/
│ └── ... # rdflib stores or Neo4j connection info
├── sessions/
│ └── ... # Session state files (if needed beyond DB)
└── contexts/
└── ... # Exported/cached context snapshots
import structlog
logger = structlog.get_logger()
# Every log entry automatically includes bound context
logger = logger.bind(
plan_id="01HXR1C1D2E3F4G5H6I7J8K9L0",
phase="execute",
actor_name="anthropic/claude-3.5-sonnet",
session_id="01HXM2A6K1P2E9Q9D4GQ7J4S7Z",
)
# Example: tool invocation logging
logger.info(
"tool_invoked",
tool_name="local/write-file",
skill_name="local/file-ops",
resource_id="01HXR1A1B2C3D4E5F6G7H8J9K0",
resource_type="git-checkout",
input_schema_hash="sha256:a1b2c3...",
duration_ms=142,
writes=True,
checkpoint_created=True,
)
from enum import Enum
from pydantic import BaseModel
from datetime import datetime
class EventType(str, Enum):
# Plan lifecycle events
PLAN_CREATED = "plan.created"
PLAN_PHASE_CHANGED = "plan.phase_changed"
PLAN_STATE_CHANGED = "plan.state_changed"
PLAN_APPLIED = "plan.applied"
PLAN_CANCELLED = "plan.cancelled"
PLAN_ERRORED = "plan.errored"
# Decision events
DECISION_CREATED = "decision.created"
DECISION_APPROVED = "decision.approved"
DECISION_CORRECTED = "decision.corrected"
DECISION_SUPERSEDED = "decision.superseded"
# Invariant events
INVARIANT_RECONCILED = "invariant.reconciled"
INVARIANT_VIOLATED = "invariant.violated"
INVARIANT_ENFORCED = "invariant.enforced"
# Actor events
ACTOR_INVOKED = "actor.invoked"
ACTOR_COMPLETED = "actor.completed"
ACTOR_ERRORED = "actor.errored"
ACTOR_ESCALATED = "actor.escalated" # confidence below threshold
# Tool events
TOOL_INVOKED = "tool.invoked"
TOOL_COMPLETED = "tool.completed"
TOOL_ERRORED = "tool.errored"
TOOL_RETRIED = "tool.retried"
# Resource events
RESOURCE_ACCESSED = "resource.accessed"
RESOURCE_MODIFIED = "resource.modified"
RESOURCE_INDEXED = "resource.indexed"
# Sandbox events
SANDBOX_CREATED = "sandbox.created"
SANDBOX_COMMITTED = "sandbox.committed"
SANDBOX_ROLLED_BACK = "sandbox.rolled_back"
CHECKPOINT_CREATED = "checkpoint.created"
CHECKPOINT_RESTORED = "checkpoint.restored"
# Context events
CONTEXT_BUILT = "context.built"
CONTEXT_QUERY_EXECUTED = "context.query_executed"
# Validation events
VALIDATION_STARTED = "validation.started"
VALIDATION_PASSED = "validation.passed"
VALIDATION_FAILED = "validation.failed"
# Session events
SESSION_CREATED = "session.created"
SESSION_MESSAGE_SENT = "session.message_sent"
# Cost events
BUDGET_WARNING = "budget.warning"
BUDGET_EXCEEDED = "budget.exceeded"
class DomainEvent(BaseModel):
"""Base event model emitted by all domain operations."""
event_type: EventType
timestamp: datetime
plan_id: str | None = None
root_plan_id: str | None = None
session_id: str | None = None
actor_name: str | None = None
project_name: str | None = None
details: dict # Event-type-specific payload
from typing import Protocol
import rx
from rx.subject import Subject
class EventBus(Protocol):
def emit(self, event: DomainEvent) -> None: ...
def subscribe(self, event_type: EventType, handler: Callable) -> None: ...
class ReactiveEventBus:
"""In-process event bus using RxPY for real-time distribution."""
def __init__(self):
self._subject = Subject()
self._subscriptions: dict[EventType, list[Callable]] = {}
def emit(self, event: DomainEvent) -> None:
# Push to reactive stream for real-time subscribers
self._subject.on_next(event)
# Persist to audit log
self._persist_audit(event)
# Dispatch to type-specific handlers
for handler in self._subscriptions.get(event.event_type, []):
handler(event)
def subscribe(self, event_type: EventType, handler: Callable) -> None:
self._subscriptions.setdefault(event_type, []).append(handler)
@property
def stream(self) -> rx.Observable:
"""Raw observable stream for advanced RxPY operators."""
return self._subject
# Trace record for each LLM call
class LLMTrace(BaseModel):
trace_id: str # ULID
plan_id: str
decision_id: str | None
actor_name: str
provider: str # openai, anthropic, google, etc.
model: str # gpt-4o, claude-3.5-sonnet, etc.
prompt_tokens: int
completion_tokens: int
total_tokens: int
cost_usd: float
latency_ms: int
temperature: float
tool_calls: list[str] # tool names invoked by the LLM
context_hash: str # hash of the context window contents
context_refs: list[str] # resource IDs referenced in context
streaming: bool
retry_count: int
error: str | None
timestamp: datetime
# File: tools/my-custom-tool.yaml
tool:
name: local/analyze-complexity
description: "Compute cyclomatic complexity for Python files"
source: custom
input_schema:
type: object
properties:
file_path: { type: string }
required: [file_path]
output_schema:
type: object
properties:
complexity: { type: integer }
functions: { type: array }
capability:
writes: false
checkpointable: false
resource_slots:
- name: source
type: git-checkout
binding: contextual
code: |
import ast
content = ctx.resources["source"].read(params["file_path"])
tree = ast.parse(content)
# ... complexity analysis ...
return {"complexity": total, "functions": results}
# File: skills/kubernetes-ops.yaml
skill:
name: local/kubernetes-ops
description: "Kubernetes cluster management tools"
mcp_servers:
- transport: stdio
command: npx
args: ["-y", "@anthropic/mcp-kubernetes"]
skill:
name: local/project-tools
agent_skills_dirs:
- ./agent-skills/
from typing import Protocol
class AIProviderInterface(Protocol):
"""Protocol for LLM provider implementations."""
@property
def provider_name(self) -> str: ...
@property
def capabilities(self) -> ProviderCapabilities: ...
def create_chat_model(
self,
model: str,
temperature: float = 0.7,
**kwargs,
) -> BaseChatModel: ...
def create_embedding_model(
self,
model: str,
**kwargs,
) -> BaseEmbeddings: ...
# File: resource-types/docker-registry.yaml
resource_type:
name: local/docker-registry
description: "Docker container registry"
classification: physical
user_addable: true
cli_args:
- name: registry_url
type: string
required: true
- name: repository
type: string
required: true
- name: tag
type: string
default: "latest"
sandbox_strategy: none # Docker images are immutable
handler: docker_registry_handler
child_types:
- type: local/docker-image
relationship: contains
auto_discover: true
auto_discovery:
enabled: true
strategy: list_tags
class TextIndexBackend(Protocol):
"""Interface for full-text search backends."""
def index_document(self, project: str, doc_id: str, content: str, metadata: dict) -> None: ...
def search(self, project: str, query: str, limit: int) -> list[SearchResult]: ...
def remove_document(self, project: str, doc_id: str) -> None: ...
def rebuild_index(self, project: str) -> None: ...
class VectorIndexBackend(Protocol):
"""Interface for vector similarity search backends."""
def index_embedding(self, project: str, doc_id: str, embedding: list[float], metadata: dict) -> None: ...
def search_similar(self, project: str, query_embedding: list[float], limit: int, min_relevance: float) -> list[VectorResult]: ...
def remove_embedding(self, project: str, doc_id: str) -> None: ...
class GraphIndexBackend(Protocol):
"""Interface for knowledge graph backends."""
def add_triple(self, project: str, subject: str, predicate: str, obj: str) -> None: ...
def query(self, project: str, sparql: str) -> list[dict]: ...
def remove_triples(self, project: str, subject: str | None, predicate: str | None, obj: str | None) -> None: ...
# config.toml
[index.text]
backend = "custom"
custom_module = "my_extensions.elasticsearch_backend"
custom_class = "ElasticsearchTextIndex"
[index.text.custom_options]
hosts = ["http://localhost:9200"]
index_prefix = "cleveragents"
class SandboxStrategy(Protocol):
"""Interface for sandbox isolation strategies."""
def create(self, plan_id: str, resource: Resource) -> SandboxRef: ...
def read(self, ref: SandboxRef, path: str) -> bytes: ...
def write(self, ref: SandboxRef, path: str, content: bytes) -> Change: ...
def diff(self, ref: SandboxRef) -> DiffView: ...
def commit(self, ref: SandboxRef) -> None: ...
def rollback(self, ref: SandboxRef) -> None: ...
def checkpoint(self, ref: SandboxRef, checkpoint_id: str) -> None: ...
def restore_checkpoint(self, ref: SandboxRef, checkpoint_id: str) -> None: ...
def cleanup(self, ref: SandboxRef) -> None: ...
PluginSystem:
analyzers:
# --- Source Code Analyzers (Layer 1: uko-code + Layer 2/3) ---
python:
class: "PythonAnalyzer"
features: [AST parsing, Type inference via mypy, Import resolution, Docstring extraction]
typescript:
class: "TypeScriptAnalyzer"
features: [TSC-based parsing, Type extraction, Module resolution, JSDoc parsing]
rust:
class: "RustAnalyzer"
features: [rust-analyzer integration, Lifetime analysis, Trait resolution, Macro expansion]
custom_dsl:
class: "CustomDSLAnalyzer"
config:
grammar: "path/to/grammar.peg"
semantic_rules: "path/to/rules.yaml"
# --- Document Analyzers (Layer 1: uko-doc) ---
markdown:
class: "MarkdownAnalyzer"
features: [Heading hierarchy, Link extraction, Code block detection, Topic inference, Cross-reference resolution]
restructuredtext:
class: "ReStructuredTextAnalyzer"
features: [Directive parsing, Role resolution, Cross-reference resolution, Index extraction]
html:
class: "HTMLDocumentAnalyzer"
features: [Semantic HTML parsing, Heading extraction, Link graph, Readability scoring]
# --- Data Schema Analyzers (Layer 1: uko-data) ---
postgresql:
class: "PostgreSQLAnalyzer"
features: [Schema introspection, DDL extraction, Foreign key graph, View dependency analysis, Stored procedure parsing, Statistics collection]
mysql:
class: "MySQLAnalyzer"
features: [Schema introspection, DDL extraction, Foreign key graph, Trigger parsing]
sqlite:
class: "SQLiteAnalyzer"
features: [Schema introspection, DDL extraction, Virtual table detection]
# --- Infrastructure Analyzers (Layer 1: uko-infra) ---
docker_compose:
class: "DockerComposeAnalyzer"
features: [Service graph, Port mapping, Volume resolution, Environment variable extraction]
kubernetes:
class: "KubernetesAnalyzer"
features: [Resource parsing, Service dependency graph, ConfigMap/Secret references, Ingress routing]
backends:
graph:
- { name: "blazegraph", class: "BlazegraphBackend", features: ["SPARQL", "reasoning"] }
- { name: "neo4j", class: "Neo4jBackend", features: ["Cypher", "APOC", "GDS"] }
vector:
- { name: "faiss", class: "FaissBackend", features: ["GPU acceleration", "HNSW"] }
- { name: "qdrant", class: "QdrantBackend", features: ["filtering", "payloads"] }
embedders:
- { name: "openai", class: "OpenAIEmbedder", models: ["text-embedding-3-large"] }
- { name: "local", class: "LocalEmbedder", models: ["all-MiniLM-L6-v2"] }
@prefix uko-tf: <https://cleveragents.ai/ontology/uko/infra/terraform#> .
uko-tf:TerraformModule a owl:Class ;
rdfs:subClassOf uko-infra:ConfigBlock, uko:Container .
uko-tf:Resource a owl:Class ;
rdfs:subClassOf uko:Container .
uko-tf:Variable a owl:Class ;
rdfs:subClassOf uko-infra:ConfigKey .
uko-tf:Output a owl:Class ;
rdfs:subClassOf uko:Boundary .
uko-tf:provisionsOn a owl:ObjectProperty ;
rdfs:subPropertyOf uko:dependsOn ;
rdfs:domain uko-tf:Resource ;
rdfs:range uko-infra:Service .
class MyDomainStrategy:
name = "my-namespace/domain-strategy"
capabilities = StrategyCapabilities(
uses_graph=True, uses_text=True,
uko_levels=["uko:", "uko-tf:"],
resource_types=["*"],
supports_depth_breadth=True,
quality_score=0.8,
)
def can_handle(self, request, backends):
if any("terraform" in f for f in request.focus):
return 0.9
return 0.0
def assemble(self, request, backends, budget, plan_context):
# Custom logic...
...
[context.strategies.custom]
"my-namespace/domain-strategy" = "my_package.strategies.MyDomainStrategy"
class MyCustomScorer:
"""A domain-aware fragment scorer that boosts infrastructure fragments
when the plan focuses on deployment tasks."""
def score(self, fragments: list[ContextFragment],
plan_context: PlanContext) -> list[ScoredFragment]:
scored = []
is_deploy = "deploy" in plan_context.plan.description.lower()
for f in fragments:
base_score = f.relevance_score * 0.4 + f.hierarchy_weight * 0.3
if is_deploy and "uko-infra:" in f.uko_uri:
base_score *= 1.5 # Boost infrastructure fragments
scored.append(ScoredFragment(**vars(f), composite_score=base_score))
return sorted(scored, key=lambda s: s.composite_score, reverse=True)
[context.pipeline]
fragment-scorer = "my_extensions.scorers:MyCustomScorer"
project: local/api-service
view: strategize
pipeline:
fragment-scorer: "my_extensions.scorers:MyCustomScorer"