| name | intent |
| description | Pre-Scout intent capture phase. Structures vague user goals into intent.md before any subagent budget is spent. Opt-in via policy.json workflow.phase_enables.intent=on. |
intent
Sprint 4 composable skill (v8.19.0+). Wraps the new Intent phase that runs between Calibrate and Research when workflow.phase_enables.intent=1. Single-persona, autonomy-preserving — no human checkpoint mid-cycle.
When to invoke
- Autonomous: orchestrator advances to phase=intent when
cycle-state.intent_required==true (set at cycle init from workflow.phase_enables.intent=1)
- User-driven:
/evo:intent, before /evo:loop, to lock in structured intent
- Re-run: re-invoke to replace prior intent.md within the same cycle (kernel accepts latest ledger entry)
When NOT to invoke
- After Scout has already run for this cycle (intent must precede research)
- For pure-execution cycles where the goal is fully specified (e.g., "fix typo at file.md:42") — but in practice, even those benefit from the explicit
non_goals and acceptance_checks
- When
workflow.phase_enables.intent is unset and the user has not explicitly invoked /evo:intent — default flow skips this phase
Workflow
| Step | Action | Exit criteria |
|---|
| 1 | Read user goal + workspace + priorIntent (if re-run) | Inputs gathered |
| 2 | Classify input via AwN framework (IMKI/IMR/IwE/IBTC/CLEAR) | Single class chosen |
| 3 | If awn_class == IBTC: emit short scope-rejection intent.md | gate_intent_to_research will short-circuit cycle |
| 4 | Otherwise: produce 8-field structured intent.md | Frontmatter complete + body written |
| 5 | Surface ≥1 challenged_premise — assumption to actively question | premise/challenge/alternative populated |
| 6 | Write $workspace/intent.md | File present, parseable |
| 7 | Subagent runner writes ledger entry binding intent.md SHA to cycle | kind: "agent_subprocess", role: "intent" ledger entry |
Autonomy invariant
This skill MUST NOT block on human approval. The intent persona produces intent.md; gate_intent_to_research verifies structure (≥1 challenged_premise, valid awn_class, SHA matches ledger); cycle proceeds. There is no accept-intent operator command — re-running /evo:intent replaces the prior file, and the kernel uses the latest ledger entry. This is the difference between an autonomy-preserving filter and a checkpoint.
Cycle-binding
Like every other agent, intent.md gets a ledger entry with (artifact_sha256, git_head, tree_state_sha, challenge_token). ship.sh's downstream tree-state check works against the same SHA-binding the auditor uses.
Phase facts
| Fact | Value |
|---|
| Phase | intent (plan archetype, optional, gated by workflow.phase_enables.intent=on) |
| Persona | agents/evolve-intent.md |
| Profile | .evolve/profiles/intent.json — CLI claude-tmux, tier deep, single-writer |
| Artifact | intent.md (cycle workspace) |
Output contract
intent.md must declare:
Composition
Invoked by:
/evo:intent (user-driven)
evolve-orchestrator macro when cycle-state.intent_required==true
Cannot be:
- Invoked by another persona (Anti-pattern B per
docs/architecture/tri-layer.md)
- Fanned out (single perspective; no
parallel_subtasks in profile for v0.1)
- Substituted via
evolve guard phase --bypass (CRITICAL violation per CLAUDE.md)
Reference
agents/evolve-intent.md (persona)
.evolve/profiles/intent.json (permission profile)
legacy/scripts/lifecycle/phase-gate.sh (gate_calibrate_to_intent, gate_intent_to_research)
legacy/scripts/guards/phase-gate-precondition.sh (scout-blocked-without-intent enforcement)
.evolve/research/intent-capture-patterns.md (5-source research grounding)
docs/architecture/intent-phase.md (full architecture)