intake · git:20260816.bac04eb · 2026-08-16 · sha256 33fef05c1ca594e6

intake git:20260816.bac04ebA

Immutable. This exact content never changes and is served at /api/v1/blob/33fef05c1ca594e6.

---
name: intake
description: Phase 1 of the pipeline — collect inputs and scaffold the run. Use at the very start of any optimization. Interviews the user to decide what capability to optimize, which runner/optimizer/algorithm to use, and where the data is; scaffolds .capevolve/project/ (adapter stub, capevolve.yaml, PROJECT.md); and for every NEEDED input that is missing, asks the user (quoting path, how to retrieve it, alternatives) rather than fabricating it.
component: phase
argument-hint: "--base .capevolve"
allowed-tools: Read, Write, Edit, Bash
provides: [project, tasks]
needs: []
sources: []
---

# intake — collect inputs, scaffold the project

The first phase. Its job is to turn a vague wish ("make this agent better at X")
into a concrete, runnable project: a filled `capevolve.yaml`, an adapter ready to
implement, and **every NEEDED input resolved before any budget is spent**. Intake
is cheap; a botched intake is not — an unresolved input discovered three phases
later means a wasted optimization run and a meaningless number.

## Inputs / outputs (manifest tokens)
- **needs:** *(nothing)* — intake is the pipeline entry point.
- **provides:** `project` (the scaffolded `.capevolve/project/`) and `tasks` (the
  evaluation dataset, resolved either to a path or to the adapter's `tasks()`).

Downstream, `implement-and-check` consumes `project`; `baseline` consumes
`project` + `tasks`. If intake under-delivers either token, the hard gate in
`implement-and-check` fails loudly rather than silently optimizing against a stub.

## Step 0 — Inspect before asking
Before any question, inspect the target so you can PROPOSE defaults instead of asking blind:
1. Look at the repo/benchmark/agent: entrypoint, how one eval runs, where traces/scores live.
2. Detect candidate metrics (what the scorer emits), a natural train/val/test split, and cost caps.
3. Run `gh auth status` to know whether GitHub is available.

Then ask the FEWEST questions — present detected metrics/splits/caps as multiple-choice
defaults with a free-text escape, keeping the ask-user-if-missing discipline for NEEDED
inputs. The metric / GitHub / stop-condition questions below feed directly into the
`capevolve.yaml` spec keys, so ask them here (after inspecting, before scaffolding).

### Metrics
- Which metrics should the dashboard show? (detected: `<list>`) — multiple choice + free text → `metrics_display`.
- Which ONE gates accept/reject? — single choice → `metric_primary`. (This is the only metric the gate uses.)
- For each shown metric, is higher or lower better? → `metric_directions` (parallel to `metrics_display`).

### GitHub integration
- `gh auth status` = authed? Offer: mirror the algorithm's work items as issues + ship winner as PR (`Closes #n`) → `github_integration: true`; else offer `gh auth login` or skip → `false`. WHAT gets mirrored is algorithm-specific (the `algorithm_skill` defines it — e.g. evograph → weaknesses). GitHub is mirror-only; the run dir stays authoritative.

### Orchestration mode
- Ask: deterministic or agent? → `orchestration_mode` (default `deterministic`).
  - `deterministic` — cap-evolve sequences intake→…→algorithm→finalize; honesty is code-enforced. Best when a deterministic engine exists for the algorithm.
  - `agent` — the coding agent drives the loop itself (reads the algorithm's "Agent-mode loop"), self-policing honesty, and seals via the finalize phase. Required for agent-only algorithms. The purpose-built fully-agentic algorithm is `algorithm_skill: agent-optimize` (free-form loop; it also does a Phase-0 understand-the-benchmark step). In agent mode also collect `stop_condition`.

### Stop condition (agent mode)
- Free-text halt rule re-read each round → `stop_condition`. Deterministic mode leaves it blank and uses budget knobs.

## What it does
1. **Interview** (driven by this SKILL.md): pick the capability skill (*what* is
   optimized), the optimizer (*which* coding agent proposes edits), the algorithm
   (*the search loop*), the dataset, the splits, and the budget.
2. **Scaffold** `.capevolve/project/` from the template (`scripts/run.py`):
   adapter stub, `inputs/`, `capevolve.yaml`, `PROJECT.md`, and the optimizer-prompt
   template `optimizer/INSTRUCTIONS.md` (the whole `templates/project/` tree is
   copytree'd verbatim, so this file is already in place — confirm it exists).
3. **Resolve inputs** per `inputs/INPUTS.md` — the contract below.
4. **Wire trajectories + scoring into the adapter.** From the *trajectories path*
   and *metric extraction / scoring source* inputs:
   - implement `adapter.trajectories(split)` to RETURN the runner's native trajectory
     directory for the last eval of `split` (any structure/format; it is copied
     verbatim into the optimizer's `./trajectories/`). Return `None` only if there is
     genuinely no separate native store (cap-evolve then falls back to its per-rollout
     JSON) — note that choice in `PROJECT.md`.
   - implement `score()` to extract the OBJECTIVE metric from a rollout, matching the
     benchmark's own scoring source; verify it reproduces the benchmark's number.
   - **Make `score()`'s feedback ARGUMENT-LEVEL — it IS the learning signal.** A
     tool-name-only signal ("action X was wrong") is too coarse for the optimizer to
     localize a fix; it pattern-matches to prose rules and the run plateaus. For EACH
     failing check, the feedback must point at the specific argument/value/step that
     was wrong: name the wrong ARGUMENT key and the **agent's OWN wrong value** (not
     the gold value), name the wrong target id, and for communication/omission misses
     name the value or field the agent failed to state **when it is derivable from the
     agent's own state** (e.g. an un-stated computed total). This is **gold-SAFE**:
     derive everything from the agent's own messages/tool-calls/observed state (and the
     user's own profile/db state the agent saw) — use the gold record ONLY to learn
     WHICH check/argument failed (key names are safe; gold VALUES must never be read or
     printed). When a piece is not safely derivable, fall back to the coarser
     tool-name message. Keep `score()` deterministic (the check gate requires it).
5. **Author the optimizer instructions for THIS benchmark — SCOPED TO THE SELECTED
   CAPABILITIES.** Customize the scaffolded `.capevolve/project/optimizer/INSTRUCTIONS.md`.
   Keep the `{{...}}` placeholders intact (`{{FOCUS_SUMMARY}}`, `{{FAILURES}}`,
   `{{CAP_BRIEF}}`, `{{ALGO_BRIEF}}`, `{{BENCH_REPO}}` — the harness fills them per
   iteration). Keep the authored static guidance **short on meta-narration, explicit
   and DEMANDING on iteration depth**, and make it **capability-scoped**: include
   guidance, skill references, and edit-space ONLY for the capabilities actually
   listed in `capevolve.yaml: capabilities`.
   - **DEPTH MANDATE — address ALL failure clusters each iteration.** The authored
     instructions must demand a substantial multi-root-cause pass: diagnose ALL
     clusters and fix as many as possible in ONE candidate, spanning EVERY edit class
     the selected capabilities offer (each capability's SKILL.md enumerates its own).
     Scope each fix to protect passing tasks; do NOT trade breadth for caution. State
     plainly that a single small edit is an under-used iteration. For the concrete
     per-capability wording of this mandate, use the selected capability's own
     optimizer playbook (see the capability-playbook rule below).
   - **State the GOAL up front:** maximize the eval score — make the largest
     improvement you can this iteration, grounded in the trajectories.
   - **The authored INSTRUCTIONS MUST encode all of these (generic, capability-scoped):**
     1. **STEP-0 reading mandate.** Before diagnosing, the optimizer must READ
        `./guidance/<cap>/SKILL.md` (for EACH selected capability) and the optimizer
        features reference under `./guidance/optimizer/`. State this as an explicit
        first step.
     2. **Each selected capability's own optimizer playbook.** For EVERY capability in
        `capevolve.yaml: capabilities`, load that capability's playbook from its skill.
        Both path forms matter, each for its own reader: YOU read it in this repo at
        `skills/capabilities/<cap>/references/` (e.g. `tools` →
        [`optimizer-playbook.md`](../../capabilities/tools/references/optimizer-playbook.md)),
        but any path you WRITE INTO the authored INSTRUCTIONS must be the
        runtime-materialized form `./guidance/<cap>/references/` — the repo-relative
        path does not resolve in the optimizer's working dir. Fold its edit-depth
        demands and subagent-fan-out pattern into the authored INSTRUCTIONS. Do NOT
        restate one capability's playbook here — it lives with that capability and
        evolves with it.
     3. **The NON-OVERFITTING guardrail.** Demand that every prompt/tool edit encode
        a GENERAL rule/policy/validation that generalizes across the whole class of
        inputs — NEVER hardcode a specific task's id/value/date/name/answer. A guard
        must fire on the general condition (e.g. "id not in the user's profile"), not
        match a literal value (NOT `if id == "<TASK_SPECIFIC_ID>"`). A literal special-case that
        only helps one task is forbidden — it overfits, fails the held-out gate, and
        hurts other tasks. Per-task specifics are for understanding the failure CLASS
        only; the fix must be general.
     4. **EXPLOIT ground-truth/eval present in the trajectories (diagnosis only).**
        Tell the optimizer that when `./trajectories/` include ground-truth /
        expected actions / a reward breakdown, it should USE them during diagnosis to
        localize the exact defect (expected vs actual action/argument/value) — and if
        not present, infer from the traces + feedback. State plainly that ground truth
        informs the failure class only; the resulting edit must still be GENERAL
        (guardrail 3) and never copy a gold value.
   - **Capability-scoping (the key rule):** reference `./guidance/<cap>/SKILL.md`
     and present the editable artifacts **for the selected caps only**. If only
     `tools` is selected, do NOT include any prompt-editing guidance, do NOT
     reference the `system-prompt` skill, and do NOT present the prompt/policy file
     as editable. If only `system-prompt` is selected, do not surface the tools file
     as editable. Each capability's "What you can change here" lives in its
     `./guidance/<cap>/SKILL.md` — point the optimizer there rather than restating it.
   - **Always include (capability-agnostic):** READ the four cross-iteration files in
     the working dir FIRST — `./LEDGER.md` (framework facts: each iteration's outcome +
     tasks broken/fixed), the whole `./JOURNAL.md` (the optimizer's append-only
     handover across the run), and `./RUNMAP.md` + `./prior_iterations/<id>/` (every
     prior iteration's PROCESS.md + capability diff) — and never re-propose an approach
     the journal/ledger shows was rejected *as implemented* (a better-designed version
     may still work — not a permanent ban); READ and USE the diagnose skill
     `./guidance/diagnose/SKILL.md` (incl. its KNOWLEDGE / BEHAVIORAL / CAPABILITY-GAP
     tags), the optimizer features reference `./guidance/optimizer/<name>.md`, this
     step's `./trajectories/`, and any `./guidance/sources/` data-model files. Each
     iteration the optimizer MUST: fill `./PROCESS.md` (the required explainability
     template — ranked issues + tags, every edit + class, verify-the-fix,
     subagents/features used, what to preserve, what was skipped) and APPEND its entry
     to `./JOURNAL.md` below the marker (what was tried / worked / regressed / refuted /
     plateau-signal / focus-next). Ship MULTIPLE edit classes and ADD a new
     code-bearing tool whenever a CAPABILITY-GAP/stall cluster is present.
6. **Set the spec keys** in `capevolve.yaml`:
   - `runner_repo_path` — the benchmark/runner source, surfaced read-only to the
     optimizer.
   - `optimizer_instructions_file` — point at the customized template (default
     `optimizer/INSTRUCTIONS.md`).
   - `capability_sources` — the benchmark's data-model / types source files that the
     tools import (resolved relative to the project dir; copied verbatim into the
     optimizer's `./guidance/sources/`), so the optimizer can write correct code
     against the real types. Set this whenever a selected capability's code imports a
     shared types/data-model module; leave the default `[]` when there is none.
   - `target_model` (+ optional `target_profile_file`) — the runtime/CONSUMING LLM the
     agent reads the capabilities with, DISTINCT from `optimizer_model`. A model id or a
     tier (`frontier|strong|mid|weak`); steers the optimizer prompt + capability guidance
     to optimize FOR that reader. Ask which model the agent runs at runtime; leave blank
     (profile-agnostic) if unknown. See `inputs/INPUTS.md` → `target_model`.

## Ask-the-user-if-missing (mandatory — the core discipline)
Read `inputs/INPUTS.md`. It classifies every input as **NEEDED** or
**RECOMMENDED**. For each **NEEDED** input that is not already present:

> **ASK THE USER.** Quote (a) the exact path where it is expected, (b) the
> command or option that produces it, and (c) any alternatives. Then wait.

**Never invent a NEEDED input.** Fabricating a dataset, a scorer, or a gold
answer does not unblock the run — it produces a number that measures nothing and
hides that fact. A missing tasks file is a *question for the user*, not a gap for
you to paper over. This is the single most important behavior of this phase.

**RECOMMENDED** inputs have sane defaults and may be skipped — but log every skip
in `PROJECT.md` (e.g. "num_trials defaulted to 1 — scores will be single-trial,
so the significance gate will correctly reject marginal gains"), so the honesty
cost of each default is visible at report time.

### Block on a missing NEEDED input (never fabricate)
The action when a NEEDED input is absent depends on the run mode:
- **Interactive / chat mode** — ASK THE USER and wait: quote *what* is needed, *why*
  it is needed (what breaks without it), and *how* to provide it (the exact path /
  command / option / alternatives from `INPUTS.md`). Do not proceed past the missing
  input.
- **Non-interactive mode** (`cap-evolve run` / orchestrate, no human to ask) — do NOT
  fabricate. WRITE a clearly delimited section into `PROJECT.md`:
  `BLOCKED: <input> — why it is needed — how to provide it`, then STOP with a non-zero
  exit. A blocked-but-honest stop is correct; a green run on a guessed input is not.

This extends the ask-if-missing discipline above — it is the same rule, with an
explicit non-interactive fallback so a headless run fails loud and recorded instead
of silently inventing a dataset, scorer, trajectories path, or scoring source.

### Why a contract, not a guess
The classic failure mode of "auto-optimize my agent" tooling is to start running
with whatever it can find and backfill assumptions. That yields a green run and a
worthless result. Splitting inputs into NEEDED (blocking → ask) vs RECOMMENDED
(default → log) makes the *only* legitimate way to proceed-without-an-input an
explicit, recorded default — never a silent fabrication. Treat `INPUTS.md` as the
spec; this SKILL.md is just the procedure for honoring it.

## Dual-mode
This phase runs two ways from the **same** SKILL.md: standalone as the slash command `/cap-evolve:intake` (the `argument-hint` shows its run.py args), and orchestrator-callable — `cap-evolve run` / the `orchestrate` skill invokes the same `scripts/run.py` headlessly and threads the run dir between phases.

## How to run
```
python scripts/run.py --base .capevolve        # scaffold .capevolve/project
```
The script is purely mechanical: it copies the template and prints the next
steps. The *judgment* — interviewing, choosing components, and running the
ask-if-missing loop — is yours, driven by this SKILL.md and `inputs/INPUTS.md`.

Then implement `adapters/adapter.py`, fill `capevolve.yaml`, and proceed to
`implement-and-check`. Together, **intake → implement-and-check** is the *full
integration*: scaffold → implement the 3 required adapter methods →
`cap-evolve check` green, before any budget is spent. The using-agent (e.g. the chosen optimizer) can run
this whole integration autonomously.

> **Worked example (onboard a new benchmark from a prompt):** see `examples/` for
> an end-to-end onboarding. The intake/onboarding step **installs the benchmark**
> (clones + installs it) and the **optimizer agent** wires the adapter from the
> stub until `cap-evolve check` passes, then optimizes the selected capability. The
> example's `setup.sh` is the executable transcript of that onboarding; `run.sh`
> runs the full optimization with the live dashboard.

## What good vs bad intake looks like
- **Good:** every NEEDED input resolved to a real path or `"adapter"`; splits and
  budget chosen deliberately; each defaulted RECOMMENDED input logged in
  `PROJECT.md`; `capevolve.yaml` fully filled; the user answered every blocking
  question before the scaffold was declared done.
- **Bad:** a tasks file that "looked plausible" was synthesized; the scorer leaks
  the gold answer into feedback; test == train with no note; budget left at a
  default that cannot possibly find a gain; the run proceeded past a missing
  NEEDED input "to keep moving".
- **Bad:** authored INSTRUCTIONS that omit the STEP-0 reading mandate, or that skip a
  selected capability's own optimizer playbook — so an iteration can pass on a
  cosmetic edit that the capability's playbook calls under-used.

## References
- `references/concepts.md` — the inputs contract, NEEDED vs RECOMMENDED
  rationale, the 3 required adapter methods, and split/trial/budget guidance with
  sources.