2026-06-05 12:23:59 +01:00
|
|
|
# Huginn
|
2026-05-06 03:11:02 +01:00
|
|
|
|
2026-09-16 15:12:18 +02:00
|
|
|
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.
|
2026-05-06 03:11:02 +01:00
|
|
|
|
2026-06-21 15:51:46 +01:00
|
|
|
Upstream: `https://github.com/GameCult/Huginn.git`
|
|
|
|
|
|
2026-06-05 12:42:30 +01:00
|
|
|
## Authority
|
2026-05-06 03:11:02 +01:00
|
|
|
|
2026-09-16 15:12:18 +02:00
|
|
|
- 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.
|
2026-06-21 15:51:46 +01:00
|
|
|
|
2026-09-16 15:12:18 +02:00
|
|
|
Generic `.cc` inspection is not Huginn's job. CultCache Studio inspects and
|
|
|
|
|
edits `.cc` state. Huginn reads and writes minds.
|
2026-06-21 15:51:46 +01:00
|
|
|
|
2026-09-16 15:12:18 +02:00
|
|
|
## Layout
|
2026-05-06 04:41:11 +01:00
|
|
|
|
2026-09-16 15:12:18 +02:00
|
|
|
A Cargo workspace of three crates:
|
2026-05-06 04:41:11 +01:00
|
|
|
|
2026-09-16 15:12:18 +02:00
|
|
|
- `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.
|
2026-05-06 04:41:11 +01:00
|
|
|
|
Open a mind fail-closed over an owned redb store
Cut 8, Huginn half, commit 1 of 4: the store port, the opener and the
identity rules. `huginn-mind` gains its dependencies (`cultcache-rs` at
Epiphany's pin `a0813c6`, `epiphany-pipeline` at `a65c6420`, the Epiphany
half of this cut), `store.rs` with the one narrow `MindStore` trait that
injects compare-and-swap, `mind.rs` with `Mind::open` and `open_with`, and
`refusal.rs` with the organ's refusal vocabulary.
The opener refuses in order and attaches nothing until every gate passes:
a foreign type, a foreign epoch, a missing identity, an identity naming
another instance. The path under the state root is derived from the slug;
the `instance` document is the authority, so a store copied into another
instance's directory is refused. The owned store's exclusive lock is the
single-writer mechanism: a second `Mind::open` of the same path is
`MindAlreadyOwned`.
The receipt type and the two provenance shapes (`Faculty`,
`PipelineProvenance`) land here rather than in the later commits because
the opener registers the receipt's type id, and their only consumer is the
receipt; the commit primitive itself is the next commit. `MindRefusal`
carries a serde remote definition of the leaf's `PipelineRefusal`, which
derives neither `Serialize` nor `JsonSchema` at the pinned rev; it is
compiled against the leaf's type so a leaf change breaks the build rather
than drifting.
`Cargo.lock` is regenerated and gains 90 packages. The map predicted a
CRLF-to-LF rewrite of the whole file; the file was already LF in the index
and stays LF, so the diff is additions only.
README and AGENTS now say `huginn-mind` is live and the other two crates
are stubs.
Builds: `cargo check -p huginn-mind --lib --tests` and `cargo test -p
huginn-mind --lib` (4 tests) pass. This commit carries dead-code warnings
on the store and cache accessors and the refusing test store; commits 2 and
3 consume them.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-16 17:04:23 +02:00
|
|
|
`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.
|
2026-06-21 15:51:46 +01:00
|
|
|
|
|
|
|
|
```powershell
|
2026-09-16 15:12:18 +02:00
|
|
|
cargo check --workspace
|
2026-06-21 15:51:46 +01:00
|
|
|
```
|
|
|
|
|
|
2026-09-16 15:12:18 +02:00
|
|
|
## 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/`.
|