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 a4c5b79d52 Land a batch whole with a receipt naming its exact bytes
Cut 8, Huginn half, commit 2 of 4: the commit primitive in `receipt.rs`.
`candidate` is the one construction site of a receipt: its id is the
digest of `(instance, strong_reads, writes)`, each list in identity order,
computed before anything is stored so admission can look up an exact
replay. `replay` finds a stored receipt with that id and checks its reads
and writes equal the candidate's. `commit` is one compare-and-swap over
the store, the strong reads as its expectation and the writes plus the
receipt as its replacements; the image is re-pulled either way, and a lost
swap is diffed against the fresh image and typed `Conflict`.

Provenance and `committed_at` are on the receipt and outside the digest,
so the same bytes replayed by another faculty in another session answer
with the first receipt. The store requires every expected identity to be
replaced, so a strong read is re-inserted unchanged beside the writes, as
Epiphany's receipt path does.

Builds: `cargo check -p huginn-mind --lib --tests`, `cargo test -p
huginn-mind --lib` (4 tests). Dead-code warnings remain on the primitive
and the refusing test store until admission consumes them in the next
commit.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-16 17:05:30 +02:00
.voidbot Document Huginn repo swarm wiring 2026-06-21 15:51:46 +01:00
crates Land a batch whole with a receipt naming its exact bytes 2026-09-16 17:05:30 +02:00
.gitignore Add the empty Rust workspace 2026-09-16 15:11:05 +02:00
AGENTS.md Open a mind fail-closed over an owned redb store 2026-09-16 17:04:23 +02:00
Cargo.lock Open a mind fail-closed over an owned redb store 2026-09-16 17:04:23 +02:00
Cargo.toml Add the empty Rust workspace 2026-09-16 15:11:05 +02:00
README.md Open a mind fail-closed over an owned redb store 2026-09-16 17:04:23 +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 .cc state. Huginn persists them through CultLib's Rust runtime and publishes them as typed documents over CultNet.
  • Huginn depends on Qdrant directly for retrieval. When Qdrant is unreachable Huginn refuses loudly; it does not fall back to a second store or a second writer.
  • 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, and admission of memory documents.
  • crates/huginn-daemon: the CultNet surface and serve loop.
  • crates/eureka-state: typed state for the Eureka pipeline.

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. Document shape and keys come from epiphany-pipeline; the store is CultLib's Rust CultCache. huginn-daemon and eureka-state are stubs; the campaign's cut map in Epiphany/notes/eureka-pipeline-state-cut.md owns what each crate must do next.

cargo check --workspace

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