chore(docs): delete legacy migration/cutover artifacts; repoint handoff refs (Sam & Claude)

Remove the transition-era docs that no longer guide anyone and just pollute
context: MIGRATION-INVENTORY, CALLER-INVENTORY, GATE5-MIGRATION-GRAPH,
COLIBRI-CUTOVER-PLAN, and the rolling .agent-handoff.md. (History stays in git.)

Fix references in kept docs: drop the cutover/caller pointers (README,
COLIBRI-DAEMON-GLASSPANE-INTEGRATION), and repoint handoff mentions (AGENTS,
tools/README, MULTIAGENT-WORKFLOW-IMPROVEMENTS) to the ephemeral per-task
`doc/<FEATURE>-HANDOFF.md` convention. Dated session logs left as historical
record. Markdown gate green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Sam & Claude 2026-06-05 12:09:39 +02:00
parent b5a781f6e4
commit ae5da0e94b
10 changed files with 7 additions and 892 deletions

View file

@ -1,268 +0,0 @@
# Agent Handoff Protocol
Standardized protocol for transferring context between agents in the Colibri multiagent development cycle.
## Before Handoff
- [ ] All tests pass (`cargo test --workspace`)
- [ ] Relevant proof gates documented in `docs/PROOF-GATES.md`
- [ ] Cross-platform validation recorded (osa/domedog/debby)
- [ ] Next agent's entry point clearly marked
- [ ] No uncommitted changes that break existing functionality
## Handoff Template
```json
{
"agent_from": "agent_name",
"agent_to": "agent_name",
"focus_area": "brief description",
"proof_gates_pending": ["gate-1", "gate-2"],
"known_limitations": ["limitation 1", "limitation 2"],
"next_steps": ["step 1", "step 2"],
"context_files": ["file1.rs", "file2.md"],
"test_evidence": ["manifests/file1.json", "manifests/file2.json"]
}
```
## Current Proof Gates Status
- **Gate #1**: Contract round-tripping (11 golden tests) - ✅ PASSING
- **Gate #2**: DeepSeek live cache manifest - ✅ PASSING
- **Gate #3**: Runtime inventory parity - ✅ PASSING
- **Gate #4**: Cross-platform build/test - ✅ PASSING
- **Gate #5**: Watchdog socket reader - ✅ PASSING
- **Gate #6**: Caller inventory & retirement - ⏸️ PRECONDITION CHECK
## Platform Matrix
| Platform | Host | Status | Notes |
| -------- | -------------------- | ---------- | --------------------------------------- |
| FreeBSD | osa.smilepowered.org | ✅ Active | Primary target, FreeBSD 15.0-RELEASE-p8 |
| Linux | domedog | ✅ Active | Development/testing, Linux 6.8.0 |
| Linux | debby | ⏸️ Partial | Node 24, no Pi yet |
## After Handoff
- [ ] Receiving agent confirms understanding
- [ ] Test suite updated if new functionality added
- [ ] Documentation sync'd
- [ ] Handoff entry added to this file with timestamp
## Handoff History
### 2026-05-27T10:00:00Z - Initial Setup
- **Agent**: System
- **Purpose**: Establish handoff protocol for Colibri multiagent development
- **Context**: TypeScript → Rust migration in progress, 6 proof gates defined
- **Next**: First agent handoff to be logged here
### 2026-05-27T12:30:00Z - Glasspane Integration
- **Agent From**: hermes
- **Agent To**: sam
- **Focus Area**: colibri-glasspane TUI and client integration
- **Proof Gates**: Gate #5 complete, daemon socket API working
- **Evidence**:
- `manifests/2026-05-26-osa-watchdog-host-status.json`
- `crates/colibri-glasspane-tui/` created
- **Known Limitations**: PTY launch not yet validated on FreeBSD
- **Next Steps**:
- Complete colibri-client crate
- Add glasspane-snapshot command to socket API
- Live FreeBSD PTY validation
- **Context Files**:
- `crates/colibri-glasspane/src/lib.rs`
- `crates/colibri-daemon/src/socket.rs`
- `docs/COLIBRI-GLASSPANE-DESIGN.md`
### 2026-05-27T13:15:00Z - Herdr Remote + TUI Dashboard + Platform Matrix
- **Agent From**: hermes
- **Agent To**: sam & claude
- **Focus Area**: Herdr Tailscale remote smoke, colibri-glasspane-tui, multiagent workflow tools
- **Proof Gates**: All 6 gates green (see proof-gate-tracker). `b325c38` baseline.
- **Evidence**:
- `clawdie-ai/docs/internal/sessions/2026-05-27-herdr-tailscale-remote-smoke.md` — bidirectional debby↔domedog over Tailscale
- `crates/colibri-glasspane-tui/` — 8th crate, ratatui dashboard (live snapshot polling, color-coded states, stalled detection)
- `crates/colibri-client/src/bin/colibri_ctl.rs` — operator CLI (snapshot, status, spawn/kill)
- `crates/colibri-client/src/bin/colibri_smoke_agent.rs` — offline local-fake-Pi smoke agent
- `tests/platform-matrix.rs` — cross-platform parity tests (FreeBSD + Linux)
- `tools/proof-gate-tracker.rs` — automated 6-gate validation binary
- **Known Limitations**:
- Herdr FreeBSD port parked — boundary decided (Linux/macOS display only)
- `herdr --remote` requires interactive terminal for first install
- Platform matrix omits debby (no Pi installed) — needs colibri-smoke-agent integration
- Debby's sshd was dead for 2 days (ListenAddress=100.66.193.10 → fixed to 0.0.0.0)
- **Next Steps**:
- Claude: review and merge handoff updates
- Wire debby into platform-matrix with colibri-smoke-agent
- CI/CD wiring for proof-gate-tracker (self-hosted Forgejo Actions/webhooks)
- **Context Files**:
- `.agent-handoff.md` (this file)
- `docs/MULTIAGENT-WORKFLOW-IMPROVEMENTS.md`
- `docs/MIGRATION-INVENTORY.md`
- `clawdie-ai/docs/internal/sessions/2026-05-27-herdr-tailscale-remote-smoke.md`
### 2026-05-27T19:35:00Z - FreeBSD Daemon + Scheduler Validation Planning
- **Agent From**: claude (domedog/Linux)
- **Agent To**: codex (osa/FreeBSD)
- **Focus Area**: OSA FreeBSD daemon bring-up with comprehensive scheduler validation
- **Proof Gates**: All 6 gates green, baseline `a48afa1` (89 tests pass/0 fail, FreeBSD-safe test isolation)
- **Context**: Significant scope expansion at commit `db5737b` — scheduler module (506 lines) + rc.d service file landed
- **Evidence**:
- `crates/colibri-daemon/src/scheduler.rs` — NEW 506-line scheduler module (Once/Interval/Cron schedules, job management, agent capability matching)
- `packaging/freebsd/colibri_daemon.in` — rc.d service file (50 lines, review-only, not installed)
- `crates/colibri-store/` — NEW SQLite coordination store crate
- `docs/internal/sessions/2026-05-27-scheduler-freebsd-store-isolation-finding.md` — FreeBSD test isolation fix documented
- `docs/COLIBRI-CUTOVER-PLAN.md` — updated with T1.3b next action: FreeBSD smoke test at current main
- **What Changed Since Last Handoff**:
- **NEW**: Full scheduler implementation (T1.3) embedded in `DaemonState.scheduler`
- **NEW**: SQLite coordination store via `colibri-store` crate
- **NEW**: rc.d service file for `/usr/local/etc/rc.d/colibri_daemon` (not installed yet)
- **FIXED**: FreeBSD test isolation bug (production path permissions in unit tests)
- **UPDATED**: Cutover plan reflects scheduler landing + T1.3b FreeBSD smoke test as next action
- **Three Validation Options Analyzed**:
1. **Option 1 (RECOMMENDED)**: Comprehensive scheduler + daemon smoke — single test validates both core daemon AND new scheduler functionality on FreeBSD
2. **Option 2**: Incremental validation — core daemon first, then scheduler in separate cycle
3. **Option 3**: Minimal smoke — core only, defer scheduler validation
- **Critical Questions to Answer Before Execution**:
1. **`colibri-ctl` Binary Exists?** The smoke plan uses `target/release/colibri-ctl` but I don't see it in the workspace. Is this a CLI wrapper around `colibri-client`?
**ANSWERED (hermes):** Yes. Built from `crates/colibri-client/src/bin/colibri_ctl.rs`. `cargo build --release` produces `target/release/colibri-ctl`.
2. **Scheduler Socket Commands?** Does `crates/colibri-daemon/src/socket.rs` implement scheduler commands (`add_job`, `list_jobs`, `submit_task`)?
**ANSWERED (hermes):** `intake-task` socket command exists (for Telegram/remote task submission). Job management (`add_job`, `list_jobs`) is currently in-memory only via `Scheduler::add_job()` — no socket commands for those yet. The smoke should test `intake-task` via socket and verify jobs fire via daemon logs.
3. **Fake Agent for Spawn?** The plan references `target/release/colibri-smoke-agent`. Does this exist from the previous handoff?
**ANSWERED (hermes):** Yes. Built from `crates/colibri-client/src/bin/colibri_smoke_agent.rs`. Produces Pi-format JSONL output for glasspane ingestion.
4. **SQLite WAL on FreeBSD?** Are there FreeBSD-specific considerations for SQLite WAL journaling?
**ANSWERED (hermes):** WAL is filesystem-level, not OS-specific. The `bundled` rusqlite feature compiles SQLite from source (no system lib dependency). Works on FreeBSD. WAL files (`-wal`, `-shm`) will appear alongside the `.sqlite` file — normal.
5. **Baseline Confirmation**: Verify we're pulling from `origin/main` which includes the FreeBSD test isolation fix at `a48afa1`
**ANSWERED (hermes):** Current main is `b898c97` (claude's handoff) which includes `a48afa1`. 72 tests, clippy-clean.
- **Recommended Path**: Option 1 — Comprehensive smoke testing both core daemon (socket, status, snapshot, spawn) AND scheduler functionality (jobs, schedules, task intake) in isolated `/tmp` paths
- **Smoke Test Scope (Option 1)**:
- **Part A: Core Daemon**: `COLIBRI_DAEMON_DATA_DIR=/tmp/colibri-osa-smoke-$USER`, start daemon, verify socket/SQLite, test `colibri-ctl status/snapshot/spawn-local`, TUI display, cleanup
- **Part B: Scheduler**: Submit interval/once/cron jobs via socket, verify jobs fire, check tasks in SQLite store, confirm scheduler tick works on FreeBSD
- **Session Report**: `docs/internal/sessions/2026-05-27-osa-freebsd-daemon-scheduler-smoke.md`
- **Evidence to Record**:
- FreeBSD version (`freebsd-version`)
- Rust version (`rustc --version`)
- Commit hash (`git rev-parse HEAD`)
- Exact env vars and paths
- Socket/SQLite creation verification
- Scheduler job/task counts before/after
- Daemon logs showing job execution
- Cleanup success/failure (stale socket handling)
- **Known Limitations**:
- Scheduler developed on Linux, may have FreeBSD edge cases
- SQLite coordination store untested on FreeBSD yet
- rc.d file is review-only, not installed to system
- No Herdr on FreeBSD (boundary reaffirmed)
- **Next Steps**:
1. Answer 5 critical questions above
2. Verify baseline (`a48afa1` or newer)
3. Confirm `colibri-ctl` exists or define socket commands
4. Execute smoke on osa at current main (`db5737b`)
5. Document findings in session report
6. Update `.agent-handoff.md` with results
- **Context Files**:
- `.agent-handoff.md` (this file)
- `docs/COLIBRI-CUTOVER-PLAN.md`
- `docs/internal/sessions/2026-05-27-scheduler-freebsd-store-isolation-finding.md`
- `packaging/freebsd/colibri_daemon.in`
- `crates/colibri-daemon/src/scheduler.rs`
- `crates/colibri-daemon/src/socket.rs`
- `crates/colibri-daemon/src/daemon.rs`
### 2026-05-27T16:00:00Z - Cutover plan reconciliation (FYI, not a debate)
- **Agent From**: claude (domedog)
- **Agent To**: hermes (debby)
- **Focus Area**: shared cutover plan is now authoritative; storage decided
- **Summary**:
- `docs/COLIBRI-CUTOVER-PLAN.md` (`0925939`, then this commit) is the **shared
verified** cutover plan. `.hermes/plans/2026-05-27-colibri-cutover.md` is
**superseded where it conflicts** — please reconcile or retire it.
- **Storage DECIDED (Sam):** Colibri owns its own store; **embedded SQLite**
first; Postgres adapter only if parity/integration proves the need. Do not
reuse clawdie-ai `system_ops` Postgres by default.
- **Conflicts fixed (verified 27.maj)**:
- No `crates/colibri-daemon` in `clawdie-ai` — it has **no `crates/` dir**.
The real daemon is **Unix-socket** in the `colibri` repo, not axum/HTTP.
- **No Herdr in the FreeBSD execution path** — Linux/macOS display/remote
only; `colibri-glasspane` is the native answer (`MIGRATION-INVENTORY.md` §3).
- Baseline corrected to `160dd11` (65 tests pass/0 fail, clippy clean);
`eb37784` was **not** clippy-clean.
- Ownership: **Claude=domedog=Linux, Codex=osa=FreeBSD, Hermes=debby=Linux**.
- "debby↔domedog herdr already smoke-tested" downgraded: as of my 27.maj check
the **herdr client is not installed on debby**, so the hub direction
(debby→domedog) is still pending (Lane 2 T2.2). Conflicts with the T13:15
"bidirectional" entry above — flagging so it gets actually closed.
- **Next Steps (hermes)**:
- Reconcile/retire the `.hermes` draft against `docs/COLIBRI-CUTOVER-PLAN.md`.
- Install herdr client on debby → close Lane 2 T2.2 per `HERDR-HUB-RUNBOOK.md`.
- **Context Files**:
- `docs/COLIBRI-CUTOVER-PLAN.md`
- `docs/HERDR-HUB-RUNBOOK.md`
- `docs/MIGRATION-INVENTORY.md`
### 2026-05-27T23:30:00Z - ISO build: Colibri release binaries needed on OSA
- **Agent From**: hermes (debby)
- **Agent To**: codex (osa/FreeBSD)
- **Focus Area**: Build Colibri release binaries so the ISO build can consume them
- **Context**: `clawdie-iso` branch `xfce-operator-usb` (`d3deafd`) has
`FEATURE_COLIBRI=YES` wired in `build.sh`. The build preflight checks for
Colibri artifacts in `../colibri/target/release/`. They are not present yet.
- **Steps**:
1. Build Colibri:
```sh
cd /home/clawdie/colibri
git pull --ff-only origin main
git rev-parse --short HEAD
cargo build --workspace --release
```
2. Verify binaries exist and are FreeBSD executables:
```sh
ls -lh target/release/colibri-daemon \
target/release/colibri \
target/release/colibri-smoke-agent \
target/release/colibri-tui
file target/release/colibri-daemon target/release/colibri
target/release/colibri --help | head
```
3. Verify ISO build preflight passes (without starting root image assembly):
```sh
cd /home/clawdie/clawdie-iso
git checkout xfce-operator-usb
FEATURE_COLIBRI=YES ./build.sh --skip-fetch
```
Expected: passes Colibri preflight, stops at step 5 (root/mdconfig required).
4. `cargo clean` after successful build per `AGENTS.md` cleanup rule.
- **No debby cross-build** unless OSA build fails.
- **Context Files**:
- `AGENTS.md` (cleanup rule)
- `docs/ISO-INTEGRATION-PLAN.md`
- `docs/ISO-ACCEPTANCE-RUNBOOK.md`
### 2026-05-29T09:10:00Z - Forgejo cutover: self-hosted source forge is primary
- **Agent From**: claude (debby/Linux)
- **Agent To**: hermes / sam / codex
- **Focus Area**: Stop tracking Codeberg as the active Colibri remote; use self-hosted Forgejo.
- **Decision**: `code.smilepowered.org` is now the primary source forge for Colibri and the Clawdie repos. Codeberg is stale/archival unless Sam explicitly requests a sync.
- **Evidence**:
- SSH auth works with key `claude-code-clawdie` on Forgejo SSH port `2222`.
- Colibri remote now points to `git@code.smilepowered.org:clawdie/colibri.git`.
- `git fetch origin --prune` succeeds and local `main` tracks `origin/main` at `da31b5c`.
- **Known Limitations**:
- Branch protection, per-agent users/keys, and Forgejo webhook-driven FreeBSD validation are still pending.
- Other clones should update remotes or reclone from Forgejo; do not assume Codeberg has current state.
- **Next Steps**:
1. Hermes finishes syncing `clawdie-ai` and cleaned `clawdie-iso` to Forgejo.
2. Create per-host/per-agent credentials (`hermes-debby`, `claude-domedog`, `codex-osa`) and retire bootstrap/admin credentials from daily use.
3. Add branch protection for `main` and wire Forgejo push webhooks to OSA FreeBSD validation.
- **Context Files**:
- `AGENTS.md`
- `.ssh/config` host entry for `code.smilepowered.org`
- `docs/HERDR-HUB-RUNBOOK.md`

View file

@ -92,7 +92,7 @@ It is intentionally separate from:
## Multiagent Workflow
- **Handoff doc:** `.agent-handoff.md` — always update before handing off
- **Handoff doc:** `doc/<FEATURE>-HANDOFF.md` — always update before handing off
- **Proof gate tracker:** `cargo run --bin proof-gate-tracker`
- **Platform matrix:** `cargo test --test platform-matrix`
- **Herdr remote smoke:** `clawdie-ai/docs/internal/sessions/2026-05-27-herdr-tailscale-remote-smoke.md`

View file

@ -6,7 +6,6 @@ with cache-first cost discipline (byte-stable prompt prefixes, cache-hit meterin
**Status:** 8 crates; workspace gates are expected to be fmt/clippy/test/release green. Avoid fixed test-count status here — run the gate commands below for the current count. Phase 3 (coordination core) is in progress.
Design doc + cutover plan: `docs/COLIBRI-CUTOVER-PLAN.md`.
Next ISO integration plan: `docs/ISO-INTEGRATION-PLAN.md`.
ISO acceptance runbook: `docs/ISO-ACCEPTANCE-RUNBOOK.md`.
Clawdie Studio/Zed proposal: `docs/CLAWDIE-STUDIO-PROPOSAL.md`.

View file

@ -1,94 +0,0 @@
# Caller Inventory & Retirement Plan (gate #6 prerequisite)
Read-only "who-imports-what" of the clawdie-ai TS drop candidates, so retirement
is explicit and safe. **No code changed.** Method: import grep across
`clawdie-ai/src/` + content classification. Snapshot for rollback:
`archive/multitenant-claude-pre-divergence`.
**Headline: the inventory corrected the earlier drop list** — `agent-runner.ts`
and `jail-exec-runner.ts` are load-bearing (they run **Pi**), not droppable. The
real, safe drop set is narrow and contained in one dispatch hub.
## Findings
| TS file | Callers (live) | Verdict | Why / replacement |
| --------------------------------- | ---------------------------------------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `agent-runner.ts` | `config.ts`, `task-scheduler.ts`, `ipc.ts`, `index.ts` (4) | **KEEP** | It _is_ the Pi host runner — "spawns `pi` directly… `--print` mode". Mislabeled "multi-backend" in the plan. Dropping it breaks the Pi runtime. |
| `jail-exec-runner.ts` | `controlplane-heartbeat-executor.ts` (+ test) | **KEEP, trim** | Exports `jailPi` (Pi jail exec, load-bearing) **and** `jailAider`. Keep `jailPi`; remove `jailAider` only when aider goes. |
| `controlplane-aider-runner.ts` | `controlplane-heartbeat-executor.ts` | **DROP (gated)** | Reachable only via executor branch `CONTROLPLANE_RUNNER === 'aider'`. Replaced by Pi-only. |
| `controlplane-heartbeat-codex.ts` | `controlplane-heartbeat-executor.ts` | **DROP (gated)** | Reachable only via executor branch `CONTROLPLANE_RUNNER === 'codex'`. `controlplane-heartbeat-pi.ts` stays. |
| `tmux-screenshot-command.ts` | `index.ts` (1) | **DROP (gated)** | Terminal-screenshot CLI command; superseded by Herdr (Linux client supervision). |
| bespoke provider-smoke | `.agent/skills/pi-provider-smoke`, `scripts/*smoke*.mjs` | **separate track** | Not a `src/` module. `colibri-deepseek` covers the cache probe; retire/repoint the skill later, on its own. |
| "glass-pane glue" | — | **does not exist** | No agent-supervision module. `nginx-glasspane` (caching) and `glass.sh` are unrelated. |
## The drop is one contained edit
All non-Pi backends are gated behind `CONTROLPLANE_RUNNER` and dispatched from a
single hub, `controlplane-heartbeat-executor.ts`:
```text
controlplane-heartbeat-executor.ts
if CONTROLPLANE_RUNNER === 'aider' -> runAiderTask + jailAider ⛔ remove branch
if CONTROLPLANE_RUNNER === 'codex' -> runCodexTask ⛔ remove branch
else (pi) -> runPiTask + jailPi ✅ keep
```
**Retirement steps (gated — execute only after the precondition below):**
1. In `controlplane-heartbeat-executor.ts`: delete the `=== 'aider'` and
`=== 'codex'` branches and their imports (`runAiderTask`, `runCodexTask`,
`jailAider`, `CONTROLPLANE_AIDER_*`). Keep the Pi path.
2. Now-unreferenced → delete: `controlplane-aider-runner.ts`,
`controlplane-heartbeat-codex.ts` (+ their tests).
3. `jail-exec-runner.ts`: remove the `jailAider` export; keep `jailPi`.
4. Remove `CONTROLPLANE_AIDER_BIN/FLAGS/LOG_DIR/TMUX_SESSION` from config.
5. `index.ts`: unregister the tmux-screenshot command; delete
`tmux-screenshot-command.ts` (+ test). Supervision → Herdr Linux client.
## Mermaid
```mermaid
graph LR
idx["index.ts"] --> tmux["tmux-screenshot-command.ts ⛔"]
cfg["config.ts"] --> ar["agent-runner.ts ✅ Pi runner"]
sch["task-scheduler.ts"] --> ar
ipc["ipc.ts"] --> ar
idx --> ar
exec["controlplane-heartbeat-executor.ts (hub)"] --> pi["heartbeat-pi.ts ✅"]
exec --> aider["aider-runner.ts ⛔"]
exec --> codex["heartbeat-codex.ts ⛔"]
exec --> jail["jail-exec-runner.ts: jailPi ✅ / jailAider ⛔"]
tmux -. replaced_by .-> HERDR["Herdr (Linux client)"]
aider -. replaced_by .-> PI["Pi-only + colibri-deepseek"]
codex -. replaced_by .-> PI
```
## JSON
```json
{
"keep": [
{"file":"agent-runner.ts","reason":"the Pi host runner","callers":["config","task-scheduler","ipc","index"]},
{"file":"jail-exec-runner.ts","reason":"jailPi load-bearing","trim":"jailAider"}
],
"drop_gated": [
{"file":"controlplane-aider-runner.ts","caller":"heartbeat-executor","gate":"CONTROLPLANE_RUNNER==aider"},
{"file":"controlplane-heartbeat-codex.ts","caller":"heartbeat-executor","gate":"CONTROLPLANE_RUNNER==codex"},
{"file":"tmux-screenshot-command.ts","caller":"index.ts","replacement":"herdr"}
],
"separate_track": ["pi-provider-smoke skill","scripts/*smoke*.mjs"]
}
```
## Precondition & guardrails
- **Replacement must be explicit & live:** production runs `CONTROLPLANE_RUNNER=pi`
(the Pi-only path), with Colibri's DeepSeek slice + Herdr supervision as the
replacements. **Verify the production `CONTROLPLANE_RUNNER` value before any
deletion** — if any deployment still sets `aider`/`codex`, do not drop.
- Untouched: `watchdog`, `hostd`, `doctor`, `pi-profile`, `controlplane-*`
coordination, `task-scheduler`, `provider-capabilities` (contract source),
and `agent-runner`/`jail-exec-runner` (Pi runtime).
- This is the **plan**, not the execution. Retirement is a separate, reviewed PR
after the precondition holds — and it touches one hub + deletes two files, so
it's small and revertible.

View file

@ -1,209 +0,0 @@
# Colibri Cutover Plan — clawdie-ai (TS) → Colibri (Rust)
**Status:** DRAFT / PROPOSED — 27.maj.2026. Shared, verified version of the
orchestration plan. Supersedes the working draft `.hermes/plans/2026-05-27-colibri-cutover.md`
(see "Corrections from the draft" below).
**Goal:** progressively replace the clawdie-ai TypeScript control plane with the
Colibri Rust core as the FreeBSD system service, with the FreeBSD-native
supervision boundary intact and each step proven before takeover.
---
## Corrections from the `.hermes` draft
The earlier draft asserted several things that don't match the repos. Fixed here:
| Draft claim | Reality (verified 27.maj) |
| ------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `clawdie` repo has `crates/colibri-daemon/` (event.rs/state.rs/ingestor.rs/snapshot.rs, **axum HTTP**) | `clawdie-ai` has **no `crates/` dir**. The Rust daemon lives only in the **`colibri` repo**, and it is **Unix-socket** (`socket.rs` `UnixListener`), not HTTP. |
| Baseline `eb37784` — "62 tests, clippy-clean" | `eb37784` carried the `collapsible_match` clippy errors (fixed in `5d45a0f`). Accurate baseline: **`160dd11` — 65 tests passed/0 failed, `clippy -D warnings` clean**. |
| "`herdr --remote` debby↔domedog already smoke-tested" | Only a one-off domedog→debby attach occurred. The **hub direction (debby→domedog) is not tested** — herdr client isn't installed on debby yet (see `HERDR-HUB-RUNBOOK.md`). |
| Herdr as "drop-in for Clawdie's tmux-based agent **execution**" on FreeBSD | Contradicts the settled boundary (`MIGRATION-INVENTORY.md` §3, `862204c`): **no Herdr on FreeBSD**. Herdr is a Linux/macOS **display/remote** client; `colibri-glasspane` is the FreeBSD-native supervision. Reframed in Lane 2. |
| Owner "Claude (osa, FreeBSD validation)" | **Claude = domedog = Linux. Codex = osa = FreeBSD. Hermes = debby = Linux.** FreeBSD validation/build is Codex's lane. |
---
## Verified current state (27.maj.2026)
| Repo | Branch | Baseline | Notes |
| ------------- | ------ | --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `colibri` | main | `ceaeaee` + follow-up | T1.2/T1.3 landed (`colibri-store` + scheduler); 8 crates; verify current counts with `cargo test --workspace`; `clippy -D warnings` clean after follow-up. |
| `clawdie-ai` | main | `169bee2` | TS control plane (the cutover _source_); **no Rust crates** |
| `clawdie-iso` | main | `b9803d8` | has a Colibri dependency section in `AGENTS.md` |
| `herdr` | main | `ede2059` _(per Hermes; not verified from domedog)_ | Linux/macOS display client |
### What actually exists in Colibri today
- **Rust workspace, 8 crates** (`colibri-contracts`, `-deepseek`, `-runtime`,
`-glasspane`, `-daemon`, `-client`, `-glasspane-tui`, `-store` + root bins).
Builds and tests green on Linux (debby/domedog) and FreeBSD (osa).
- **`colibri-daemon`** — always-on service over a **Unix socket** (newline-JSON):
`config/daemon/session/socket/spawner`. Not HTTP.
- **`colibri-glasspane`** — FreeBSD-native agent supervision; 5-state machine
derived from Pi `--mode json` events; `clawdie.glasspane.snapshot.v1`.
- **`colibri-client`** — typed Unix-socket client; live socket smoke test.
- Proof gates 16 green per `MIGRATION-INVENTORY.md`; gate 7 (multi-host
coordination) pending.
### The TS side being retired (in `clawdie-ai`)
Contract sources already mirrored into Rust: `src/colibri-pi-events.ts`,
`colibri-run-manifest.ts`, `colibri-runtime-inventory.ts`, `colibri-host-status.ts`,
`colibri-pi-run.ts`. Load-bearing runtime kept until cutover: `agent-runner.ts`
(the Pi host runner), `jail-exec-runner.ts` (`jailPi`), `watchdog.ts`, `hostd`.
---
## Decisions
1. **Coordination-core storage — DECIDED (Sam, 27.maj): Colibri owns its own
store.** Phase 1 = **embedded SQLite**. Add a Postgres adapter _only if_
dual-run parity or integration proves the need — do **not** default to
reusing clawdie-ai's `system_ops` Postgres. Rationale: cleaner cutover
boundary, no hidden coupling to clawdie-ai. (Rejected up front: reuse
`system_ops`; Colibri-owned Postgres.)
2. **Herdr boundary — REAFFIRMED.** Herdr stays Linux/macOS display/remote only.
Putting Herdr in the FreeBSD execution path reopens `MIGRATION-INVENTORY.md`
§3 and needs an explicit reversal.
### Storage ownership surface (Decision #1 detail)
_Proposed defaults — adjust at implementation._
- **DB file:** FreeBSD service path `/var/db/colibri/colibri.sqlite` (owned by the
Colibri service user, dir `0700`). Linux dev: `$XDG_DATA_HOME/colibri/colibri.sqlite`
(`~/.local/share/colibri/`). Overridable via daemon config / `COLIBRI_DB_PATH`.
- **Mode:** **WAL** (`journal_mode=WAL`, `synchronous=NORMAL`) — concurrent snapshot
readers + single writer daemon. **Local filesystem only** (WAL is unsafe over
network FS).
- **Backup/export:** hot binary backup via `VACUUM INTO` (point-in-time, no stop);
**plus** a JSON export in the existing contract shapes
(`clawdie.glasspane.snapshot.v1`, run-manifest) for portability, human inspection,
and dual-run parity diffs.
- **Authoritative here:** task-board lifecycle, agent lifecycle, scheduling state
(Colibri-owned). **Mirrored / derived — NOT authoritative here:** Pi JSONL events
(source = the agent's stream), watchdog host-status (source = watchdog socket /
`hostd`), runtime inventory. Colibri holds read-only copies of these.
**Postgres-escalation criterion (one rule, not "maybe later"):** add the Postgres
adapter **only if**, during Lane 4 dual-run state-parity (T4.2), SQLite proves
insufficient for _required shared state_ — i.e. ≥2 hosts must concurrently
read/write the same coordination state and a single-writer local SQLite cannot
satisfy it. A single-host daemon never triggers it.
**Failure mode (Colibri DB corrupt/unavailable) — fail safe:** Colibri must **not**
take over. It drops to observe-only (or halts its control actions), reports an
unhealthy status, and the cutover gates (T4.3 / T4.4) cannot advance; during
dual-run, clawdie-ai (TS) retains control. **`watchdog` / `hostd` and local FreeBSD
safety remain authoritative and win** regardless of Colibri DB state — no unsafe
takeover.
---
## Lane 1 — Colibri core
**Owner:** Hermes (debby/Linux) → Codex (osa/FreeBSD validation).
- **T1.1 Stabilize baseline.** `cargo test --workspace && cargo clippy
--workspace --all-targets -- -D warnings`; record exact counts; commit any
fmt/clippy fixes. _(Green at `160dd11`.)_
- **T1.2 Phase 3 — coordination core.** Task board with explicit lifecycle
(queued→claimed→started→done/failed); agents-as-teammates; skills catalog.
**Storage: embedded SQLite (Decision #1); Postgres adapter only if parity needs it.**
- **T1.3 Phase 4 — execution & scheduling.** cron/interval/one-time scheduler;
Pi engine integration via the events parser; Telegram-intake compatibility.
- **T1.4 Phase 5 — cache-first prompt discipline.** Deterministic 3-region
prompt assembler; cost modes (fast/smart/max); visible escalation.
[Implementation plan →](T1.4-PROMPT-DISCIPLINE-PLAN.md)
- **T1.5 Phase 6 — gated cutover.** Replace TS control-plane paths only after
proof gates pass; **separate deprecation PR per path**.
- **FreeBSD validation (each step):** push → Codex on osa runs `cargo test` on
FreeBSD 15 → record `rustc --version`, `freebsd-version`, exact output.
_(Phase numbers per `clawdie-ai/doc/COLIBRI-CONTROLPLANE-PLAN.md`; distinct from
the migration phases in `MIGRATION-INVENTORY.md`.)_
## Lane 2 — Herdr compatibility (Linux display plane)
**Owner:** Hermes (debby) + Codex (osa, for the FreeBSD-side socket).
Herdr consumes Colibri's socket/snapshot API as a **display/remote client**;
it is not an execution layer and not on FreeBSD.
**Non-blocking for core:** Lane 2 gates only **IMG deployment**, never Colibri
**core correctness**. Lane 1 must not depend on Herdr compatibility, and Herdr
must not silently become a prerequisite for the Rust core.
- **T2.1 Snapshot API consumption.** Verify a Herdr-Linux client can read
`clawdie.glasspane.snapshot.v1` over the daemon Unix socket (and the future
HTTP/SSE transport when it lands).
- **T2.2 Remote attach over Tailscale.** Complete the debby→domedog hub attach
(install herdr client on debby; `herdr --remote domedog-ts-herdr`). Per
`HERDR-HUB-RUNBOOK.md`. _(Not yet done — supersedes the draft's "already
smoke-tested.")_
- **T2.3 Compatibility manifest.** Produce `herdr-clawdie-compat.v1`: protocol
version, socket/snapshot schema, transport, known gaps.
- **Gate:** compat manifest signed → IMG deployment unblocked.
## Lane 3 — ISO build chain
**Owner:** Hermes (coordination) → Codex (osa, FreeBSD build).
- **T3.1 Assess ISO state.** Review the operator-USB round scope; check the
Colibri dependency section in `clawdie-iso/AGENTS.md`.
- **T3.2 Colibri artifact integration.** Define which Colibri binary the ISO
bundles; FreeBSD `rc.d` service for the daemon; firstboot starts Colibri
alongside clawdie-ai **during the dual-run transition only**.
- **T3.3 Build handoff.** ISO handoff doc for Codex: exact Colibri commit hash,
target triple (`x86_64-unknown-freebsd`), TLS = rustls, build flags.
## Lane 4 — Gradual phase-out (clawdie-ai TS → Colibri Rust)
**Owner:** shared (Hermes + Claude + Codex + Sam). Conservative, reversible.
- **T4.1 Dual-run (passive).** Colibri daemon runs beside clawdie-ai on FreeBSD;
both consume Pi JSONL; compare state snapshots. No takeover.
- **T4.2 State-parity gates.** Task-board state, agent lifecycle transitions,
and watchdog host-status ingestion all match between the TS control plane and
the Rust daemon.
- **T4.3 Read-only takeover.** Colibri serves snapshots; clawdie-ai's TS UI reads
from the Colibri API. Prove the Rust daemon is the source of truth.
- **T4.4 Write takeover.** Colibri owns scheduling + agent dispatch; clawdie-ai
reduced to Telegram intake.
- **T4.5 Full cutover.** clawdie-ai control plane stopped; Colibri `rc.d` service
is the sole control plane; clawdie-ai service disabled. Watchdog/`hostd`
FreeBSD safety stays locally authoritative throughout.
---
## Dependency graph
```text
Lane 1 (Colibri core) ───────────────────────────┐
├──→ Lane 4 (phase-out)
Lane 2 (Herdr display compat) ──→ IMG unblocked ──┤
Lane 3 (ISO build) ───────────→ Colibri in ISO ───┘
```
## Conventions
- Commit prefixes `feat:`/`fix:`/`docs:`/`refactor:`/`test:`.
- Attribution `(Sam & Hermes)` / `(Sam & Claude)` / `(Sam & Codex)`.
- Cross-repo references in the commit body when relevant.
## Next actions
1. Lane 1 T1.3 — execution & scheduling landed: scheduler module,
cron/interval/one-shot, leader/delegate matching, intake-task socket command.
Follow-up fixed FreeBSD test isolation and scheduler edge cases.
2. ~~Lane 1 T1.3b — FreeBSD smoke test.~~ **DONE**. OSA /tmp smoke
passed, scheduler deadlock fixed + regression test, rc.d service structurally
correct, CLI renamed `colibri-ctl``colibri`, and task operations are now
covered by `colibri create-task`, `colibri list-tasks`, and
`colibri intake-task`. Reports live in `docs/internal/sessions/`, including
`2026-05-27-osa-freebsd-colibri-cli-task-smoke.md`.
3. **Lane 2 T2.2** — Herdr debby→domedog attach (install herdr client on debby).
4. **Lane 1 T1.4** — Phase 5 cache-first prompt discipline (3-region assembler,
cost modes fast/smart/max).

View file

@ -551,7 +551,6 @@ Unix socket path (`DaemonConfig.socket_path`).
| `docs/COLIBRI-GLASSPANE-DESIGN.md` | Glasspane capability design, phase plan, non-goals |
| `crates/colibri-client/src/lib.rs` | Phase-4 typed Unix-socket client for display/UI consumers |
| `docs/HERDR-VS-COLIBRI-GRAPH.md` | Hybrid boundary: Herdr as Linux display client |
| `docs/CALLER-INVENTORY.md` | Caller-side inventory of Pi/agent invocations |
| `crates/colibri-daemon/src/socket.rs` | Socket server implementation |
| `crates/colibri-daemon/src/daemon.rs` | Daemon background loop + heartbeat |
| `crates/colibri-daemon/src/lib.rs` | Wire types: `HerdrCommand`, `HerdrResponse` |

View file

@ -1,142 +0,0 @@
# Gate #5 Migration Graph — watchdog host-status reader
Graph-only migration map (no code). Purpose: port the **right contract and
boundaries** for gate #5 ("watchdog status read without breaking
doctor / pi-profile"), and prevent control-plane-rewrite creep. The Rust reader
is a **new, additive, read-only** consumer of the watchdog socket — it replaces
a _contract_, not production logic.
Grounded in: `clawdie-ai/src/watchdog.ts` (owns the socket),
`src/doctor.ts` (existing reader), `src/colibri-host-status.ts` (additive reader
- shape), `src/pi-profile.ts` (keep-compatible; **not** a confirmed direct
socket reader), and this repo's `colibri-contracts` / `manifests/`.
## Mermaid
```mermaid
graph LR
subgraph TS["clawdie-ai — production TS (PROTECTED)"]
WD["watchdog.ts<br/>runtime governor (owns socket)"]
SOCK(["watchdog Unix socket<br/>${SERVICE_NAME}-watchdog.sock"])
DOC["doctor.ts<br/>socket reader"]
PIP["pi-profile.ts<br/>keep-compatible"]
CHS["colibri-host-status.ts<br/>additive reader + shape"]
end
subgraph RS["Colibri — target Rust"]
RT["crates/colibri-runtime<br/>watchdog reader (NEW)"]
CT["crates/colibri-contracts<br/>HostStatus (NEW)"]
end
subgraph EV["evidence / gate"]
M1["manifest: linux mock<br/>host-status run"]
M2["manifest: osa live<br/>watchdog read"]
G5{{"gate #5"}}
end
WD -->|owns/serves| SOCK
WD -->|"IPC: cmd:status / cmd:mode"| SOCK
DOC -->|"reads (cmd:status)"| SOCK
CHS -->|"reads (cmd:status)"| SOCK
CHS -->|defines shape| CT
RT -->|"reads (cmd:status) READ-ONLY"| SOCK
RT -->|replaces_contract_only| CHS
RT -->|produces| CT
RT -.->|must_not_break| DOC
RT -.->|must_not_break / no edits| WD
RT -.->|keep_compatible| PIP
RT -->|produces| M1
M1 -->|evidence_for_gate| G5
M2 -->|evidence_for_gate| G5
SOCK -->|lives_on FreeBSD| OSA[(osa)]
M1 -->|runs_on| DOM[(domedog · mock)]
M2 -->|runs_on| OSA
```
## JSON nodes/edges
```json
{
"nodes": [
{ "id": "ts:watchdog", "type": "ts_module", "file": "src/watchdog.ts", "role": "owns socket; runtime governor; IPC cmd:status,cmd:mode" },
{ "id": "socket:watchdog", "type": "watchdog_socket", "path": "${SERVICE_NAME}-watchdog.sock", "host": "osa (FreeBSD)" },
{ "id": "ts:doctor", "type": "ts_module", "file": "src/doctor.ts", "role": "confirmed socket reader" },
{ "id": "ts:pi-profile", "type": "ts_module", "file": "src/pi-profile.ts", "role": "keep-compatible; not a confirmed direct socket reader" },
{ "id": "ts:colibri-host-status", "type": "ts_module", "file": "src/colibri-host-status.ts", "role": "additive reader; ColibriHostStatus shape" },
{ "id": "rust:colibri-runtime", "type": "rust_crate", "status": "to_build", "role": "watchdog reader" },
{ "id": "rust:colibri-contracts", "type": "rust_crate", "status": "exists", "role": "contracts" },
{ "id": "contract:HostStatus", "type": "contract", "status": "to_add", "fields": ["source","observed_at","mode","throttled","free_memory_mb","active_jails","queued_groups","controlplane_status"] },
{ "id": "manifest:linux-mock", "type": "manifest", "status": "to_produce", "host": "domedog" },
{ "id": "manifest:osa-live", "type": "manifest", "status": "later", "host": "osa" },
{ "id": "gate:5", "type": "proof_gate" }
],
"edges": [
{ "from": "ts:watchdog", "to": "socket:watchdog", "rel": "owns" },
{ "from": "ts:doctor", "to": "socket:watchdog", "rel": "reads" },
{ "from": "ts:colibri-host-status", "to": "socket:watchdog", "rel": "reads" },
{ "from": "ts:colibri-host-status", "to": "contract:HostStatus", "rel": "defines_shape" },
{ "from": "rust:colibri-runtime", "to": "socket:watchdog", "rel": "reads_readonly" },
{ "from": "rust:colibri-runtime", "to": "ts:colibri-host-status", "rel": "replaces_contract_only" },
{ "from": "rust:colibri-runtime", "to": "contract:HostStatus", "rel": "produces" },
{ "from": "rust:colibri-contracts", "to": "contract:HostStatus", "rel": "defines" },
{ "from": "rust:colibri-runtime", "to": "ts:doctor", "rel": "must_not_break" },
{ "from": "rust:colibri-runtime", "to": "ts:watchdog", "rel": "must_not_break" },
{ "from": "rust:colibri-runtime", "to": "ts:pi-profile", "rel": "keep_compatible" },
{ "from": "rust:colibri-runtime", "to": "manifest:linux-mock", "rel": "produces" },
{ "from": "manifest:linux-mock", "to": "gate:5", "rel": "evidence_for_gate" },
{ "from": "manifest:osa-live", "to": "gate:5", "rel": "evidence_for_gate" },
{ "from": "socket:watchdog", "to": "osa", "rel": "lives_on" }
]
}
```
## Wire facts (from `watchdog.ts`)
- Socket path: `path.join(TMP_IPC_DIR, "${SERVICE_NAME}-watchdog.sock")`.
- Request: `{"cmd":"status"}\n` (newline-framed). Reply: `{ok:true, data:{...}}\n`.
- `data` keys (camelCase): `mode`, `throttled`, `freeMemoryMB`, `activeJails`,
`queuedGroups`, `controlplane.overallStatus`.
- Mutating command exists: `{"cmd":"mode","value":...}` — **the reader must
never send this.**
## Gap list — what Rust must implement for gate #5
1. **`colibri-contracts`: `HostStatus`** struct. Mirror `ColibriHostStatus`:
`source:"watchdog-socket"`, `observed_at`, `mode`, `throttled`,
`free_memory_mb`, `active_jails`, `queued_groups`,
`controlplane_status: Option<String>`. **Naming decision:** wire `data` is
camelCase (`freeMemoryMB`); the other Colibri contracts are snake_case
(`prompt_cache_hit_tokens`). Recommend the contract stay **snake_case** and
the reader map wire→contract. Add a golden test fixture.
2. **`crates/colibri-runtime`: watchdog reader.** tokio `UnixStream`; connect →
write `{"cmd":"status"}\n` → read until newline → parse `{ok,data}`
normalize to `HostStatus`. **Read-only** (only `cmd:status`). Total/lenient
parse (garbled fields → safe defaults), 2s timeout, never panics — every
failure returns `Err`/`{ok:false}` (mirror `readColibriHostStatus`).
3. **Socket path resolution:** `COLIBRI_WATCHDOG_SOCKET` env override, default to
the `${SERVICE_NAME}-watchdog.sock` convention. (Linux has no such socket →
the reader must degrade cleanly to "unavailable".)
4. **Mock Unix-socket test (domedog/Linux):** a tokio `UnixListener` replying
with a sample `{ok,data}` → assert parsed `HostStatus`; plus an
unavailable-socket → graceful error. Mirrors the two TS test cases.
5. **Evidence:** emit a `clawdie.interagent.run-manifest.v1` for the Linux mock
run (gate #5 Linux evidence). Live osa read manifest comes from Codex.
## Risk list — what must NOT change in production TS
- **Do not edit `watchdog.ts`** or the socket path/protocol. The reader is purely
additive.
- **Read-only invariant:** the reader sends only `{"cmd":"status"}`. It must
never send `{"cmd":"mode",...}` (that changes the live run mode → production
behavior change).
- **`doctor.ts` keeps working unchanged.** The Rust reader runs _alongside_ it;
it `replaces_contract_only` `colibri-host-status.ts`, and even that TS module
stays in production until gate #6 (no retirement yet).
- **`pi-profile.ts`:** keep-compatible per the plan, but it is **not** a
confirmed direct socket reader — verify before assuming coupling; don't add
edges that don't exist.
- **Connection hygiene:** connect, one request, disconnect, short timeout. Don't
hold the socket or add load that could starve `doctor`/`colibri-host-status`.
- **Mock ≠ live.** A green Linux mock does **not** close gate #5. The socket only
exists on FreeBSD; gate #5 needs the **osa live read manifest** (Codex).
- **Scope:** gate #5 unblocks the operator/control-plane path only; it does not
authorize porting any other watchdog/orchestration logic.

View file

@ -1,170 +0,0 @@
# Colibri Migration Inventory
**Status:** Phases 14 complete; 7 crates; daemon scaffolded; TS legacy files
retired. Workspace gates green as of `b325c38`. Herdr FreeBSD port is **parked**
(not a migration blocker) — Herdr stays a Linux/macOS display/remote plane;
`colibri-glasspane` is the native FreeBSD answer.
Source plan: `clawdie-ai/doc/COLIBRI-CONTROLPLANE-PLAN.md` and
`clawdie-ai/doc/COLIBRI-PI-CONTROL-PLAN.md`.
**Date:** 27.maj.2026
Principle: **extract contracts, not logic.** Port the stable wire surfaces from
`clawdie-ai` into Rust, use the TS definitions and committed `manifests/` as
golden fixtures, and do not migrate orchestration until the proof gates pass.
---
## 0. Phases — status summary
| Phase | Description | Status |
| ----- | ------------------------------------------------------------- | ------------------------- |
| 1 | Inventory (caller audit) | ✅ complete |
| 2 | Pi event bridge (contracts crate) | ✅ complete |
| 3 | Host status ingestion (runtime) | ✅ complete |
| 4 | Run manifest ingestion + daemon | ✅ complete |
| 5 | Herdr Linux display client (optional, AGPL, Linux/macOS-only) | ✅ validated (Linux only) |
| 6 | Deprecation PRs (TS retirement) | ✅ complete |
---
## 1. Rust workspace — 7 crates
All crates compile and test on Linux (debby) and FreeBSD (osa).
`cargo test --workspace`: **all gates green as of `b325c38`**
(`cargo clippy --workspace --all-targets -- -D warnings`: clean).
| Crate | Role |
| ------------------- | ---------------------------------------------------------------- |
| `colibri-contracts` | JSON schemas + serde structs + golden tests |
| `colibri-deepseek` | DeepSeek client + prefix-cache accounting (probe home) |
| `colibri-runtime` | Watchdog host-status reader + runtime inventory |
| `colibri-glasspane` | FreeBSD-native agent supervision ("the radar") |
| `colibri-daemon` | Always-on service: session manager, agent spawner, socket API |
| `colibri-client` | Typed client for the daemon Unix socket API |
| `colibri` (root) | Binary entrypoints: `colibri-probe`, `colibri-runtime-inventory` |
Binaries: `colibri-probe` (DeepSeek cache probe) and
`colibri-runtime-inventory` (cross-host version drift report).
### Daemon scaffold (Phase 4)
`colibri-daemon` is scaffolded as an always-on Rust service:
- Session manager: JSONL persistence + context window management
- Agent spawner: subprocess lifecycle + provider routing
- Herdr Unix socket API: newline-delimited JSON commands
- Graceful shutdown on SIGTERM/SIGINT
- Background loop: heartbeat (30s), session rotation (60s), memory handoff (120s)
- Agent stall detection with glasspane integration
The daemon replaces control-plane loop logic previously scattered across
`agent-runner.ts`, `agent-session.ts`, and `session-compaction.ts` in
clawdie-ai TypeScript.
---
## 2. TS files retired (Phase 6 complete)
**Commit:** retirement commit on `main` — 3425 deletions, 38 files changed.
**Post-retirement test validation (debby, Linux, Node v24):**
`npx vitest run` — 19 failed | 2329 passed (2348 total). All 19 failures are
expected Linux exclusions (argon2 FreeBSD-only API, explanation-grounder
snippet drift, nginx config path difference). No regressions.
### Dropped (non-Pi backends removed)
| TS file | Reason |
| ---------------------------------------- | ----------------------------------------------------------- |
| `controlplane-aider-runner.ts` | Non-Pi backend — `CONTROLPLANE_RUNNER=aider` branch removed |
| `controlplane-heartbeat-codex.ts` | Non-Pi backend — `CONTROLPLANE_RUNNER=codex` branch removed |
| `tmux-screenshot-command.ts` | Terminal-scrape glue, superseded by Herdr/glasspane |
| `jailAider` (from `jail-exec-runner.ts`) | Aider jail exec path removed |
### Kept (load-bearing)
| TS file | Why kept |
| ------------------------------ | --------------------------------------------------------------- |
| `agent-runner.ts` | IS the Pi host runner — mislabeled "multi-backend" in plan |
| `jail-exec-runner.ts` | `jailPi` is load-bearing FreeBSD exec; only `jailAider` removed |
| `colibri-pi-events.ts` | Pi `--mode json` event taxonomy (contract source) |
| `colibri-run-manifest.ts` | `clawdie.interagent.run-manifest.v1` (contract source) |
| `colibri-runtime-inventory.ts` | `clawdie.runtime-version-inventory.v1` + drift-report logic |
| `colibri-host-status.ts` | Additive watchdog socket reader (contract source) |
| `colibri-pi-run.ts` | Pi run summarizer (contract source) |
| `provider-capabilities.ts` | Model capability table (contract source) |
| `watchdog.ts` | FreeBSD runtime governor — NOT a deletion target |
| `hostd` | Privileged host operations — NOT a deletion target |
| `doctor` / `pi-profile` | Existing watchdog-status consumers — NOT deletion targets |
### Retirement method
All non-Pi backends were gated behind `CONTROLPLANE_RUNNER` and dispatched from
a single hub (`controlplane-heartbeat-executor.ts`). Retirement was one
contained edit: delete the `aider` and `codex` branches, their imports, and
the now-unreferenced files. The Pi path (`runPiTask` + `jailPi`) stays.
---
## 3. Herdr FreeBSD port — parked, not a migration blocker (27.maj.2026)
**Verdict:** dropped/parked. Herdr is **not** on the FreeBSD migration path, and
nothing in this plan blocks on porting it. FreeBSD supervision is delivered
natively by `colibri-glasspane`; Herdr stays a Linux/macOS **display/remote
plane** behind Colibri's socket API. Herdr-Linux-remote and Colibri-FreeBSD were
validated **separately**, which is exactly the boundary we want.
**Boundary (decided):**
- Herdr is AGPL + Linux/macOS-only — optional display/remote client over the
Colibri socket contract. No Herdr vendoring, no Herdr-on-FreeBSD in the core.
- `colibri-glasspane` is the FreeBSD-native answer (event-derived agent state).
For the record, an exploratory build confirmed Herdr _can_ compile on FreeBSD 15
(Zig target `x86_64-freebsd`; `cargo build --release` succeeded; 1450 passed / 3
expected failures; `sysctl(KERN_PROC)`/`KERN_PROC_ARGS` work, `sizeof(kinfo_proc)=1088`;
no procfs so CWD must fall back to `kern.proc.cwd`/`None`). That experiment is
**not** continued — it is parked, not a pending task. Details:
`clawdie-ai/docs/internal/sessions/2026-05-27-herdr-freebsd-port-codex-results.md`.
---
## 4. Proof gates — all green
| Gate | Description | Status |
| ---- | --------------------------------------------------------------------- | --------- |
| 1 | `colibri-contracts` round-trips TS fixtures (11 golden tests) | ✅ |
| 2 | DeepSeek live cache manifest exists (domedog, ~98% cache-hit) | ✅ 26.maj |
| 3 | Runtime inventory parity (osa/domedog/debby, all Node 24) | ✅ 26.maj |
| 4 | End-to-end on Linux **and** FreeBSD (both cache-hit at ~98%) | ✅ 26.maj |
| 5 | Watchdog status read from Rust without breaking TS | ✅ 26.maj |
| 6 | TS non-Pi backends retired; caller inventory complete | ✅ 27.maj |
| 7 | Network-throughput coordination test (structured manifests, 2+ hosts) | pending |
---
## 5. Architecture boundary
```text
Rust daemon = source of truth (scheduling, task ownership, provider logic)
colibri-glasspane = FreeBSD-native agent supervision (derived from Pi events)
Herdr / Zed / web board = display + controls over socket/web
```
No scheduling, task ownership, or provider logic in the GUI layer.
---
## 6. Evidence freeze
`manifests/` is the source of truth. Current evidence set:
- osa FreeBSD inventory — `manifests/2026-05-26-osa-runtime-inventory.json`
- domedog Linux inventory — `manifests/2026-05-26-domedog-runtime-inventory.json`
- debby inventory — `manifests/2026-05-26-debby-runtime-inventory.json` (Node 24; no Pi)
- domedog DeepSeek cache — `manifests/2026-05-26-domedog-deepseek-cache-result.json`
- osa DeepSeek cache — `manifests/2026-05-26-osa-deepseek-cache-result.json`
- osa watchdog status — `manifests/2026-05-26-osa-watchdog-host-status.json`
- osa FreeBSD gate #4 run manifest — `manifests/2026-05-26-osa-freebsd-gate4-run-manifest.json`

View file

@ -10,7 +10,7 @@ The Colibri project uses a multiagent development model where different AI agent
## 1. Agent Handoff Protocol
**File**: `.agent-handoff.md`
**File**: `doc/<FEATURE>-HANDOFF.md`
### Purpose
@ -248,7 +248,7 @@ When an agent completes work:
1. Run `proof-gate-tracker` and verify all critical gates pass
2. Run `cargo test --workspace` and verify all tests pass
3. Update `.agent-handoff.md` with handoff details
3. Update `doc/<FEATURE>-HANDOFF.md` with handoff details
4. Commit and push with clear handoff message
---
@ -266,12 +266,12 @@ When an agent completes work:
1. Add platform to `PlatformMatrix` tests in `tests/platform-matrix.rs`
2. Add validation criteria
3. Update `.agent-handoff.md` platform matrix
3. Update `doc/<FEATURE>-HANDOFF.md` platform matrix
4. Commit manifests to `manifests/` directory
### Updating Handoff Protocol
1. Modify `.agent-handoff.md` template
1. Modify `doc/<FEATURE>-HANDOFF.md` template
2. Update handoff history format
3. Communicate changes to all agents

View file

@ -67,7 +67,7 @@ cargo test --test platform-matrix all_platforms_validate_core_features -- --noca
### Agent Handoff Protocol
See `.agent-handoff.md` for the standardized handoff protocol used between agents.
See `doc/<FEATURE>-HANDOFF.md` for the standardized handoff protocol used between agents.
### Handoff Template
@ -90,4 +90,4 @@ See `.agent-handoff.md` for the standardized handoff protocol used between agent
- [ ] Relevant proof gates documented
- [ ] Cross-platform validation recorded
- [ ] Next agent's entry point marked
- [ ] Handoff entry added to `.agent-handoff.md`
- [ ] Handoff entry added to `doc/<FEATURE>-HANDOFF.md`