End-to-end operation for cross-vendor orchestration running today. Claude
Code is the typical/default architect host but is not required by the
harness itself — orchestration works from Grok or Codex instead. Every run
moves through three ordered stages — Setup & Environment → Use →
Cleanup — identically on Windows and WSL/Linux. Soft mode is the default
Use path; hard mode is called out where it differs. Claims below match the
tree under skills/foreman/, agents/, env/, launcher/, and tests/,
and are consistent with
references/orchestration-hardening.md
and
references/reference-environment.md.
Setup owns tool inventory, bootstrap, and all vendor authentication. It never runs during Use.
cd path\to\foreman
.\env\tool-check.ps1 -Profile soft -Json -Out $env:USERPROFILE\.foreman\last-tool-check.jsonIf not ready:
.\env\bootstrap-windows.ps1 -Profile soft -Yes
.\env\tool-check.ps1 -Profile softcd /path/to/foreman
bash env/bootstrap-wsl.sh --profile soft --yes # full WSL-native provisioning
bash skills/foreman/scripts/foreman-setup.sh --profile softOn WSL, Setup automatically builds launcher/dist/foreman-launch when it is
absent and bun is available. An existing executable is a no-op. If the
automatic build cannot run because bun is absent, install Bun and run the
manual fallback before re-running Setup:
cd launcher && bun run build:posixforeman-setup.sh (skills/foreman/scripts/foreman-setup.sh [--profile soft|hard|full] [--lane grok|codex|claude]) composes env/tool-check.sh
rather than reimplementing it, and is bash-only — run it under Git Bash on
Windows, natively on WSL/Linux. It prints one <vendor>: NOT-READY -- run <instruction> line for every unauthenticated vendor and never authenticates
anything itself:
| Vendor | Instruction Setup prints |
|---|---|
| grok | grok login --device-code |
| codex | codex login |
| claude | claude auth login |
Run the printed instruction yourself, then re-run the Setup command — it is
idempotent, so re-running against an already-ready host changes nothing and
re-reports READY. --lane <vendor> scopes the check to that vendor's own
readiness signal only, so a gap in an unrelated tool never blocks a lane
whose own vendor is already authenticated. Exit 0 = READY, 1 =
NOT-READY (whole-profile mode) or that lane not ready (--lane mode).
WSL is a co-equal, fully-provisioned target as of v0.2.7.5
(wsl-reliability-env-refresh): bootstrap-wsl.sh installs every tool
WSL-native — bats-core, shellcheck, bun (pinned 1.3.14), pueue (GitHub
release binary, no apt package), codex/grok (npm, forced @latest so the
platform-specific optional dependency re-resolves), jq, node/npm via fnm,
hwclock — and symlinks each into /usr/local/bin ahead of /usr/bin, so
resolution is identical under a login or non-login shell. /etc/wsl.conf's
[interop] appendWindowsPath=false stops a leaked Windows npm shim from
shadowing the WSL-native codex/grok binaries.
cd path\to\foreman
claude/model claude-fable-5-1
/foreman
Use the canonical model ID. Foreman does not accept the fable alias as
evidence that Fable 5.1 ran.
Restate the goal and mode in one short paragraph. Soft unless you set
mode = "hard" in .foreman/config.toml or ask for hard mode.
Use assumes an authenticated, provisioned environment and never
authenticates — lane-run.sh refuses to spawn a lane for a not-ready vendor
(citing Setup) before it ever touches the worktree lock, so a missing login
is always caught at Setup, never mid-round.
Pick one RUN_ID for the whole session (letters, digits, ., _, -
only):
RUN=run-$(date +%Y%m%d-%H%M%S)
bash skills/foreman/scripts/wt-new.sh "$RUN" search
bash skills/foreman/scripts/wt-new.sh "$RUN" planEach call prints the worktree path. Layout (sibling of the repo root):
<parent>/<repo>-wt-<RUN_ID>-search/
<parent>/<repo>-wt-<RUN_ID>-plan/
Branches: foreman/<RUN_ID>/<role>[/<slug>]. Metadata and reports archive
under ~/.foreman/runs/<RUN_ID>/.
In Claude, spawn foreman-search and foreman-plan in parallel (one turn),
each with cwd set to its worktree (or isolation: worktree). Both are
read-only for product code. Each must write:
FOREMAN_REPORT.mdFOREMAN_REPORT.json(schemaforeman.worktree-report.v1)
bash skills/foreman/scripts/wt-consolidate.sh "$RUN"Read ~/.foreman/runs/$RUN/CONSOLIDATED.md. Synthesize; do not ship on a
single partial report.
Create an implement worktree (default for soft implement rounds):
bash skills/foreman/scripts/wt-new.sh "$RUN" implement docs-stageRoute the full five-part spec to grok-implementer (or codex-implementer)
with that worktree as cwd. Standing rule: implementers never run git write
commands; changes stay uncommitted until the architect merges. Spec
template and vendor lane recipes: section 5 below and
../skills/foreman/references/five-part-spec.md.
Reports are claims. You:
git -C <implement-wt> statusandgit diff- Re-run the Verification command from the spec yourself
- Confirm evidence digests moved when the model claimed edits
Wrong code → corrected five-part spec back to the cheap implementer lane, not hand-patching on the architect model.
bash skills/foreman/scripts/wt-new.sh "$RUN" auditPass to codex-auditor (or foreman-audit wrapper): worker vendor,
acceptance criteria from the five-part spec, and a cold unified diff. After
the run, git status --porcelain in the audit tree must show no auditor
mutations.
bash skills/foreman/scripts/wt-consolidate.sh "$RUN"
# if implement tree is ready and checks + audit are green:
bash skills/foreman/scripts/wt-merge.sh "$RUN" implement docs-stage
# optional: --commit to create a single merge commit; default is staged onlyConsult foreman-advisor only at commitment boundaries (architecture,
migration, API shape, or a problem that failed twice). Then run Cleanup
(section 3) to close the run.
bash skills/foreman/scripts/foreman-cleanup.sh "$RUN" [--force]Deterministic, idempotent teardown, in order:
- Best-effort SIGINT of any lane subprocess this run's event log still shows alive — before any worktree is touched.
- Delegates to
wt-cleanup.sh(wt-cleanup.sh RUN_ID [--force] [--keep-branches]): runs consolidate ifCONSOLIDATED.mdis missing, removes worktrees, deletes branches unless--keep-branches, skips dirty worktrees unless--force, keeps reports under~/.foreman/runs/<RUN_ID>/. Refuses to delete a worktree with uncommitted/untracked changes unless forced — reports are archived first either way. - Stops a foreman-owned
pueuedonly if this run's own.pueued-ownedmarker says this run started it — never a blindpueue shutdown. - Sweeps this run's own stale
.seq.lock/.attempt.lock/.supervise.lockdirectories — never the host-wide~/.foreman/gate.lock(section 4 owns that one) and never a worktree's own live.harness/lane.lock.
Safe to run more than once: re-running against an already-cleaned-up run is
a no-op. --force is typically required in practice — report files are
intentionally never merged, so an implement worktree that only ever wrote
FOREMAN_REPORT.* is still "dirty" from git's point of view even after a
successful wt-merge; those reports are already archived under
~/.foreman/runs/$RUN/ by wt-consolidate before Cleanup runs.
| Lane | Producer | Direct CLI (headless) |
|---|---|---|
| Routine implementer | Grok 4.5 | grok --prompt-file … -m grok-4.5 --allow "Write" --allow "Edit" --output-format plain --cwd <dir> |
| Cross-vendor implementer | GPT-5.6 Sol (medium) | codex exec --model gpt-5.6-sol -c model_reasoning_effort=medium --sandbox workspace-write |
| Audit (default) | GPT-5.6 Sol (high) | codex exec --model gpt-5.6-sol -c model_reasoning_effort=high --sandbox read-only |
| Judgment | Fable 5.1 | Session model or model: claude-fable-5-1 agent; exact identity is host-verified |
Grok is live on the reference host: Grok Build (0.2.118) installed via
npm i -g @xai-official/grok, signed in via grok login --device-code, and
one-shot headless completions return rc 0. The CLI accepts
--permission-mode acceptEdits but silently ignores it in headless
mode — always pass --allow "Write" --allow "Edit" (capitalized prefixes
auto-approve writes/edits only; shell stays gated, so Grok still cannot
delete, rename, chmod, or run verification). Treat a zero-change evidence
digest after a "successful" run as a cancelled-writes signal, not proof of
nothing to do.
Durable-lane (non-interactive) recipe, distinct from the
architect-dispatched grok-implementer agent above:
grok -p "<spec>" --cwd <worktree> --output-format json --always-approve \
--session-id <uuid> --no-auto-update
# resume:
grok -r <session-id> --cwd <worktree> --output-format json --always-approve \
--no-auto-updateGROK_HOME is set per lane by lane-run.sh's LANE_VENDOR=grok plumbing —
never shared across concurrent lanes. Before spawning grok, lane-run.sh
scans the worktree for .env files (any depth, excluding .env.example)
and private-key material and refuses the lane
(alert{kind:"grok_secrets_refused"}) if either is found, since Grok
Build's whole-repo-upload behavior is unrefuted.
Grok's concurrency is capped, not promoted. It remains the routine
implementer by doctrine, but the destructive real-vendor concurrency test
(T5b) has not recorded an authenticated green row for either grok or codex
(docs/research/vendor-concurrency-results.md) — see section 4.2's gate
group and the honest-limits section in the README for the full account.
Do not raise the grok/codex pueue caps above 1 on the strength of the
unauthenticated auxiliary evidence in that file.
lane-queue.sh ensure|add GROUP --endstop-state-root ABS --endstop-contract-id ID --endstop-contract-sha SHA256 --endstop-action ACTION --endstop-candidate-sha SHA256 -- CMD [ARGS...]|status [TASK_ID]|kill TASK_ID wraps pueue (staged at
~/.foreman/tools/pueue/, v4.0.4 — no
Windows package-manager route) with a fixed group topology, created
idempotently by ensure:
| Group | Parallelism | Purpose |
|---|---|---|
grok |
1 | Grok CLI concurrency cap (T5b UNVERIFIED) |
codex |
1 | Codex CLI concurrency cap (ditto) |
claude |
3 | Claude lane concurrency |
misc |
2 | Catch-all |
gate |
1 | Host-wide bats mutex — every bats invocation, lane/auditor/investigation, enqueues here |
The gate group exists because concurrent bats suites on one host is the
single most frequent failure class recorded in bugeventlog.md (corrupted
wall-clock tests, an orphaned auditor-run suite blocking the release gate
for roughly an hour). Standing rule: a lane round runs only its own
.bats file in its inner loop; the architect runs the full suite once at
merge, as sole gate holder; auditor and investigation agents never run bats
at all — they reason from code, never from a live test invocation.
Enqueue an implement round through the queue rather than dispatching the vendor CLI directly:
add is contract-bound (v0.3 prerequisite -- see "Foreman Endstop" in
skills/foreman/SKILL.md): every enqueue carries the five --endstop-*
flags from an already-created execution contract, or the CLI refuses
admission before touching pueue.
bash skills/foreman/scripts/lane-queue.sh add grok \
--endstop-state-root "$STATE_ROOT" --endstop-contract-id "$CID" \
--endstop-contract-sha "$CSHA" --endstop-action implement \
--endstop-candidate-sha "$CANDIDATE_SHA" -- <grok invocation>
bash skills/foreman/scripts/lane-queue.sh add gate \
--endstop-state-root "$STATE_ROOT" --endstop-contract-id "$CID" \
--endstop-contract-sha "$CSHA" --endstop-action verify \
--endstop-candidate-sha "$CANDIDATE_SHA" -- bash tests/run.sh
bash skills/foreman/scripts/lane-queue.sh status <TASK_ID>If pueue is absent (or LANE_QUEUE_FORCE_MISSING=1), add degrades to a
direct foreground spawn with a "degraded" stderr marker; ensure/status/
kill fail loudly rather than silently no-op.
An implement round that must survive the dispatching agent backgrounding
and stopping is lane-run.sh --round GATE_CMD REPORT_PATH RUN LANE WORKTREE -- CMD... — this owns the whole round (CMD → gate → attempt-fresh
report assert → round_done), not just the bare vendor CLI:
bash skills/foreman/scripts/watch.sh "$RUN" "$LANE" "$WORKTREE"is the per-lane stall watchdog. Arm real watchers with
WATCH_OWNERSHIP_WAIT=25000 (milliseconds — 25 seconds, matching the
ownership event's own ~20s emission bound; the shipped default 3000 is a
bats-test-scale compromise, not the deployment recommendation). On DEAD it
prints a kill+retry hint and exits 3. Recover a DEAD/crashed lane with:
bash skills/foreman/scripts/resume.sh [--force] [--exact] RUN LANE WORKTREEFull launcher contract, the typed watch-state machine, vendor config
isolation, and the merge-freshness gate:
../skills/foreman/references/orchestration-hardening.md.
Copy from skills/foreman/references/five-part-spec.md:
## Objective
[One paragraph: what to build or change and why.]
## Files
- create: path/to/new.file
- modify: path/to/existing.file
- do not touch: path/to/protected/**
## Interfaces
[Signatures, types, API shapes, HTML section IDs, CSS tokens.]
## Constraints
- Project conventions: …
- Stack / libraries: …
- Forbidden: no new dependencies without asking; no drive-by refactors
- Mode notes: soft | hard
## Verification
# Exact command(s) the orchestrator will re-run
test -f path && grep -q "marker" path
- NEVER run git write commands (
commit,add,reset,branch,push,rebase,merge,tag). Changes stay uncommitted in the working tree. - Do not delete or rename files. List needed deletions/renames under
ARCHITECT_ACTIONSin the report. - Work only inside the provided worktree path.
- No network access unless the spec explicitly grants it.
- Documentation and comments are part of the deliverable: markdown passes
markdownlint-cli2; bash functions carry shdoc headers (
# @descriptionminimum); scripts carry a top-of-file purpose comment.
If you cannot fill Interfaces or Verification, you are not ready to delegate.
| Situation | Route |
|---|---|
| Spec fully determines the outcome | grok-implementer (default) |
| Costly mistakes / judgment-heavy implementation | Race Grok + codex-implementer, or keep with architect |
| Grok CLI missing or timed out | Re-route to codex-implementer and say so |
| After independent checks on a non-trivial diff | codex-auditor (default when worker ≠ OpenAI) |
| Worker was already Codex / OpenAI | Do not call codex-auditor; architect review or non-OpenAI audit; state the substitution |
| Architecture, migration, API shape, stuck twice | foreman-advisor (≤ ~300 words, read-only) |
| Implementer CLIs both unavailable | Architect types only after stating the same-family downgrade |
After implementation and independent product checks, run:
bash skills/foreman/scripts/docs-check.sh
bash skills/foreman/scripts/docs-check.sh --json docs-check.json
bash skills/foreman/scripts/docs-check.sh --online # full link check (network)Tools (fail closed if missing; exit 2):
| Tool | Config | Default mode |
|---|---|---|
| markdownlint-cli2 | .markdownlint-cli2.jsonc |
All **/*.md except vendored ignores |
| codespell | .codespellrc |
Repo spell check with skip list |
| lychee | (CLI flags) | Offline local paths unless --online |
| comment coverage | (script) | Purpose headers + @description on bash functions |
Exit codes: 0 all pass, 1 findings, 2 required tool missing.
docs-check.sh runs exactly these four checks — markdownlint, codespell,
lychee, and comment coverage — and nothing else. It has no AI-slop or
prose-naturalness detector; do not treat a green run as a signal about
writing quality, only about lint/spelling/links/comment hygiene.
Iterative rework. On failure, feed the summary (and docs-check.json if
present) back to the implementer as a corrected five-part spec. Cap loops
with [limits] max_rework_rounds (default 3 in
config/foreman.toml.example).
Auditor vendor must differ from worker vendor. Default: Grok implements
→ Codex GPT-5.6 Sol audits via codex-auditor (--sandbox read-only, high
reasoning). If Codex implemented, stop with blocked_same_vendor and pick
another review path.
Required after independent verification when any of: multi-file or multi-step deliverable; security-sensitive paths (auth, crypto, network, secrets, shell); before declaring a multi-step task done; after a race between implementers (audit the chosen diff). Trivial single-file mechanical edits may skip audit if the architect states why.
{
"verdict": "APPROVED | WARNING | BLOCKED",
"findings": [
{
"severity": "critical | high | medium | low",
"file": "path",
"line": 0,
"summary": "one line",
"evidence": "quote or rationale"
}
],
"summary": "one or two sentences for the architect"
}| Verdict | Soft mode | Hard gate |
|---|---|---|
| APPROVED | Ship if independent checks green | May pass if hashes + forbidden paths clean |
| WARNING | Ship only after architect acknowledges findings | May pass; findings attach to PR body |
| BLOCKED | Rework via implementer with corrected spec | Gate fails |
[audit.policy] (warning_low_resolved/warning_medium/blocked in
.foreman/config.toml) is soft-mode architect doctrine only —
gate-eval.sh does not yet bucket findings by resolved/unresolved severity;
that is a stated v0.3.0 consumer, not silently assumed today.
Symptom: model narrates edits; tree unchanged; evidence digests identical.
Cause: the Grok CLI accepts --permission-mode acceptEdits but
silently ignores that value in headless mode.
Fix: always pass allow rules (capitalized prefixes):
grok --prompt-file "$SPEC" -m grok-4.5 \
--allow "Write" --allow "Edit" \
--output-format plain --cwd "$(pwd)"Heavy concurrent worktree use produces specific, documented failure classes. The guard bundle:
git-guards.sh REPO— idempotent bootstrap:maintenance.auto=false(stops the reactivegc.autoDetachfork that competes for the object-DB lock mid-commit),core.fsmonitor=true+core.untrackedCache=true(faster status without a filesystem watcher),core.longpaths=true(WindowsMAX_PATH),safe.bareRepository=explicit. It also runsgit maintenance run --autodirectly (throttled via a marker file, default interval 3600s) as the foreman-owned maintenance tick — it deliberately does not callgit maintenance register/start, sincestartinstalls real, host-wide Windows Scheduled Tasks this script cannot itself undo. Re-invoke it periodically (a Setup step, or before a work session) to keep the tick current.git_retry(lib/worktree.sh) — bounded exponential backoff (5 attempts, 200→400→800→1600ms) around shared-lock-touching worktree operations, riding out a transientUnable to create '.git/index.lock'instead of aborting on the first failure.wt_sweep_stale_locks REPO [THRESHOLD_S]— removes 0-byte*.lockfiles older than ~30s (default) at lane start, in bothwt-new.shandlane-run.sh, so a crashed prior process's lock never blocks a fresh lane indefinitely. Never touches a non-empty or fresh lock a live process may hold.GIT_OPTIONAL_LOCKS=0on read-only git polling (status/diff/log) andGIT_ASK_YESNO=falselane-wide, so a Windows "Unlink failed. Try again?" prompt auto-declines instead of hanging with no TTY to answer.wt-cleanup.shSIGINT-before-remove — beforegit worktree remove, reads the run's event log for the worktree's lastownershipevent and, if that pid is still alive, SIGINTs it, waits a bounded grace period, and escalates to SIGKILL if needed — order is load-bearing, always before removal. This targets the single recorded pid only; a grandchild process (e.g. a git subprocess it spawned) is swept in a best-effort follow-up pass (taskkill //Tvia winpid translation on Windows, a process-group kill on POSIX) — see the README's honest-limits section for why that second pass exists and what it does not guarantee.- Windows Defender exclusions (operator doctrine, not automated): add
path exclusions for the repo and every sibling
*-wt-*worktree directory — real-time scanning of.gitinternals is a measured stall/unlink-failure cause on this host class.
As of v0.2.7.5 (posix-cascade-parity), the POSIX foreman-launch build
self-re-execs under unshare --pid --mount-proc --fork --kill-child,
becoming PID 1 of a fresh PID namespace — killing the launcher for any
reason now reaps the whole process tree, kernel-enforced. When unshare is
unavailable or fails (checked via a disposable probe before the
irreversible self-replacement), the launcher falls back to the pre-v0.2.7.5
setsid + kill(-pgid) path and logs a DEGRADED marker — check for that
marker before assuming the stronger guarantee held. Full mechanism:
launcher/README.md "POSIX asymmetry."
The Bun binary above always degrades for an unprivileged user, because
unshare(2) needs CAP_SYS_ADMIN for --pid and --mount-proc. Since
2026-09-05 lane-run.sh prefers the Node launcher
(skills/foreman/runtime/dist/foreman-launch.js), which probes a
user-namespace ladder first and gets the cascade unprivileged. Set
FOREMAN_LAUNCH_IMPL=bun to force the legacy binary. Diagnosis:
docs/research/foreman-pidns-degradation-2026-09-05.md.
Before spawning CMD, lane-run.sh runs the launcher in --probe-only mode and
reads <WT>/.harness/capability.json. The round's ownership event then
carries containment: {tag, kind, reason, approval}.
FOREMAN_CONTAINMENT_REQUIRE=strong|any. DefaultstrongwhenLANE_VENDORis set (an implementation lane), elseany.- A non-strong capability under
strongwith no approval is refused:lane-run.shemitsalert {kind: "containment_refused"}, printslane-run: REFUSED containment=..., and exits 2 before CMD runs. FOREMAN_CONTAINMENT_APPROVAL="<reason>"admits a degraded round and records the reason in the degraded alert and the ownership event. Set it through the queue withlane-queue.sh add ... --containment-approval REASON.- Setup shows a
containmentrow (env/tool-check.sh). It reports DEGRADED when the probe fails and never changes generic READY. - With a strong capability,
lane-run.shkills the launcher pid withSIGKILLon cleanup, which tears the namespace down. With a degraded capability it keeps the process-group kill.
If launcher/dist/foreman-launch itself is absent, there is no pidns launcher
to enter and lane-run.sh emits the frozen launcher_absent degraded alert.
Re-run Setup, which builds the launcher automatically on WSL when bun is
present, or build it manually:
cd launcher && bun run build:posixImplementer and auditor wrappers use timeout/gtimeout 600 seconds
when present. On STATUS: timeout, split into smaller five-part specs or a
narrower audit diff and re-route. Do not silently lengthen a hung call or
substitute Claude under the Codex lane name.
Hard-mode scripts and some metadata paths prefer jq. When jq is missing,
only wt-merge.sh accepts python3 or python; wt-new.sh,
wt-consolidate.sh, and wt-cleanup.sh require python3 specifically. On
a Windows-only host where only a python command is on PATH (no python3
alias/shim), those three scripts fail with a missing-command error even
though Python is installed — use a python3 alias/symlink (or WSL) for
them; wt-merge.sh alone works with plain python. Install Python ≥ 3.11
for the fallback, or install jq in WSL for hard mode.
env/reference-manifest.toml marks jq required for hard/full on WSL.
bash tests/run.shLooks for bats on PATH, then ~/.foreman/tools/bats-core/bin/bats.
Install hint from the runner:
git clone https://github.com/bats-core/bats-core ~/.foreman/tools/bats-coreContract is WSL (or Git Bash with bats); PowerShell does not run the suite.
docs-check.sh resolves lychee from PATH, then
%LOCALAPPDATA%/Microsoft/WinGet/Links/lychee.exe, then WinGet package
folders. After a winget install, open a new shell so PATH and those
locations are visible; otherwise lychee is recorded missing and
docs-check exits 2.
| Symptom | Action |
|---|---|
STATUS: unavailable from a lane |
Install/auth the CLI; re-route; never fake the lane as Claude |
blocked_same_vendor from codex-auditor |
Worker was OpenAI family; pick another auditor |
| wt-merge exit 5 | Overlap with dirty target files; commit, stash, or partition ownership |
| wt-cleanup skips tree | Dirty worktree; commit/merge first or pass --force |
| Gate fail closed | Missing audit CLI or checks infra; fix inventory, do not skip gate |
| Setup reports a vendor NOT-READY | Run the printed auth instruction; a Use request to that vendor is refused at the door, never mid-round |
Why the cost discipline? The session architect model is the expensive lane. It should emit judgment (specs, routing, verdicts), not implementation volume. Graph-query-first and cheap implementers keep most tokens off Fable/Opus.
Why cross-vendor audit?
Same-family self-review shares blind spots. Default pairing (Grok
implements, Codex Sol audits, Claude architects) decorrelates review.
Same-vendor audit of a Codex worker via codex-auditor is forbidden.
Is grok mandatory?
No. You can orchestrate without Grok/Codex, but implementer and auditor
agents will report unavailable rather than silently typing as Claude.
Grok is live and wired into the lane machinery on the reference host, but
its concurrency beyond one lane is UNVERIFIED (T5b) — see the README's
honest-limits section — so nothing in this doc treats it as mandatory or
as concurrency-safe.
Where does run state live?
$FOREMAN_HOME/runs/<run-or-task-id>/ (default ~/.foreman/runs/),
including worktree metadata, reports, CONSOLIDATED.md, and hard-mode
evidence. Worktrees themselves sit as siblings of the repo root:
<parent>/<repo>-wt-<RUN_ID>-<role>[-slug]/.
Soft vs hard: which should I use?
Soft for interactive Claude sessions with Grok/Codex CLIs. Hard when you
need scripted INIT→GATE enforcement, host evidence, and forbidden-path
gates. Hard mode's IMPLEMENT stage (worker-run.sh) is still a stub in this
release — see the README's hard-mode section for the approved next-release
design (launcher-only default, container opt-in) — use soft agents for
typing today.
What is OpenSpec in this repo?
openspec/README.md defines change folders under
openspec/changes/<name>/ (proposal, specs, design, tasks). Workflow:
propose → approve → implement via Foreman lanes → archive. Legacy specs
remain in docs/superpowers/specs/.
How do I preview the docs site?
See site/README.md: python -m http.server 8080 --directory site or open
site/index.html directly.