Describe the daemon that exists instead of the stub that does not

`huginn-daemon` serves a mind, so the README and AGENTS say what it serves,
over which envelope, in which order it starts, and where its two published
schemas live. `eureka-state` is the remaining stub. The command block gains
the daemon's own invocation.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-09-16 23:00:28 +02:00
commit a235304ae5
2 changed files with 29 additions and 14 deletions

View file

@ -16,13 +16,15 @@ Studio's job, not Huginn's.
runtimes come from `F:\Projects\CultLib\packages`. `huginn-mind` is live:
it persists, admits and reads back an instance's mind, queries and derived
status included, over `cultcache-rs` and `epiphany-pipeline` pinned by git
rev. `huginn-daemon` and `eureka-state`
are stubs with no dependencies; nothing here publishes or connects yet.
rev. `huginn-daemon` serves one mind over CultNet RUDP through `cultnet-rs`
at the same rev, and reaches the leaf and the store type through
`huginn-mind` so one crate pins each revision. `eureka-state` is a stub.
- Owned: an instance's memory documents, their admission and the read side
that derives their status, in `huginn-mind`,
over a redb CultCache store at `<state_root>/minds/<instance>/mind.redb`.
Their CultNet publication is owned here and not built; `huginn-daemon` is a
stub.
over a redb CultCache store at `<state_root>/minds/<instance>/mind.redb`;
and their CultNet surface in `huginn-daemon`, which owns the socket, the
sessions, the process and the operation envelope, and no rule. The two wire
schemas are published from `schemas/cultnet/`. There is no index yet.
- To depend on: Qdrant, directly, once retrieval exists. Unreachable Qdrant is
to be a loud refusal, never a fallback store. No crate connects to it yet.
- Forbidden: a second writer of mind state; mind state in version control;

View file

@ -11,10 +11,12 @@ Upstream: `https://github.com/GameCult/Huginn.git`
- 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.
- Memory documents are CultCache state. `huginn-mind` persists them through
CultLib's Rust CultCache into a redb store at
`<state_root>/minds/<instance>/mind.redb`. `huginn-daemon` serves one such
mind over CultNet RUDP: admission and the read side ride
`cultnet.operation_request.v0` and `cultnet.operation_response.v0`, and the
two wire schemas answer a schema catalog request.
- 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.
@ -30,8 +32,8 @@ 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/huginn-daemon`: the CultNet surface. The socket, the sessions, the
process and the operation envelope, and no rule.
- `crates/eureka-state`: a stub. It will carry typed state for the Eureka
pipeline; today it holds none.
@ -50,12 +52,23 @@ 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.
`huginn-daemon` opens one mind, binds one UDP socket in that order, and
answers every frame on the session it arrived on: one operation per `Mind`
method plus `whoami`, whose payload is the mind's own types as named
MessagePack. A refusal is an answer with a `rejected` status, never a
transport error; an envelope that does not decode is answered with a typed
failure and reaches no mind. The two schemas it publishes live in
`schemas/cultnet/` and are pinned to their derivation by a test. There is no
index yet.
`eureka-state` is a stub; the campaign's cut map in
`Epiphany/notes/eureka-pipeline-state-cut.md` owns what each crate must do
next.
```powershell
cargo check --workspace
cargo run -p huginn-daemon -- --state-root <abs> --instance <slug> --bind 127.0.0.1:17872
```
## Persona