- Rust 98.4%
- C++ 1.2%
- Python 0.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Two rules Soul's follow-up pass falsified, both in admission. A batch that derives a write could not be replayed. `derive` set every derived sequence to `latest + 1` over an image that already held the first admission's derived record, so the second admission produced a different document, A8 refused it -- `AlreadyResolved` on the source side, and `AlreadyStewarded` on the receiving one -- and A9 never saw the digest it would have recognised. `derive` now reproduces the record it already made when image or batch holds one, found by what the derivation writes into it: a resolution `Answered` by this ruling, a withdrawal whose reason is this hand-off's key, an assignment whose note is. The same document comes back byte for byte, A9 answers with the first receipt, and only a batch that never landed takes `latest + 1`. A withdrawal could re-raise an earlier record over a later one, which is the rationale Q19 A's cap rests on and the cap alone does not carry. Withdrawing a resolution puts its subject back in force, so a repo handed away and handed back could have the hand-off's withdrawal withdrawn and stand under two assignments at once; a supersession withdrawn while the revision that superseded it stood left two revisions in force, which is what the finding rule reads for its invariant vocabulary. `WouldReinstateOverLater` refuses that: the record the withdrawal would reinstate, against anything in force and later in the scope that record is sequenced in -- `(instance, repo)` for a stewardship, the subject for a resolution, the campaign for a target and the cut for a cut spec. Four tests, one per fix and kind: the ruling's resolution and both sides of a hand-off replayed to `AlreadyAdmitted` with the first receipt and no second receipt in the store; the retaken repo and the superseded revision refused, with the later record still the only one in force. Four more tests for rules the code already held and the suite could not tell from weaker ones: a sequence gap refuses on both sequenced kinds rather than only a taken sequence; the latest sequence counts the batch as well as the image; the Q19 cap reads a chain landing in one batch; and the hand-off's second withdrawal of one assignment takes the next sequence, not `1`. 41 tests, 0 warnings. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> |
||
| .voidbot | ||
| crates | ||
| tools | ||
| .gitignore | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| README.md | ||
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 ishuginn-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, and admission of 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.
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/.