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 4f7e3b5edc N3 and N4: one generated separator test, and gate fixtures that vary
operation and runtime id

N3 (medium-low). One generated test, mind::tests::every_separator_variant_
of_a_declared_name_is_foreign_not_the_mind, replaces the separator-only
fixture pairs' narrower coverage. A base name carrying all three separator
bytes a Slug permits at three non-adjacent positions yields 26 same-length
variants by cartesian substitution, plus 3 dash-padded and 1 doubled-dash
variant (30 total); every one must be refused as ForeignInstance. Kills
four mutants of require_instance's comparison: folding `_`/`.` into each
other on both sides, folding `_` to `-` on the mind's own side alone,
trim_matches('-'), and collapsing `--` to `-` (N3a-d).

N4 (low). The size-gate boundary fixtures (the_gates_boundary_* in
serve.rs) held operation and source_runtime_id fixed at "view" and
"huginn-yggdrasil", varying only message_id -- so a formula of message_id's
length alone, shaped to fit exactly the suite's two lengths, would never be
wrong there. synthetic_with_id and sized_exactly_with_id are now thin
wrappers over synthetic_full/sized_exactly_full, which also take operation
and runtime_id; a new test, the_gates_boundary_holds_across_operation_and_
runtime_id, holds the boundary at view and open_items over two runtime
ids. Kills two coincidental overhead formulas that fit the old fixture's
two message_id lengths by construction: payload+228+id.len()+(id.len()>31)
(N4a) and payload+228+id.len()*38/37 (N4b).

All three suites rerun clean: cut8 67/67, cut9 38/38, cut10 71/71 (65 plus
N3a-d and N4a-b), every M0 green, restores hash-verified. cargo test
--workspace: huginn-mind 62/62, huginn-daemon 19/19.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 06:15:30 +02:00
.voidbot Document Huginn repo swarm wiring 2026-06-21 15:51:46 +01:00
crates N3 and N4: one generated separator test, and gate fixtures that vary 2026-09-22 06:15:30 +02:00
schemas/cultnet Refuse an answer that will not fit, by name 2026-09-17 00:08:10 +02:00
tools N3 and N4: one generated separator test, and gate fixtures that vary 2026-09-22 06:15:30 +02:00
.gitignore Add the empty Rust workspace 2026-09-16 15:11:05 +02:00
AGENTS.md Describe the daemon that exists instead of the stub that does not 2026-09-16 23:00:28 +02:00
Cargo.lock Fourth fix batch: fill N1 in its owner, and correct two ledger claims 2026-09-22 05:14:34 +02:00
Cargo.toml Add the empty Rust workspace 2026-09-16 15:11:05 +02:00
README.md Describe the daemon that exists instead of the stub that does not 2026-09-16 23:00:28 +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

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 is to depend on Qdrant directly, refusing loudly when Qdrant is unreachable rather than falling back to a second store or a second writer. No crate opens that connection yet.
  • 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 three crates:

  • crates/huginn-mind: storage, identity, admission, and queries and derived status over memory documents.
  • crates/huginn-daemon: the CultNet surface. The socket, the sessions, the process and the operation envelope, and no rule.
  • crates/eureka-state: a stub. It will carry typed state for the Eureka pipeline; today it holds none.

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, typed queries over one mind, a campaign's open work, and a subject's or a repo's history. Status is never stored, and the views derive it through the same rules admission does. Document shape and keys come from epiphany-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/ and are pinned to their derivation by a test. There is no index yet.

eureka-state is a stub; the campaign's cut map in Epiphany/notes/eureka-pipeline-state-cut.md owns what each crate must do next.

cargo check --workspace
cargo run -p huginn-daemon -- --state-root <abs> --instance <slug> --bind 127.0.0.1:17872

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/.