Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/nornir

.nornir/funnel-executor.md

Funnel executor — Claude drives the plan-DAG (separate from the planner)

Two DISTINCT Claude roles over the funnel plan-DAG, kept separate:

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