Commit graph Huginn/crates/eureka-state/tests
Author SHA1 Message Date
6f66e048a5 huginn sources takes one to eight texts
The CLI sends every positional text as `texts` and never `text`; help says each
is a topic and the lists are fused. Daemon and CLI deploy together. Cut
gamecult-chat:cut_spec:cut-source-query-texts.r1, commit 4.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 16:04:37 +00:00
4674d5f283 huginn: --session falls back to HUGINN_SESSION for admit, import and persona put
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 09:03:50 +00:00
e35181b296 Desk door part A: the unix-socket door, peer uid checked before a byte is read, joined to the one serve loop
desk_door.rs owns who may speak, the socket's life and the frame bounds; Daemon::handle_desk owns which Mind method answers (Answer via desk_answer, the replay flag gating index.committed; Forks and Fork refused Unavailable until desk-door-reads). startup returns Started; run takes the door; its five callers pass it or None. desk_wire::answer_ref is the one spelling of a stored answer's ref.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 20:56:51 +00:00
719b5104f5 huginn-mind: Mind::answer_desk, the counting door for desk answers
Rules 3-8, R1, R2, R4 of the binding spec; counted_answer derives which answer
counts; Door::Desk is the only door that may write a desk_answer, so Admit,
import and derivation refuse it. options_hash sits behind one seam, failing
closed until the bytes are filled; tests use a named fixture hash.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 15:24:08 +00:00
2f165d8d1e huginn sources --front: search only a repo's front-page files
SourceQuery gains `front` (serde default false, so an old client's request
decodes as before). The one owner of the list is sources::FRONT_PAGE_FILES;
the Qdrant filter matches `path` against it with MatchAny on the existing
keyword index, composed with the `repo` condition. The CLI prints the
citation line range as before.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 14:47:47 +00:00
0f417143f7 import: a follow-up or idea the receiver wrote after the import began no longer blocks the resume
Nibu's stopped import of aetheria-release was refused twice over for her own
run's follow-up chat-s4606-4606: by the verb's resume (a record under the root
not imported from the source) and, had that passed, by admission
(ImportOutsideCampaign, a native write under the root). Both now leave a native
FollowUp or Idea alone when it was admitted after the root's first imported
document, share one predicate (`inert_in_window`), and the verb names what it
left in place and leaves it out of the final verification walk. Every other
native kind (a question, a resolution, a ruling, a target) can answer or
resolve a replayed document and still refuses; a collision on a planned key
still refuses. No evict verb: a receipt cannot be unwritten.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 21:28:25 +00:00
Meta Vens
7e2f893439 huginn import tests: the history has four receipts under the root; the brief test uses the testkit's own instance
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 19:18:36 +01:00
Meta Vens
7334c4278d huginn import tests: name the viewing helper apart from the file's own
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 19:18:35 +01:00
Meta Vens
a61586b030 huginn import: end-to-end tests over two live daemons, and the verification walk's differences
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 19:18:35 +01:00
Meta Vens
c76e37280d huginn-mind: a Moved resolution freezes its campaign's root and the receiver replays the history as an import naming its source
The giver: (Campaign, Moved) joins the matrix; a Moved to this mind refuses MoveToSelf and a withdrawn Moved MoveIsFinal; any staged document rooted at a moved campaign, derived ones included, refuses CampaignMoved; Docs::closing_resolution reads every other document under the root closed by the Moved, and the image fans status_changed out so an earlier as_of still reads in force. The oracle derives the same fallback independently.

The receiver: PipelineProvenance.imported_from (optional, absent from every other receipt and from the digest) names the source receipt and the externals the batch cites. An import derives nothing, refuses its own instance, a Moved outcome, and an external this mind holds; a listed external stands in for an absent referent. mind-body persona.rs gains one outcome_words arm for the new variant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 17:47:43 +01:00
Meta Vens
337521f654 recall dispatch tests: box the held view 2026-11-07 12:32:21 +01:00
Meta Vens
9295b4c348 recall dispatch: cited scan without open loops; tie and dotted-slug tests 2026-11-07 12:08:42 +01:00
Meta Vens
28412f0da6 recall dispatch: d2 top-k test 2026-11-07 11:54:23 +01:00
Meta Vens
07b2d124e7 recall dispatch: fix literals, boxed view 2026-11-07 11:51:04 +01:00
Meta Vens
5b469ef54d huginn recall dispatch: the Agent PreToolUse hook appends the in-force neighbours of a brief's cited records; admit's hold check bounded at 10 s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 11:49:48 +01:00
Meta Vens
373d96691f huginn admit: hold a batch once when its rulings or questions have in-force neighbours
cut huginn-admit-hold r2. admit decodes, then asks near::neighbours (the one
neighbour query, for admit now and recall dispatch next) for the nearest
in-force rulings and questions to each of the batch's first three titled
rulings or questions, minus the batch's own ids, the question a ruling answers
and the subject of a Superseded resolution. A neighbour left holds the batch:
exit 6, the neighbours and a token (16 hex of sha256 over the decoded batch and
the agent) printed, nothing sent. The same command with --seen <token> admits
it; any other token is InvalidInput. A trouble during the check prints a note on
stderr and the admission proceeds.

PipelineDocumentSummary::of is public so the neighbours print as header lines.
sha2 joins eureka-state (already in the lock).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 11:35:01 +01:00
Meta Vens
bea5e8eccc huginn CLI: persona get and persona put
persona get prints the stored gamecult.persona_state.v0 document, then its
updatedAt and receipt (absent, exit 1, until the first put). persona put reads
the whole document from a file or stdin and prints Committed <receipt>, or the
refusal (a stale put names the stored updatedAt), exit 1; a document that is
not one JSON object is a usage error and sends nothing. Provenance tool is huginn.
The eureka-state MCP's last unique capability is now in the CLI.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 10:43:36 +01:00
Meta Vens
c1f7d7d8d9 Merge hands/eureka-body-stream-thoughts (e2e0488) into eureka-body/release-reply-path
# Conflicts:
#	crates/mind-body/src/persona.rs
2026-11-07 08:03:05 +00:00
Meta Vens
5aa643a6c2 stewardship names: chat names a steward lists, and the Persona and heartbeat address her by them
address.rs is the one rule for whether a delivery is for a Mind (tag, or a name as a whole word, a listed name exactly as written and a derived or her own in any case); heartbeat's addresses and names_whole_word move into it, the Persona's to_you and own stagger rank call it. eureka-pipeline PipelineStewardship gains names (absent when empty); facts, schemas and golden follow.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 00:51:17 +01:00
Eureka Hands
f65a7449fb thought kind: her stream of thought is a document (cut stream-thoughts step 1)
PipelineThought epiphany.pipeline.thought.v2, instance-rooted, validated as
its chosen candidate; ForeignInstance refusal, Answered-by-FollowUp or Recorded
resolutions, facts, a reads citation role, text index. Schemas, golden sample,
huginn schema list regenerated.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 22:18:47 +00:00
Meta Vens
aab49c5d35 eureka-state: schema list names reply before selection
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 20:42:10 +00:00
Meta Vens
8f5ff3e415 eureka-state: schema list counts the reply kind
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 20:18:59 +00:00
Meta Vens
b63de715ae eureka-state tests: an unknown kind names documents[i].kind
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:47:07 +01:00
Meta Vens
51853c1ac1 eureka-state door: a decode refusal names the field path, never a value
Documents decode one by one through serde_path_to_error, so the refusal says
documents[i].path and what is wrong, in the schema's words: a field name, the
allowed variants, the expected type. Serde's own text quotes the input, so it
is not passed through.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:45:48 +01:00
Meta Vens
e808c619fd eureka-state: one text door; the MCP admit decodes through it
The strict decode that refuses unknown keys by path moves from the huginn
binary to eureka_state::door; the CLI re-exports it and the MCP admit takes
documents as a Value (schema still Vec<PipelineDocument>) and decodes through
it, answering InvalidInput before any call. A research note with extra keys is
refused by path and nothing is stored.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:06:41 +01:00
Meta Vens
7f22da3886 research and idea: two kinds for what a pass finds and what could be, and the recipes known, pass and ideas (eureka-pipeline, huginn-mind, eureka-state)
epiphany.pipeline.research.v2 (one claim, typed sources, no status) and
epiphany.pipeline.idea.v2 (what could be, rests_on / toward), campaign-rooted
as <campaign>:research|idea:<pass>.<label>. Resolutions are the matrix alone;
lineage is Global; roles serves, sources, rests_on, toward; alias pass; index
text without a version bump. No faculty is told to use them yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 15:13:40 +01:00
Meta Vens
5874717c88 huginn-sources: embed before deleting; the reserve gets a CPU's bounds
Source refresh now upserts a repo's new chunks first and deletes what is
left in scope under another commit afterwards, so a failed embed never
removes indexed content (embed-outage-empties-repo). The cursor is still
dropped before the first write.

The pool's reserve endpoints use EmbedBounds::RESERVE (30 s a text, 60 s
floor) instead of the GPU default (reserve-bounded-like-a-gpu).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:54:54 +01:00
Meta Vens
fa5c65c6f4 cli test: the hold of spec B is its own run's question and not A's
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 05:43:30 +01:00
Meta Vens
b1f0654f54 tests: blocked tells a second run's question from the first; a free brief writes no closing note
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 05:42:47 +01:00
Meta Vens
3e48e122af hold: one decider of what a question holds, read once per launch; a dead Self holder no longer stalls the successor; retire is read
s5 findings of cut-self-session-live:
- blocked-recipe-misses-run-held-spec: eureka_state::hold is the one decider
  (a question holds the item it is raised in, or every claim of the run it is
  raised in; an answer of retire keeps holding the claims still in force).
  queue::on_hold and `huginn blocked` both read it.
- hold-read-not-one-snapshot: on_hold returns a Held snapshot that the request
  carries; claimable, queue and the gate read it, none reads it again.
- dead-self-holder-stalls-successor: launch::slot is the one reader of whether
  a holder lives; claimable asks it, a dead holder is closed by the launch and
  the beat's trace says so.
- retire-answer-reopens: launch::retire_answered resolves the claims of an
  answered-retire question Withdrawn; the beat runs it before reading briefs.
- held-note-threshold-unpinned: a test pins the note for exactly one held brief.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 04:11:38 +01:00
Meta Vens
152e315e5d memory: a persistent kind for what a Mind keeps (eureka-pipeline, huginn-mind)
epiphany.pipeline.memory.v2, instance-rooted `<instance>:memory:<label>`:
PipelineMemory with seven sorts (Asked, Decided, Committed, Learned, Did,
Idea, Rapport), her own text, who it is about, where it was learned, whether
directly, what it rests on, a salience that only ranks, and the memories a
consolidating one replaces.

Admission refuses a foreign instance and resolves a memory only Deferred to a
follow-up (an ask taken on), Recorded, Withdrawn or Superseded by a memory.
Memories have their own lineage so supersession stays within one mind. The
read side selects by sort, about (multi-valued) and direct; the index carries
the text; `consolidates` is a citation role.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 15:15:40 +01:00
Meta Vens
bc59cb9025 Merge remote-tracking branch 'origin/main' into eureka-body/heartbeat-joint-lever 2026-10-31 09:53:14 +01:00
Meta Vens
5b920371c5 eureka-state tests: huginn sources end to end through a daemon to a printed citation
The CLI binary asks a real in-process daemon over CultNet; the daemon answers
through sources::search against an in-memory source index and a flat embedder.
Pins the citation line, the repo filter and limit, and the refusal naming both
models when the daemon embeds under another digest (Soul test-gaps). common
serve takes any index sink.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 08:59:16 +01:00
Meta Vens
d77747023e huginn sources: CLI door for SearchSources
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 06:25:26 +01:00
Meta Vens
a6302f0dd9 tests: restore the self_run ceiling and flush tests and the persona DM-room, flag and outcome tests on the usage-only surface; close the red tests; regenerate public_surface.txt; strip stale initiative and dial wording
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 05:58:44 +01:00
Meta Vens
d7b1b1d116 A semantic query returns up to top_k members of its selection, with scores
The mind decides membership (Mind::members) before the index is asked; the
index scores exactly the members (Qdrant has_id + exact) and the page carries
one cosine score per row. Deletes OVERSAMPLE_MAX, the x4 oversample, the
unfiltered VectorIndex::search contract and check_semantic.

Not yet compiled when committed: the first Yggdrasil run follows.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 19:51:29 +01:00
Meta Vens
126a914abb Restore LF line endings in the files my last three commits rewrote as CRLF
The repo stores LF; a scripted edit on Windows wrote CRLF. No content change:
git diff -w d5fddc3 shows only the three commits' real edits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 10:58:14 +02:00
Meta Vens
27e8d58757 huginn CLI whoami prints the persona door state
One bounded line: absent, stored updatedAt=<stamp>, or unreadable; no value
of the document. Test over canned Whoami answers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 10:15:44 +02:00
Meta Vens
d5fddc3a58 Merge origin/main (huginn CLI) into huginn-persona-state
Resolves the eureka-state Cargo.toml comment block to main's, regenerates
Cargo.lock from main's with cargo update -w, adds the Persona and PersonaPut
arms to the CLI's unexpected-answer match and the persona field to the CLI
test MindStatus literals.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 10:15:12 +02:00
Meta Vens
c5af029d20 Tests follow PersonaStatus: the MCP whoami answers in it, a receipt-less planted row is not a door read
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 08:53:05 +02:00
Meta Vens
ea28b8cbc0 Decoder reports field path and error class, never a caller value; status says Unreadable
The shared request decoder (envelope.rs) no longer quotes decoder text or
envelope fields: a refusal names the field path and the class. MindStatus.persona
is PersonaStatus {Absent, Stored, Unreadable}, so whoami answers in the persona
door's own terms.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 08:32:48 +02:00
Meta Vens
1db7ff3946 huginn CLI: decode errors report category and position, never serde's message; a refused read-back is the mind's no; clap behind a default cli feature
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 08:06:56 +02:00
Meta Vens
5ce103d2b2 huginn tests: pin the build sha, the batch bound, blank-line paging, list paths and fact tokens
Kills the seven survivors of the first mutation run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:48:46 +02:00
Meta Vens
055b73e8f8 huginn door: report every lost key across the batch, accept only objects
The strict decode stopped at the first document with a lost key and let
serde read a struct from a JSON array. It now names every lost path in the
batch and refuses a non-object document or selection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:04:43 +02:00
Meta Vens
02cb3dadcd huginn CLI over HuginnClient: whoami, view, query, recipes, admit with read-back, schema
A new bin of eureka-state, crates/eureka-state/src/bin/huginn/: the agents'
shell door to the mind. Text out, typed exit codes, strict decode of
agent-written JSON (unknown key paths refused, never values), the named
campaign-state recipes, and a read-back after every committed admission.
lib.rs, main.rs and tests/mcp.rs are untouched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:01:01 +02:00
Meta Vens
dbdb4e86f8 Huginn holds an instance's persona document, validated and receipted
put_persona replaces the mind's gamecult.persona_state.v0 whole through the
commit primitive: schema-valid against the published file, personaId is the
instance, canonical provenance, CAS on updatedAt, monotone updatedAt. The
document is an opaque seventeenth stored type, one per mind. Wire operations
persona_get and persona_put, MindStatus.persona, HuginnClient methods and the
eureka-state persona tools. Published wire schemas follow in the next commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 05:30:48 +02:00
Meta Vens
44c010c9da Leaf: CodeLocation.symbol and CutSpec.reads, additive at epoch v2 through the value_types! = absent marker
Adds Absent, Symbol, ReadAnchor and read_window_is_bounded, the marker in
value_types!, the workspace fixtures and the reads admission test. The
golden file and the six published schemas are not regenerated yet, so the
golden, schema and wire-schema tests fail at this commit (it builds).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:29:53 +02:00
Meta Vens
c46b0ec183 Rename the pipeline leaf to eureka-pipeline and take it as a path dependency
Package and lib become eureka-pipeline / eureka_pipeline; the crate joins the
workspace; huginn-mind's git dependency on GameCult/Epiphany is replaced by
the path, and Cargo.lock is regenerated (the Epiphany source entry is gone).
Every epiphany_pipeline mention in huginn-mind, huginn-daemon and eureka-state
is renamed. The schema-publication test reads ../../schemas/cultnet. The
leaf's license-file key (../LICENSE, which Huginn has no file for) is dropped.
Type ids, the epoch and every schema_id string are untouched. Schemas README
and the pipeline section of schemas/cultnet/README.md are rewritten for the
new home; README and AGENTS no longer say the leaf is pinned by git. New test:
the catalogue lists exactly the schema files beside it.

Not yet built or tested; verification follows on Yggdrasil.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:09:16 +02:00
Meta Vens
f29a7ce7f0 huginn-mind: tighten the refusal and read-back tests (Soul s1 findings)
snapshot_admits_and_reads_back now counts pipeline envelopes apart from the
loop, asserts validate() and pipeline_key == stored key for every one, admits
a resolution for every stuck finding and a withdrawal for every unwithdrawable
resolution, and fails with the id named on any refusal.

The refusal tests assert the exact leaf refusal (field and value from
pipeline_key) at Mind::admit and at the helper, and eureka-state gains a
tool-level test that the typed refusal reaches the result intact.

Tests only; no production code changes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-01 12:10:19 +02:00
Meta Vens
cd3dfc0268 eureka-state: an encode failure is not retryable, and a non-UTF-8 endpoint is pinned
A request that fails to encode is a defect in this client, not a transport
failure, so it is ClientError::Unencodable, typed Unencodable at the tool,
instead of the retryable Unavailable. A test reports a non-UTF-8
HUGINN_ENDPOINT as such.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 04:55:05 +02:00