- Rust 98.4%
- C++ 1.2%
- Python 0.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
A hand-off's derived withdrawal read whichever stewardship `stewardships_of` listed first. While the withdrawal is being derived the hand-off's own is excluded from what stands, so two assignments are in force at once: the one this hand-off withdrew, and whatever stewards the repo now. Key order does not tell them apart -- once a repo has changed hands ten times, `n11` sorts before `n2` -- so replaying an old hand-off derived a second withdrawal of a standing assignment and died on the identity collision instead of answering with its first receipt. `stewardship_of` now takes the stewardship whose withdrawal already carries this hand-off's key, the same content match the ruling's answer and the receiving side's assignment already use, and falls back to the one in force. The comment claiming at most one is ever in force said the opposite of what the exclusion does; it is gone. `later_than`'s resolution arm is deleted. Nothing could reach it: the Q19 cap refuses a withdrawal whose subject is a resolution of a resolution before the reinstatement rule asks what stands later, so the arm was dead and the entry Soul wrote against it could not fail. Dead code with a test that cannot reach it is what subtraction is for -- an arm no caller enters is a rule nobody can break and nobody can rely on, and leaving it would have bought a green mutation line for a branch the machine never runs. The two doc sentences that named the resolution scope go with it. Four fixtures close gaps where the code was right and the suite could not tell it from something weaker: a ruling answering a reopened question takes the next sequence rather than reproducing the withdrawn answer's; a cut spec's revisions are read within its own cut, so cut B's second does not block reinstating cut A's first; `later_in_force` counts only what stands, and reads the batch, so an assignment derived beside a withdrawal still blocks it. Entries H62-H67 pin all six. H1-H67 killed by their own tests, M0 green; 46 tests pass with no warnings; `cargo check --workspace` clean. 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/.