Commit graph

486 commits

Author SHA1 Message Date
4e509c3e37 docs(plan): refresh MULTI-AGENT-HOST-PLAN for current state
Phase 3 schema landed (PR #204) — columns exist, wiring pending.
Bridge IP scrubbed, health/status unscrambled. Linux packaging
added (PR #203). Firewall rules live (pf OSA + ufw domedog).
Gap 4 (claim_task atomicity) marked closed. Test count: 256.

Accurate status: Phase 3 is schema-in/logic-pending (not 'deferred'
and not 'done'). Heartbeat/lease/TTL remain open.
2026-06-26 01:49:46 +02:00
ca5a226dce Merge pull request 'Linux/systemd colibri-bridge packaging + domedog network facts' (#203) from feat/colibri-bridge-linux-packaging into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #203
2026-06-26 01:35:06 +02:00
22df778f07 Merge pull request 'Phase 3 agent presence + bridge IP scrub & health-fn fix' (#204) from fix/phase3-rebase-callers into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #204
2026-06-26 01:34:21 +02:00
Sam & Claude
2be8d4f72f docs(packaging): scrub real Tailscale IPs from bridge files
Some checks failed
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
Per the no-real-100.x-IPs-in-git policy: env.example now ships
COLIBRI_BRIDGE_LISTEN_ADDR=TAILSCALE_IP_REQUIRED (operator fills in via
tailscale ip -4 at deploy time), and the README uses placeholders/commands
instead of literal addresses for both domedog and hermes.
2026-06-26 01:22:10 +02:00
Sam & Claude
3b00b49e03 docs(packaging): Linux/systemd colibri-bridge + domedog network facts
Some checks failed
CI / markdown (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
Linux peer of packaging/freebsd/colibri_bridge.in: bridge the colibri-daemon
control-plane Unix socket to TCP 9190 on the Tailscale interface so mesh hosts
can reach the control plane.

- colibri-bridge.service: systemd unit running socat under sandboxing, BindsTo
  the daemon, freebind so it can bind the tailnet IP before tailscaled is up.
- colibri-bridge.env.example: tunables (systemd parallel to the rc.d sysrc vars).
- colibri-bridge.nft: nftables ruleset for hosts WITHOUT ufw.
- README: install steps + the verified domedog host facts (tailnet IP, ufw
  default-deny posture, 8443=CloudPanel and its public exposure) + open
  questions for the cross-host (hermes) review.

Network gate already applied on domedog: `ufw allow in on tailscale0 to any
port 9190 proto tcp`. The systemd unit is proposed pending the hermes review.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 01:03:29 +02:00
29141bfbc5 fix(bridge): unscramble colibri_bridge health/status functions
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
Three bugs in the FreeBSD rc.d script:
- colibri_bridge_health() had an empty body — health check did nothing
- tcolibri_bridge_health — stray 't' prefix, typo
- Stray closing/opening braces scrambled colibri_bridge_status()
  into two detached blocks, breaking the pgrep + nc check

health now delegates to status; status runs the full health check
(pgrep for socat + nc smoke to the socket).
2026-06-26 00:51:20 +02:00
c66f6dfe4c security(bridge): scrub hardcoded Tailscale IP from colibri_bridge.in
Replace the real default 100.72.229.63 with TAILSCALE_IP_REQUIRED.
The operator must now set the listen address explicitly in rc.conf
before the service will start. The prestart guard fails with a clear
error message if the placeholder is still present.

This ensures no real Tailscale IPs leak into the git history or
shipped config files. Per MULTI-AGENT-HOST-PLAN Phase 5 acceptance.
2026-06-26 00:40:34 +02:00
017aae3794 fix(store): rebase fixups for Phase 3 — register_agent host parameter
- Update register_agent callers added on main after Phase 3 diverged
  (live_socket_check + claim_task tests), pass None for host
- Prefix unused host param with underscore (WIP — wiring in next slice)
- Allow dead_code on MIGRATIONS constant (schema not yet wired)

Rebase conflict resolution only — no behavioral changes.
2026-06-26 00:01:25 +02:00
ba5ee66e24 feat(store): Phase 3 — agent presence (host + last_seen + heartbeat)
Adds host and last_seen columns to the agents table. Idempotent via
MIGRATIONS array in schema.rs — duplicate column errors swallowed on re-open.

- schema.rs: MIGRATIONS constant with ALTER TABLE ADD COLUMN
- lib.rs: Agent struct gains host: Option<String>, last_seen: Option<String>
- lib.rs: register_agent accepts optional host param, sets last_seen
- lib.rs: Store::heartbeat() updates last_seen (with optional host update)
- lib.rs: run_migrations() executes MIGRATIONS after schema SQL
- socket.rs: cmd_register_agent accepts host param (backward-compat via _host)

Phase 3 ready for heartbeat socket command (lib.rs enum already has Heartbeat
variant but dispatch is deferred to a follow-up PR for cleaner diff).
2026-06-25 23:58:14 +02:00
11e5f163ea Merge pull request 'test(tui): attention filter toggle round-trip restores full view' (#202) from feat/tui-attention-filter-roundtrip into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #202
2026-06-25 23:54:46 +02:00
4615c730ab Merge pull request 'chore/wiki-polish' (#201) from chore/wiki-polish into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #201
2026-06-25 23:53:50 +02:00
5578de0abb Merge pull request 'test(daemon): add default_agent_args unit tests for pi/zot harness' (#200) from feat/pi-autospawn-tests into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #200
2026-06-25 23:52:51 +02:00
301b8b4e8f test(tui): attention filter toggle round-trip restores full view
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
Verify that toggling attention_only ON then OFF returns
filtered_panes() to the exact same list (order, count, IDs)
— no state corruption from the retain() partial filter.
2026-06-25 23:50:31 +02:00
4935cd3000 docs(wiki): add pi end-to-end proof to agent-harness
Some checks failed
CI / agent-jail-pkgs (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
agent-harness.md listed only zot's end-to-end proof (zot_rpc_smoke.rs,
ignored, ZOT_BIN-gated). pi now has better default CI coverage via
pi_spawn_live.rs (unignored, runs every test run), plus the new
default_agent_args unit tests proving the autospawn argv contract.

Also moves the autospawn argv reference into its own bullet for clarity.
2026-06-25 23:40:41 +02:00
934d1123a5 docs(wiki): remove remaining stale references — 'fake', AUTOSPAWN_PI
- index.md: 'fake → sample' → 'legacy rename to sample'
- mother-hive.md: 'AUTOSPAWN_PI → AUTOSPAWN' → 'autospawn flag rename'
- Verified: zero 'fake' references in repo
2026-06-25 23:40:23 +02:00
d8060e504b chore: remove all 'fake-pi-agent' references — code, linter, docs
- naming-decisions.md: rephrase row, no longer references old filename
- wiki-lint: remove allowlist entry + guard block (rename is done)
- Verified: zero 'fake' references remaining in repo
2026-06-25 23:40:23 +02:00
d267a4bcb2 docs(wiki): polish terminal + operator-attention pages
- terminal.md: pi→zot,pi order (zot is default agent), 'pi harness'→'agent harness (zot, pi)',
  add pkg install kitty (x11/kitty 0.47.4)
- operator-attention.md: document NO_COLOR pitfall (Hermes leak→force_color_output fix),
  note dual-view (header+bar) as future enhancement
- glasspane.md: link terminal capture + signature triage from see-also

(Sam & Claude)
2026-06-25 23:40:23 +02:00
48737e0c8a test(daemon): add default_agent_args unit tests for pi/zot harness
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
Three unit tests for the autospawn contract function that determines
whether a spawned agent gets rpc-args (zot) or self-driving JSON args
(pi / everything else):

- default_agent_args_zot_gets_rpc — basename 'zot' → ["rpc"]
- default_agent_args_pi_gets_mode_json — basename 'pi' → ["--mode","json"]
- default_agent_args_unknown_gets_mode_json — safe default for
  unknown harnesses (sample-pi-agent.py, colibri-test-agent)

Also covers path-prefixed variants (/usr/local/bin/zot, /usr/local/bin/pi)
to verify basename extraction works through the spawner pipeline.

This closes the untested gap: if someone adds a third harness or changes
the basename check, these tests catch the pi-path regression before it
reaches the operator who flips from zot to pi.

workspace green (0 failures).
2026-06-25 23:30:50 +02:00
c679e13307 Merge pull request 'Post-attention follow-ups: All-sessions view fix, wiki-lint CI parity, terminal/attention wiki pages' (#199) from chore/post-attention-followups into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #199
2026-06-25 22:58:37 +02:00
Sam & Claude
20b65f9577 docs(wiki): add terminal + operator-attention pages, fix glasspane drift
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
Two new decisions captured, one page corrected:

terminal.md — the terminal-capability decision. Why colibri-tui and the agents
it supervises need modified-key reporting (Tab vs Shift-Tab, n vs N, Enter),
why the choice fell on Kitty, the tmux extended-keys + csi-u passthrough for
the in-tmux workflow, raw-vs-tmux distinction, the SSH xterm-kitty terminfo
gotcha, and pi's identical requirement. The decision is about capability;
Kitty is the instance.

operator-attention.md — the shipped attention system as one decision. Attention
as a derived view over the state machine (not a sixth variant), the TUI
bar/jump/filter/row-highlight, and the #193 terminal-capture + signature-triage
+ edge-triggered alerts. Records the has_attention session-filter bug and fix.
Lists what is still open (outbound push, answer-from-dashboard).

glasspane.md — corrected drift. The real AgentState enum is {Idle, Working,
Blocked, Done, Error}; Stalled is a derived flag, not a variant (the page's
diagram omitted Blocked and listed Stalled as a variant). The "Usability
roadmap (TODO)" listed the attention half as not-yet-built; it shipped via
#191/#193, so those items move to operator-attention.md and the roadmap keeps
only the genuinely-unbuilt direction.

index.md — two table rows (also satisfies the orphan-page check).

Verified: prettier-clean on all 4 files; wiki-lint --strict clean (144 pass /
0 fail, up from 137); no dangling refs, no orphans, no resurrected names.

(Sam & Claude)
2026-06-25 22:50:19 +02:00
Sam & Claude
6de41332f6 chore(ci): add wiki-lint to CI for parity with ci-checks.sh
scripts/ci-checks.sh runs five gates; .forgejo/workflows/ci.yml ran only four
— wiki-lint --strict was missing. quality-gates.md states "ci.yml encodes the
same checks" as local, which was not quite true. Add the wiki-lint step to the
markdown job so CI matches local the day a runner is registered.

wiki-lint is pure POSIX sh (grep/awk/sed/find), so it runs in the existing
node:20 container — no new image or job.

This does not by itself stop drift reaching main: as quality-gates.md notes,
no Forgejo Actions runner is registered, so nothing enforces CI server-side
today. The local pre-push hook remains the active enforcement layer; this
change ensures CI is ready to take over once a runner exists. Verified
wiki-lint passes clean on main (137 pass / 0 fail).

(Sam & Claude)
2026-06-25 22:50:19 +02:00
Sam & Claude
0b9ea33ce9 fix(tui): make the "All sessions" aggregated view reachable
Once any pane carried a session_id, rebuild_session_list() forced
session_filter = Some(first), so the operator could never get back to the
aggregated "All sessions" view — Tab only cycled individual sessions.
Documented as a known bug in GLASSPANE-TUI-ENHANCEMENTS.md.

Model the session cycle as [All, s1, s2, ...]: index 0 is a synthetic "All
sessions" entry (filter = None), any other index scopes to sessions[i-1].
Two helpers encode the mapping:
  - session_count() = sessions.len() + 1 (All is always present)
  - apply_session_filter() maps session_idx -> filter (0 => None)

Behavior changes:
  - On connect, the operator now lands on "All sessions" (was: the
    alphabetically-first session). The aggregated view is the more useful
    default and is always reachable via Tab/BackTab.
  - The position indicator now shows for any cycle > 1 item, so the
    "All (1 of 2)" hint appears even with a single session.

self.sessions still holds real session ids only (no sentinel string), so the
sorted/deduped invariant is unchanged.

Tests:
  - rebuild_session_list_dedupes_and_sorts: updated for the new default +
    offset mapping (index 1 => s1, index 2 => s2).
  - all_sessions_view_is_reachable_with_sessions_present: new regression test
    covering connect-defaults-to-All and the Tab cycle All -> s1 -> s2 -> All.
  - attention_bar_ignores_other_session_panes: comment corrected (rebuild no
    longer selects the first session).

19/19 TUI tests pass; fmt + clippy (-D warnings) clean.

(Sam & Claude)
2026-06-25 22:50:19 +02:00
1b37a9ea9f Merge pull request 'chore(fmt): fix colibri-glasspane-tui test fmt drift from #195' (#196) from chore/tui-fmt-195 into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #196
2026-06-25 22:15:31 +02:00
Sam & Claude
5abe59f94a chore(fmt): fix colibri-glasspane-tui test fmt drift from #195
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
cargo fmt --all --check failed on main with 5 drift sites in
crates/colibri-glasspane-tui/src/main.rs — all inside the tests added by #195,
which hand-packed Pane struct literals as `id: .., agent: .., state: ..,` on a
single line. rustfmt wants one field per line. Pure formatting: 91 insertions
/ 38 deletions, no logic change (only structural additions are field
continuations and one assert!(...) arg wrap).

Unblocks the fmt half of the workspace gate; second merged PR in a row (#193,
#195) to land fmt-red — worth tightening the CI fmt check as a required gate.

Verified: fmt clean workspace-wide, clippy -D warnings clean, 18/18 tests pass.

(Sam & Claude)
2026-06-25 22:13:45 +02:00
10372bfd7a Merge pull request 'fix(tui): attention bar respects session filter (+ tests) — resolves #194' (#195) from fix/glasspane-attention-session-filter into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #195
2026-06-25 22:08:55 +02:00
1b4d95db9d test(tui): add coverage for attention navigation + cross-session isolation
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
Four new tests closing the last attention-tier coverage gaps:

- jump_next_attention_skips_healthy_panes:
  Panes [ok, err, ok, stalled, ok] — proves n jumps 0→1→3→wrap→1,
  skipping healthy panes. Forward wrapping.

- jump_prev_attention_wraps_backwards:
  Same layout — proves N jumps 4→3→1→wrap→3.
  Backward wrapping.

- attention_bar_ignores_other_session_panes:
  Error pane in session s2, viewing session s1 — bar must NOT
  appear. Proves the filtered_panes()-based has_attention fix
  from commit 4d95f11.

- jump_next_attention_reports_when_no_attention_panes:
  All healthy panes — status message set to 'no attention',
  selection unchanged.

18 tests, workspace green (0 failures).
2026-06-25 21:35:10 +02:00
Sam & Claude
154df5c735 fix(tui): attention bar respects session filter
Compute has_attention from filtered_panes() instead of the unfiltered
attention_count() so an error pane in another session no longer lights
the bar for the session you're viewing. Removes the now-unused
attention_count(). (The refinement from PR #194's feature commit that
was not in the version merged via #191.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 21:35:10 +02:00
4bdcea18d5 Merge pull request 'Terminal capture, signature triage, and edge-triggered alerts' (#193) from terminal-capture-and-alerts into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #193
2026-06-25 21:28:21 +02:00
Sam & Claude
7980b09ddb style: rustfmt — fix fmt drift introduced by terminal-capture commit
Some checks failed
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
cargo fmt --all --check flagged 10 drift sites across 4 files, all from the
terminal-capture commit (0509ed7): config.rs (env_bool matches! one-liner),
socket.rs (serde_json! block), signatures.rs + terminal.rs (long arg lists and
json! blocks). Pure line-wrapping — no logic changes.

Unblocks the fmt half of the workspace gate (fmt/clippy/test/release) for PR
#193.

Verified: fmt clean, clippy -D warnings clean, config tests pass (env_bool +
defaults + from_env_vars).

(Sam & Claude)
2026-06-25 21:01:12 +02:00
Sam & Claude
b2f5d8f355 fix(config): forgiving bool parsing for pre-existing feature flags
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
scheduler_prompt_injection, cache_warming_enabled, and headroom_enabled
used env_parse::<bool>, i.e. bool::from_str, which accepts only "true"/
"false". Any other truthy spelling (1/yes/on/TRUE) silently parsed to
false — the feature failed closed with no error or log. Switch them to
the same env_bool helper added for terminal capture so =1/yes/on now work
as operators expect. Backward compatible: true/false keep their meaning.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:54:26 +02:00
Sam & Claude
0509ed76bc feat(glasspane): terminal capture, signature triage, and edge-triggered alerts
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
Add the screen-scraping half of Glasspane to complement its event-state
model. Ports the *brain* of the clawdie-ai tmux-screenshot skill (not the
PNG) into the Rust core and wires it into the daemon.

colibri-glasspane:
- terminal.rs: strip_ansi, content-hash frame ids (sha256[:12]),
  CapturedFrame, and TerminalRecorder — a deduped ring buffer that drops
  frames identical to the previous one (so polling a static pane collapses
  to a log of real transitions) with edge-triggered alerting (a failure
  fires once on its rising edge, re-fires only after it clears). Thin
  capture_tmux_pane seam keeps I/O out of the testable core.
- signatures.rs: data-driven Severity/Signature/Detection/SignatureSet
  matcher with a high-value linux_default() set (systemd/oom/disk/docker/
  forwarding). Per-OS set is the hook for capability-routing.

colibri-daemon:
- DaemonState.terminal map of per-pane recorders; poll tick in run_loop
  gated on COLIBRI_TERMINAL_CAPTURE, seeded from COLIBRI_TERMINAL_WATCH.
- capture_and_record() shares the blocking tmux capture (on spawn_blocking)
  + brief lock fold between the loop and the socket; env-gated Telegram
  alert routing that no-ops cleanly when unconfigured.
- socket cmds: terminal-watch/unwatch/list/history/poll.
- env_bool helper: forgiving truthy parsing (1/true/yes/on) so
  COLIBRI_TERMINAL_CAPTURE=1 is not silently false like bool::from_str.

Tests: 17 new glasspane unit tests + daemon socket/config tests; whole
workspace green, clippy clean. Verified live on Linux (domedog): autonomous
loop deduped ~5 ticks into 2 frames and fired one edge-triggered alert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:50:57 +02:00
e953b1c050 Merge pull request 'docs: concrete attention system design for colibri-tui' (#189) from docs/tui-attention-plan into main
Some checks are pending
CI / port (push) Waiting to run
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #189
2026-06-25 18:44:25 +02:00
d5e3cfbfef Merge pull request 'chore: cargo fmt — fix pre-existing fmt violations' (#192) from chore/cargo-fmt-main into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #192
2026-06-25 18:38:26 +02:00
Sam & Claude
8dfd9281a7 chore: cargo fmt — fix pre-existing violations in store + multi-agent tests
Some checks failed
CI / agent-jail-pkgs (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
Pre-existing fmt violations from PRs #186 and #190:
  - crates/colibri-daemon/tests/multi_agent_board.rs (3 violations)
  - crates/colibri-store/src/lib.rs (1 violation)

No code changes — pure formatting.

(Sam & Claude)
2026-06-25 18:37:33 +02:00
2228b10203 Merge pull request 'feat(tui): glasspane attention tiers 1-4 — bar, jump, filter, row highlight' (#191) from feat/glasspane-attention-tiers into main
Some checks are pending
CI / agent-jail-pkgs (push) Waiting to run
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
Reviewed-on: #191
2026-06-25 18:34:42 +02:00
c858cde01c feat(tui): glasspane attention tiers 1-4 — bar, jump, filter, row highlight
Some checks failed
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
needs_attention() = Error + Blocked + Stalled (free function, single
source of truth). Includes Blocked because glasspane doc comments say
Blocked = 'operator attention needed' (queue_update / pending steering).

Tier 1 — Attention bar:
  Red-bordered panel with '⚠ ATTENTION (N)' title replaces the header
  when any pane needs attention. Shows pane id, reason, and agent.

Tier 2 — Jump keys (n/N):
  n = next attention pane, N = previous (wrapping). Respects session
  scope via filtered_panes(). Detail pane follows the jump.

Tier 3 — Attention filter (a key):
  Toggles attention_only on App. Composes with session filter.

Tier 4 — Row highlight:
  Attention rows get red background when unselected, inverted
  dark-gray+light-red+bold when selected. Global row_highlight
  neutralized.

Also:
- fix(tui): remove hardcoded dark-terminal assumptions — theme-agnostic
- fix(tui): force crossterm color output — override NO_COLOR=1 inherited
  from Hermes sessions (crossterm honours no-color.org standard)
2026-06-25 18:33:47 +02:00
95bf3f396d fix(store): atomic+exclusive claim_task — close Gap 4 concurrency guard (#190)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Co-authored-by: Sam & Claude <hello@clawdie.si>
Co-committed-by: Sam & Claude <hello@clawdie.si>
2026-06-25 17:33:15 +02:00
Sam & Claude
0ac07a864c docs: add concrete attention system design to TUI enhancements
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
Resolved decisions from brainstorm (Sam & Claude):
- needs_attention = Error + Blocked + Stalled (free function on &Pane)
- Stall threshold stays at 4h (Stalled is rare/critical, not frequent)
- Attention bar replaces header when active (same 3-line footprint)
- Row highlight inverts on selection (red bg → bright red fg on DarkGray)
- Filter composes with session filter (AND), not replaces

Implementation plan: 4 tiers in main.rs (~100-120 lines added):
  T1: needs_attention() + attention bar (replaces header)
  T2: n/N jump keys
  T3: a key attention filter
  T4: per-row highlight (invert on selection)
  T5: answer-from-dashboard (separate PR)

Also documents pre-existing 'All sessions' unreachable bug.
2026-06-25 17:18:13 +02:00
c1ae24d5ce docs(glasspane): operator-attention usability roadmap + TUI-enhancements working doc (#188)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Co-authored-by: Sam & Claude <hello@clawdie.si>
Co-committed-by: Sam & Claude <hello@clawdie.si>
2026-06-25 16:59:05 +02:00
6078c3f28f docs: refresh MULTI-AGENT-HOST-PLAN for 0.12.0 — mark phases 1+2 complete (#187)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Co-authored-by: Sam & Claude <hello@clawdie.si>
Co-committed-by: Sam & Claude <hello@clawdie.si>
2026-06-25 16:58:35 +02:00
7e81819026 test(daemon): multi-agent board — lifecycle, capability routing, contention (#186)
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Co-authored-by: Sam & Claude <hello@clawdie.si>
Co-committed-by: Sam & Claude <hello@clawdie.si>
2026-06-25 16:58:21 +02:00
263b8f0b4d Merge pull request 'fix(daemon): gate autospawn on .secured marker when require_secured=YES' (#184) from fix/require-secured-interlock into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #184
2026-06-25 07:25:41 +02:00
796070605b fix(daemon): gate autospawn on .secured marker when require_secured=YES
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
Adds colibri_daemon_require_secured knob (default NO). When enabled, the
daemon refuses to autospawn an agent until /var/db/colibri/.secured exists.
This interlock pairs with the clawdie-iso firstboot password gate (#139):
the gate writes .secured after the operator sets passwords, the daemon
reads it to gate autospawn + node_register.

Must run AFTER the provider.env block — otherwise COLIBRI_AUTOSPAWN=YES
from provider.env would override the NO set here. Defaults to NO so
deployed/disk hosts (which never run the firstboot gate) are unaffected.

Paired with: clawdie-iso PR #139 (force-root-password-on-first-boot).
2026-06-25 07:04:59 +02:00
fda555ada9 Merge pull request 'docs(mother): add Python deps + RPC_PROMPT to first-run checklist' (#180) from docs/mother-checklist-update into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #180
2026-06-25 05:08:15 +02:00
e77e197e8f Merge pull request 'fix(daemon): pin ZOT_HOME so the autospawned zot reads its AGENTS.md' (#182) from fix/zot-home into main
Some checks are pending
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
CI / rust (push) Waiting to run
Reviewed-on: #182
2026-06-25 05:07:49 +02:00
13a5220615 fix(daemon): export ZOT_HOME so autospawned zot reads the right AGENTS.md
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
The rc.d drops privilege via su -m, which preserves the environment from
/etc/rc (HOME=/). Without an explicit ZOT_HOME, zot resolves to
/.local/state/zot — missing any AGENTS.md installed by the seed importer.

Pin ZOT_HOME to /var/db/colibri/.local/state/zot. The seed importer
(clawdie-iso) targets this same path, so AGENTS.md placed on the seed
reaches the autospawned zot's global slot.
2026-06-25 04:27:18 +02:00
a50bc81b4c Merge pull request 'docs(handoff): fix artifact list, add node+npm requirement' (#181) from docs/handoff-fixes into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #181
2026-06-24 19:50:55 +02:00
47504cd05d docs(handoff): fix artifact list, add node+npm requirement
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
- §2: list colibri-mcp instead of colibri-test-agent (matches preflight at
  build.sh:335 — test-agent is optional, gated by COLIBRI_STAGE_TEST_AGENT)
- §3: name the specific binaries preflight checks
- Notes: add Node.js (npm) to host toolchain requirements — build_and_stage_docs
  needs node+npm, and the handoff should match REQUIREMENTS.md
2026-06-24 19:42:33 +02:00
4c3cca5936 Merge pull request 'mother: preflight numpy/Pillow imports, not just python3' (#179) from mother-geodesic-deps into main
Some checks are pending
CI / rust (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
Reviewed-on: #179
2026-06-24 19:31:23 +02:00
0021199077 mother: preflight numpy/Pillow imports, not just python3
Some checks failed
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
geodesic-dome-mcp imports numpy + PIL at module load (not stdlib-only, as
#178 incorrectly stated). A present python3 therefore proves nothing — the
preflight would pass on a host missing numpy/Pillow and the tool would fail
only when the MCP host first invokes it.

- setup-mother.sh: add a 'python3 -c "import numpy, PIL"' check after the
  python3-exists check, with a pkg install py311-numpy py311-pillow hint.
- MOTHER-SETUP.md: correct the prereq from 'stdlib only, no pip' to
  'python3 + numpy + Pillow'.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 19:30:16 +02:00