unattended

Installation
SKILL.md

Clean Room Unattended

Start the clean-room startup wizard with controller_policy.mode fixed to unattended.

In Pi, this entry point is invoked as /skill:unattended.

Use the canonical clean-room skill workflow and references in this plugin. Read skills/clean-room/references/CONTROLLER-LOOP.md before defining unattended loop behavior. Preserve the same clean-room boundary, role separation, artifact schemas, leakage rules, implementation-root rules, and hook expectations.

Before asking setup or preflight questions, use the canonical clean-room "Run State Discovery Before Wizard" rules. Resolve explicit artifact paths first, then current-repo .clean-room/local-state.json, then configured clean-room roots, then bounded ~/Documents/CleanRoom/task-* (legacy) and ~/Documents/CleanRoom/*/tasks/task-* (project layout) candidates. Treat target-repo .clean-room/tasks/ as noncanonical unless explicitly provided or named by the local pointer. If a valid task-manifest.json exists, route to resume-cr. If a task-manifest.json exists but is invalid or legacy-shaped, stop and report its exact path and validation errors. If a valid canonical preflight-goal.json exists without a manifest, continue at source/destination discovery and manifest creation. If a preflight artifact exists but is invalid, stop with schema errors instead of restarting preflight. If a project is found with only completed tasks and the user wants more work, create the next task in that project by default. If multiple candidates are found without an explicit path, list them and stop for selection.

This unattended skill runs on every supported runtime; only the optional dynamic-workflow shortcut below is Claude Code specific. Role execution preference, most to least preferred:

  1. In-harness roles with fresh context and no external process spawn. In Claude Code this is the cost-free dynamic workflow front door /clean-room:clean-room-loop (in-session agent() subagents, new context per role; self-bootstraps init, preflight, and decomposition). It is Claude Code only and installs project-local (.claude/workflows/); it gives context-level separation, not the OS-enforced wall. On non-Claude harnesses, run each role as a fresh in-harness subagent or skill session orchestrated from the controller.
  2. Durable runner with external process dispatch: last resort, or when you specifically need the OS-enforced wall. Use clean-room-skill run --task-manifest <path> --agent-commands <adapter> (spawns the harness's own CLI, shell: false) on Codex, Pi, and every non-Claude runtime; --agent-runtime claude spawns claude -p per role and is Claude only and per-token, so treat it as the last resort even on Claude Code. Never pass --agent-runtime claude on a non-Claude runtime. Launch the runner only after the manifest has loop_context with an approved pending or gap unit. For ccsilo/OpenRouter sessions, use clean-room-skill run --task-manifest <path> --ccsilo [variant] instead of manual --agent-runtime claude, --agent-config-dir, or CLEAN_ROOM_CLAUDE_EXECUTABLE wiring. Never write ANTHROPIC_AUTH_TOKEN or API keys into ccsilo or Claude settings files. If an unattended manifest lacks loop_context, treat it as incomplete outer-loop state: finish decomposition or selected-slice approval first, or stop with the missing outer-loop fields instead of launching the runner. If clean-room-skill is not on PATH, immediately use npx clean-room-skill@latest run --task-manifest <path> --agent-runtime claude instead of searching for the installed package. Do not search plugin cache paths for schema files, and do not pass --schema-dir /dev/null. The runner uses bundled schemas by default; pass --schema-dir only when the user provides a real schema directory. The main conversation must not perform Agent 1, Agent 2, Agent 3, or Agent 4 work once runner-ready unattended state exists. Do not edit task-manifest.json unit statuses in the main conversation; unit completion must come from runner-managed role artifacts and contaminated-side coverage verification. Do not ask to continue while controller_policy.mode is unattended, the iteration budget remains, and approved pending or gap units remain. If Claude role-agent dispatch or the runner is unavailable, stop with BLOCKERS: Claude role-agent dispatch unavailable instead of falling back to main-chat execution.

Load or create preflight-goal.json first. Unattended mode requires a complete goal contract with no blocking or non-blocking open_questions, controller_policy.unattended_allowed_after_preflight: true, finite controller_policy.max_iterations, and intent_confirmation showing the end goal, target stack, and controller mode came from explicit user answers.

Do not assume end goal, target language, runtime, framework, package manager, test framework, license policy, dependency policy, exactness policy, output directory, or feature add/remove policy during the unattended loop. Source language and build tooling are not destination choices. If the user's end goal or target stack is unknown, leave blocking open_questions, keep unattended disabled, and stop on ambiguity instead of inventing product decisions.

Installs
2
GitHub Stars
10
First Seen
Jun 28, 2026
unattended — whit3rabbit/clean-room-skill