Vendor CultLib's revision and retraction answer vectors (string answerer; no vector nulls them).
The doc and test now say two variants are pinned nulled by bytes (Counted, Refused) and all four
by ruling desk-reader-counts-shape. The sha test requires the fixture README and the doc to name
CULTLIB_SHA verbatim. Doc notes Bifrost heimdall/desk-card-repin (f977a43) re-pin and
DeskDocuments.cs JsonRequired answerer_count.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Ten vectors from fork-card-vectors.json at CultLib 3a51bbabad244a56ec4521080530d88744001ce4
(#117 on #115), unedited: three cards, three answers, four entries (decider and non-decider twins).
Tests decode them with a decoder of their own and pin the header DE 00 12 (18 keys), record 86
with answerer_count fifth, decider_count after deciders, nullable answerer; Huginn's real types
are pinned as not yet carrying the shapes. docs/desk-feed-door.md states the pinned shapes.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Soul on 30a0530: deleting dedup() in view() survived because three
answers came from three accounts, and Retraction was never in the
mirror record. The record now holds Counted, Revision, Refused and
Retraction by three accounts (four answers, answerer_count 3), and the
test asserts both.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Ruling desk-reader-counts-shape (Libby's CultLib reader-counts cut):
decider_count 1..64 right after deciders, deciders empty when withheld
or exactly decider_count ids; answerer nullable on all four variants and
null only in a non-decider's view; answerer_count over all stored
answers, refusals included; card 18 keys with raised_at, record 6.
Mirror fragments for both reader kinds and tests pinning those rules;
no CultLib bytes pinned until Libby posts her sha.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Soul on d08b888: CultLib main's card requires 16 keys, not 17. The
account-id grammar test now rejects 36 hex digits with no dash, a
37-character id and a dash off position. The reader-view test says it
pins mirror types only.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
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>
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>
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>
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>
ChatPending gains a defaulted Option tail (old two-field mouths still decode), Chat::pending returns it, and a process's first line renders it: speakable rooms only, 20 per room and 60 in all, byte bound counting framing, quoted untrusted data, dedupe by event id against waiting deliveries, a marker for dropped lines and for rooms with none, and an unavailable note when the mouth sends no tail. A failed first poll fails the start as Chat again.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Matrix is the record and the mouth its only reader: the tail is assembled from the deliveries and contexts the mouth already sends (no new endpoint, no stored copy). Newest 60 lines / 24 KiB, oldest dropped with a marker; public sessions read the rooms she may speak in, a DM session its own room alone; a first poll that fails degrades to a tail-unavailable note instead of failing the wake.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A brief that asks for a change closes Fixed by a default-branch commit, not Recorded on an open PR; work waiting on someone else is superseded by her own follow-up. Replaces the three 'Recorded with your answer' sentences.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
WORK_QUESTION also sends her to huginn query over her own plans, frames what she
finds as candidates she weighs, names --cursor, and says every follow-up in her
campaigns is hers whoever filed it. The messages clause is ANSWER_MESSAGES, set
before the question on first lines that carry messages only. Stale prose about
bare later lines is corrected in the body map, MESSAGES_HEADER's comment and one
test name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
repo-activity landed; wear-facts is next and wake-room-tail after. The forge
owns repo facts and the daemon reads it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A tell is the message (first line carries the machine, later lines messages and
organ notices); upsert before delete in the source index; the CPU reserve's own
embed bounds; the tempo fallback controller merged but not wired; Mind web
builds and the recorded shared origin; skill pin b22762a. The design doc's
section 3 no longer says every line.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Persona units are long-lived leased sessions (mind-persona@<i>, 4h cap, fence Requires, claude-lease), added the Persona session section, governance list, model-page rows and F36-F40; the 2026-10-30 swarm flow is marked historical. Sequence doc: closure notes on section 0, the superseded actuator-side brief closure, cut 6 landed, cut 7 not shown landed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Eyes facts: reconstructed wake and traffic inputs with file:line, reply schema,
per-Mind behaviour since persona-session went live, refused flush replies.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Heartbeat poll and Persona turn durations measured on Yggdrasil, the busy
report, the dt cap, what the vote release does and does not promise, the
rerun table (27th by rank), and the crossing bound stated by the rows it
admits.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>