CLI Reference
July 1, 2026 · View on GitHub
This page is a copy-paste reference. It may lag the parser;
striatum --help(andstriatum <verb> --help) is authoritative.
Core lifecycle
striatum repo add <path> [--init]
striatum skills install [--profile <profile>] [--scope project|user]
striatum plugin install [--profile <profile>] [--scope project|user]
striatum workflow validate
striatum workflow generate
striatum workflow templates list
striatum workflow templates show
striatum run prepare
striatum branch confirm
striatum run start
striatum run drive
striatum operator bootstrap
striatum run summary
striatum archive create
workflow generate (below) is the way to scaffold a starter workflow tree;
run prepare requires an explicit --workflow <path> and creates no runtime
default. The generated tree uses a single local process lane as a valid
placeholder; edit lanes and job lane_id bindings for real agent runs.
run drive --run-id <id> [--interval 15s] [--provider-auth-gate auto|required|off] [--once] [--json] is a local
operator loop over existing daemon RPC methods. It reads run.detail and
list.sessions, registers and supervises one fresh session per queued
role/lane as the DAG unblocks, adopts already-active matching sessions, and
stops terminal or superseded launched lanes before registering fresh reviewers.
It is not a daemon RPC method and does not call rescue verbs or force non-fresh
sessions. --provider-auth-gate is forwarded to supervise.start; when a
lane-provider-auth refusal blocks launch, the driver closes the fresh session,
emits a sanitized failure action, and exits nonzero instead of retrying the same
doomed launch.
run pause [run-id], run resume [run-id], and run cancel [run-id]
transition an existing run's lifecycle (capability admin). run retry-job [run-id] [job-id] requeues a single failed job (capability admin).
run integrate [run-id] integrates completed run output into the target
branch (capability apply). All five are daemon RPC methods; pass the run id
(and job id) positionally or as --run-id / --job-id.
operator bootstrap [--operator-docs-root <path>] [--limit N] [--markdown|--json]
is a bounded AI-operator cold-start packet. It is a local read-only
composite over existing daemon reads (repo.resolve, status, doctor)
plus local git, VERSION, daemon-runtime-path, MCP-endpoint-path, and
docs/operator/BRIEF.md probes. It prints frontier state, doctor counts,
operator-brief freshness, skill drift, exact next commands, and a bounded
reading plan without embedding full status, doctor, session, verdict, or
historical run arrays. --limit caps expanded lists and is bounded to 20.
The command creates no live state and is not a daemon RPC method.
workflow templates list [--kind shape|lane_set|role_pack|adversary_pack]
and workflow templates show <template_id> read the bundled local
workflow-template catalog (embedded under go/pkg/workflowtemplates).
workflow generate --shape <shape> [--lane-set <set>] [--workflow-id <id>] [--scaffold-root <path>] [--artifact-root <path>] [--option key=value ...]
compiles a concrete workflow tree from that catalog. It previews the planned
repo-relative files by default and writes them only with --write; --json
emits the structured envelope. The lane set defaults to the local fixture
lane (which needs no real lane command), so workflow generate --shape conversation --option topic="…" scaffolds a valid starter out of the box; edit
in real lanes (e.g. --lane-set author_reviewer then supply lane commands in
the generated workflow.json) before a real run. --option phases=…
(multi_phase) and shape-specific --option key=value values are
accepted as the shape requires.
The Python-era workflow init, workflow lint, workflow plan,
workflow graph, workflow upgrade, and workflow templates render-md
verbs are not part of the current Go CLI (RFC 0078 ported validate,
generate, and templates {list,show}); workflow-authoring lint is enforced
at validate/generation time. A fuller CLI_REFERENCE audit against the Go
command surface is tracked separately.
Same-model-pairing lint is enforced by workflow validate (refuse unless
--allow-same-model-pairing); operational accepted-risk overrides are recorded
through the daemon workflow accept-risk / workflow accepted-risks commands.
striatum repo add <path> [--init] registers a target repository
with the daemon-owned PostgreSQL registry. Pass --init for a fresh
target repo so the daemon creates .striatum/scratch and adds
.striatum/ to .gitignore.
striatum skills install --profile <profile> writes the agent skill
bundle for claude_code | codex | agy | generic | all.
Use --scope user to install once in the user's agent config
directory instead of a project tree.
striatum plugin install --profile <profile> writes agent plugin
bundles for claude_code, codex, or agy. Project-scope plugin
installs also write a local marketplace fixture when supported by the
profile.
Agent / session work loop
striatum register-session
striatum claim-next
striatum ack
striatum heartbeat
striatum release
striatum send
striatum block
striatum publish-artifact
striatum complete
striatum verdict
striatum submit-review
striatum decision record
Use submit-review for the normal single-call review path: publish the
finding artifact and record the verdict. Use verdict when the required
review artifact is already published for the current attempt, such as a
re-claimed review job after lease recovery.
For operator-authored or otherwise unattested recovery of an accepting fresh
review, record an accepting run-level decision with
--escape-surface review_provenance, then pass
--review-provenance-decision-id <decision-id> to submit-review or verdict.
The verdict event records the decision id and artifact id as durable override
evidence.
publish-artifact validates lease ownership, write scope, path
safety, artifact kind, front matter, and byline. Model-bylined
artifacts require lane evidence: a path-specific supervised
artifact_observed event when the wrapper reports one, or the legacy
clean process_executions fallback. Operators can explicitly bypass
missing lane evidence with --allow-no-process-execution --override-rationale <text>; the rationale is stored on the artifact
row and in the provenance event.
For review jobs declaring require_attested_lane: true, publish-artifact
also refuses publication unless the session has an attached lane supervisor.
D185 makes publish-artifact and complete share the frozen-attempt
write-scope contract: if a mid-run context or workflow edit makes the current
effective scope disagree with the job attempt's frozen scope, both commands must
fail with compatible typed write-scope errors that point to audited recovery
instead of silently widening historical scope.
decision record --mark-run-compromised records an accepting decision and
transitions a completed run to compromised for provenance invalidation; V1
uses this replacement-run-only path for compromised completed review jobs.
Artifact listing, detail, summary, export, and dashboard JSON includes
provenance.category so operator-bylined artifacts can be separated from
attested supervised-lane, daemon auto-finalized, operator-on-behalf,
self-declared operator, recovery-authored, and run-level operator artifacts.
Mediated repository and process surfaces (RFC 0099)
striatum repo write <session-id> <job-id> <lease-id> <path> --content <text>
striatum repo patch-preview <session-id> <job-id> <lease-id> --patch <text>
striatum repo patch-apply <session-id> <job-id> <lease-id> --patch <text>
striatum process run <session-id> <job-id> <lease-id> [-- <command> ...]
striatum scope-check [--packet-file <packet.json>] [--allowed <path> ...] [--forbidden <path> ...]
striatum work claim-override <session-id> <job-id> <decision-id>
These are the RFC 0099 constrained-operator mutation surfaces. repo write,
repo patch-preview, and repo patch-apply (capability write) require an
active repo-write job lease and refuse paths outside write_scope.allowed_paths
before mutating. repo write writes exact UTF-8 --content to one
repo-relative path; repo patch-preview checks a unified git-style --patch
for applyability and write-scope without mutating, and repo patch-apply
repeats those checks before applying.
process run (capability write) executes a command array — passed after --
or via --command-json — with --timeout-seconds (default 300, cap 1800) and
records process_executions evidence without storing stdout/stderr. It requires
capability_requirements.process_execution: true on the job, or a matching
typed escape decision whose escape_surface is process.run or shell_command.
scope-check is a daemon-free, read-only pre-complete diagnostic: it flags any
changed path outside allowed_paths or inside forbidden_paths and exits
nonzero on drift. Read the scope from the active work packet with
--packet-file, or paste --allowed / --forbidden paths directly. It does
not widen or refresh the daemon's frozen attempt scope.
work claim-override <session-id> <job-id> <decision-id> (capability admin) is
the narrow escape for the fresh-review process-lineage gate: it claims a pending
job for a session authorized by an accepted decision recorded with matching
--subject-session-id / --subject-job-id. A broad or mismatched decision is
refused; there is no normal-lane claim-next --force.
Worktree (opt-in per lane via worktree_isolation: per_job)
striatum worktree create
striatum worktree release
striatum worktree gc [--run-id <id>]
striatum worktree list
worktree release --worktree-id <id> removes reachable worktrees; --force
explicitly discards unreachable worktrees and can retire a missing-on-disk row
when the owning job is terminal. Missing-on-disk forced releases emit
worktree.force_released with missing_on_disk: true.
worktree gc removes terminal job worktrees whose on-disk HEAD is reachable
from the run branch or a refs/striatum/ pin; it also retires terminal rows
whose path is already missing on disk. Skipped rows are reported with reasons.
Worktrees with no-blob published artifacts that are not present in the worktree
HEAD are skipped until the artifact content is durable outside the per-job
worktree.
Supervisor (RFC 0009)
striatum supervise start <session-id> [--provider-auth-gate auto|required|off]
striatum supervise send
striatum supervise stop
striatum supervise status
striatum supervise list
striatum supervise trajectory
supervise start owns the lane provider-auth launch gate. The default
auto mode runs supported provider-auth preflights for Codex and Claude
agent-loop lanes under a distinct configured lane OS user; required blocks
unsupported providers and auth-negative preflight results; off is the
explicit rollback path.
The gate runs before scratch/FIFO creation, session-bound lane token minting,
supervisor rows/events, helper/tmux, or the provider lane process. Blocking
results return a safe lane_provider_auth details block. The block can include
the probe name, exit code, stdout/stderr byte counts, and bounded success-signal
state; it never includes raw stdout, stderr, final text, auth paths, provider
account ids, environment values, token material, PTY logs, or tracebacks.
For Codex, zero exit means the lane provider CLI authenticated successfully.
For Claude, the preflight is an offline freshness check of the resolver-selected
.credentials.json; it does not run a provider command or spend model tokens.
even if the bounded --output-last-message signal is missing or mismatched;
that condition is diagnostic and does not block launch.
Conversation (RFC 0086)
striatum conversation open <participant-session-ids>
striatum conversation say <session-id> <conversation-id> <body>
striatum conversation close <session-id> <conversation-id>
striatum conversation list <run-id>
striatum conversation show <conversation-id>
The RFC 0086 multi-party conversation surface runs an N-party round-robin
exchange over persistent agent-loop sessions. conversation open starts a
conversation across the named participant sessions; say posts a turn (both
write), close ends it (write), and list / show (read) enumerate a
run's conversations and replay one transcript.
Interrogation (RFC 0082 / 0083)
striatum interrogation open <session-id> <target-session-id>
striatum interrogation ask <session-id> <interrogation-id>
striatum interrogation answer <session-id> <interrogation-id>
striatum interrogation close <session-id> <interrogation-id>
striatum interrogation list <run-id>
striatum interrogation show <interrogation-id>
Interrogation windows let a consumer session question an upstream
interrogation target (a completing job marked interrogable: true whose
session stays available for preserved-context questioning). open / ask /
answer / close (capability write) drive one window; list / show
(read) enumerate a run's interrogations and replay one exchange.
Trajectory (RFC 0081)
striatum trajectory export <run-id> [profile]
striatum trajectory watch <run-id> [profile]
trajectory export returns the ordered, profile-filtered conversation
trajectory for a run as replayable/diffable JSONL; trajectory watch live-tails
it (both capability read). The dialogue profile is the curated adjudicator
view (striatum trajectory export <run-id> dialogue). This is distinct from
supervise trajectory, which reads one supervisor's operator-local PTY log.
Escalation and principal inbox (RFC 0053 / 0102)
striatum inbox
striatum escalation list
striatum escalation show <escalation-id>
striatum escalation resolve <escalation-id>
escalation list (capability read) reports the open escalations awaiting
human-principal judgment; striatum inbox is the alias that routes to the same
escalation.list method. escalation show (read) prints one escalation, and
escalation resolve (admin) records the principal's disposition. Escalations
are also resolvable through striatum decision record (RFC 0053 escalation
artifacts are durable provenance for the principal inbox).
Dashboard
striatum dashboard
striatum dashboard --all
dashboard --all (RFC 0028 V1) groups registered repositories and
reports daemon/Postgres-backed per-repository runs, blockers, claimable jobs,
stale leases, and degraded repositories. It uses daemon-owned repository
registration state and requires a daemon read capability token from the
runtime client-token file.
run summary --json, dashboard --once, and status --json all emit the
RFC 0157 (D251) canonical state_projection block —
{run_state, jobs:[{id,state}]} — so a script reads run/job state uniformly
across the three verbs (jobs[].id is the stable workflow_job_id). The block
is strictly additive: existing keys (run.summary's .run/.jobs[],
dashboard's .jobs_by_state, status's .runs[]/.jobs{}) are unchanged,
and dashboard --once additionally carries a top-level state mirroring
state_projection.run_state. For a repo-wide call (no single run in scope)
run_state is null and jobs is empty. See
spec.md → Operator read-surface state projection.
Records
striatum records docket <run-id> [--format markdown|json]
striatum records migration inventory [--root path]... [path ...]
striatum records migration import --manifest inventory.json [--import-batch-id id] [--dry-run] [--json]
striatum records migration verify --manifest inventory.json [--json]
striatum records migration materialize (--record-id id | --import-batch-id id | --source-path path) [--out .striatum/scratch/path] [--json]
records docket is daemon-backed and renders a compact RFC 0171 docket from
artifact and generated-record indexes. records migration inventory remains a
local read-only filesystem scan. The import, verify, and materialize migration
commands are CLI wrappers over daemon RPC: import uploads safe manifest entries
through the daemon blob client and upserts generated_records; verify compares
the original manifest to daemon-fetched blob bytes; materialize writes verified
bodies only under ignored .striatum/scratch. None of these commands delete
tracked historical files.
Daemon and multi-repo registry (RFC 0028 V1)
striatum daemon install [--no-start] [--print-unit]
striatum daemon status
striatum daemon uninstall
striatum daemon migrate-db [--admin-url <dsn>] [--json]
striatum daemon owner-ddl apply [--owner-url <dsn>] [--json]
striatum daemon token-create <capability>
striatum doctor [--verbose] [--json]
striatum doctor --lane-provider-auth codex|claude [--run-id <id>] [--lane-id <id>] [--timeout 45s] --json
striatumd [daemon-start options]
systemctl --user start|stop|restart|status striatumd
striatum repo add <path> [--init] [--display-name <name>] [--no-migrate] [--apply-blob-creation]
striatum repo list
striatum repo remove <id>
striatum daemon install renders the systemd user unit, scaffolds
daemon.toml when absent, and enables/starts striatumd unless --no-start
is passed. Use systemctl --user start|stop|restart striatumd for service
lifecycle after installation. On hosts without systemd user services, run
striatumd -socket "${XDG_RUNTIME_DIR}/striatum/daemon-go.sock" directly as
described in the daemon runbook.
If a system unit (/etc/systemd/system/striatumd.service) already owns the
daemon, striatum daemon install refuses with exit code 1 and
daemon_install_system_unit_present rather than writing a conflicting
user-scope unit. The user-scope unit carries no owner-DB bootstrap environment,
so re-creating it next to a system unit crash-loops the daemon and takes it down
for every session (#509). On such a host, manage the daemon with
sudo systemctl restart striatumd and use --print-unit to inspect the unit
template without installing it.
striatumd is the supported foreground daemon process. Per D094 / RFC 0043 the
daemon is a hard prerequisite for every Striatum verb; CLI verbs without a
reachable daemon refuse with exit code 11 (daemon_unreachable) and do not
fall back to direct mode.
On first successful startup, striatumd bootstraps a single admin token when
daemon-owned Postgres has no clients and writes a 0600 runtime
client-token file. Token secrets are never read from environment variables,
never logged to audit, and never stored in the registry.
Ordinary doctor and doctor --verbose do not run provider CLIs. The
provider-auth diagnostic is explicit-only because provider-specific checks may
touch the network, spend provider tokens, trigger auth refresh, or hang on an
interactive prompt. The Claude diagnostic is offline-only and reads credential
freshness without running a provider command or spending model tokens.
Its JSON result is the same private-safe block used by supervise.start, with
raw_output_returned=false. A Codex zero-exit smoke with a missing or
mismatched bounded success signal reports success_signal as missing,
empty, or mismatch; it is not an auth failure.
Authorization uses the closed daemon method capability vocabulary:
read, write, review, claim, apply, admin, recovery, and
surgical_recovery.
striatum daemon token-create <capability> (method daemon.token.create,
capability admin) mints an additional scoped capability token against the
daemon-owned Postgres. The capability argument is one of the closed vocabulary
above. The secret is returned once and never re-read from the registry.
repo add canonicalizes the repository root, refuses
symlink/path-traversal ambiguity, derives a realpath/inode-based
repository identity, and refuses active path re-occupation by a
different identity. Pass --init when no .striatum/ directory
exists; it creates operational scratch only and does not create
.striatum/retired-local-state. If a pre-D094 repo-local SQLite source
exists, registration refuses and tells the operator to archive/remove
the legacy SQLite file before registering. --display-name sets the
operator-facing repository name (defaults to the directory basename);
--apply-blob-creation creates the per-repository blob-storage bucket when
the daemon is configured for blob storage and the bucket is absent.
--no-migrate is an accepted compatibility flag — production registration
never imports retired SQLite state.
repo remove is idempotent, revokes live repo-scoped
capabilities, preserves audit rows, and never reuses
repository_id; re-adding allocates a fresh id.
The resident recovery sweep runs inside striatumd. Use the daemon-backed
recovery auto family for explicit recovery diagnostics
where applicable; there is no striatum daemon sweep CLI command.
RFC 0033 V2 accepts system PostgreSQL as the daemon-owned
storage substrate for daemon-global state. Configure it with
STRIATUM_DAEMON_DB_URL, daemon config, or an explicit
--postgres-url client surface. The daemon owns schema
migrations and roles, but it does not install, start, stop, or
upgrade PostgreSQL. Bundled, embedded, and Dockerized Postgres
distributions are deferred.
striatum doctor is the daemon-backed health check. Top-level warnings
name non-red findings that still have operator work behind them; top-level
notices preserve advisory historical/local-environment facts that do not
name daemon recovery work. doctor --verbose includes structured
problem_records, warning_records, and notice_records alongside the stable
string lists, including RFC 0171 generated_record_integrity records for
missing, corrupt, swapped, duplicate-source, or metadata-incomplete
generated-record blobs. doctor --lane-provider-auth codex|claude [--run-id <id>] [--lane-id <id>] [--timeout 45s] --json is an explicit provider-auth
diagnostic for the lane identity; ordinary doctor and doctor --verbose
never run provider CLIs.
striatum daemon status is the local bootstrap summary for unit state and
runtime paths; it folds in read-only doctor information when the daemon is
reachable.
daemon migrate-db [--admin-url <dsn>] [--json] (RFC 0079 §5) applies pending
daemon PostgreSQL schema migrations using an owner/admin DSN, so DDL the runtime
role (striatumd_rw) cannot perform — e.g. a migration that adds a foreign key
to an owner-held table — is applied before the daemon serves. The admin DSN is
resolved from --admin-url, then STRIATUM_DAEMON_ADMIN_DB_URL, then the normal
daemon DSN (flag/env/daemon.toml) as a fallback for additive migrations the
runtime role can apply itself. This is distinct from the retired SQLite-era
daemon migrate below.
daemon migrate --from sqlite --to pg and
daemon migrate-repo-local --from sqlite --to pg --repo <path> are fully
removed SQLite-era import spellings. They are no longer parseable compatibility
commands; stale automation receives an unknown-command parse failure. Use
striatum daemon status, striatum doctor --verbose --json, and
striatum repo add <path> --init for current registration/cutover diagnostics.
CLI verbs against an unregistered repo refuse with exit code 12
(repo_not_migrated) and point operators to archive/remove legacy SQLite
files, then register with repo add --init.
RFC 0030/0031 add the daemon V2 RPC and supervision/apply foundation on
top of RFC 0033. The wire envelope is versioned JSON; daemon.hello
negotiates envelope/framing, daemon.describe publishes the method
registry and methods_etag, and incompatible clients refuse with exit
code 10. RFC 0048 completed the production handler-port work in
v1.49.0-v1.55.0: mapped production verbs are daemon/Postgres-backed and
fail closed without daemon reachability, repository registration, and
capability authorization. Legacy SQLite paths remain only for migration
sources, golden fixtures, and explicitly gated subprocess compatibility
tests under STRIATUM_DAEMON_REQUIRED=0 STRIATUM_TEST_HARNESS=1.
Daemon-required runtime
Production commands route through the daemon authority boundary by default.
There is no global --daemon flag in the Go CLI; daemon connectivity is
required and assumed.
striatum status [--run-id <id>]
striatum doctor
striatum why <job-id>
striatum dashboard --all
The V1 --no-daemon flag is retired (D094 / RFC 0043); parsing it
returns the standard argparse "unrecognized arguments" error and exit
code 2. Production mutation and read verbs do not fall back to direct
repo-local mode.
Daemon RPC method capabilities use the closed vocabulary read,
write, review, claim, apply, admin, recovery, and
surgical_recovery.
supervise.* and apply.* are daemon RPC routes; sealed apply fails
closed unless a daemon signing key and apply capability are present.
The Go daemon rotates the local Ed25519 fallback signing key through the
admin RPC method daemon.key.rotate; there is not yet a stable
user-facing striatum keys CLI.
D270 retires the cross-repo CLI surface. Current CLI workflows are
single-repository units; there is no supported striatum cross-repo ...
command family. Historical RFC 0032 schema may remain in upgraded databases,
but no current CLI route exposes cross-repo lifecycle, read, or recovery
behavior. Daemon MCP tools/list is filtered by each token's effective
capabilities and scope, and tools/call re-checks authorization and audits
denials.
RFC 0036 adds no new CLI verb. Regenerate agent-facing MCP guidance with
striatum skills install or striatum plugin install; chat workflow
generation uses the existing local service and RFC 0034 generator paths.
Skills (RFC 0015)
striatum skills install
Codex launcher
striatum codex [codex args ...]
striatum codex launches the codex CLI pre-wired to the live daemon MCP
endpoint: it injects -c mcp_servers.striatum.url=<live endpoint> (overriding
~/.codex/config.toml) and -c mcp_servers.striatum.bearer_token_env_var=STRIATUM_MCP_TOKEN, and sets
STRIATUM_MCP_TOKEN in codex's environment from the runtime client-token
(never printed). Extra arguments pass through to codex unchanged.
Daemon-Mounted HTTP Service (RFC 0012 / 0013 / 0085)
striatumd -mcp-http-addr 127.0.0.1:0
BASE_URL=$(sed 's#/mcp$##' "$XDG_RUNTIME_DIR/striatum/mcp-http-endpoint")
TOKEN=$(cat "$XDG_RUNTIME_DIR/striatum/client-token")
curl -H "Authorization: Bearer $TOKEN" "$BASE_URL/v1/health"
Web routes (RFC 0013 / 0022 / 0024 / 0038)
striatumd mounts the Go web service on the same localhost-only HTTP listener
as daemon MCP. The endpoint file includes /mcp; strip that suffix for web
routes. The loopback service requires Authorization: Bearer <client-token>;
there is no separate striatum serve command and no serve --web flag.
Mutations are read-only by default and require
STRIATUM_DAEMON_WEB_ALLOW_MUTATIONS=1 on the daemon process before startup.
For ordinary browser access without bearer-header tooling, run the optional
read-only tailnet identity listener (striatumd -web-tailscale or
STRIATUM_DAEMON_WEB_TAILSCALE=1) and point
tailscale serve --bg unix:$XDG_RUNTIME_DIR/striatum/web-ui.sock at the
owner-only socket.
| Route | Surface |
|---|---|
/ | Run list (RFC 0013/0022/0037). |
/run?run_id=<id> | Server-rendered run detail/status page. |
/v1/health | Service health and mutation posture. |
/v1/runs | Daemon status JSON. |
/v1/runs/<id> | Daemon status --run-id JSON. |
/v1/runs/<id>/events | Server-Sent Events over daemon run.events. |
/v1/runs/<id>/dashboard | Dashboard DTO for the run. |
/v1/runs/<id>/why?id=<entity> | Daemon why JSON. |
/v1/runs/<id>/artifacts | Artifact list for the run. |
/v1/artifacts/<id>/raw | Raw artifact content. |
/workflow-templates | Workflow template catalog list. |
/workflow-templates/<id> | Workflow template catalog entry. |
/workflows/generate/preview | Workflow generator preview (POST). |
/workflows/generate | Workflow generator write (POST; requires web mutations). |
List (read-only enumeration)
striatum list runs
striatum list sessions
striatum list jobs
striatum list artifacts
striatum list workflows
list runs includes the workflow identity triple for each run:
workflow_id, workflow_version, and workflow_snapshot_id. The web
run list uses the same snapshot identity to display the workflow name
and link back to the workflow detail when the source path is known.
Inspection and recovery
striatum status
striatum why
striatum work packet-show
striatum doctor
striatum git snapshot
striatum git commit-apply
striatum evidence export
striatum run graph
striatum recovery auto
striatum recovery auto-publish
striatum recovery auto-finalize
striatum recovery stale-leases
striatum recovery requeue-stale
striatum recovery cancel-job
striatum recovery invalidate-job
striatum recovery process-reconcile
striatum recovery resume
striatum recovery reseal
striatum recovery complete-stalled
striatum recovery accept-quarantined
striatum recovery resolve-blocker
striatum recovery prune-debris
striatum recovery quarantine-lane
striatum checkpoint resolve
striatum override-verdict
recovery --help (and bare striatum recovery) lists the full recovery
verb family above; run striatum recovery <subcommand> --help for a
subcommand's flags. Each recovery verb requires the recovery capability.
All recovery verbs are diagnostic/compatibility clients of the same
daemon boundary — they route remediation back through the daemon's own
state machine and never hand-finish a wedged lane (see AGENTS.md,
"Do not paste over a broken runner").
Recovery verb family (when each applies)
The recovery verbs are the legitimate way to unstick a wedged lane or run.
The non-obvious entry point is the "lane finished but the seal failed"
path: a transient artifact.publish / seal failure (e.g. a DB lock timeout,
SQLSTATE 55P03, under concurrent runs) can leave the work done and durable
on disk but the job in state blocked, not requeued. run retry-job refuses
(it would exceed max_attempts), and run drive cannot launch a blocked
job — it now reports cannot advance <job> (cannot_advance_blocked): … instead
of idling silently. The fix is:
striatum recovery reseal --run-id <run-id> --job-id <job-id>
recovery reseal moves the job blocked -> queued on the SAME attempt so the
driver re-claims and re-seals the already-durable artifact; it does not consume
a retry.
recovery reseal <run-id> <job-id>— re-seal a job whose lane finished but whose seal/publish failed transiently;blocked -> queued, same attempt.recovery resolve-blocker <blocker-id>— close a dangling non-escalation, non-checkpoint blocker that no completion path cleared.recovery complete-stalled <run-id> <job-id>— finalize a recovery-exhausted job from its already-durable published artifacts when the lane is dead and the work is complete. Review / phase-synthesis jobs are refused by default; after inspection,--forcemay recover a dead or blocked verdict-capable job only from an already-published requiredfindingorsynthesisartifact whose front matter carries a recoverable verdict (verdict_intentorstatus).recovery accept-quarantined <run-id> <job-id>— resolve a quarantined job's blocker and mark it canceled-by-operator.recovery prune-debris <run-id>— tombstone a terminal-debris run's unrecoverable artifact debris sodoctorreportsokagain.recovery quarantine-lane <run-id> <job-id>— snapshot a terminal run's dirty lane worktree to a durable quarantine ref, then clean the worktree.
striatum doctor surfaces this wedge family directly: a non-terminal job in
running / claimed / stale_lease / blocked with no live session and
no recent progress is reported as a job_stuck_no_live_session warning naming
the recovery verb to run. The warning is advisory (it does not flip doctor
to a hard red) so it tolerates normal in-flight latency.
run graph --run-id <id> [--format mermaid|json|dot|ascii]
renders the workflow graph for an existing run with each node
colored by current job state. Mermaid output appends
classDef/class lines; JSON adds current_state, attempt,
and a latest_verdict block on review nodes; ascii reuses the
dashboard's graph panel renderer (RFC 0016).
recovery resume resolves remediated process-adapter blockers with the
preserved lease. For remediated write-scope dirty-path blockers, it validates
that the tree is clean, resolves the blocker, and requeues the same attempt for
a fresh claim before completion. It is also the named recovery destination for
write-scope drift failures: recovery must audit the remediation or override and
must not mutate the historical attempt scope that caused publish-artifact or
complete to fail.
git snapshot --json [--ancestry-limit N] [--no-ancestry] emits the
daemon read-only git.snapshot projection for the registered target
repository: local branch, HEAD metadata, dirty counts, changed paths,
and bounded ancestry. It does not fetch, push, commit, read remote URLs,
or include diff hunks or commit bodies.
git commit-apply <commit-request-path> --confirm --confirm-request-id <id> --json emits daemon method git.commit_apply. It creates only a local
commit from a striatum.commit_request.v1 artifact whose
confirmation_status is already operator_confirmed or human_confirmed.
It refuses base-HEAD, branch, or dirty-path mismatches, disables repository
Git hooks for the commit invocation, and never pushes or calls hosted
providers.
recovery auto emits the daemon recovery.sweep method. The sweep
runs workflow-opt-in recovery.auto_finalize before lazy lease expiry,
then the existing stale-lease, process-reconcile, and review-only requeue
recovery pieces where policy allows. When live recovery creates escalation
rows, STRIATUM_ESCALATION_NOTIFY_URL opts into a best-effort post-commit JSON
POST to loopback or tailnet HTTP(S) targets only. Dry-runs do not notify, and
notification success or failure is not authoritative. recovery auto-publish
emits the explicit
recovery.auto_publish_stale_artifacts method. The deprecated recovery.auto
daemon RPC alias is retired; stale direct RPC calls audit as method_unknown.
D184 allows the sweep to auto-cancel an abandoned running run after the default
24h threshold when there are no live sessions, no live supervisors or supervised
processes, no active leases, and no progress or durable events in the threshold
window. Any live-work evidence or inconclusive liveness probe fails closed and
leaves the run non-terminal for operator inspection; there is no
needs_operator intermediate when the abandonment predicate is proven.
recovery invalidate-job <job-id> <decision-id> (RFC 0118, capability
recovery) invalidates a completed job's provenance against an accepting
run-level decision and records a durable supersede receipt so a fresh attempt
can re-drive the work.
work packet-show (capability read) inspects work-packet metadata. Select a
packet with [packet-id] or --message-id / --job-id / --session-id /
--run-id (at least one selector required); --limit caps rows (default 20,
cap 200). It returns metadata and packet_sha256 only; pass --raw to include
packet_json, which is omitted by default to avoid leaking task prose.
Corpus export (RFC 0044 V1 / RFC 0057 contract)
striatum corpus export --since <ref> --out <dir>
corpus export emits a redacted JSONL bundle of Striatum's durable
provenance (RFCs, decision-log rows, operator reports, run summaries,
audit-chain entries, changelog entries, ubiquitous-language terms,
harness-friction patterns, recent commits) plus a verifying
manifest.json with explicit state_authority metadata. Re-running over
unchanged inputs produces byte-identical JSONL files and stable per-file
SHA-256s; only generated_at varies, and it is excluded from the bundle
digest.
The bundle is operator-triggered local provenance, never streamed to any
external service. Optional consumers (Engram is the first reference under
RFC 0044) may ingest the bundle for retrieval, but Striatum does not call
them at runtime and runs identically when no consumer is configured. The
V2 contract decisions (multi-corpus identity, redaction-tier metadata,
incremental watermarks, optional context-injection policy) are scoped by
RFC 0057.
Run archive
striatum archive create --run-id <id> --out <dir>
archive create is a daemon/Postgres-backed read command that writes a
local archive directory for one run. The V2 archive contains the run row,
workflow snapshot, run-scoped rows, artifact metadata, event metadata, and a
self-verifying manifest.json; it does not copy artifact contents,
transcripts, or .striatum/ scratch. The current Go CLI exposes archive
creation only; local archive verify / archive inspect verifier commands are
not part of the active command surface.
Adapter
striatum adapter run
adapter run is retired outside the explicit legacy test-fixture
compatibility environment. Use daemon-supervised process lanes instead.
Session lifecycle
striatum session close
Stable exit codes
0: success, includingclaim-nextwithno_work.1: generic / unhandled runtime error.2: CLI usage error (argparse).3: missing run, session, job, message, blocker, artifact, verdict, or session target.4: invalid state transition.5: lease expiry or ownership mismatch.6: artifact or write-scope violation.7: branch confirmation required before work can be claimed.8: workflow config rejected (also raised bybranch confirmwhen a requested git operation cannot be performed).9: state schema is newer than this striatum install supports (daemon PostgreSQL in production; legacy SQLite only in fixture paths).10: daemon RPC transport, handshake, or version-skew refusal.11:daemon_unreachable. The CLI could not reach the daemon socket; stderr names the socket path and remediation. No SQLite fallback is attempted.12:repo_not_migrated. The target repository is not registered for daemon/PostgreSQL state or still has a legacy.striatum/retired-local-state; stderr and the--jsonhint tell the operator to archive/remove legacy SQLite files and register withrepo add --init.
See also
- HOW_TO_HUMAN.md — the operator's playbook with examples per verb.
- HOW_TO_AGENT.md — the coding-agent companion to the RFC 0015 skill bundle.
- SPEC.md — the implementation contract.