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 333e1c4314 Give the two failable loosenings entries of their own
Cut 9's entries file recorded three weakenings as unfailable. Two of them
are reachable in this Body, so they are entries now:

- The `semantic` check below `Reader::new` changes the answer for a store
  the reader refuses -- a doubled receipt, a row that does not decode --
  from the semantic refusal to the integrity one. `V8L` is that move, and
  the semantic test asks a semantic query of a mind whose receipts name one
  write twice.
- `resolutions_of` comparing a subject by `id` alone is reachable because
  the read side validates no `PipelineRef` it is handed. `V10L` is that
  comparison, and the subject-history test asks for a `Ruling` ref carrying
  a question's id after that question has ten resolutions.

`assignments_of` ignoring the instance stays recorded as unfailable, with
A5 and the derivations scoped to this mind as the reason.

`specs_without_report` compares the citation by exact id, but every fixture
report cited `.r1`, so the test could not tell an exact id from a cut
prefix. cut-9 now carries a report of the revision it superseded and cut-12
is a superseded revision no report names, so standing and citation are each
still visible on their own, and `V13L` compares by cut prefix.

Fork, not closed here: Soul asked that `view` and `history` validate the
ref through the leaf and refuse a malformed one typed rather than answering
empty. The leaf's `Bounded` is `pub(crate)` at the pinned rev d5a36c2, so
`PipelineRef::validate` cannot be called from this crate and the fix is an
Epiphany change. The history test pins today's empty answer and names the
reason.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-16 22:19:42 +02:00
.voidbot Document Huginn repo swarm wiring 2026-06-21 15:51:46 +01:00
crates Give the two failable loosenings entries of their own 2026-09-16 22:19:42 +02:00
tools Give the two failable loosenings entries of their own 2026-09-16 22:19:42 +02:00
.gitignore Add the empty Rust workspace 2026-09-16 15:11:05 +02:00
AGENTS.md Read a mind: views, queries, open items and history 2026-09-16 21:22:41 +02:00
Cargo.lock Take the sequenced keys and make in force mean what it says 2026-09-16 19:28:17 +02:00
Cargo.toml Add the empty Rust workspace 2026-09-16 15:11:05 +02:00
README.md Read a mind: views, queries, open items and history 2026-09-16 21:22:41 +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, the one live crate, persists them through CultLib's Rust CultCache into a redb store at <state_root>/minds/<instance>/mind.redb. Publishing them over CultNet is huginn-daemon's, and that crate is a stub: nothing here publishes yet.
  • 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: a stub. It will carry the CultNet surface and serve loop; today it holds neither.
  • 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 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/.