auto-driver
Orient before /auto starts. Loads the hypothesis JSON from lib/auto-detect.sh, surfaces one action line, dispatches when ambiguity is null, or asks one blocking question when it isn't. No verdict-tree
SKILL.mdskills/auto-driver/SKILL.md
GitHubauto-driver
One action line per branch. Dispatch. Do not narrate.
Load the hypothesis
bash "${CLAUDE_PLUGIN_ROOT}/lib/auto-detect.sh"
If the detector yields no parseable envelope (empty/non-zero env hiccup), don't stall — treat as raw.
Returns one JSON object (situation, summary, ambiguity, single_plan, multi_plan, in_flight, workspace, workspace_action, recommendation, plans, git). The detector emits deterministic facts — it has no transcript access. You have the transcript: surface summary, then decide the route from situation + ambiguity + the plans/git facts. The conversation-vs-stale-plan call is YOURS, not the detector's (U4 — see below).
| situation | ambiguity null → dispatch | ambiguity non-null → AskUserQuestion |
|---|---|---|
in-flight |
(FRESH run) bash "${CLAUDE_PLUGIN_ROOT}/lib/auto-resume.sh" "continue <run-id>" |
(STALE run) options = resume vs start-fresh; on the resume option (carries run_id) → auto-resume.sh "continue <run-id>"; on "Start fresh" (run_id null) → treat as raw (ask what to work on) |
ambiguous-runs |
(n/a — always ambiguous) | options = the in-flight run-ids; on answer, resume the chosen run |
reviewed-plan |
if single_plan.freshness is stale and this session is about other live work, prefer conversation-context (below). Else run the goal-aware pre-step; if it does not reshape, load auto-launch (the launch chooser) via Skill: it gates on driving_session_id — self-driven silent-applies, interactive confirms — then dispatches lib/auto.sh "<path> --workflow w" |
(n/a — single plan unambiguous) |
multi-plan |
If every plans[].freshness is stale and this session is about other live work, use conversation-context (below) and do NOT offer the stale plan actions; otherwise run the goal-aware pre-step first |
options = the FRESH plans (path → auto.sh "<path>"); a "Fan out all N" option (path null → auto-spawn.py fanout) appears ONLY when the set is fresh. An all-stale set offers no plan actions — it routes to conversation-context |
raw |
(n/a — always ambiguous) | open "what should we work on?"; on answer, route as freeform text (or conversation-context, below). Summary may include dirty-tree context (the git fact). |
Conversation-context is driver-owned (U4). The detector no longer emits a conversation-context situation — it can't sense the transcript. When the facts show no in-flight run and no LIVE plan to act on (situation = raw, or a reviewed-plan/multi-plan whose plans are all freshness: stale) AND this session is clearly about live work, DON'T act on the stale/absent plan: classify state → recommend (lib/recommender.py) → author goal → dispatch the entry workflow (pre-dispatch escalate if unsure). A FRESH plan (freshness: fresh) always wins over conversation.
Goal-aware plan routing (pre-step)
For reviewed-plan / multi-plan, interactive runs only (driving_session_id
null — self-driven/headless runs skip this whole step, take the row above
unchanged). Recover THIS invocation's goal: the typed /auto intent or a session
/goal's text (read only — never query/run/bind/clear it);
else infer from the session (advisory). Weight the plans (the fuzzy judgment is
yours → ordered matched paths), hand verdicts to the crisp router, run its reason
(map + guardrails: driver-reference.md §17; rubric goal-plan-relevance-rubric.md):
python "${CLAUDE_PLUGIN_ROOT}/lib/goal-route.py" \
'{"authority":"<explicit|inferred|none>","matches":[<ordered matched paths>],
"all_plans":[<multi_plan.paths>],"interactive":<driving_session_id is null>}'
Reason markers (§17): explicit-suppress, inferred-re-rank, no-match-unchanged, no-goal-unchanged.
Argument-aware freeform: a plan path → auto-launch → auto.sh "<path> --workflow w"; else classify with lib/verb-classify.py → the auto-launch chooser —
freshest plan / clear-intent-no-plan→a1@plan / /ce-plan.
Workspace / conversation-context / unknown (§17): branch workspace_action; unknown → raw.
Dispatch grammar (reference)
- Single plan:
bash lib/auto.sh "<plan-path> [auto] [--review-plan] [--backend ce|native] [--goal <text>] [--workflow <name>]" - Batch fanout:
python lib/auto-spawn.py fanout <plan> [<plan>...] [--intent "<text>"]— the spawner owns worktrees/ports/sidecar + dispatch; the driver never shells out per sub-run. - Resume:
bash lib/auto-resume.sh "<continue|abort|retry|skip> [<run-id>] [<step>]"
Theory + edge cases (docs/contracts/driver-reference.md): prepare/execute, goal
binding, pulse/handoff/fan-out, exit reasons, goal-aware routing (§17) — load on demand.