跳到正文
cccskills
免费在 GitHub 公开

autopilot

Use this skill when running an autonomous session-orchestration loop. Chains session-start → session-plan → wave-executor → session-end for N iterations with all 10 kill-switches (SPIRAL, FAILED wave, carryover > 50%, max-hours, max-sessions, resource-overload, token-budget, stall-timeout, sub-threshold confidence, user-abort). Reads Mode-Selector output (Phase B) to decide auto-execute vs. fallback. Writes one autopilot.jsonl record per loop run. Phase C scaffold (issue #277); implementation lives in scripts/lib/autopilot.mjs (Phase C-1 follow-up).

中文简介正在准备中。当前显示原文说明。

Kanevry/session-orchestrator星标 52(GitHub 52 + cccskills 0)

实测评分 未实测

查看安装方法

包含的文件(1)

  • SKILL.md29.0 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Autopilot Skill

Invocation

The user invokes /autopilot with arguments: $ARGUMENTS. This is autonomous session-orchestration mode — a top-level invocation only, never from inside a running session.

Parse $ARGUMENTS before anything else. Unrecognized flags are ignored; out-of-range values silently clamp to bounds. Use parseFlags from scripts/lib/autopilot.mjs for canonical parsing — never re-implement clamping inline. The loop flags (--max-sessions, --max-hours, --confidence-threshold, --dry-run) and their defaults/bounds are tabled once in § Command Surface below. Two further flags belong to the invocation surface only:

FlagDefaultMeaning
--headlessfalseRun via the standalone driver scripts/autopilot.mjs, which spawns claude -p '/session <mode>' as a child process per iteration. Required for unattended walk-away mode. Without it, /autopilot runs the in-process driver inside the current chat session (see § Production Wiring).
--verbosefalseVerbose driver output.

Headless (claude -p)

Headless requirements:

  • Anthropic API key configured for claude -p (Claude Code CLI auth).
  • scripts/autopilot.mjs starts each child with --session-id <fresh uuid> and, after it exits, reads the one canonical sessions.jsonl record whose raw_session_id is that uuid to construct the sessionRunner return shape — the spawned session must complete cleanly and append its record (session-end Phase 3.7 handles this). No such record, or more than one, stops the loop with failed-wave instead of reading the ledger tail (#1457). So does a unique record that is only a backfill stub (no waves/agents/token totals — the child never closed): its token usage is unknown, not 0, so it is never counted as a healthy 0-token iteration (#1457 F2).
  • AUTOPILOT_RUN_ID env var is set in the child's env, but nothing reads it yet (measured 2026-10-01: rg -n "AUTOPILOT_RUN_ID" scripts hooks skills finds only the writer in scripts/autopilot.mjs and this line). CLI-driven iterations therefore carry no autopilot_run_id on their sessions.jsonl record yet; join them to autopilot.jsonl via the sessions list there, not via that field.

Do NOT re-implement loop logic inline — this skill and scripts/lib/autopilot.mjs are authoritative. Kill-switches are enforced by scripts/lib/autopilot.mjs, not inline by Claude. The runtime writes ONE record to .orchestrator/metrics/autopilot.jsonl per invocation via atomic tmp+rename; no other code path appends to that file.

Phase 0.5: Parallel-Aware Preamble

Skip silently when persistence: false in Session Config.

Before any Phase 1 work, run the parallel-aware preamble per skills/_shared/parallel-aware-preamble.md. The preamble detects other active sessions in the worktree-family via findPeers(repoRoot, { mySessionId }), classifies the caller's mode via classifyMode(callerMode) against the exclusivity-matrix, and either:

  • Returns PASS_THROUGH (no other session / always-ok mode) → continue to Phase 1
  • Returns EXCLUSIVE_BLOCKED → fires Exclusive-Conflict AUQ from skills/_shared/parallel-aware-auq.md
  • Returns PROMOTION_OFFER → fires Worktree-Promotion AUQ (via enterWorktree() from scripts/lib/autopilot/worktree-pipeline.mjs — see parallel-aware-auq.md outcome-handling)

On any non-PASS_THROUGH outcome that does not result in immediate exit, append a Deviation to STATE.md via appendDeviationOnDisk(repoRoot, isoTimestamp, message) from scripts/lib/state-md.mjs.

Implementation reference: skills/_shared/parallel-aware-preamble.md § Implementation. AUQ reference: skills/_shared/parallel-aware-auq.md.

Status

Phase C-1.b complete (2026-04-25, issues #295 + #300). Runtime at scripts/lib/autopilot/kill-switches.mjs:18-32 (the frozen KILL_SWITCHES enum is SSOT) enforces all 10 kill-switches:

  • Pre-iteration (6, #295 + #355): max-sessions-reached, max-hours-exceeded, resource-overload, low-confidence-fallback (with iter-1-fallback / iter-2+-exit asymmetry), user-abort, token-budget-exceeded (cumulative tokens ≥ --max-tokens).
  • Post-iteration (1, ADR-364 §3): stall-timeout — no progress marker in autopilot.jsonl within the threshold (default 600s; missing file → no kill).
  • Post-session (3, #300): spiral, failed-wave, carryover-too-high. Read schema-canonical fields off the sessionRunner return shape: agent_summary.{spiral, failed} (numeric counts) and effectiveness.{carryover, planned_issues}. Absent fields → no kill (forward-compatible: a sessionRunner that does not yet emit those fields silently no-ops the post-session gates).

Atomic autopilot.jsonl writer (tmp+rename, schema_version 1) and silent-clamp parseFlags shipped in C-1. autopilot_run_id is passed into sessionRunner via args.autopilotRunId; production callers MUST persist it into the per-iteration sessions.jsonl record (additive optional field, schema_version 1 compatible). See skills/wave-executor/SKILL.md § Return Shape Contract and skills/session-end/SKILL.md § Phase 3.7.

Purpose

Autopilot collapses the per-session attention cost when Mode-Selector is confident enough to make routine decisions autonomously. A productive day commonly ships 3–7 sessions; each manual session-start costs the user 10–60 seconds of context-switch attention. When the session is genuinely routine (mechanical refactor, post-merge housekeeping, repeated follow-ups from a planned epic), that attention cost is pure overhead.

/autopilot reads the Mode-Selector recommendation, executes the recommended session if confidence clears the threshold, then loops — checking kill-switches between iterations. The user invokes the loop once and walks away; autopilot stops itself when work runs out or quality degrades.

This is opt-in by design: autopilot never starts itself. The user must run /autopilot explicitly. Configuration thresholds (--max-sessions, --max-hours, --confidence-threshold) are CLI flags, not Session Config defaults — the user signals intent for THIS run, not a standing policy.

Command Surface

/autopilot [--max-sessions=N] [--max-hours=H] [--confidence-threshold=0.X] [--max-tokens=N] [--dry-run]
FlagDefaultBoundsMeaning
--max-sessions51..50Iteration cap (graceful exit when reached)
--max-hours4.00.5..24.0Wall-clock budget for entire loop
--confidence-threshold0.850.0..1.0Minimum selectMode confidence for auto-execute
--max-tokens0 (off)0..10000000Token budget for token-budget-exceeded. Unit: cumulative subagent OUTPUT tokens, summed from each sessions.jsonl record's total_token_output (falling back to total_tokens, which is subagent-only as well) — coordinator tokens are not counted. Off by default until calibrated: one measured deep session's subagents produced 450 499 output tokens, so a six-figure budget stops the loop after about one deep session. An iteration whose record carries no token figure adds nothing and is counted as tokens_unknown_sessions (state, return value, autopilot.jsonl, and the run summary line on stdout, which prints tokens=<sum> and — when non-zero — tokens_unknown_sessions=<n>), so with any such iteration the sum is a LOWER bound and the budget can be overshot
--dry-runfalse—Print planned iterations without executing

Out-of-range values silently clamp to bounds. --dry-run exits after printing — never invokes session lifecycle.

Loop Semantics

state := { iterations_completed: 0, started_at: now(), kill_switch: null, sessions: [] }

WHILE state.iterations_completed < max-sessions:
  # Pre-iteration kill-switches (6)
  IF aborted: kill_switch := 'user-abort'; break
  IF state.iterations_completed >= max-sessions:
    kill_switch := 'max-sessions-reached'; break
  IF (now() - state.started_at) > max-hours:
    kill_switch := 'max-hours-exceeded'; break
  IF max-tokens > 0 AND cumulative_tokens_used >= max-tokens:
    kill_switch := 'token-budget-exceeded'; break
  IF resource_verdict() == 'critical' AND peer_count() > autopilot-peer-abort:
    kill_switch := 'resource-overload'; break

  recommendation := mode-selector.selectMode(<live signals from session-start Phase 7.5>)

  IF recommendation.confidence < confidence-threshold:
    IF state.iterations_completed == 0:
      fallback_to_manual()  # iteration 1: hand off cleanly to manual /session flow
    ELSE:
      kill_switch := 'low-confidence-fallback'  # iteration 2+: exit, let user decide
    break

  cap := resource_adaptive_cap()
  session_result := run_session(mode=recommendation.mode, agents_per_wave_cap=cap)
  state.sessions.append(session_result.session_id)

  # Post-iteration kill-switch (1)
  IF stalled(autopilot.jsonl) >= stall-timeout: kill_switch := 'stall-timeout'; break
  # Post-session kill-switches (3)
  IF session_result.spiral_detected: kill_switch := 'spiral'; break
  IF session_result.failed_waves > 0: kill_switch := 'failed-wave'; break
  IF session_result.carryover_ratio > 0.50: kill_switch := 'carryover-too-high'; break

  state.iterations_completed += 1

write_autopilot_jsonl(state, kill_switch)
print_summary(state, kill_switch)

Atomicity rule: iteration boundaries are atomic. A session must complete (/close including the post-session writes) before the next iteration starts. Autopilot does NOT abort sessions mid-flight; kill-switches are checked AFTER each session completes.

Kill-Switches

All 10 kill-switches, grouped by check phase (mirrors the KILL_SWITCHES enum in scripts/lib/autopilot/kill-switches.mjs:18-32):

Kill-switchPhaseTriggerRecovery hint
max-sessions-reachedpre-iterationiterations_completed >= --max-sessionsGraceful — not an error.
max-hours-exceededpre-iterationWall-clock exceeds --max-hoursRe-run with higher --max-hours or address slow waves.
resource-overloadpre-iterationverdict==critical AND peers > autopilot-peer-abortWait for peer sessions to complete or close them.
low-confidence-fallbackpre-iterationconfidence < threshold (iteration 2+)Re-run with lower --confidence-threshold or run next session manually.
user-abortpre-iterationCtrl+C / Esc (AbortSignal)Re-run when ready.
token-budget-exceededpre-iterationcumulative_tokens >= --max-tokens (#355)Re-run with a higher --max-tokens budget or split the work.
stall-timeoutpost-iterationNo progress marker in autopilot.jsonl within threshold (ADR-364 §3; default 600s)Inspect the stalled iteration; missing telemetry file is NOT a kill.
spiralpost-sessionwave-executor spiral detection fires (agent_summary.spiral > 0)Triage the spiraling wave manually; autopilot will not retry.
failed-wavepost-sessionAny wave reports agent_summary.failed > 0Investigate failure mode (test contract drift, env issue). Re-run after fix.
carryover-too-highpost-sessioncarryover/planned > 0.50Last session under-delivered. Reduce scope or split issues before resuming.

Resource-Adaptive Concurrency

Autopilot does NOT hard-block on peer Claude processes. It adapts agents-per-wave cap per iteration based on the most-restrictive resource signal.

TierRAM freeSwapPeersmacOS memory_pressurecap
green≥ 6 GB< 1 GB≤ 2≥ 30% freeSession Config default
warn4–6 GB1–2 GB3–415–30% free4
degraded2–4 GB2–3 GB5–65–15% free2
critical< 2 GB> 3 GB> 6< 5% free0 (coord-direct)

Most-restrictive-signal-wins: [ram=8GB, swap=0, peers=7] → critical (peer rule wins).

Defaults are conservative initial estimates. Phase C-3 follow-up calibrates the swap and memory_pressure thresholds against real autopilot-run effectiveness data.

Production Wiring

Phase C-1 ships runLoop as a pure controller. Phase C-1.c ships buildLiveSignals as the canonical signals-assembly helper. This section documents the in-process driver protocol (Option B from #301): how Claude — running as the coordinator in a chat session — drives runLoop between manual /session invocations. The headless wrapper (Option A, scripts/autopilot.mjs CLI spawning claude -p) is selected with --headless — see § Invocation.

Dependency-Injection Contract

runLoop requires four injected dependencies:

FieldSignatureSource
modeSelector() => Promise<{mode, confidence, rationale?}>wraps selectMode(await buildLiveSignals())
sessionRunner({mode, autopilotRunId}) => Promise<{session_id, agent_summary?, effectiveness?}>wraps a /session <mode> invocation; reads the child's own record (matched on raw_session_id) to construct return value
resourceEvaluator() => {verdict}calls evaluate(cachedProbeSnapshot, thresholds) from resource-probe.mjs over a snapshot peerCounter refreshed on the prior iteration — never calls probe() itself, which is what keeps it synchronous
peerCounter() => Promise<number>returns peers.length from detectPeers({ sessionId, freshnessMin: 15 }) (a SESSION count, not a process count — see host-resources.md HR-103) while refreshing the cached probe() snapshot resourceEvaluator reads

abortSignal is optional (Ctrl+C / Esc → user-abort kill-switch).

In-Process Driver Skeleton

import { runLoop, parseFlags } from '$PLUGIN_ROOT/scripts/lib/autopilot.mjs';
import { buildLiveSignals } from '$PLUGIN_ROOT/scripts/lib/build-live-signals.mjs';
import { selectMode } from '$PLUGIN_ROOT/scripts/lib/mode-selector.mjs';
import { probe, evaluate } from '$PLUGIN_ROOT/scripts/lib/resource-probe.mjs';
import { detectPeers } from '$PLUGIN_ROOT/scripts/lib/session-registry.mjs';

const flags = parseFlags(process.argv.slice(2));

const modeSelector = async () => {
  // Each iteration rebuilds signals from current disk state. STATE.md will
  // carry the recommendation the previous /close wrote (the idle reset at the
  // next session-start keeps those keys, #1560), sessions.jsonl will have the
  // new tail entry, etc. This is the contract: live signals every iteration.
  // `repoRoot` is passed explicitly (#1071) rather than left to the helper's
  // cwd default. Do NOT hand-write a `backlogLimit` here — the window default
  // lives once, in backlog-scan.mjs (`DEFAULT_BACKLOG_LIMIT`); see
  // skills/session-start/phase-7-5-mode-selector.md for the same contract.
  const signals = await buildLiveSignals({ repoRoot: process.cwd() });
  return selectMode(signals);
};

let cachedProbeSnapshot = null;   // written by peerCounter, read by resourceEvaluator

const resourceEvaluator = () => {
  // Synchronous by contract: never calls probe() itself (it is async) — reads
  // the snapshot peerCounter refreshed on the prior iteration.
  if (cachedProbeSnapshot === null) {
    return { verdict: 'warn', reasons: ['probe not yet available'], recommended_agents_per_wave_cap: null };
  }
  return evaluate(cachedProbeSnapshot, thresholds);
};

const peerCounter = async () => {
  // A SESSION count, not a process count (host-resources.md HR-103) —
  // claude_processes_count runs ~6 processes per session. `ownSessionId` is
  // this coordinator's registry id, so detectPeers() excludes it.
  const [peers, snapshot] = await Promise.all([
    detectPeers({ sessionId: ownSessionId, freshnessMin: 15 }),
    probe(),
  ]);
  cachedProbeSnapshot = snapshot;
  return peers.length;
};

const sessionRunner = async ({ mode, autopilotRunId }) => {
  // The coordinator (Claude) invokes /session <mode> manually here. After the
  // session completes (/close runs, sessions.jsonl appended), this function
  // reads the tail entry and projects it into the runLoop return-shape.
  // CAUTION: a tail read has the peer-append error class — a parallel session
  // that appends after this one supplies ITS record (and token usage). A real
  // run should read its own record by raw session id, as scripts/autopilot.mjs
  // does (readOwnSession → raw_session_id match, #1457).
  const tail = readSessionsJsonlTail(1);   // last line, normalized
  return {
    session_id: tail.session_id,
    agent_summary: tail.agent_summary,    // {complete, partial, failed, spiral}
    effectiveness: tail.effectiveness,    // {planned_issues, carryover, completion_rate, ...}
  };
};

const result = await runLoop({
  ...flags,
  modeSelector,
  sessionRunner,
  resourceEvaluator,
  peerCounter,
});

Why In-Process First

The in-process driver has Claude (the coordinator) call /session <mode> between runLoop iterations, with runLoop orchestrating the kill-switches. Trade-offs:

  • Pro: zero new infra. Reuses canonical kill-switch logic. Validates buildLiveSignals against real Phase 7.5 swap before headless complexity. Each iteration carries inter-session memory through STATE.md / sessions.jsonl / learnings.
  • Con: not truly autonomous — Claude must stay in the chat. The in-process driver does not deliver walk-away UX; that is the shipped headless driver (--headless, scripts/autopilot.mjs, Phase C-5; see § Headless Driver Wiring).

Headless Driver Wiring (Option A — scripts/autopilot.mjs)

The standalone headless driver invoked via --headless (see § Invocation) wires all four required runLoop dependencies (modeSelector, sessionRunner, resourceEvaluator, peerCounter) plus the optional abortSignal to production sources — distinct from, and more concrete than, the in-process skeleton above:

  • sessionRunner — spawns claude -p '/session <mode>' --session-id <uuid> as a child process; after it exits cleanly, reads the one canonical sessions.jsonl record whose raw_session_id is that uuid to construct the return shape {session_id, agent_summary?, effectiveness?, usage?} (scripts/autopilot.mjs sessionRunner).
  • resourceEvaluator — calls evaluate(cachedProbeSnapshot, thresholds) from scripts/lib/resource-probe.mjs, reading a snapshot refreshed by peerCounter on the prior iteration so the function itself stays synchronous, per the runLoop contract (scripts/autopilot.mjs resourceEvaluator).
  • peerCounter — calls detectPeers({ sessionId: autopilotRunId, freshnessMin: 15 }) from scripts/lib/session-registry.mjs AND refreshes the cached probe() snapshot in the same call, returning peers.length (scripts/autopilot.mjs makePeerCounter).
  • abortSignal — an AbortController aborted on the process's SIGINT handler.

autopilot_run_id Propagation

When runLoop invokes sessionRunner({mode, autopilotRunId}), the per-iteration sessions.jsonl record MUST carry autopilot_run_id: <id>. session-end Phase 3.7 writes this field. Manual sessions write null or omit it — readers treat both identically per the v1 schema additive convention. See skills/session-end/session-metrics-write.md.

Acceptance Signals

A live /autopilot invocation against this wiring produces a non-zero confidence recommendation when at least one signal source is populated (state-md rec fields, sessions.jsonl tail, learnings, or backlog). Confidence at 0.0 with all four sources populated is a Mode-Selector heuristic bug (file as [Mode-Selector v1.x quirk] issue), not an autopilot bug.

Pre-Loop Verdict Gate (dispatcher → autopilot handoff — #682)

When the cross-repo dispatcher (skills/dispatcher/SKILL.md) routes into an autopilot launch, a pre-loop suitability verdict decides whether the launch may proceed WITHOUT per-selection operator confirmation. This is distinct from — and runs BEFORE — the loop's 10 kill-switches:

  • The verdict gate is a PRE-LAUNCH decision. It is computed ONCE, at the dispatcher → runLoop handoff, before the first iteration starts. It answers "may I launch this repo autonomously, or must I ask first?" — NOT "should I stop the running loop?"
  • The 10 kill-switches are PER-ITERATION and reused UNCHANGED. Once runLoop starts, the frozen KILL_SWITCHES enum (scripts/lib/autopilot/kill-switches.mjs:18-32) governs when the loop stops, exactly as documented above. The verdict gate adds NO new kill-switch, modifies NONE of the existing 10, and does not re-implement any of them.
  • The gate engine is computeSuitabilityVerdict(deps) from scripts/lib/autonomy/suitability.mjs — a pure four-gate AND (confidence ≥ floor; kill-switch fired-rate < 0.2 over the recent runs, omitted below 5 runs; CI ≠ red; resource ≠ critical). The dispatcher gathers every signal and passes it in (DI); the engine reads no files.
  • Kill-switch history feeds G2 via readRecentAutopilotRuns from scripts/lib/autopilot/recent-runs.mjs, which reads THIS repo's .orchestrator/metrics/autopilot.jsonl (newest-last, never throws). The verdict's G2 gate counts those records and reads each one's persisted kill_switch field — it never re-enumerates or re-derives the switches; it reads the history the loop already wrote.
  • FAIL-CLOSED launch wiring: the dispatcher launches without confirmation ONLY when autonomy === 'autonomous-gated' AND verdict.suitable === true. Every other case (any non-autonomous-gated dial, a CI-red / resource-critical / low-confidence verdict) informs the operator and asks before launch. resolveDispatcherAutonomy defaults to 'off' when unconfigured, so an absent config forces inform + ask. See skills/dispatcher/SKILL.md § Phase 1.5 for the full sourcing table and invariant.
  • null signals are honest, not failures (NICE-b). On a CI-fetch or resource-probe failure the dispatcher passes ci = null / resourceVerdict = null (not a synthesized { status: undefined } or a fabricated 'green'). Each null ⇒ the gate passes + warns — it surfaces a warning the operator sees, it does not block on its own.
  • forcedFail is reachable end-to-end (NICE-c). When CI is red OR resource is critical, verdict.suitable === false REGARDLESS of confidence (the engine words the rationale FORCED: CI red / FORCED: resource critical), so even under autonomous-gated the launch falls to inform + ask. Reachability depends on the dispatcher wiring the live signals through (CI wrapped as { status }, the real resource verdict string) rather than masking them — see skills/dispatcher/SKILL.md § Phase 1.5.

This gate does NOT change the loop. Autopilot remains opt-in, and the kill-switch contract is unchanged — the verdict gate only governs HOW the loop is entered (auto vs. confirm).

Telemetry

One record per /autopilot invocation, written to .orchestrator/metrics/autopilot.jsonl via atomic tmp + rename. See "Autopilot Loop" (#277; archived in the private Meta-Vault) § Output for the full schema.

Each iteration's sessions.jsonl entry gets an additional optional field autopilot_run_id (string or null) so retros can join across the two files without schema changes.

Manual sessions write autopilot_run_id: null (or omit the field — both treated identically by readers per the v1 schema additive convention).

Integration with Other Skills

  • mode-selector.mjs::selectMode — sole source of mode + confidence per iteration. Autopilot does not implement its own mode logic; v1.x quirks affect autopilot exactly as they affect manual session-start.
  • resource-probe.mjs::probe + evaluate — extended in Phase C-2 with swap and memory_pressure signals. Existing consumers (manual session-start, wave-executor) benefit from the new signals automatically.
  • session-start / session-plan / wave-executor / session-end — invoked unmodified. Autopilot is a controller around the existing session lifecycle, not a replacement.
  • session-registry.mjs — peer-count signal source. Autopilot reads but does not write to the registry beyond the standard hook.
  • mode-selector-accuracy — autopilot iterations write accuracy learnings exactly like manual sessions (Phase B-4 contract). The chosen field reflects autopilot's auto-execute decision, which equals recommendation.mode when confidence ≥ threshold.

Critical Rules

  • Never auto-merge or auto-push beyond /close defaults. /close already pushes to origin; autopilot does not add PR creation, merge, or force-push behavior.
  • Iteration boundaries are atomic. Never abort a running session to start a new one.
  • Kill-switches checked AFTER each session. Even if a kill-switch will fire after iteration N, iteration N completes cleanly first.
  • Iteration 1 sub-threshold falls back to manual; iteration 2+ exits with kill-switch. This asymmetry is intentional — see PRD Q8.
  • autopilot.jsonl is the SOLE writer's responsibility of autopilot.mjs. Other skills must not append to or rewrite this file.
  • Mode-Selector contract is read-only here. Autopilot does not modify selectMode output, does not re-rank alternatives, does not patch confidence values.

Anti-Patterns

  • Do not invoke /autopilot from inside a running session. The skill is a top-level command; nested invocation is undefined behavior.
  • Do not modify autopilot.jsonl schema additively without bumping schema_version. Readers MUST treat unknown fields as a forward-compat signal, not as corruption.
  • Do not bypass selectMode to force-run a specific mode. If you want to run a specific mode, use /session [mode] manually — that is autopilot's fallback path.
  • Do not lower --confidence-threshold below 0.5 in production. The Mode-Selector fallback table treats < 0.5 as suggestion-only; autopilot at that threshold becomes a random-walk over modes.
  • Do not implement kill-switch logic in this skill. Kill-switch enforcement is in scripts/lib/autopilot.mjs. The skill documents the contract; the runtime enforces it.

Configuration

Single-story /autopilot takes no Session Config block. Multi-story (autopilot.bg-isolation, --multi-story, --deconflict-paths) was removed in 4.0.0 — see docs/migration-v4.md and docs/session-config-reference.md § "Autopilot Multi-Story (#431) — removed".

References

  • PRD: "Autopilot Loop" (#277; archived in the private Meta-Vault)
  • Implementation (Phase C-1 + C-1.b): scripts/lib/autopilot.mjs — exports runLoop, parseFlags, writeAutopilotJsonl, KILL_SWITCHES, FLAG_BOUNDS, SCHEMA_VERSION, DEFAULT_PEER_ABORT_THRESHOLD, DEFAULT_JSONL_PATH, DEFAULT_CARRYOVER_THRESHOLD
  • Tests (Phase C-1 + C-1.b): tests/lib/autopilot.test.mjs
  • Mode-Selector contract: skills/mode-selector/SKILL.md
  • Resource probe: scripts/lib/resource-probe.mjs
  • Session registry: scripts/lib/session-registry.mjs
  • Wave-executor return shape: skills/wave-executor/SKILL.md § Return Shape Contract
  • Sessions.jsonl writer: skills/session-end/session-metrics-write.md
  • Pre-loop verdict gate (#682): scripts/lib/autonomy/suitability.mjs (computeSuitabilityVerdict) · scripts/lib/config/dispatcher-autonomy.mjs (resolveDispatcherAutonomy) · scripts/lib/autopilot/recent-runs.mjs (readRecentAutopilotRuns) · skills/dispatcher/SKILL.md § Phase 1.5
  • Epic: #271 v3.2 Autopilot — Autonomous Session Orchestration
  • Issues: #277 Phase C scaffold, #295 Phase C-1 runtime, #300 Phase C-1.b follow-up
  • Phase A PRD: "STATE.md Recommendations Contract" (#271; archived in the private Meta-Vault)
  • Phase B PRD: "Mode Selector" (#276; archived in the private Meta-Vault)

Open Questions (Phase C-1 to resolve)

  • --confidence-threshold=auto — let autopilot self-tune from accumulated mode-selector-accuracy learnings? Requires ≥ 20 accuracy learnings before useful.
  • STATE.md autopilot-active: true field — should other Claude sessions detect via the session-registry and refuse to start during an autopilot run? Dogfooding will inform.
  • failed-wave granularity — distinguish "agent failed but was retried successfully" from "wave ended with un-recovered failures"? Requires wave-executor schema audit.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

Use when the user asks to improve architecture, find refactoring opportunities, surface deepening opportunities, consolidate tightly-coupled modules, or make a codebase more testable and AI-navigable. Surfaces shallow modules and hypothetical seams using a precise vocabulary (Module / Interface / Implementation / Depth / Seam / Adapter / Leverage / Locality from LANGUAGE.md).

中文简介正在准备中。当前显示原文说明。

Kanevry/session-orchestrator522026年10月26日 更新

bootstrap

免费

Use this skill when scaffolding the minimum repository structure required by session-orchestrator. Invoked automatically by the Bootstrap Gate when CLAUDE.md, Session Config, or bootstrap.lock is missing. Also available as /bootstrap for manual invocation. Three intensity tiers: fast (demos/spikes), standard (MVPs), deep (production/team).

中文简介正在准备中。当前显示原文说明。

Kanevry/session-orchestrator522026年10月26日 更新

Use when you have a feature idea but the scope or UX is still ambiguous — runs a lightweight Socratic design dialogue (3-5 AUQ rounds) and writes a spec markdown file. Use BEFORE /plan feature when product intent needs validation; skip to /plan feature when scope is already clear. HARD-GATE prevents any code work until the design is user-approved.

中文简介正在准备中。当前显示原文说明。

Kanevry/session-orchestrator522026年10月26日 更新

Use when detecting drift between CLAUDE.md (or AGENTS.md, the Codex CLI alias) / _meta narrative and live repository state. Ten checks: absolute-path resolution, 01-projects/ count claims, issue-reference freshness, session-file existence, command-count sync, session-config-parity (mandatory template keys = error, opt-in gaps = note, unknown local keys = warning), vault-dir-parity (CLAUDE.md vs AGENTS.md), generated-rule-staleness (WARN-only), rule-scoping (paths:/globs: frontmatter defects, dangling rule citations, zero-match globs), and docs-parity (docs/components.md count-claims vs on-disk counts, template-vs-reference config-key parity, stale .claude/metrics/ paths). Full per-check spec in the body table. Invoked as an opt-in session-end phase; mirrors vault-sync's lean JSON+exit-code contract.

中文简介正在准备中。当前显示原文说明。

Kanevry/session-orchestrator522026年10月26日 更新

close

免费

End session with verification, commits, and documentation

中文简介正在准备中。当前显示原文说明。

Kanevry/session-orchestrator522026年10月26日 更新

Monitor iterative improvement loops for convergence. Three signals — shrinking diff, pass-rate plateau, velocity — drive a Stop/Continue/Investigate decision at each inter-wave checkpoint. Distinct from /evolve (retrospective) and session-reviewer (wave output review): convergence-monitoring answers "are we making progress?" not "was the last wave correct?". Primary consumer: /autoresearch loops and wave-executor inter-wave checkpoints.

中文简介正在准备中。当前显示原文说明。

Kanevry/session-orchestrator522026年10月26日 更新

查看 Kanevry 的全部技能

报告此技能的问题