Commit graph

243 commits

Author SHA1 Message Date
Sam & Claude
8d91b844c6 chore: drop stale duplicate stage-colibri-iso.sh (Sam & Claude)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
Item 4 from the rc.d/release-gate audit. The colibri repo carried its own copy
of scripts/stage-colibri-iso.sh that had drifted behind clawdie-iso's — the ISO
build uses clawdie-iso's copy, and nothing in colibri executes this one, so the
colibri copy was dead split-brain (a maintenance trap). Deleted it and pointed
the PRIORITY-HANDOFF references at clawdie-iso as the canonical owner.

Checks: ./scripts/check-format.sh.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 18:03:39 +02:00
c1076f3379 chore: cut proof-gate ceremony, keep the tests (#76)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-15 17:57:01 +02:00
0d872f199b fix(test): handle serve() Result in live_socket_check (unbreak clippy on main) (#78)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-15 17:56:47 +02:00
2addce9e01 Merge pull request 'fix(rc): FreeBSD rc.d deep-audit — 6 bugs after live-host testing' (#75) from fix/freebsd-rc-d-deep-audit into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
Reviewed-on: #75
2026-06-15 09:24:18 +02:00
4517e13935 fix(daemon): fail closed when socket ownership is unsafe (Sam & Codex)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
Return an error from the socket server when another daemon owns the Unix socket or bind setup fails, and broadcast shutdown so the daemon does not stay alive without a control socket. Also format the PR docs.\n\nChecks: cargo fmt --check; ./scripts/check-format.sh; git diff --check; cargo test -p colibri-daemon clear_stale_socket -- --nocapture; cargo test -p colibri-daemon --test sigterm_shutdown -- --nocapture.
2026-06-15 09:08:56 +02:00
Sam & Claude
b32c3acaed fix(daemon): handle SIGTERM + liveness-aware socket cleanup (Sam & Claude)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
The rc.d "rm stale socket on prestart" fix (07e4660) was a band-aid over
two daemon-side defects that surfaced on the live FreeBSD host:

1. colibri-daemon never handled SIGTERM. main.rs awaited only ctrl_c()
   (SIGINT), so `service stop`/`restart` — which sends SIGTERM via
   daemon(8) to the child — killed it on the default disposition with no
   cleanup. The graceful path (socket removal, agent reaping) never ran,
   leaking the socket file and orphaning spawned agents across restarts.
   Now wait_for_shutdown_signal() selects on SIGTERM or SIGINT, so the
   same graceful path runs on a normal service stop. New integration test
   (tests/sigterm_shutdown.rs) spawns the binary, sends SIGTERM, and
   asserts the socket is removed.

2. Stale-socket cleanup had no liveness check — both the daemon
   (socket.rs) and the rc prestart would unconditionally rm the socket
   before bind, which could delete a *running* instance's socket if
   rc.subr's pid detection misfires and starts a second daemon. Cleanup
   now probes first (clear_stale_socket): connect succeeds -> refuse to
   start; refused/dead -> remove and bind. Unit-tested for absent, stale,
   and live cases.

With the daemon owning safe socket cleanup, the rc prestart no longer
removes the socket (only stale pidfiles), eliminating the restart-time
clobber hazard. This also makes the SIGTERM shutdown described in
ISO-SERVICE-LAYOUT.md (PR #75) actually true.

Gates: cargo fmt --check, clippy -D warnings, cargo test --workspace all
green on Linux; sh -n on the rc script OK. FreeBSD runtime validation
still pending per FREEBSD-BUILD-LANE-HANDOFF.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 08:37:06 +02:00
Sam & Claude
df5fbab051 fix(rc): FreeBSD rc.d deep-audit — cost mode naming, chmod cleanup, health check, docs (Sam & Hermes)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
Six bugs found in deep-dive analysis of FreeBSD rc.d/rc.conf after the
live-copy-safe fix (7d23905):

1. colibri_cost_mode → colibri_daemon_cost_mode: naming broke rc.subr
   ${name}_ convention — operator setting colibri_daemon_cost_mode=fast
   in rc.conf was silently ignored. Fixed in rc.d, staging script,
   rc.conf.sample, and all docs.

2. Removed redundant chmod 660 on socket in poststart: Rust code already
   sets 0770 with documented rationale. The poststart override to 0660
   was conflicting, fragile, and had no comment.

3. Removed unnecessary chmod 644 on pidfile in poststart: pidfile lives
   in a 0750 directory — world-readable permission is pointless and
   security-negative.

4. Fixed ISO-SERVICE-LAYOUT.md: socket perms were wrong (said 750, actual
   770), colibri-daemon.pid was labeled supervisor pidfile (it's the
   child), supervisor pidfile was missing entirely, shutdown behavior
   didn't mention custom stop_cmd targeting the supervisor.

5. health_cmd now checks for non-empty daemon response instead of just
   connectvity — a hung daemon accepting connections but returning
   garbage was reported healthy.

6. rc.conf.sample hostname path: $ (hostname) → $(/bin/hostname) for
   consistency with rc.d script and early-boot PATH safety.

Checks: sh -n OK, cargo fmt --check OK, cargo clippy clean,
cargo test --workspace 207 passed.
2026-06-15 08:28:20 +02:00
abf4beef06 Merge pull request 'docs(rc): simplify colibri daemon service comments (Sam & Codex)' (#74) from docs/rc-comments-current into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
Reviewed-on: #74
2026-06-15 07:56:25 +02:00
8cf36a4264 docs(rc): simplify colibri daemon service comments (Sam & Codex)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
Keep the FreeBSD rc.d comments focused on the intended service contract instead of historical repair details.\n\nChecks: sh -n packaging/freebsd/colibri_daemon.in; git diff --check.
2026-06-15 07:54:51 +02:00
2e07613584 Merge pull request 'feat/test-agent-provider-env' (#73) from feat/test-agent-provider-env into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
Reviewed-on: #73
2026-06-15 07:46:21 +02:00
d77a2a524d fix(rc): set PATH for local test agent spawns (Sam & Codex)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
Ensure rc.d-launched colibri-daemon can resolve local provider commands such as colibri-test-agent from /usr/local/bin.\n\nChecks: sh -n packaging/freebsd/colibri_daemon.in; git diff --check.
2026-06-15 07:36:37 +02:00
9891d06144 feat(rc): rename test agent and load provider env (Sam & Codex)
Rename the local deterministic launch helper from colibri-smoke-agent to colibri-test-agent, update CLI/TUI/tests/docs, and teach the FreeBSD rc.d service to source /usr/local/etc/colibri/provider.env plus set a service PATH for local spawns.\n\nChecks: cargo fmt --check; ./scripts/check-format.sh; git diff --check; cargo check -p colibri-daemon -p colibri-client -p colibri-glasspane-tui; cargo check -p colibri-client --bins; cargo test -p colibri-client --test live_socket_check -- --nocapture.
2026-06-15 07:35:44 +02:00
c967698ea2 Merge pull request 'fix/freebsd-rc-live-copy-safe' (#72) from fix/freebsd-rc-live-copy-safe into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
Reviewed-on: #72
2026-06-14 22:55:47 +02:00
07e4660a95 fix(rc): clear stale colibri socket before start (Sam & Codex)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
Remove stale socket and pidfiles in prestart while rc.d still has root privileges. This handles live USB repair cases where a previous corrupt/root-started daemon left /var/run/colibri/colibri.sock owned by root, causing the colibri user to fail unlink with EPERM and bind with EADDRINUSE.\n\nChecks: sh -n packaging/freebsd/colibri_daemon.in; git diff --check.
2026-06-14 22:39:52 +02:00
7d239053ed fix(rc): make colibri_daemon script live-copy safe (Sam & Codex)
Make the FreeBSD rc.d source safe to copy directly onto the live USB: avoid rc.subr's *_program command override, avoid double privilege drop via daemon(8) -u, and keep pid/socket chmod fixes in the source script.\n\nChecks: sh -n packaging/freebsd/colibri_daemon.in; git diff --check.
2026-06-14 22:08:54 +02:00
4e1437ae9d feat: wire cost mode enforcement + poll_tasks spawn path (#71)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 17:25:51 +02:00
Sam & Claude
9d443a498c feat: wire cost mode enforcement + poll_tasks spawn path (Sam & Hermes)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
Priority 3 — Cost mode enforcement:
- Removed session_max_bytes/max_uncompacted_turns from DaemonConfig; cost
  mode string is now the single source of truth for all thresholds
- maybe_compact_or_rollover() derives thresholds from CostMode, not static
  config fields
- compact_oldest_turns() takes a keep parameter (derived from cost mode)
- compact_tool_result() wired into build_prompt_messages() — tool results
  are truncated when cost mode says to compact
- trim_to_budget() called in build_prompt_assembly()
- auto_escalate() wired into session_rotation() — escalates cost mode
  when compaction is insufficient
- set-cost-mode socket command now updates runtime cost_mode (RwLock on
  DaemonState) instead of just acknowledging

Priority 2 — Pi spawn path end-to-end:
- poll_tasks() now queries claimed tasks, spawns the configured agent
  binary (COLIBRI_AGENT_BINARY), creates a session, wires stdout to
  glasspane, and transitions the task to Started
- stream_agent_stdout_to_glasspane made pub for cross-module access
- poll_tasks called from scheduler_tick_fn after the scheduler runs
- New integration test: poll_tasks_spawns_agent_for_claimed_task validates
  the full path: create task → claim → poll_tasks spawns → glasspane
  observes Idle → Working → Blocked → Done lifecycle

Gates: fmt/clippy/test all green (207 tests, 0 failures).
2026-06-14 17:25:11 +02:00
7e7915c829 docs(agents): list active handoffs for the FreeBSD agent (#70)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 15:52:56 +02:00
2e23e4c409 docs(handoff): pin exact zot build command + artifact path (#69)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 15:45:57 +02:00
8a137ee8cd docs: FreeBSD build-lane handoff for Codex (ISO Gate 1 runtime proof) (#68)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 15:29:09 +02:00
0dfb57acac docs: add Hermes rc.d service to ISO Priority 1 FreeBSD validation (#67)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 15:24:21 +02:00
9593348df7 Test staged-env shell-quoting helpers; rescope ISO priority 1 to boot validation (#66)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 15:07:47 +02:00
a8b2a89e7c docs: purge all Herdr references, consolidate into AGENTS.md + README (#64)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 14:05:17 +02:00
Sam & Claude
7abe8c4d4c docs: purge all Herdr references, consolidate into AGENTS.md + README (Sam & Hermes)
Some checks failed
CI / markdown (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
Deleted 8 stale docs (~1,700 lines) and merged their essential intent into
AGENTS.md and README.md:

Merged into AGENTS.md:
- Architecture Roles section (zot=agent, Colibri=control plane, pi=backend)
- ISO Takeover Gates table (Gates 1-5 with status)

Merged into README.md:
- glasspane row names zot/pi (not just Pi)
- architecture diagram names zot/pi JSONL
- removed Herdr dependency reference

Deleted (content merged or obsolete):
- docs/HERDR-VS-COLIBRI-GRAPH.md (migration artifact)
- docs/ADR-agent-harness-consolidation.md (merged into AGENTS.md)
- docs/COLIBRI-GLASSPANE-DESIGN.md (merged into README, rest in code)
- docs/COLIBRI-DAEMON-GLASSPANE-INTEGRATION.md (code is source of truth)
- docs/MULTIAGENT-WORKFLOW-IMPROVEMENTS.md (already in AGENTS.md)
- docs/T1.4-PROMPT-DISCIPLINE-PLAN.md (gaps tracked in priority handoff #3)
- docs/ISO-INTEGRATION-PLAN.md (gates merged into AGENTS.md)
- .hermes/plans/2026-05-27-colibri-cutover.md (old plan, superseded)

Also cleaned Herdr references from Rust doc comments in
colibri-glasspane/src/lib.rs and colibri-client/src/lib.rs.

Result: 18 docs → 11 docs, 66 Herdr references → 0.
Gates: fmt/clippy/test all green.
2026-06-14 14:04:49 +02:00
3d5a26776a Merge pull request 'docs: tidy formatting, add docs index, and refresh README status line' (#63) from docs/polish-formatting-index-status into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
Reviewed-on: #63
2026-06-14 13:36:45 +02:00
Sam & Claude
7853e5a2be docs: tidy formatting, add docs index, and refresh README status line
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
2026-06-14 13:35:37 +02:00
a330406bab docs: priority handoff — ISO staging, Pi spawn, cost mode enforcement (#62)
Some checks are pending
CI / markdown (push) Waiting to run
CI / rust (push) Waiting to run
2026-06-14 12:57:29 +02:00
Sam & Claude
a6f1a8b4f5 docs: priority handoff — ISO staging, Pi spawn, cost mode enforcement (Sam & Hermes)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
2026-06-14 12:57:02 +02:00
b6d0b82452 Merge pull request 'docs: stop hand-maintaining the workspace crate count' (#61) from docs/drop-hardcoded-crate-count into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 12:45:00 +02:00
Sam & Claude
f8a0aff88d docs: stop hand-maintaining the workspace crate count
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
The count drifted repeatedly (8/10/11/12, plus README-vs-AGENTS mismatches)
because it was hardcoded in three places. Drop the number from README (status +
heading) and AGENTS; the crate table + Cargo.toml members are the source of
truth, so adding/removing a crate only touches the table.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 12:44:53 +02:00
d490cedb55 docs: fix crate count (12 incl root) + add jail mention to spawner (Sam & Hermes) (#60)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 12:37:25 +02:00
Sam & Claude
ba041e61a5 docs: fix crate count (12 incl root) + add jail mention to spawner (Sam & Hermes)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
2026-06-14 12:37:02 +02:00
cce15a3b7a Merge pull request 'fix(import): treat each SKILL.md as one skill' (#59) from fix/import-skill-md into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 02:08:20 +02:00
Sam & Claude
a56c33c30d fix(import): treat each SKILL.md as one skill (not every .md)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
The layered-soul skills importer globbed skills/**/*.md, pulling references/ and
templates/ in as separate skills. Import each skills/**/SKILL.md instead
(frontmatter name/description, category 'soul'); supporting files are not skills.
Verified against the populated layered-soul: 9 skills imported, idempotent,
curated memory deferred. Doc updated to match.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 02:08:12 +02:00
b3f3e3913f Merge pull request 'docs: jail root_path + staged env payloads' (#58) from docs/land-staged-env-docs into main
Some checks are pending
CI / markdown (push) Waiting to run
CI / rust (push) Waiting to run
2026-06-14 01:38:37 +02:00
Sam & Claude
5fe0848707 docs: document jail root_path + staged env payloads
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
Match the docs to the shipped staged-env code: add the JailConfig root_path
field, a 'Staged env payloads' section (prepare_spawn_command writes env.sh/
launch.sh under /var/run/colibri-stage/<id>/), resolve the mdo-env-passthrough
open item, and add root_path to the external-MCP example.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 01:38:30 +02:00
83abd586c3 Merge pull request 'feat(daemon): headroom compression sidecar (hardened)' (#57) from fix/headroom-sidecar-quality into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 01:35:53 +02:00
34929a6a53 fix(headroom): harden sidecar protocol and timeout (Sam & Codex)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
Keep the Python sidecar connection open for multiple newline-delimited requests, add daemon-side request timeout/fallback tests, and document the opt-in Headroom sidecar contract.\n\nChecks: ./scripts/check-format.sh; cargo fmt --check; python3 -m py_compile scripts/headroom-sidecar.py; git diff --check; cargo test -p colibri-daemon cost -- --nocapture; cargo test -p colibri-daemon session:: -- --nocapture; cargo test -p colibri-daemon --all-targets; cargo check -p colibri-daemon; manual sidecar two-request smoke using a headroom-capable Python env.
2026-06-14 01:30:45 +02:00
c406a44d94 Merge pull request 'fix(spawner): unbreak clippy gate (too_many_arguments)' (#56) from fix/clippy-too-many-args into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 01:30:39 +02:00
Sam & Claude
0b364ac36d fix(spawner): allow too_many_arguments on prepare_spawn_command
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
Unbreaks the workspace clippy gate: prepare_spawn_command has 8 args (8/7), so
clippy::too_many_arguments fails under -D warnings on main.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 01:30:31 +02:00
edc1a5cdbf feat(daemon): headroom-ai compression sidecar for tool results
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
- scripts/headroom-sidecar.py: Unix socket server (from headroom import compress)
- cost.rs: HeadroomSidecar struct with connect/compress methods
- session.rs: build_prompt_messages() now accepts optional sidecar
- daemon.rs: spawns sidecar on startup if COLIBRI_HEADROOM_ENABLED=true
- config.rs: headroom_enabled + headroom_socket_path config fields
- socket.rs: cmd_status reports headroom status, cmd_get_session uses sidecar
- All test fixtures updated with new DaemonConfig fields

40-50% token savings on tool outputs with zero accuracy loss.
Disabled by default (COLIBRI_HEADROOM_ENABLED=false).
Works identically on Linux and FreeBSD.
2026-06-14 01:15:52 +02:00
5d7536101f Merge pull request 'docs: tidy clawdie handoff (hardening applied)' (#54) from docs/handoff-tidy into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 00:50:05 +02:00
Sam & Claude
cee02cc052 docs: tidy clawdie handoff — reflect hardening applied (PR #53)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
The findings were merged; reword from 'filed in branch for review' to 'applied
(PR #53)'.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 00:49:52 +02:00
7fcac32155 Merge pull request 'fix/clawdie-installer-freebsd-hardening' (#53) from fix/clawdie-installer-freebsd-hardening into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
Reviewed-on: #53
2026-06-14 00:46:11 +02:00
df73740e59 docs: record FreeBSD clawdie installer findings (Sam & Codex)
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
Add real FreeBSD 15 read-only validation output and the hardening findings so Linux-side reviewers can evaluate the installer follow-up without needing host access.\n\nChecks: ./scripts/check-format.sh; git diff --check
2026-06-14 00:45:02 +02:00
4abc2c5294 fix(clawdie): harden FreeBSD installer plan (Sam & Codex)
Use the clawdie service user in the generated FreeBSD rc.d script, chown state directories after the user is created, and reject unknown existing ZFS pools before rendering/applying a plan. Update the FreeBSD validation handoff to cover these checks.\n\nFreeBSD checks: cargo fmt --check; ./scripts/check-format.sh; git diff --check; cargo test -p clawdie -- --nocapture; cargo clippy -p clawdie --all-targets -- -D warnings; cargo build -p clawdie --release; target/release/clawdie discover; target/release/clawdie plan; target/release/clawdie apply --pool zroot (dry-run); target/release/clawdie plan --pool does-not-exist (expected error).
2026-06-14 00:42:43 +02:00
2cdefc00a0 Merge pull request 'docs: FreeBSD validation handoff for the clawdie installer' (#52) from docs/clawdie-installer-handoff into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 00:35:09 +02:00
Sam & Claude
f7942c61d1 docs: FreeBSD validation handoff for the clawdie installer
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
Codex validates the disk-touching + service-install paths (zfs/zpool create,
pw/rc.d service) that can't be exercised off-host. Includes read-only checks,
destructive provisioning steps for a scratch pool, teardown, and acceptance
criteria.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 00:35:01 +02:00
341a594ead Merge pull request 'feat(clawdie): ZFS-aware storage strategy + optional pool creation' (#51) from feat/clawdie-zfs-strategy into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
2026-06-14 00:32:30 +02:00
Sam & Claude
325951be5c feat(clawdie): ZFS-aware storage strategy + optional pool creation
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
clawdie chooses storage per host:
- FreeBSD: ZFS required (datasets under the pool)
- Linux with ZFS + a pool: datasets under the pool
- Linux without ZFS: plain-dir fallback, reporting ZFS benefits + spare disks
- --create-pool /dev/DEV runs `zpool create` (needs --pool NAME)

Pool creation is destructive and guarded: refused unless the disk is detected
empty (no partitions/filesystem/mount, not the root disk) or --force is given,
and only with --yes. `discover` lists block devices with candidacy. New
disk-candidacy parser + storage resolver are unit-tested (13 tests).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 00:32:21 +02:00