# Changelog

All notable changes to `roba` are documented here. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning
follows [SemVer](https://semver.org/).

Per-crate releases are managed by
[release-plz](https://release-plz.dev/) with changelog entries
generated by [git-cliff](https://git-cliff.org/) from
[conventional commits](https://www.conventionalcommits.org/).
The `[Unreleased]` section accumulates between releases; on
release, it is renamed to the new version and a fresh
`[Unreleased]` is added.

## [Unreleased]

## [0.9.0] - 2026-06-24

### Fixed

- green the scheduled live-test run (json-schema default render + config-init) ([#349](https://github.com/joshrotenberg/roba/pull/349))


### Maintenance

- move roba.toml worktree/full_auto into [profile.worker] (closes #346) ([#347](https://github.com/joshrotenberg/roba/pull/347))
- gitignore the local structured-tasks design doc ([#352](https://github.com/joshrotenberg/roba/pull/352))


### Tests

- finish #337 -- mechanical A3/A4 + live Tier-B journeys ([#351](https://github.com/joshrotenberg/roba/pull/351))



## [0.8.1] - 2026-06-18

### Fixed

- a profile's full_auto/writable overrides a top-level readonly (closes #343) ([#344](https://github.com/joshrotenberg/roba/pull/344))



## [0.8.0] - 2026-06-17

### Added

- warn when -c/--resume resolves with an anonymous --worktree (closes #328) ([#331](https://github.com/joshrotenberg/roba/pull/331))
- roba config show -- merged-pool view (refs #330) ([#334](https://github.com/joshrotenberg/roba/pull/334))
- roba config show --sources -- effective config + per-key provenance (closes #330) ([#335](https://github.com/joshrotenberg/roba/pull/335))
- --no-worktree to override a config-set worktree off (closes #332) ([#339](https://github.com/joshrotenberg/roba/pull/339))
- config lint -- warn on top-level loaded guns + a warning severity tier (closes #340) ([#341](https://github.com/joshrotenberg/roba/pull/341))


### Changed

- de-dup roba_in/fresh_dir onto the shared tests/common builder (refs #337) ([#342](https://github.com/joshrotenberg/roba/pull/342))


### Documentation

- name the multi-task limitation -- one turn, many tasks ([#322](https://github.com/joshrotenberg/roba/pull/322))
- add multi-task worker example bundle (closes #323) ([#326](https://github.com/joshrotenberg/roba/pull/326))


### Fixed

- consistent no-prompt blurb header, error on its own line ([#319](https://github.com/joshrotenberg/roba/pull/319))
- surface --json-schema structured output cleanly (closes #317) ([#325](https://github.com/joshrotenberg/roba/pull/325))
- lead claude-command-failed errors with the cause; preflight --worktree in non-git dirs (closes #327) ([#333](https://github.com/joshrotenberg/roba/pull/333))
- config init -- steer off top-level loaded guns + plan-as-aliases, inject inherited pool (closes #329) ([#336](https://github.com/joshrotenberg/roba/pull/336))


### Maintenance

- bump claude-wrapper to 0.12.1 (closes #321) ([#324](https://github.com/joshrotenberg/roba/pull/324))


### Tests

- pretend-project fixture builder + mechanical config-show scenarios (refs #337) ([#338](https://github.com/joshrotenberg/roba/pull/338))



## [0.7.1] - 2026-06-12

### Added

- tested example config bundles -- rust-dispatch + reviewer (closes #308) ([#312](https://github.com/joshrotenberg/roba/pull/312))
- consume claude-wrapper 0.12.0 -- max-turns exit code ([#309](https://github.com/joshrotenberg/roba/pull/309)) + slug fix ([#310](https://github.com/joshrotenberg/roba/pull/310)) ([#315](https://github.com/joshrotenberg/roba/pull/315))


### Fixed

- bump claude-wrapper to 0.11.1 -- correct auth/404 exit-code classification (closes #281) ([#314](https://github.com/joshrotenberg/roba/pull/314))


### Tests

- local-only scenario suite -- the codified shakedown (closes #307) ([#311](https://github.com/joshrotenberg/roba/pull/311))



## [0.7.0] - 2026-06-11

### Added

- roba config lint -- static config checks with typed exit (closes #266) ([#301](https://github.com/joshrotenberg/roba/pull/301))
- resolve a short session-id prefix for -c/--resume, git-style (closes #304) ([#305](https://github.com/joshrotenberg/roba/pull/305))
- default-on single-turn agent advisory + orchestrator hand-off docs (closes #302, #303) ([#306](https://github.com/joshrotenberg/roba/pull/306))


### Fixed

- agent-check stall warning requires resolved write tools (closes #264) ([#265](https://github.com/joshrotenberg/roba/pull/265))
- derive builtin-subcommand names from the clap tree (closes #268) ([#277](https://github.com/joshrotenberg/roba/pull/277))
- audit batch -- four verified findings (closes #269, #272, #273, #275) ([#278](https://github.com/joshrotenberg/roba/pull/278))
- shell-quote alias args interpolated into $() regions -- SECURITY (closes #287) ([#290](https://github.com/joshrotenberg/roba/pull/290))
- render structured output on the --json-schema default path (closes #280) ([#291](https://github.com/joshrotenberg/roba/pull/291))
- validate --session-id; document + explain the optional-value swallow (closes #284, #285) ([#292](https://github.com/joshrotenberg/roba/pull/292))
- --quiet suppresses the spinner, matching its contract (closes #282) ([#293](https://github.com/joshrotenberg/roba/pull/293))
- dim the [roba] session: line so it reads as metadata, not conversation (closes #294) ([#295](https://github.com/joshrotenberg/roba/pull/295))
- prompt.rs robustness -- idle-stdin hang, {{VAR}} warn, attach size-guard (closes #288, #286, #271) ([#296](https://github.com/joshrotenberg/roba/pull/296))
- --show-permissions surfaces --add-dir and resolves allow/deny conflicts (closes #283) ([#297](https://github.com/joshrotenberg/roba/pull/297))
- remove session_id from the Profile schema -- per-invocation only (closes #270) ([#298](https://github.com/joshrotenberg/roba/pull/298)) (BREAKING)
- show --wait timeout exits 4, not generic 1 (closes #289) ([#299](https://github.com/joshrotenberg/roba/pull/299))


### Maintenance

- untrack the local roba.toml swept in by #278; ignore project-local config ([#279](https://github.com/joshrotenberg/roba/pull/279))
- un-pin macOS CI -- macos-latest rustup verified fixed (closes #274) ([#300](https://github.com/joshrotenberg/roba/pull/300))



## [0.6.0] - 2026-06-10

### Added

- footer model/effort segment + alias-list AGENT column polish (closes #250, closes #251) ([#252](https://github.com/joshrotenberg/roba/pull/252))
- roba alias draft -- claude-assisted, parse-validated alias generation (closes #254) ([#257](https://github.com/joshrotenberg/roba/pull/257))
- roba profile draft -- claude-assisted, parse-validated profile generation (closes #255) ([#259](https://github.com/joshrotenberg/roba/pull/259))
- roba config init -- claude-assisted per-project roba.toml bootstrap (closes #256) ([#261](https://github.com/joshrotenberg/roba/pull/261))
- --detach -- fire a run that survives the caller, print the handle (closes #260) ([#262](https://github.com/joshrotenberg/roba/pull/262))


### Documentation

- add roberview slide deck (snapshot @ v0.5.0) ([#253](https://github.com/joshrotenberg/roba/pull/253))
- the survivable hand-off -- --detach + show --wait (closes #258) ([#263](https://github.com/joshrotenberg/roba/pull/263))


### Fixed

- substitute ${args} inside $(...) shell substitutions before running them (closes #247) ([#248](https://github.com/joshrotenberg/roba/pull/248))



## [0.5.0] - 2026-06-10

### Added

- unambiguous doctor auth + documented --json envelope schema (closes #214) ([#215](https://github.com/joshrotenberg/roba/pull/215))
- add --session-id pass-through flag (refs #222, #37) ([#225](https://github.com/joshrotenberg/roba/pull/225))
- add --max-turns + --max-budget-usd guardrail flags (refs #222) ([#226](https://github.com/joshrotenberg/roba/pull/226))
- add --json-schema validated structured output (refs #222) ([#227](https://github.com/joshrotenberg/roba/pull/227))
- add --mcp-config + --strict-mcp-config pass-through (refs #222) ([#228](https://github.com/joshrotenberg/roba/pull/228))
- add --add-dir, --fallback-model, --no-session-persistence (refs #222) ([#229](https://github.com/joshrotenberg/roba/pull/229))
- add roba worktree list read-only subcommand (closes #217) ([#230](https://github.com/joshrotenberg/roba/pull/230))
- add roba show read-only result handle + --metrics (refs #220) ([#231](https://github.com/joshrotenberg/roba/pull/231))
- add roba history --worktree filter (closes #218) ([#232](https://github.com/joshrotenberg/roba/pull/232))
- uniform {version:1} --json envelope for cost/history/doctor (closes #221) ([#233](https://github.com/joshrotenberg/roba/pull/233)) (BREAKING)
- add roba show --wait poll-until-complete (closes #220) ([#236](https://github.com/joshrotenberg/roba/pull/236))
- merge piped stdin as context when a prompt is present (closes #242) ([#243](https://github.com/joshrotenberg/roba/pull/243))


### Documentation

- sharpen positioning to claude -p sugar; remove use-roba skill; add cost + worktree notes (closes #223, #224, #209) ([#234](https://github.com/joshrotenberg/roba/pull/234))
- tighten README to a factual voice (cut fluff, anecdote, prose) ([#235](https://github.com/joshrotenberg/roba/pull/235))
- README tables -- install options, vs claude -p, agents ABI (clearer scan) ([#239](https://github.com/joshrotenberg/roba/pull/239))
- add contributor-facing AGENTS.md ([#240](https://github.com/joshrotenberg/roba/pull/240))
- fix verified-example drift (footer illustration, placeholder quoting, stdin-dropping err.log example, -C/-f ordering note) ([#241](https://github.com/joshrotenberg/roba/pull/241))
- pre-release help-audit fixes (22 edits incl. two behavior gates) ([#244](https://github.com/joshrotenberg/roba/pull/244))


### Maintenance

- re-verify bundled rates as of 2026-06-08 (prices unchanged) ([#207](https://github.com/joshrotenberg/roba/pull/207))
- add claude-fable-5 to the bundled rate table (verified 2026-06-10) ([#237](https://github.com/joshrotenberg/roba/pull/237))



## [0.4.0] - 2026-06-08

### Added

- named sessions via [session] config + --session/ROBA_SESSION (closes #37) ([#199](https://github.com/joshrotenberg/roba/pull/199))
- style the --help trailer sections (NO_COLOR/pipe-clean) ([#204](https://github.com/joshrotenberg/roba/pull/204))


### Changed

- remove the --dispatch preset (closes #202) ([#203](https://github.com/joshrotenberg/roba/pull/203)) (BREAKING)


### Documentation

- split --help examples into human + agent sections (closes #205) ([#206](https://github.com/joshrotenberg/roba/pull/206))



## [0.3.1] - 2026-06-08

### Dependencies

- update dialoguer 0.12, indicatif 0.18, termimad 0.34, toml 1 ([#195](https://github.com/joshrotenberg/roba/pull/195))


### Fixed

- show abbreviated help blurb for bare roba on a TTY (closes #196) ([#197](https://github.com/joshrotenberg/roba/pull/197))



## [0.3.0] - 2026-06-08

### Added

- shell completions via clap_complete (closes #185) ([#189](https://github.com/joshrotenberg/roba/pull/189))
- roba doctor health check (closes #186) ([#190](https://github.com/joshrotenberg/roba/pull/190))
- actionable hints when claude is missing or unauthenticated (closes #188) ([#192](https://github.com/joshrotenberg/roba/pull/192))


### Fixed

- guide instead of hang when roba has no prompt on a TTY (closes #187) ([#191](https://github.com/joshrotenberg/roba/pull/191))



## [0.2.2] - 2026-06-08

### CI

- fix live-test install step failing under bash -e ([#176](https://github.com/joshrotenberg/roba/pull/176))


### Documentation

- slim roba --help into a scannable short/long split ([#180](https://github.com/joshrotenberg/roba/pull/180))
- make --help a self-contained colored reference ([#181](https://github.com/joshrotenberg/roba/pull/181))
- consolidate to README + --help + sample + skill; retire the book ([#182](https://github.com/joshrotenberg/roba/pull/182))


### Fixed

- empty changelog from empty skip_tags/ignore_tags (closes #173) ([#184](https://github.com/joshrotenberg/roba/pull/184))


### Maintenance

- drop MSRV, add rustfmt pre-commit hook (bleeding-edge binary) ([#183](https://github.com/joshrotenberg/roba/pull/183))


### Tests

- make live_system_prompt_influences_response deterministic ([#177](https://github.com/joshrotenberg/roba/pull/177))
- stop gating live CI on model-compliance (fixes the flaky pair) ([#178](https://github.com/joshrotenberg/roba/pull/178))



## [0.2.1] - 2026-06-06

### Fixed

- accept camelCase `--permission-mode` values (#169)

### CI

- cargo-dist release artifacts (adrs pattern) + README badges (#165)
- scheduled live-test workflow against the real API (#172)

### Documentation

- fix book rendering -- every chapter was a blank stub (#166)

### Tests

- fix stale/fragile live tests surfaced by full run (#170)

## [0.2.0] - 2026-06-06

Initial public release. The CLI surface, exit codes, config schema,
and `--json` envelope are intended to be stable across 0.2.x;
breaking changes that landed before this release (e.g. flag
renames, schema renames) are listed under `Removed`.

### Added

#### Surface

- **Prompt sources**: positional argument, `-p, --prompt TEXT`
  (explicit prompt string; mutually exclusive with the positional
  argument -- the escape hatch when the positional form would be
  ambiguous against an optional-value flag like `-c` or `-w`, e.g.
  `roba -c -p "follow up"`), stdin (`-` or piped), `-f FILE`,
  `-e` (compose in `$EDITOR` / `$VISUAL`), `--editor-history N`
  (last N responses included as reference block in the editor).
- **Composition**: `--prepend FILE` and `--append FILE`
  (repeatable), `--attach GLOB` (repeatable, embeds files with
  `File: PATH` framing), `--git-diff`, `--git-log [N]`,
  `--git-status`, `--var K=V` template substitution.
- **Output**: `--json` (versioned envelope on stdout), `--quiet`
  (answer only, no metadata), `--code [LANG]` (extract fenced
  blocks), `-o, --out PATH` (write to file AND stdout, extension
  drives format), `--stream` (TTY-only progress indicator),
  `--show-thinking` (extended-thinking blocks live on stderr,
  requires `--stream`), `--trace PATH` (writes spawned claude
  streaming events to PATH as JSONL; observability handle for
  in-flight runs), `--echo` (print resolved prompt), `--plain`
  (master kill-switch: no markdown render, no color, no spinner).
- **Dispatch session id on stderr**: when the streaming pipeline
  is active (`--stream` or `--trace`), roba prints `[roba]
  session: <id>` to stderr as soon as the spawned session id
  becomes known (first event). Gives orchestrators a stable handle
  to the session JSONL without requiring `--trace` to be set
  upfront. Suppressed by `--quiet`.
- **Sessions**: `-c [ID]` (bare = continue most recent in cwd;
  `-c ID` or `-c=ID` = resume specific session by id), `--fork`
  (branch a resumed session; requires an explicit id, `-c ID
  --fork`), `--pick` (interactive fuzzy chooser), `--fresh` (force
  new session, cancels env/profile continue), `--agent NAME` (pin a
  specific Claude Code subagent for the run), `-w, --worktree
  [NAME]` (run in a fresh git worktree; named or auto-generated).
- **Permissions**: `--readonly` (Read/Glob/Grep only -- the
  default), `--writable` (adds Edit/Write), `--allow-tool TOOL`
  (repeatable), `--deny-tool TOOL` (repeatable), `--full-auto`
  (bypass everything), `--permission-mode MODE` (pass a specific
  claude permission mode -- `plan`, `dontAsk`, `auto`,
  `acceptEdits`, `default`, `bypassPermissions` -- orthogonal to
  the allowlist shortcuts; the shortcuts set the allowlist, this
  sets the mode), `--show-permissions` (preview the
  effective allow/deny set with per-entry provenance and exit 0
  without calling claude), `--no-agent-check` (suppress the
  agent frontmatter permission check).
- **Agent frontmatter permission check**: when `--agent NAME` is
  set, roba parses the agent's `tools:` field from its YAML
  frontmatter and warns on stderr if any declared tools are not
  covered by the resolved allowlist. Granular `Bash(git:*)` allows
  count as covering bare `Bash`. The check is best-effort and
  non-blocking -- dispatch proceeds regardless. Suppressed by
  `--full-auto`, `--quiet`, and `--no-agent-check`; also
  honoured via `ROBA_NO_AGENT_CHECK` env var and `no_agent_check
  = true` in a profile. Closes the silent partial-capability trap
  when a lower-layer profile doesn't grant what the agent needs.
- **Other dispatch flags**: `-C, --cwd PATH` (run as if invoked
  from a different directory), `--model NAME` (override the model
  per call), `--no-retry` (disable wrapper-level auto-retry on
  transient failures; deterministic for orchestrator scripts),
  `--effort LEVEL` (cost/quality tradeoff -- `low`, `medium`,
  `high`, `xhigh`, `max`), `--bare` (minimal-overhead mode: skip
  hooks, LSP, plugin sync, CLAUDE.md auto-discovery, auto-memory,
  and keychain reads -- for non-interactive dispatches),
  `--system-prompt TEXT` (replace the default system prompt) and
  `--append-system-prompt TEXT` (append to it; when both are set,
  replace runs first), `--dispatch` (preset for unattended
  file-mutating workers -- implies `--full-auto`, `--worktree`,
  and `--fresh`, each individually overridable; warns when
  `--agent` is unset).
- **Cost in dollars**: `roba cost` now reports a dollar figure
  alongside tokens, computed from a bundled per-model rate table
  (`src/rates.toml`, baked in via `include_str!`). Per-project
  breakdown (`--by-project`) gains a `COST` column and `--json`
  gains a `cost_usd` field (rollup + per project) plus an
  `input`/`output`/cache `usage` breakdown. Dollars also appear in
  the per-call footer. Override the table with `--rates-file PATH`
  (or `ROBA_RATES_FILE`), or suppress dollars with `--no-dollars`
  when the bundled rates are stale; the table carries an `as_of`
  date surfaced on the report. Models the table doesn't cover are
  listed as "rates unknown" rather than costed at a misleading $0.
- **Subcommands**: `roba history [--paths [N]]` (list recent
  sessions; `--paths` emits the JSONL session file paths,
  most-recent first, for shell composition and corpus mining),
  `roba last` (reprint last run), `roba cost [--by-project]
  [--project SLUG] [--json] [--rates-file PATH] [--no-dollars]`
  (token + dollar usage rollup),
  `roba profile {list,show,init,path,active}`,
  `roba alias {list,show,path}` (user-defined aliases from
  `roba.toml`).
- **`see_also` error-envelope field**: additive v1 field on the
  `--json` error envelope (`error.see_also`, a list of doc URLs).
  Omitted from the JSON when empty, so the v1 shape is unchanged for
  errors with no doc pointer.

#### Config

- **`roba.toml` config file** with layered resolution:
  CLI > env (`ROBA_<PARAM>`) > active profile overlay >
  top-level keys > built-in default > claude default. Project
  files walk up to the git root; closer-to-cwd wins per key;
  lists concat across files; vars merge per key.
- **Profiles**: `[profile.NAME]` overlays in any `roba.toml`;
  `default` profile auto-applies when none is named (suppressed
  via `--no-default-profile` or `ROBA_PROFILE=`).
- **User-defined aliases**: `[alias.NAME]` shortcuts. Each alias
  is invoked as `roba NAME [args]` and expands to a prompt
  template (with positional `${1}` / `${@}`, named `${pr}` via the
  `args` schema, `$$` for literal `$`, and `$(command)` shell
  substitution) plus default `flags`. Aliases can pin a subagent
  (`agent = "NAME"`) and override CLI flags. Lookup order:
  built-in subcommand first, then alias, then unknown-alias
  suggestions (Levenshtein top-3).
- **Env-var override layer**: every CLI knob is settable via
  `ROBA_<PARAM>` (uppercased, `-` -> `_`, prefixed `ROBA_`).
  Lists comma-separated; vars per-key via `ROBA_VAR_<KEY>`.

#### Output discipline

- stdout = the answer; stderr = metadata (cost footer, tool calls,
  refusal warnings, spinner, errors).
- Auto-detect: rich on a TTY, plain on a pipe. `NO_COLOR=1`
  honored.
- **Versioned JSON envelope** (`--json`):
  - Success: `{ "version": 1, "result": { QueryResult }, "refusal": bool }`
  - Error: `{ "version": 1, "error": { kind, message, exit_code, chain } }`
  - V1 contract: top-level `version` always present; `result` xor
    `error`; inner fields preserved across additive changes;
    breaking shape changes bump the version.
- **Refusal signal** (`refusal: bool` in the success envelope) for
  non-TTY consumers; exit code stays 0 on refusal (the call
  succeeded, the heuristic labels the body).
- **Structured JSON error envelope**: runtime failures emit a
  parseable `{ "error": {...} }` object on stderr instead of plain
  anyhow text. `kind` mirrors the typed exit code.

#### Permissions precedence + cross-layer suppression

- CLI `--readonly` actively suppresses lower-layer `writable =
  true` and `full_auto = true`. CLI `--writable` suppresses
  lower-layer `full_auto = true`. Mutual-exclusion holds across
  layers, not just within the CLI parse.
- `allow_tool` / `deny_tool` lists accumulate across files;
  closer-to-cwd entries concat on top of farther-from-cwd.
  CLI / env replace the resolved list; profile concats.
- Deny wins when the same tool appears in both lists.

#### Failure modes

- Typed exit codes: 0 ok, 1 generic, 2 auth (re-login needed), 3
  budget exceeded, 4 timeout.
- Fail-fast on interactive flags without a TTY: `-e`, `--pick`,
  and `--editor-history N > 0` exit 1 with a clear message
  instead of hanging on input that can't arrive.
- `--no-retry` flag and `ROBA_NO_RETRY=1` env var disable
  wrapper-level auto-retry for the run.

### Changed

- **Permissions precedence model documented** in `README.md`
  (`## Permissions` -> `### Precedence`) and `docs/profiles.md`.
  Spells out the CLI > env > profile overlay > top-level >
  built-in default layering, the `writable` / `full_auto`
  interaction, the concat-vs-replace behavior for tool lists, and
  the deny-wins rule.
- **`--quiet` vs `--plain` help text** disambiguated. They're
  orthogonal: `--quiet` is the metadata kill-switch (suppress
  footer, spinner, tool markers); `--plain` is the decoration
  kill-switch (no markdown render, no color, no spinner).
- **`--readonly` is now an active suppressor** rather than a
  no-op marker. Passing `--readonly` on the CLI cancels a
  `writable = true` or `full_auto = true` coming from a profile
  or env var.
- **`--stream` documented as a TTY-only nicety**, never
  load-bearing on a pipe; the agent-ABI surface (`--json`, typed
  exit codes, error envelope) is the contract for non-TTY
  consumers.
- **Security audit moved off the PR critical path** to a daily
  scheduled job (`.github/workflows/security-audit.yml`) + manual
  `workflow_dispatch`. PR CI feedback no longer waits on the
  audit's full dep-tree scan.
- **BREAKING (pre-publish): `-c` / `--continue` and `-w` /
  `--worktree` no longer require `=` for their values.** The
  `require_equals` constraint was dropped, so the natural
  space-separated form now works (`roba -c 7c3f9a21`,
  `roba -w mybranch`). The trade-off: because the value is
  optional, a bare word right after the flag is consumed as that
  value, so `roba -c "follow up"` now treats `follow up` as the
  session id and `roba -w "do it"` treats `do it` as the worktree
  name (previously these were parsed as the prompt). The documented
  escape is the new `-p` / `--prompt` flag:
  `roba -c -p "follow up"`, `roba -w mybranch -p "do it"`. The
  `=` form (`-c=ID`, `-w=NAME`) still works unchanged.

### Removed

These are pre-publish breaking surface changes; no published
users yet.

- **`--head N`** and **`--tail N`** flags. Pipe mode already has
  `| head`/`| tail`; TTY scrollback covers the TTY case;
  source-vs-rendered semantics were never pinned.
- **`--save PATH`** and **`--tee PATH`** flags. Collapsed into
  the new `-o, --out PATH` (writes to file AND stdout; extension
  drives format; `--json` forces JSON regardless). File-only is
  the Unix idiom `-o foo.json > /dev/null`.
- **`--resume ID`** flag. Unified into `-c [ID]` (`-c` bare =
  continue most recent; `-c ID` or `-c=ID` = resume specific).
  `--fork` now requires an explicit id (`-c ID --fork`).
- **`ROBA_PROFILES_FILE`** env var (point-at-an-extra-file).
  Subsumed by the general `ROBA_<PARAM>` override layer + file
  walk-up discovery.
- **BREAKING:** bundled skill+agent library and the
  `roba skill {install,list,show}` and `roba agent
  {install,list,show}` subcommands. Bring your own skills
  and agents via `~/.claude/skills/` and
  `~/.claude/agents/`. See
  [joshrotenberg/agent-tools](https://github.com/joshrotenberg/agent-tools)
  for one curated set.

### Fixed

- Fail fast when an interactive-only flag is set without a TTY
  on stdin. `-e` / `--editor` and `--pick` pre-check
  `stdin.is_terminal()` and exit 1 with a canonical message
  instead of hanging on input that can't arrive.

### Docs

- **`docs/vs-claude-p.md`**: side-by-side comparison between
  `roba` and `claude -p`, with worked examples for common cases.
- **`docs/use-cases.md`**: cookbook-style use cases, seeded with
  the multi-repo orchestration pattern (orchestration bus =
  headless `roba` calls; cockpit = optional tmux for
  observation).
- **`docs/examples/github-actions/pr-review.yml`**: example
  workflow YAML for running roba as a PR auto-reviewer.
- **`docs/profiles.md`**: gh allow-list worked example under
  `## Worked examples`.
- **Docs site**: an [mdbook](https://rust-lang.github.io/mdBook/)
  aggregating the README and `docs/` into a navigable site, deployed
  to GitHub Pages on push to `main`
  ([joshrotenberg.github.io/roba](https://joshrotenberg.github.io/roba/)).
  The book source is generated by `book/build.sh`; only `book.toml`
  and the script are committed.
- **README slimmed**: the repo `README.md` is now a tight landing
  page serving both GitHub visitors and the book's Introduction. The
  heaviest sections moved into dedicated `docs/` pages:
  `docs/permissions.md`, `docs/scripting.md`, `docs/aliases.md`.
- **Book structured into three audience-driven sections**: "Getting
  started", "Using roba", "Reference". New docs pages:
  `docs/quickstart.md` (install-to-first-answer),
  `docs/reference.md` (flags, env vars, exit codes, JSON envelope,
  config schema). (refs #86)
