Commit graph Huginn/crates/eureka-state
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
e939d246b8 Source query takes texts: wire field, door and published schemas
SourceQuery gains `texts` (one to eight, SOURCE_TEXTS_MAX) beside the
transitional `text`; check() refuses neither, both, more than eight and blank
entries, naming `texts`. SourceHit.score documents cosine versus reciprocal-rank
sum. Published request and response schemas regenerated. Cut
gamecult-chat:cut_spec:cut-source-query-texts.r1, commit 1.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 15:59:52 +00:00
c2f251cb26 huginn-mind: a Steward ruling is selected by decider and repo, indexed by her words, and printed with who decided it
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 11:56:53 +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
583d6f52b7 desk: header facts derive whether an answer counts at the read's snapshot; refusals keep what was sent
PipelineFacts::DeskAnswer gains counts, derived through counted_answer over the
read's Docs::at(image, as_of); the stored outcome name stays the write-time record.
DeskOutcome::Refused carries the retraction target as sent; the record's choice is a
Short kept as sent (a choice_invalid choice is no label), and an illegal retraction
form keeps its choice and note. body_sha256 form unchanged. Schemas regenerated.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 17:38:36 +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
3b35fb8bae Import: order the use list, pin the later-batch collision, state it in the window_writes doc
A follow-up the receiver wrote natively, closed, and a later batch replays is inert to the
daemon now and refused as an identity collision when the batch arrives.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 12:05:24 +00:00
0c4e700b9e Import: the resolution of a follow-up or idea the receiver wrote is inert in the window
inert_in_window covered FollowUp and Idea only, so a receiver's own resolution
of such a record, admitted after the import began, refused the rerun in both
the tool (resume/window_writes) and the daemon (root_holds_native_write).
A Resolution whose subject is a follow-up or idea the plan does not replay
touches nothing planned and now stays beside the replay. One predicate, both
callers; the resolution of a replayed follow-up, or of any other kind, still
refuses.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 11:48:19 +00:00
9958555d71 import: an imported record never cites or resolves the receiver's own native document
Soul F1: the window left open by `inert_in_window` let a later imported record
withdraw or cite the receiver's native follow-up. Admission now refuses an
imported document that cites or resolves a native document of its own root
(another root's native documents are cited as ever). Stale docs and the import
help name the amended rule.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 21:43:00 +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
fd19f13eb1 huginn import: the verification test names the field path as the document spells it
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
5f67eb1188 huginn import: the receiver's Self replays a moved campaign from the giver's mind
The verb walks the giver (Query only), plans with huginn_mind::plan, walks her own root to
resume by what she holds, admits one batch per source receipt with imported_from, and ends
with a verification walk. Settings::source builds the giver's client from explicit flags.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 19:18:35 +01:00
Meta Vens
c4d38bcea5 huginn view: the header names an imported document's source and a moved document's receiver
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 17:47:43 +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
c8b338598c recall cited(): skip non-standing positions before scanning the word run, so one long run costs O(n) not O(n^2); a 1 MiB run test
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 12:58:03 +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
a34d54985b recall dispatch: block test budgets 2026-11-07 11:52:08 +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
3ef5da5e0d reply kind: one result of her Self session, as its actuator heard it (eureka-pipeline, huginn-mind, schemas, golden)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 20:17:45 +00:00
Meta Vens
4a7bb5fafc eureka-state door: a custom message with an expected clause is not passed on
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 23:03:19 +01:00
Meta Vens
27ab1fcbcf eureka-state door: pin schema_words by behaviour
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:58:42 +01: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
eeeded257b eureka-state door: drop the unused Display on Refusal
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:20:56 +01:00
Meta Vens
5b6305c522 eureka-state door: tidy test module
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:10:10 +01:00
Meta Vens
1aa3176796 eureka-state: close the moved door's test modules
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:07:59 +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
34db493010 huginn pass: the help promises no key order, since a pass spanning batches comes back grouped by batch (eureka-state)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 15:43:16 +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
cb86f58a7d wear-facts: a Mind's first line shows the wear her own mind holds, specs with no report, open Soul findings and quiet campaigns on what she stewards, each leading to a record she can open (squash of hands/eureka-body-wear-facts ab61a53..6014554; Soul s1-s2)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 07:06:16 +01:00
Meta Vens
545d6319bf repo-activity: a Mind hears of changes in her stewarded repos, on her first line and by one organ notice on change; a repo the anonymous read cannot reach is named, never a failed read (squash of hands/eureka-body-repo-activity 5a294ed..eee0b14; Soul s1-s4)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 04:54:26 +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
79e4cac5fd blocked selects the held questions by key alone; the retire test pins which run's claims an answer retires
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 06:20:11 +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