Commit graph

512 commits

Author SHA1 Message Date
8f84eb51c2 docs(sl): translate wiki group 2 — deployment, operator-cli, terminal, tui, headroom-sidecar 2026-06-26 14:15:11 +02:00
3ec68ff860 docs(sl): translate wiki group 1 — glasspane, agent-harness, naming, quality-gates, store-schema 2026-06-26 14:15:11 +02:00
Sam & Claude
d9ef0a94e2 docs(sl): install pages use clawdie flow (drop just install)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 14:15:11 +02:00
412364bf74 docs(sl): translate wiki batch 1 — 7 core pages
- mother-hive (matični hive): forced-command SSH, single home,
  peer auth, key-on-seed, daemon user
- task-board (tabla opravil): capability scoring, cron/interval/once,
  intake drain, SQLite backing
- operator-attention (operaterska pozornost): attention bar,
  jump/filter keys, edge-triggered alerts, NO_COLOR pitfall
- contracts (JSON pogodbe): stable schemas, golden tests,
  evolution rules
- cost-model (model stroškov): cache-hit metering, fast/smart/max,
  T14 compaction, DeepSeek probe
- layered-soul (plastovita duša): import path, deferred stores,
  one-way direction
- index (wiki kazalo): conventions, lint workflow, full page table

Commands/JSON/code paths kept in English; prose + frontmatter
translated.
2026-06-26 14:15:11 +02:00
9d8fe55b6f Merge pull request 'fix(scheduler): eliminate intake double-create (+ fmt normalize)' (#207) from fix/intake-task-no-duplicate 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: #207
2026-06-26 10:39:40 +02:00
0d0e70ec36 Merge pull request 'chore: prettier format' (#212) from feat/import-clawdie-skills into main
Some checks are pending
CI / markdown (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
CI / port (push) Waiting to run
CI / rust (push) Waiting to run
Reviewed-on: #212
2026-06-26 10:38:58 +02:00
ec1e652831 Merge pull request 'docs(guide): Astro-native localization rework + Slovenian batch 1' (#210) from docs/localization-astro-native-and-slovenian into main
Some checks are pending
CI / rust (push) Waiting to run
CI / agent-jail-pkgs (push) Waiting to run
CI / markdown (push) Waiting to run
CI / port (push) Waiting to run
Reviewed-on: #210
2026-06-26 10:37:58 +02:00
f4dce01cce Merge pull request 'docs/guide-port' (#211) from docs/guide-port 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: #211
2026-06-26 10:37:26 +02:00
a3048cdef2 docs(sl): add glossary of abbreviations + link from all pages
Some checks are pending
CI / rust (pull_request) Waiting to run
CI / markdown (pull_request) Waiting to run
CI / port (pull_request) Waiting to run
CI / agent-jail-pkgs (pull_request) Waiting to run
- New page: docs/guide/sl/reference/okrajsave.md (15 abbreviations
  explained in plain Slovenian — LLM, JSON, JSONL, ACL, PF, NAT,
  ZFS, API, HTTPS, TCP, SHA, BCP, ISO, UI, VPS)
- Linked from reference index
- First occurrence of each abbreviation in every Slovenian page
  now links to the glossary
- Fix broken ./install/ link (English + Slovenian)
- requirements title: 'Zahteve' → 'Osnovne zahteve'
- prettier-clean
2026-06-26 10:34:47 +02:00
b1a561021f chore: prettier format
Some checks are pending
CI / rust (pull_request) Waiting to run
CI / markdown (pull_request) Waiting to run
CI / port (pull_request) Waiting to run
CI / agent-jail-pkgs (pull_request) Waiting to run
2026-06-26 10:07:09 +02:00
36fdfbb2c1 chore: prettier format
Some checks are pending
CI / markdown (pull_request) Waiting to run
CI / port (pull_request) Waiting to run
CI / agent-jail-pkgs (pull_request) Waiting to run
CI / rust (pull_request) Waiting to run
2026-06-26 09:39:15 +02:00
1f393af09c docs(guide): rewrite colibri.md for v0.12 + final language polish
- colibri.md: complete rewrite — was TypeScript "event fabric" with pi-centric
  ingestion modules, proof gates, Herdr evaluation. Now describes the actual
  v0.12 Rust control plane: crate map, agent model (zot/pi), mother MCP flow,
  links to wiki decision pages.
- "broken" → "inconsistent" (docs-publishing), "compromised" (install),
  "not suitable" (sdk-deep-dive)
- Zero remainders: no kill, smoke, fake, hacky, TODOs, stale pi patterns
2026-06-26 09:38:49 +02:00
dc9f7f06e7 Merge pull request 'docs(guide): add Terminal Capture & Signature Triage page' (#209) from docs/guide-port 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: #209
2026-06-26 09:35:16 +02:00
Sam & Claude
5e2692c063 docs(guide): add Control-Plane Bridge architecture page
Some checks are pending
CI / rust (pull_request) Waiting to run
CI / markdown (pull_request) Waiting to run
CI / port (pull_request) Waiting to run
CI / agent-jail-pkgs (pull_request) Waiting to run
Document the cross-host control-plane bridge (socat TCP on tailscale0 →
colibri-daemon Unix socket): FreeBSD rc.d vs Linux systemd parity, the
interface-scoped firewall gate (pf / ufw), the "tailnet boundary is the auth"
security model (no socket auth; scope :9190 via Tailscale ACL), and config
notes (TAILSCALE_IP_REQUIRED placeholder, socket-path parity, 0770 group).
Points at packaging/{freebsd,linux}/ for install. Linked from the architecture
index next to Control Plane. No real tailnet IPs (placeholders only).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 09:33:53 +02:00
Sam & Claude
7ae22097e1 docs(guide): add Terminal Capture & Signature Triage operate page
Some checks are pending
CI / rust (pull_request) Waiting to run
CI / markdown (pull_request) Waiting to run
CI / port (pull_request) Waiting to run
CI / agent-jail-pkgs (pull_request) Waiting to run
The terminal-capture / signature-triage layer (colibri-glasspane terminal.rs
+ signatures.rs, driven by the daemon poll loop) had no guide coverage. Document
it: content-hash dedup history, edge-triggered signature alerts, per-OS
signature sets, the COLIBRI_TERMINAL_* / TELEGRAM_* config, and the
terminal-watch/unwatch/list/history/poll socket commands. Linked from the
operate index.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 09:31:04 +02:00
13303e88b3 Merge pull request 'docs/guide-port' (#208) from docs/guide-port 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: #208
2026-06-26 09:25:24 +02:00
95c487546d docs(guide): port 39 procedural docs from clawdie-ai to colibri
Some checks are pending
CI / rust (pull_request) Waiting to run
CI / markdown (pull_request) Waiting to run
CI / port (pull_request) Waiting to run
CI / agent-jail-pkgs (pull_request) Waiting to run
New docs/guide/ tree — canonical home for operator-facing procedural docs.
Starlight frontmatter added to all files. 0.12 alignment fixes applied:

- v0.11.0 → v0.12.0 throughout
- PI_TUI_PROVIDER/MODEL → DEEPSEEK_API_KEY
- Headless Codex login → Agent runtime setup (zot + RPC mode)
- /login and auth.json references removed
- pi → zot in provider-fallback spawn reference
- colibri-provider-verify (was pi-provider-smoke)
- Language cleanup: smoke test → verification, fake → test,
  can't self-fix → requires operator intervention,
  broken → unresponsive, Fix anything broken → Verify all checks pass

Two-tree model: docs/wiki/ (decisions) + docs/guide/ (procedural).
Single source of truth in colibri. clawdie-ai docs/public/ to be retired.
2026-06-26 09:16:43 +02:00
5b3ccf8ace fix(daemon): use tokio::process for SSH to mother node
Convert std::process::Command → tokio::process::Command so SSH
spawn/wait_with_output yield the tokio worker instead of blocking it.
Stdin write uses AsyncWriteExt::write_all. This, combined with the
earlier tokio::time::sleep fix, makes the entire mother registration
async — no thread is ever blocked during SSH retries.
2026-06-26 08:33:52 +02:00
66d6618897 fix(daemon): use tokio::time::sleep in mother register hook
Replace three std:🧵:sleep calls with tokio::time::sleep().await
in try_register_hw_with_mother. The function is now async so retry
delays yield the tokio worker instead of blocking it — the detached
task won't starve the daemon's other async work (scheduler, heartbeat,
socket handlers) during SSH retries.
2026-06-26 08:29:21 +02:00
4d7210a492 feat(daemon): hw register with mother on autospawn (belt + suspenders)
Layer 1 — rc.d ordering:
- Add tailscaled to colibri_daemon REQUIRE so the daemon doesn't start
  before the tailscale daemon is running.

Layer 2 — autospawn hook:
- After agent spawn, if clawdie-hw-probe was collected, read
  external-mcp.json to detect a 'mother' server entry.
- If configured, SSH to mother and call node_register via colibri-mcp
  with 3 retries / 5s backoff (tailscale auth can lag).
- Runs in a detached tokio task so SSH retries never block the daemon.

The probe data is already collected at autospawn time and passed to
the agent via CLAWDIE_HW_PROFILE; this addition closes the loop by
actually sending it to the mother node as a best-effort side effect.

Sam & Claude
2026-06-26 08:25:18 +02:00
Sam & Claude
b812c1ee22 style: cargo fmt — normalize pre-existing drift inherited from main
Some checks are pending
CI / rust (pull_request) Waiting to run
CI / markdown (pull_request) Waiting to run
CI / port (pull_request) Waiting to run
CI / agent-jail-pkgs (pull_request) Waiting to run
main's fmt gate was red (over-indented host/last_seen in scheduler test
fixtures + drift in socket/store/tests from earlier Phase-3 merges). This
brings the branch to fmt --all --check clean so the gate passes; kept
separate from the dedup fix commit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 08:08:03 +02:00
a336f172df fix(scheduler): eliminate double task creation on intake
The merged #206 created a regression: cmd_intake_task created a task
at submit time (returning id A) AND the scheduler tick created a second
task from the same request (id B, which got claimed). Two tasks per
intake, with the returned id pointing to the orphaned copy.

Fix: TaskRequest now carries the pre-created task_id. The tick drops
its create_task() call and only does pick_agent + claim_task on the
existing id. One task, one id, the returned id is the one the
scheduler routes.

- TaskRequest gains task_id field
- cmd_intake_task creates once, pushes id to queue
- scheduler tick claims via req.task_id (no create_task)
- scheduler unit test pre-creates task before submit
- multi_agent_board test verifies id in response
2026-06-26 08:01:35 +02:00
d76504c5bb Merge pull request 'fix(socket): intake-task now returns full task with id' (#206) from fix/intake-task-return-id 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: #206
2026-06-26 07:33:43 +02:00
d5d7f68876 fix(socket): intake-task now returns full task with id
Some checks are pending
CI / rust (pull_request) Waiting to run
CI / markdown (pull_request) Waiting to run
CI / port (pull_request) Waiting to run
CI / agent-jail-pkgs (pull_request) Waiting to run
Previously intake-task returned {"status":"queued"} with no task_id,
breaking runbook steps 3-4 that needed the id for transition-task.

Now cmd_intake_task creates the task in the store immediately (like
create-task) and returns the full Task object including id, status,
title, etc. The scheduler queue path is unchanged — the task is still
pushed to the intake queue for the tick to route/claim.

Test updated: scheduler_routes_intake verifies response contains id.
2026-06-26 02:45:25 +02:00
722d83f79b Merge pull request 'docs/refresh-multi-agent-plan' (#205) from docs/refresh-multi-agent-plan 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: #205
2026-06-26 02:13:51 +02:00
f7d29b6257 feat(store): wire Phase 3 agent presence — host, heartbeat, last_seen
Some checks are pending
CI / rust (pull_request) Waiting to run
CI / markdown (pull_request) Waiting to run
CI / port (pull_request) Waiting to run
CI / agent-jail-pkgs (pull_request) Waiting to run
Agent struct now carries host (where the agent registered from) and
last_seen (last heartbeat/re-register timestamp). The SQL columns
existed since the Phase 3 schema commit but were never read or
written — Rust ignored them.

Changes:
- Agent struct: +host: Option<String>, +last_seen: Option<String>
- register_agent: un-underscore host arg, INSERT/read it
- get_agent / list_agents: SELECT host + last_seen columns
- Store::heartbeat(): UPDATE last_seen + COALESCE host
- ColibriCommand: +Heartbeat variant, +host on RegisterAgent
- cmd_heartbeat: socket dispatch → store heartbeat
- run_migrations: actually execute MIGRATIONS (was defined but never run)
- All test Agent constructions updated

What's still open per the plan: lease/TTL semantics, daemon heartbeat
tick calling the store, offline detection for stale agents.
Those are follow-up slices — the schema + wiring foundation is in.
2026-06-26 02:00:26 +02:00
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