Funnel executor — Claude drives the plan-DAG (separate from the planner)
Two DISTINCT Claude roles over the funnel plan-DAG, kept separate:
-
Planner (
funnel prompt --llm) — idea → plan-DAG.decompose::llm_decompose_promptdecomposition_from_llm_reply, thenanchor_subtasksgrounds each node into the system-DAG (RAG oversymbol_facts/call_edges), thenrun_prompt_with_decomposition.
-
Executor (
funnel run <plan>) — drains the plan-DAG.executor::drain_planwalks the ready frontier (promote_ready), drives each node through the bounded generate→judge loop (decompose::run_subtask_loop), recordsNodeStatusChangedDone|Failed, re-promotes, until drained or blocked. TheAnswerJudge(compiler) is the oracle; theGeneratorseam is the model.
The claude generator (this change)
warehouse::generator::claude::ClaudeGenerator — an impl of the shared Generator trait backed by the existing viz::claude client (Anthropic Messages API, claude-opus-4-8, $ANTHROPIC_API_KEY). Reuses the ClaudeTransport seam (Law #1 — no new HTTP client); transport is injectable so it is unit-tested offline with FakeTransport (3 tests, no network). Selectable via the factory: generator("claude") (or --gen claude / $NORNIR_GEN_BACKEND). It is a separate Claude call from the planner — planner and executor never share a call.
CLI
nornir funnel run p-001 # dry-run: prints the ready-frontier waves
nornir funnel run p-001 --gen claude # LIVE: real Claude proposal per ready node (proposals only)
nornir funnel run p-001 --gen mock # offline generator (deterministic)
--gen makes real generator calls but is proposals-only — no NodeStatusChanged, no unattended cargo — so an unattended run never mutates the plan from raw model output. The auto-apply drain (drain_plan + a CodegenJudge oracle that copies the crate to a scratch dir, applies the answer, runs cargo test) is the tested library path, gated behind an explicit workspace + compiler gate rather than run unattended from the CLI.
Each node = one unit of work → maps to a jera job for future fan-out across worker machines (H1).
Flow
Tests
warehouse::generator::claude::tests— completes via injected transport; system folds into the prompt; transport error surfaces (never panics). Offline (FakeTransport).funnelsuite (73 green) — anchor merge +drain_planreaches-all-done / blocks-on-failure.