docs: complete wiki updates — model-selection, guide, sl/ translations
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

This commit is contained in:
Sam & Claude 2026-06-28 14:45:44 +02:00
parent b3891a8e01
commit 6c8bf8944f
19 changed files with 57 additions and 57 deletions

View file

@ -82,7 +82,7 @@ static linking on FreeBSD (no `openssl-sys` dependency).
| `colibri-daemon` | Always-on socket server, session/agent lifecycle, jail spawner |
| `colibri-client` | Typed Unix-socket client + operator CLI tools |
| `colibri-glasspane-tui` | ratatui dashboard — live pane supervision |
| `colibri-store` | Embedded SQLite coordination (task board, agents, skills) |
| `colibri-ledger` | Embedded SQLite coordination (task board, agents, skills) |
| `colibri-skills` | Skills catalog (read-only consumer of reviewed skill artifacts) |
| `colibri-mcp` | MCP bridge for editor integration + external MCP host (jailed) |
| `clawdie` | Host installer/deployer: ZFS layout + `clawdie` service (FreeBSD/Linux) |

30
Cargo.lock generated
View file

@ -303,7 +303,7 @@ version = "0.12.0"
dependencies = [
"colibri-daemon",
"colibri-glasspane",
"colibri-store",
"colibri-ledger",
"serde",
"serde_json",
"thiserror 2.0.18",
@ -328,9 +328,9 @@ dependencies = [
"colibri-contracts",
"colibri-deepseek",
"colibri-glasspane",
"colibri-ledger",
"colibri-runtime",
"colibri-skills",
"colibri-store",
"colibri-vault",
"dashmap",
"reqwest",
@ -387,6 +387,19 @@ dependencies = [
"tokio",
]
[[package]]
name = "colibri-ledger"
version = "0.12.0"
dependencies = [
"chrono",
"colibri-skills",
"rusqlite",
"serde",
"serde_json",
"thiserror 2.0.18",
"uuid",
]
[[package]]
name = "colibri-mcp"
version = "0.12.0"
@ -434,19 +447,6 @@ dependencies = [
"serde_json",
]
[[package]]
name = "colibri-store"
version = "0.12.0"
dependencies = [
"chrono",
"colibri-skills",
"rusqlite",
"serde",
"serde_json",
"thiserror 2.0.18",
"uuid",
]
[[package]]
name = "colibri-vault"
version = "0.12.0"

View file

@ -1,5 +1,5 @@
[workspace]
members = ["crates/colibri-contracts", "crates/colibri-deepseek", "crates/colibri-runtime", "crates/colibri-glasspane", "crates/colibri-daemon", "crates/colibri-client", "crates/colibri-glasspane-tui", "crates/colibri-store", "crates/colibri-skills", "crates/colibri-mcp", "crates/colibri-vault", "crates/colibri-zfs", "crates/colibri-pf", "crates/colibri-deploy", "crates/clawdie"]
members = ["crates/colibri-contracts", "crates/colibri-deepseek", "crates/colibri-runtime", "crates/colibri-glasspane", "crates/colibri-daemon", "crates/colibri-client", "crates/colibri-glasspane-tui", "crates/colibri-ledger", "crates/colibri-skills", "crates/colibri-mcp", "crates/colibri-vault", "crates/colibri-zfs", "crates/colibri-pf", "crates/colibri-deploy", "crates/clawdie"]
[workspace.package]
version = "0.12.0"

View file

@ -18,7 +18,7 @@ bhyve VMs, Bastille jails) or as a standalone daemon on Linux.
| `colibri-daemon` | Always-on Unix socket server, task dispatch, session lifecycle |
| `colibri-client` | Typed Unix-socket client + operator CLI |
| `colibri-glasspane-tui` | ratatui live dashboard (FreeBSD-native) |
| `colibri-store` | Embedded SQLite coordination (task board, agents, cost tracking) |
| `colibri-ledger` | Embedded SQLite coordination (task board, agents, cost tracking) |
| `colibri-skills` | Skills catalog crate |
| `clawdie` | Host installer/deployer: ZFS layout + `clawdie` service (FreeBSD/Linux) |

View file

@ -24,4 +24,4 @@ tokio = { version = "1", features = ["io-util", "macros", "net", "rt-multi-threa
[dev-dependencies]
tokio = { version = "1", features = ["fs", "io-util", "macros", "net", "rt-multi-thread", "time"] }
uuid = { version = "1", features = ["v4"] }
colibri-store = { path = "../colibri-store" }
colibri-ledger = { path = "../colibri-ledger" }

View file

@ -10,7 +10,7 @@ colibri-contracts = { path = "../colibri-contracts" }
colibri-deepseek = { path = "../colibri-deepseek" }
colibri-glasspane = { path = "../colibri-glasspane" }
colibri-runtime = { path = "../colibri-runtime" }
colibri-store = { path = "../colibri-store" }
colibri-ledger = { path = "../colibri-ledger" }
colibri-skills = { path = "../colibri-skills" }
colibri-vault = { path = "../colibri-vault" }
tokio = { version = "1", features = ["full"] }

View file

@ -1,4 +1,4 @@
//! colibri-store — Embedded SQLite coordination database.
//! colibri-ledger — Embedded SQLite coordination database.
//!
//! Implements Decision #1 from `docs/COLIBRI-CUTOVER-PLAN.md`:
//! authoritative task-board lifecycle, agent registry, and skills catalog

View file

@ -29,7 +29,7 @@ colibri-daemon — Unix-socket server (the always-on supervisor)
| Crate | Role |
| ----------------------- | --------------------------------------------------------- |
| `colibri-daemon` | Socket server, agent lifecycle, scheduler loop |
| `colibri-store` | Embedded SQLite — tasks, agents, tenants, skills |
| `colibri-ledger` | Embedded SQLite — tasks, agents, tenants, skills |
| `colibri-glasspane` | Agent state machine (Idle → Working → Done/Error/Stalled) |
| `colibri-glasspane-tui` | ratatui dashboard — live pane supervision |
| `colibri-client` | CLI (`colibri status`, `colibri spawn`, `colibri tasks`) |

View file

@ -6,7 +6,7 @@
**Architecture:** New `eval.rs` module with `eval_task_locally()``tokio::spawn` in `record_task_completion()`. Upserts a second TaskEval row with `eval_mode: "local-llm"`, overwriting the agent self-report's `correctness_check` with PASS/FAIL from the local model.
**Tech Stack:** Rust, tokio::spawn, std::process::Command (ollama), colibri-store TaskEval
**Tech Stack:** Rust, tokio::spawn, std::process::Command (ollama), colibri-ledger TaskEval
---
@ -257,7 +257,7 @@ Replace lines 381-401 (the agent self-report eval block) with:
```rust
// T2.x Phase 1: Write eval record (agent self-report mode)
let agent_eval = colibri_store::TaskEval {
let agent_eval = colibri_ledger::TaskEval {
task_id: task_id.to_string(),
agent_id: Some(agent_id.to_string()),
eval_mode: "agent".to_string(),
@ -286,7 +286,7 @@ Replace lines 381-401 (the agent self-report eval block) with:
use crate::eval::eval_task_locally;
match eval_task_locally(&task_id_owned, &task_desc_owned) {
Some(attempt) => {
let local_eval = colibri_store::TaskEval {
let local_eval = colibri_ledger::TaskEval {
task_id: task_id_owned.clone(),
agent_id: Some(agent_id.to_string()),
eval_mode: "local-llm".to_string(),
@ -299,7 +299,7 @@ Replace lines 381-401 (the agent self-report eval block) with:
evaluated_at: chrono::Utc::now().to_rfc3339(),
};
// Re-open store — we're in a different thread
if let Ok(store) = colibri_store::Store::open(&store_path) {
if let Ok(store) = colibri_ledger::Store::open(&store_path) {
if let Err(e) = store.write_task_eval(&local_eval) {
warn!(task_id = %task_id_owned, error = %e, "failed to write local eval");
}

View file

@ -14,7 +14,7 @@ Colibri speaks 5 protocols today:
| **MCP JSON-RPC** | `crates/colibri-mcp/src/lib.rs` | 570 | Editor integration + external MCP host |
| **MCP-over-SSH** | `packaging/mother/` (3 files) | 437 | Mother hive entrypoint (forced-command allowlist + node register) |
| **JSONL** | `crates/colibri-glasspane/src/lib.rs` | 1,186 | Agent subprocess stdout events |
| **SQL** | `crates/colibri-store/src/lib.rs` + `crates/colibri-store/src/schema.rs` | 1,150 | Local coordination (tasks, agents, skills, tenants) |
| **SQL** | `crates/colibri-ledger/src/lib.rs` + `crates/colibri-ledger/src/schema.rs` | 1,150 | Local coordination (tasks, agents, skills, tenants) |
**Total protocol surface: ~5,324 lines.**
@ -108,7 +108,7 @@ With A2A: cost data is a typed message part (`application/json+cost`). The forma
| **Unix socket wire protocol** (`crates/colibri-daemon/src/socket.rs`) | A2A is cross-node HTTP. Local daemon control needs IPC — Unix socket is faster, auth-free (filesystem permissions), and doesn't need a network stack. | 0 |
| **Spawner** (`crates/colibri-daemon/src/spawner.rs`) | A2A routes tasks to existing agents. Colibri _creates_ agents by spawning subprocesses. A2A has no process lifecycle concept. | 0 |
| **Glasspane** (`crates/colibri-glasspane/src/lib.rs`) | A2A doesn't watch subprocess stdout. Glasspane is a PTY observer — it reads JSONL from child processes. A2A operates one layer above. | 0 |
| **Store** (`crates/colibri-store/src/lib.rs`) | A2A doesn't replace local SQLite coordination. Each node needs local persistence for task board, agents, skills — A2A is the _transport_, not the _database_. | 0 |
| **Store** (`crates/colibri-ledger/src/lib.rs`) | A2A doesn't replace local SQLite coordination. Each node needs local persistence for task board, agents, skills — A2A is the _transport_, not the _database_. | 0 |
| **MCP editor bridge** | A2A is agent-to-agent. MCP is human-to-tool. Different protocols for different directions. They coexist. | 0 |
| **Contracts schemas** (`crates/colibri-contracts/src/lib.rs`) | A2A uses JSON Schema for input validation. Colibri's contracts are already compatible — no change needed. | 0 |

View file

@ -95,7 +95,7 @@ finished_at) onto the task row. MCP exposes `colibri_get_task_cost` for
agents to query historical cost data (e.g., "what model is cheapest for
this workload?").
→ [`crates/colibri-store/src/lib.rs`](../../crates/colibri-store/src/lib.rs)
→ [`crates/colibri-ledger/src/lib.rs`](../../crates/colibri-ledger/src/lib.rs)
(`TaskCost`, `set_task_cost`),
[`crates/colibri-glasspane/src/lib.rs`](../../crates/colibri-glasspane/src/lib.rs)
(`PaneUsage`, `add_cost`),

View file

@ -17,7 +17,7 @@
| `clawdie-system-probe` | Collects GPU, RAM, CPU, disks, ZFS, WiFi, Vulkan, Colibri status | No ollama/llama.cpp probing |
| `node-register-mcp` | UPSERTs hw_profile into `hive_nodes` on join | No UUID generation at join time |
| `crates/colibri-daemon/src/scheduler.rs` | Cron/interval/one-shot jobs, capability matching stubs | No cost-aware routing, no hive awareness |
| `colibri-store` | Local SQLite `agents` table with UUID (v4 random) | UUID is session-local, not hive-stable |
| `colibri-ledger` | Local SQLite `agents` table with UUID (v4 random) | UUID is session-local, not hive-stable |
| T1.5 cost tracking | Per-task cost captured in local SQLite | No hive-level cost aggregation |
## Design Goals
@ -380,7 +380,7 @@ The capability matrix, stable UUIDs, and local LLM probes are the foundation —
| `colibri_query_hive_capabilities` MCP tool | colibri-mcp |
| `colibri_dispatch_to_node` MCP tool | colibri-mcp |
| `hive-routing` skill | `.agent/skills/` |
| `Task.routing` JSONB field in colibri-store | colibri-store |
| `Task.routing` JSONB field in colibri-ledger | colibri-ledger |
| Mother-side routing score as PostgreSQL function (optional — only if agent-driven routing proves insufficient) | mother_schema.sql |
---

View file

@ -354,7 +354,7 @@ task arrives at scheduler
| Local eval: spawn local LLM with eval prompt | colibri-daemon | ~60 |
| Fallback logic: self-report → local → cloud → skipped | colibri-daemon | ~40 |
| Eval job scheduler (async, fire-and-forget) | colibri-daemon | ~30 |
| Eval result merge into task_eval | colibri-store | ~20 |
| Eval result merge into task_eval | colibri-ledger | ~20 |
**Total:** ~180 lines, 3 days.
@ -383,7 +383,7 @@ task arrives at scheduler
| Deliverable | Where | Lines |
| --------------------------------------------------- | -------------- | ----- |
| Cloud eval: call Claude/DeepSeek with eval prompt | colibri-daemon | ~50 |
| Cost accounting: eval_cost_usd added to task_eval | colibri-store | ~10 |
| Cost accounting: eval_cost_usd added to task_eval | colibri-ledger | ~10 |
| Feedback loop: eval results → routing weight update | colibri-daemon | ~30 |
| Eval aggregation: 5-minute rollup of success rates | colibri-mcp | ~25 |

View file

@ -101,7 +101,7 @@ uspeh, finished_at) v vrstico opravila. MCP izpostavlja
`colibri_get_task_cost` za poizvedbe agentov o zgodovinskih stroških (npr.
"kateri model je najcenejši za to delovno obremenitev?").
→ [`crates/colibri-store/src/lib.rs`](../../crates/colibri-store/src/lib.rs)
→ [`crates/colibri-ledger/src/lib.rs`](../../crates/colibri-ledger/src/lib.rs)
(`TaskCost`, `set_task_cost`),
[`crates/colibri-glasspane/src/lib.rs`](../../crates/colibri-glasspane/src/lib.rs)
(`PaneUsage`, `add_cost`)

View file

@ -31,7 +31,7 @@ Vse veščine si delijo eno tabelo `skills` s stolpci `name`, `description`,
(`"soul"`, `"agent"`, `"channel"`). Brez gnezdenja, brez različic, brez
odvisnosti med veščinami. To ustreza trenutnemu obsegu (~50 veščin).
`crates/colibri-store/src/schema.rs`
`crates/colibri-ledger/src/schema.rs`
### Uvoz ob zagonu, ne sproti

View file

@ -8,11 +8,11 @@ description: "Koordinacijska shramba Colibri — ena sama podatkovna zbirka SQLi
Colibrijeva koordinacijska shramba je ena sama podatkovna zbirka SQLite v
lasti storitve `colibri`. Hrani tablo opravil, register agentov in veščin ter
preslikavo najemnikov trezorja. Ni predpomnilnik — je trajno stanje. Večina
pisanj gre skozi API vtičnice procesa v ozadju, vendar shema pripada `colibri-store`.
pisanj gre skozi API vtičnice procesa v ozadju, vendar shema pripada `colibri-ledger`.
`crates/colibri-store/src/schema.rs`
`crates/colibri-ledger/src/schema.rs`
`crates/colibri-store/src/lib.rs`
`crates/colibri-ledger/src/lib.rs`
## Odločitve
@ -39,7 +39,7 @@ Te niso nastavljive med izvajanjem. Če bomo kdaj potrebovali drugačna jamstva
glede trajnosti ali sočasnosti, naj bo to eksplicitno, namesto da bi povezava
podedovala privzetke.
`crates/colibri-store/src/lib.rs` (`Store::open`)
`crates/colibri-ledger/src/lib.rs` (`Store::open`)
### Samo idempotentne migracije
@ -49,7 +49,7 @@ navzdol; razvoj sheme so aditivne tabele in stolpci. Če bo kdaj potrebna
destruktivna migracija, mora biti to nameren ročni korak, dokumentiran v
predaji.
`crates/colibri-store/src/schema.rs`
`crates/colibri-ledger/src/schema.rs`
### Štiri tabele za štiri skrbi
@ -64,7 +64,7 @@ Opravila nosijo tuji ključ `agent_id` v `agents`. Vsako drugo razmerje je
ohlapno — veščine niso povezane z agenti, najemniki pa so referencirani po
svojem `tenant_id` v ukazih vtičnice in kljukah za oskrbo.
`crates/colibri-store/src/schema.rs`
`crates/colibri-ledger/src/schema.rs`
### Omejitev CHECK stanja opravila je vir resnice
@ -72,7 +72,7 @@ svojem `tenant_id` v ukazih vtičnice in kljukah za oskrbo.
Enum `TaskStatus` v Rustu ga zrcali, vendar je podatkovna zbirka zadnje
preverjanje. Ukaz, ki poskusi vstaviti neznano stanje, pade ob času pisanja.
`crates/colibri-store/src/schema.rs`
`crates/colibri-ledger/src/schema.rs`
### Zmožnosti agenta shranjene kot JSON, ne normalizirane
@ -84,7 +84,7 @@ bi dodali zapletenost sheme brez izboljšanja moči poizvedb.
Če metapodatki zmožnosti zrastejo (uteži, različice, zahtevane veščine),
lahko to kasneje razcepimo; trenutna shema namenoma ostaja pragmatična.
`crates/colibri-store/src/lib.rs` (`register_agent`)
`crates/colibri-ledger/src/lib.rs` (`register_agent`)
### Najemniki kodirajo preslikavo 1:1:1 ječa/trezor/zbirka
@ -97,7 +97,7 @@ Stolpec `status` najemnika sledi življenjskemu ciklu:
`provisioned → active → stopped → destroyed`. Neodvisen je od tega, ali
proces ječe teče; upravljanje življenjskega cikla je ločena skrb.
`crates/colibri-store/src/schema.rs` (komentarji na `tenants`)
`crates/colibri-ledger/src/schema.rs` (komentarji na `tenants`)
### Privzeta pot podatkovne zbirke je specifična za platformo
@ -112,7 +112,7 @@ FreeBSD privzeto uporablja `/var/db`, ker je to običajni imenik za lokalno
stanje storitev. Linuxov padec spoštuje XDG, tako da je razvoj na delovni
postaji normalen.
`crates/colibri-store/src/lib.rs` (`default_db_path`)
`crates/colibri-ledger/src/lib.rs` (`default_db_path`)
### Izvoz JSON za varnostne kopije in paritetne teste

View file

@ -92,7 +92,7 @@ administracije in preživi ponovne zagone procesa v ozadju brez ločenega življ
cikla. Matično vozlišče uporablja PostgreSQL za hive register, ker je
večnajemniško; lokalni proces v ozadju je enouporabniški (single user/operator).
→ [`crates/colibri-store/src/lib.rs`](../../crates/colibri-store/src/lib.rs)
→ [`crates/colibri-ledger/src/lib.rs`](../../crates/colibri-ledger/src/lib.rs)
## Glej tudi

View file

@ -5,11 +5,11 @@
Colibri's coordination store is a single SQLite database owned by the `colibri`
service. It holds the task board, the registry of agents and skills, and the
vault tenant map. It is not a cache — it is durable state. Most writes happen
through the daemon's socket API, but the schema belongs to `colibri-store`.
through the daemon's socket API, but the schema belongs to `colibri-ledger`.
`crates/colibri-store/src/schema.rs`
`crates/colibri-ledger/src/schema.rs`
`crates/colibri-store/src/lib.rs`
`crates/colibri-ledger/src/lib.rs`
## Decisions
@ -35,7 +35,7 @@ These are not configurable at runtime. If we ever need different durability or
concurrency guarantees, we should make it explicit rather than letting the
connection inherit defaults.
`crates/colibri-store/src/lib.rs` (`Store::open`)
`crates/colibri-ledger/src/lib.rs` (`Store::open`)
### Idempotent migrations only
@ -44,7 +44,7 @@ indexes, so repeated runs are safe. We do not ship downward migrations; schema
evolution is additive tables and columns. If a destructive migration is ever
needed, it must be a deliberate manual step documented in a handoff.
`crates/colibri-store/src/schema.rs`
`crates/colibri-ledger/src/schema.rs`
### Four tables for four concerns
@ -59,7 +59,7 @@ Tasks carry an `agent_id` foreign key into `agents`. Every other relationship is
loose — skills are not linked to agents, and tenants are referenced by their
`tenant_id` in socket commands and provisioning hooks.
`crates/colibri-store/src/schema.rs`
`crates/colibri-ledger/src/schema.rs`
### Task-status CHECK constraint is the source of truth
@ -67,7 +67,7 @@ loose — skills are not linked to agents, and tenants are referenced by their
The Rust `TaskStatus` enum mirrors it, but the database is the final gate. A
command that tries to insert an unknown status fails at write time.
`crates/colibri-store/src/schema.rs`
`crates/colibri-ledger/src/schema.rs`
### Agent capabilities stored as JSON, not normalized
@ -79,7 +79,7 @@ complexity without improving query power.
If capability metadata grows (weights, versions, required skills), we can split
it later; the current schema intentionally stays pragmatic.
`crates/colibri-store/src/lib.rs` (`register_agent`)
`crates/colibri-ledger/src/lib.rs` (`register_agent`)
### Tenants encode the 1:1:1 jail/vault/collection map
@ -92,7 +92,7 @@ The tenant `status` column tracks the lifecycle:
`provisioned → active → stopped → destroyed`. It is independent of whether the
jail process is running; lifecycle management is a separate concern.
`crates/colibri-store/src/schema.rs` (comments on `tenants`)
`crates/colibri-ledger/src/schema.rs` (comments on `tenants`)
### Default database path is platform-specific
@ -107,7 +107,7 @@ FreeBSD defaults to `/var/db` because that is the conventional local-state
directory for services. The Linux fallback respects XDG, so development on a
workstation feels normal.
`crates/colibri-store/src/lib.rs` (`default_db_path`)
`crates/colibri-ledger/src/lib.rs` (`default_db_path`)
### JSON export for backups and parity tests

View file

@ -84,7 +84,7 @@ coordination state. SQLite is zero-config, zero-admin, and survives daemon
restarts without a separate lifecycle. The mother node uses PostgreSQL for the
hive registry because it's multi-tenant; the local daemon is single-tenant.
→ [`crates/colibri-store/src/lib.rs`](../../crates/colibri-store/src/lib.rs)
→ [`crates/colibri-ledger/src/lib.rs`](../../crates/colibri-ledger/src/lib.rs)
## See also