Commit graph Huginn/crates/huginn-mind
Author SHA1 Message Date
d08b8880ff Desk feed door: the door withholds account ids from non-deciders (proposed shapes, CultLib change owed)
Persona's ruling (follow-up chat-mind-20261111T150417226Z-t167): a
reader is a decider when subject is in the call's deciders; any other
reader gets no decider or answerer ids, only counts, and Huginn does it
because the card is opaque to Bifrost. CultLib's closed card (deciders
minItems 1, no count) and non-null answerer cannot carry it yet, so the
doc names the proposal to Libby and the fixtures add clearly synthetic
card fragments and a proposed non-decider record, with a test that no
account id appears in a non-decider's bytes and a decider keeps them.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 17:38:52 +00:00
da90d7e74e Desk feed door: account ids are lowercase D-format UUIDs; fixtures and a test pin it
subject, deciders and answerer are Bifrost UserAccount ids (lowercase
D-format, as Bifrost's validator requires and as Huginn names
RequestId). The fixtures used "7"/"12"; they now carry synthetic UUIDs,
and a test pins the grammar and refuses Matrix ids, emails and handles.
The doc states that Huginn's door does not refuse other shapes yet (owed
by cut-desk-feed-listing.r4) and that card.deciders echoes the ids.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 17:35:49 +00:00
650e5e262e Desk feed door doc: read-form fork_too_large, Refused shapes, fork source, gate not live
Soul pass on 66e6fe8: document and fixture the read form of
fork_too_large (live on main; CultLib limitation 13 is stale), the
ResponseTooLarge 503 and a unit-variant Refused; say that only operation
messages have sorted keys, what failure diagnostics and the schema
catalog reply are, where forks come from, and that the listing gate is
not live (no receiver on a Mind with private questions before
cut-desk-feed-listing). Fixtures use a held fork id, synthetic record.
.gitattributes keeps .bin/.msgpack binary and .hex LF.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 17:14:27 +00:00
66e6fe8d7d Desk feed door: list/read wire contract and golden fixtures for Bifrost
docs/desk-feed-door.md states the list and read wire already on main
(frame, CultNet envelope, named MessagePack payload), the per-Mind
peer-checked socket, 503 for the addressed Mind only, the raw-answerer
trust boundary (Bifrost masks), raised_at as ruled by CultLib (card
bytes not pinned until the re-pinned card vectors land) and the planned
listing gate (default not listed).

crates/huginn-mind/tests/desk_feed_fixtures.rs writes the fixtures with
Huginn's own encoders and checks them; HUGINN_WRITE_DESK_FIXTURES=1
rewrites. No card bytes in any fixture.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 17:03:12 +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
a26bce249d persona: a rule's words are a clause of her own line outside quotation, its campaign is checked before any effect, a co-stewarded repo is not a rule, and the repo fault names her repos; tests pin the survivors
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 12:26:47 +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
aae8fe2571 Vectors re-vendored from CultLib de8a062a; the answerTooLarge vector replays over a stale answer
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 02:13:48 +00:00
711514602b Refusal replay is a property over the vectors' cases; the vector's error string is Huginn-independent
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 01:34:57 +00:00
9d0a30947a Vectors re-vendored from CultLib f6c9bf5f; replays of short pages and fork_too_large refusals; the refusal-text replay fails on a real disagreement
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 01:32:59 +00:00
4c1f247898 Desk door: a read of one fork past the reply cap is fork_too_large naming the fork (no order, no cursor)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 01:28:57 +00:00
cdc21dd396 Desk door: fork_too_large at order 0 says the list ends instead of naming c0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 01:03:42 +00:00
c2aef3bc58 Desk door: DeskForkTooLarge becomes the not-stored refusal fork_too_large (list only), text names fork id and order; schemas regenerated
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 00:56:36 +00:00
9e7dca2716 Desk reads: order is a unique 0-based rank by (admission, key); pages hold at most limit and stop at the byte budget; a lone oversize first entry is the named refusal with its order; vectors re-vendored from CultLib 9d6ee72e
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 00:36:48 +00:00
288d17cad3 Desk reads: order is a unique 0-based rank; failing tests first (batch of 64 pages, rank stability, gaps, lone oversize, vectors replay); DeskForkTooLarge names the order
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 00:31:57 +00:00
aeeb36ad2a Desk answer: delete the replayed flag nobody read; tests assert that a replay commits nothing
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 00:06:27 +00:00
31cc69922e Desk reads: a page fills to the response budget and never splits a same-order group
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 00:05:08 +00:00
e9757d7f45 Desk reads: page budget and same-order groups, failing tests first (DeskForkTooLarge, DESK_PAGE_BUDGET; the fill is not yet written)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 00:03:06 +00:00
707642bd54 Desk reads: Mind::desk_forks and desk_fork project card, record and entry at one snapshot
Newest first by admission ordinal, cursor strictly below, counts over the showable set, limit 0 is
counts and stamp. Whole record to the peer-checked socket; the trust boundary is pinned in the
desk_door module doc and the DeskRequest/DeskResponse docs. Published schemas regenerated.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 23:57:27 +00:00
a37bd4f85f Desk reads: the wire types, the request fields and the failing tests (stub reads answer fork_unknown)
Types ForkCard/Record/Entry/List, ForkCursor and ForkLimit validated at decode, DeskRequest::Forks
gains status/cursor/limit flat, DeskResponse gains Forks and Fork, the daemon dispatches to
Mind::desk_forks/desk_fork (stubs). Vectors vendored at CultLib e57fbaee. The tests pin the rules
the next commit implements; DESK_READS_UNBUILT and its test are gone.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 23:50:27 +00:00
14a914a634 Desk wire envelope delta: decode refuses an empty decider list (minItems 1)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 20:44:11 +00:00
0e590f3638 Desk wire envelope delta: failing tests first (empty deciders refused at decode, minItems 1, refusal round trip)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 20:43:31 +00:00
a19fc5b494 Desk wire envelope: DeskRequest with Libby's wire names, deciders per call (max 64), generic envelope cores, desk schemas
envelope.rs cores are generic over service id, schema and payload; the mind's five functions and the desk's five instantiate them. desk_answer's attribution parameter is authority. huginn.desk_request.v1 and huginn.desk_response.v1 are derived and pinned.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 20:31:21 +00:00
ab1b150d2f Desk wire envelope: failing tests first (deciders 64/65, wire names, no crossing, frame, schemas)
The desk request, response, envelope instantiations and constants do not exist yet; these tests name them and do not compile.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 20:28:16 +00:00
7550514dcf Desk wire: any bad fork id is fork_unknown, including the key and campaign the Mind derives from it
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 19:57:34 +00:00
c64ce59c36 Desk wire tests: a stored refusal and a stored revision replay under an empty decider list
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 19:56:54 +00:00
bc6be42ae9 Desk wire tests: the replay's id map is asserted one-to-one
S11 applied with the sequential check off and seen to fail on it. Finding desk-wire-replay-id-map-not-injective.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 19:23:25 +00:00
fc25fc925b Desk wire tests: a key outside its fork's n<seq> form projects Unavailable; the conversion round-trips over many sequences
Soul's S12 (a second converter that agrees on every legal key) applied and seen to fail. Finding desk-wire-second-converter-evades-grep.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 19:23:03 +00:00
c23c415166 Desk wire tests: request id, retracts, note, choice and Unavailable pass through as sent
Padded, cased and trailing-junk spellings added to the existing tables; Soul's S1, S8, S9, S10 each applied and seen to fail. Finding desk-wire-pass-through-unpinned.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 19:22:29 +00:00
ba6d90c7ad Desk wire tests: as_of pinned on refused and uncounted answers; the gate tried with a retraction and an illegal form
Kills Soul's S2, S3 and S5 (each applied and seen to fail). Finding desk-wire-asof-and-gate-thinly-pinned.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 19:21:39 +00:00
83107b6f3d Desk wire: an over-long fork id is fork_unknown, pinned by exact field
Her vectors hold no over-long fork id (deviation recorded). Finding desk-wire-long-fork-id-body-invalid.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 19:20:50 +00:00
a3d788fa72 Desk wire: the nullable keys her schema requires must be sent
Finding desk-wire-required-keys-optional.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 19:20:10 +00:00
905cdd6793 Desk wire: the showability gate no longer shadows a stored answer's replay
answer_desk's (answerer, request_id) lookup is now bound_answer, pub(crate) in desk.rs, and
Mind::desk_answer asks it so the gate runs only when nothing is stored. Finding
desk-wire-gate-shadows-replay.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 19:19:16 +00:00
0a9d69679c Desk wire: repin Libby's vectors to CultLib 6231ecad; replay compares counted_answer_id and the refused target exactly; digest goldens pinned from the file
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 18:50:19 +00:00
75155b3b43 Desk wire tests: a replayed revision keeps its stored word while it counts
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 18:44:37 +00:00
3936076629 Desk wire: clippy-clean test spelling and the contract named without the card word
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 18:37:22 +00:00
e84c7130dd Desk wire tests: Libby's 53 replayable scenarios through Mind::desk_answer, with the named target deviation pinned
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 18:35:21 +00:00
80697c959a Desk wire tests: the showability gate, byte bounds, request id pass-through and closed keys
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 18:34:54 +00:00
52a18ae3cb Desk wire tests: Libby's request, refusal and answer vectors byte for byte; projection, counts, conversion and refusal mapping
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 18:34:06 +00:00
2062902c80 Desk wire: Libby's answer documents, the one n<seq> conversion, the projection and Mind::desk_answer
Vendors fork-card-vectors.json at CultLib 8ca1d184 and retires the options-hash file it contains.
answer_desk's dead-code allowance goes: desk_answer is its live caller. No card is built here.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 18:31:27 +00:00
2d99e6ee6c Desk digest covers the illegal form's retracted flag; pin the s4 refusal bounds
body_digest writes retracted for the illegal form only, so forms (i) and
(iii) no longer share a digest; desk_steps refuses a value that is no
illegal form as body invalid. Tests pin the three illegal goldens, the
200-byte target, choice and Refused.retracts bounds, case-sensitive
labels and fork_closed before bad_retraction.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 18:07:10 +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
21674e134a desk: look up the retry before the probe validates
A bound (answerer, request_id) replays its stored outcome without re-running
probe validation; a malformed id binds nothing and still meets the probe.
Comment on the choice bound now says a Short (200 bytes).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 17:17:51 +00:00
e70a0fe13b huginn-mind: pin the faculty alias values to Faculty's serde names
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 17:08:40 +00:00
b4845aedcd huginn-mind: illegal retractions and non-label choices are stored refusals; claim_in_future follows the stored received_at
DeskBody::IllegalRetraction stores Refused bad_retraction after steps 4-6 (digest carries the form, so it never replays as a plain answer); a choice is any 1-200 byte text, stored Refused choice_invalid when no option label, grammar or not. claim_in_future compares against the whole-second received_at written to the record.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 17:08:40 +00:00
3a1677251b huginn-mind: Member and Steward faculties for desk receipts; pin the body digest, lookup position and sub-second claim
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 16:04:06 +00:00
368217a65a huginn-mind: tests for the desk fix batch (decider list, receipt faculty, older cards, times, notes, NFC, request_id Q1-Q6)
Each test was failed by a hand mutant of the rule it pins.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 15:49:53 +00:00
dcc51c170f huginn-mind: desk answers take the decider list as input, store attribution, received_at and request_id
DeskStamp carries answerer, attribution (Operator/Steward/Member per CultLib PR #72) and the decider
list; membership decides rule 5, the attribution never does. answer_desk and DeskStamp are crate-private.
The receipt names the operator only for the operator's account. counted_answer and R1 consider
options_hash. A stored answer keeps received_at, claim_in_future, request_id and a body digest;
the same (answerer, request_id) and body replays the stored outcome and writes nothing, another
body is request_id_conflict. Notes are Words (1..=4000 bytes, not blank); answered_at must be UTC.
The vector file is re-sliced byte for byte from PR #72 head 2dea6c56.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 15:46:02 +00:00
f1691ffc0d huginn-mind: pin that the desk door is refused before references are read
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 15:28:22 +00:00
5785c0c8c8 huginn-mind: options_hash at the bytes CultLib PR #72 pins
NFC every string, JCS (struct fields in key order through serde_json), SHA-256,
lowercase hex; the seam stays the single owner. Libby's 15 vectors, A-G included,
run as tests; the test fixture hash is gone. Adds unicode-normalization.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 15:26:03 +00:00