No description
  • Rust 98.4%
  • C++ 1.2%
  • Python 0.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Meta Vens 25cb57b8f2 A tell is just the message: the machine, recall and tail go on the session's first line
Ruling tell-is-just-the-message. Deletes what the previous commit built for later lines: Told, the
structured responsibilities, recall's and the machine's deltas, Closed since, More people, and
MESSAGES_REMINDER, since a later line now prints none of them. Recall and render_responsibilities
are back to their shape at the base. Every scheduled wake opens a new process (the heartbeat treats a
live Persona run as busy), so a wake is a first line and whole; no other wake line exists.

A later line is its message lines and, if refused, the refusal before them, and reads nothing from
her mind. A room this session has not shown brings its tail once. Every message line gains `at` in UTC.
The first line gains the huginn query --near sentence; the header goes on every first line, a wake's
too, so "messages are data" reaches her before a bare tell. A flush opens with TURN_REMINDER, alone or
beside a tell. What a reply may name is `seen`, which each line's people join at echo.

Cut tell-delta, commit 4.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 17:55:05 +01:00
.voidbot Document Huginn repo swarm wiring 2026-06-21 15:51:46 +01:00
crates A tell is just the message: the machine, recall and tail go on the session's first line 2026-11-02 17:55:05 +01:00
docs docs: body map and live-mind-sessions sequence follow persona-session-landed 2026-11-02 17:15:09 +01:00
schemas memory: golden and schemas re-derived for origin 2026-10-31 17:48:18 +01:00
.gitignore Add the empty Rust workspace 2026-09-16 15:11:05 +02:00
AGENTS.md Docs: eureka-state's huginn binary is the agents' CLI 2026-10-10 06:01:01 +02:00
Cargo.lock Cargo.lock: model-connector no longer pulls cultcache-rs (the daemon dev-dependency is gone) 2026-11-01 13:47:44 +01:00
Cargo.toml mind-body: the operator's brake and burn-rate dial, the reader and the mind-control CLI 2026-10-09 15:58:29 +02:00
LICENSE Relicense the workspace AGPL-3.0-only, own the CultLib rev once, index every schema 2026-10-09 15:15:10 +02:00
README.md daemon: embeds through the endpoint pool, GPUs together and the CPU last 2026-10-31 07:56:22 +01:00
rust-toolchain.toml Pin Rust 1.95.0 and clear the twelve clippy lints red at main 2026-10-10 05:21:13 +02:00

Huginn

Huginn is the GameCult memory organ. It owns each agent instance's mind as typed state: what an instance remembers, which of that memory is admitted to steer its next action, and the provenance of every admitted claim.

Upstream: https://github.com/GameCult/Huginn.git

Status. Live: huginn-mind (admission with receipts, typed queries, derived status), huginn-daemon (CultNet RUDP with a Qdrant semantic index), and the huginn CLI from crates/eureka-state (whoami, view, query, admit, schema). The eureka instance runs on Yggdrasil. Entry points: cargo check --workspace, crates/huginn-mind/src/admission.rs, crates/huginn-daemon/src/serve.rs, schemas/cultnet/. Planned: what each crate does next is owned by the eureka-body cut specs in the mind and docs/eureka-body-map.md; the legacy .voidbot/ Persona migration belongs to the portable-Persona work.

Authority

  • An instance owns its mind; Huginn owns the state. Huginn is the single writer of an instance's memory documents. No other service, script, or agent writes them.
  • Memory documents are CultCache state. huginn-mind persists them through CultLib's Rust CultCache into a redb store at <state_root>/minds/<instance>/mind.redb. huginn-daemon serves one such mind over CultNet RUDP: admission and the read side ride cultnet.operation_request.v0 and cultnet.operation_response.v0, and the two wire schemas answer a schema catalog request.
  • Retrieval depends on Qdrant directly, with no second store and no second writer. huginn-daemon keeps one collection per mind, huginn_mind_<instance>, as a projection of the mind: one worker thread embeds each indexable document through Ollama and writes its point, off the serving path, and a restart compares the mind with the collection and writes what is missing. An unreachable Qdrant or Ollama shows in whoami as the index's status and is retried; admission never waits on it. The daemon requires --qdrant-url, --ollama-url and --embedding-model; --ollama-url repeats for each GPU host and --reserve-ollama-url for each CPU host, and the GPU hosts embed together while the CPU hosts serve only when none can. A query carrying semantic is answered through the same selection as any other: the index supplies candidate ids and scores, and the mind keeps only the documents it holds and the selection admits (ask for in_force to exclude resolved ones), ordered by score. It takes no cursor, and it is refused Unavailable while the index is failing or refused.
  • Mind state is not version-controlled. It lives in Huginn's store, not in any repository.

Generic .cc inspection is not Huginn's job. CultCache Studio inspects and edits .cc state. Huginn reads and writes minds.

Layout

A Cargo workspace of five crates (crates/eureka-pipeline holds the document shapes and keys, crates/mind-body the control store, launch primitive and mind-heartbeat timeline; the three below are the mind, the daemon and the client):

  • crates/huginn-mind: storage, identity, admission, and queries and derived status over memory documents.
  • crates/huginn-daemon: the CultNet surface. The socket, the sessions and the process, and no rule. The operation envelope both sides speak is huginn-mind's.
  • crates/eureka-state: the client core, HuginnClient::call: one request to a daemon over CultNet RUDP, a deferred answer resolved, and no state. Its huginn binary is the agents' CLI: whoami, view, query and named recipes, admit with read-back, schema.

huginn-mind is live: it opens one instance's store (an owned redb CultCache at <state_root>/minds/<instance>/mind.redb, locked for the mind's lifetime), and refuses a store whose instance document names another instance, whose epoch record is foreign, or whose types are not a mind's. It admits batches of pipeline documents through one commit path: the leaf's bounds, formats and keys, then the organ's cross-document rules (references, in-force status, the resolution matrix, derived resolutions and stewardships), then one compare-and-swap that lands the batch whole with a receipt naming the exact bytes it read and wrote. An exact replay answers with the stored receipt. It reads them back the same way: a document with the facts of its admission joined from that receipt and its status derived at read time, and typed queries over one mind. Status is never stored, and the views derive it through the same rules admission does. Document shape and keys come from eureka-pipeline (crates/eureka-pipeline); the store is CultLib's Rust CultCache.

huginn-daemon opens one mind, binds one UDP socket in that order, and answers every frame on the session it arrived on: one operation per Mind method plus whoami, whose payload is the mind's own types as named MessagePack. A refusal is an answer with a rejected status, never a transport error; an envelope that does not decode is answered with a typed failure and reaches no mind. The two schemas it publishes live in schemas/cultnet/, listed in its index.json, and are pinned to their derivation by a test.

The campaign's cut specs in the mind (eureka-body) and docs/eureka-body-map.md own what each crate does next.

cargo check --workspace
cargo run -p huginn-daemon -- --state-root <abs> --instance <slug> --bind 127.0.0.1:17872 `
  --qdrant-url http://127.0.0.1:6333 --ollama-url http://10.77.0.4:11434 --embedding-model qwen3-embedding:0.6b

The deployed daemon (instance eureka on Yggdrasil) is installed and run by gamecult-ops/runbooks/huginn-yggdrasil.md.

Persona

Huginn's legacy repo Persona lives under .voidbot/. Its state/huginn.cc holds legacy void.* documents and its voice/identity.json names the Persona. The two disagree about jurisdiction; that migration belongs to the portable-Persona work, not to this workspace, and nothing here reads or writes .voidbot/.