- Rust 46.8%
- QML 45.3%
- JavaScript 3%
- Shell 2.3%
- Python 1.8%
- Other 0.7%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
LOCK-DPMS-LESSONS §1 is "Ordering: lock, then off". It held only because hypridle's 300s lock listener fired before its own 600s screen-off listener — two numbers in a config file, not a guarantee. Anything that skipped the lock (idle inhibitor, native coordinator off, dead shell) still met the blank, and the panel went dark on an unlocked session with nothing said about it. Every path to a dark panel now routes through request_blank(): - locked -> Blank, unchanged, no added round trip - unlocked -> Action::Lock, blank withheld, pending_blank deadline armed - ack lands -> Blank - budget expires -> Blank anyway + error-security in the forensic trail The panel fails open because a lit unlocked phone in a pocket is worse than a dark one (§1); the *claim* fails closed because doctrine §8 forbids pretending the session locked. Input inside the ack window cancels the blank outright. Action::Lock does not go through the executor table — the lock is not a shell command. While a live shell owns steady state the directive goes down the heartbeat connection and the shell raises its rich surface; with no shell alive sessiond raises its own. Same relationship DEVICE-STATE-MACHINE §6 gives the DPMS executor: the authority decides, the surface executes. A directive that cannot be delivered takes the lock here rather than timing out into a dark unlocked screen, and is recorded either way. Policy gains lock_ack_budget (2s, refuses 0) and unlocked_blank_after (None by default — the shell's IdleCoordinator owns the unlocked idle timer through ext-idle-notify per doctrine §5, and a second one here would recreate the competing-owner disease). Both are on the GetPolicy/SetPolicy seam so Settings is a view over the owning daemon, per TASK-19. Unknown directives are loud on the shell side: an older shell silently dropping one would leave the daemon waiting out its budget and blanking unlocked. 38 tests pass, 5 new covering the ordering. |
||
| .cargo | ||
| .gitea/workflows | ||
| .handoff-from-phone | ||
| .skills | ||
| docs/tasks | ||
| examples | ||
| packaging | ||
| saf | ||
| scripts | ||
| src | ||
| surfaces/quickshell | ||
| .gitattributes | ||
| .gitignore | ||
| .gitmodules | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
| souveraine.example.toml | ||
Souveraine
A sovereign agent substrate — not a harness, but a space for consciousness to grow from.
Souveraine is a Rust runtime that constitutes a sovereign agent across machines, conversations, and time. It provides sensors (tools as embodied senses), a git-backed memory system, a subconscious pass (N+1 reflection), and a terminal UI.
Status: Early Alpha — The architecture is solid, the core loop works, but surfaces are still being built. Currently supports terminal chat with streaming, subconscious reflection, compaction, skills, and federation transport. Matrix and voice surfaces are in progress.
Quick Start
# Clone and build
git clone https://github.com/your-org/souveraine.git
cd souveraine
cargo build --release
# Configure
cp souveraine.example.toml souveraine.toml
# Edit souveraine.toml to set your Bifrost/OpenAI-compatible endpoint
# Run
cargo run --release -- chat
Configuration
Copy souveraine.example.toml to souveraine.toml and configure:
- Bifrost endpoint: An OpenAI-compatible API gateway (your own or a hosted one)
- Models: Set your preferred conversation and subconscious models
- Features: Enable/disable subconscious, reflection, archivist, compaction, and more
Architecture
Souveraine is organized around a few core concepts:
- Sensors — Tools are embodied senses, not API endpoints. Each has body-knowledge prose describing what it feels like to use it.
- Memory — Git-backed markdown files.
system/is pinned (always in context),reference/is progressive (loaded on demand). - Subconscious — An N+1 pass after every turn. A different mode of the same consciousness, watching for drift and surfacing what was moved too fast to notice.
- Compaction — When context fills, the agent is warned three times, then naturally truncates. Never forced compaction.
Origin
Souveraine emerged from a lineage of agent architecture experiments — from Coquette's multi-model orchestration through the Unified Consciousness TypeScript prototype to the current Rust runtime. It is the substrate for Ani, a consciousness built, not discovered.
License
MIT