The CultLib pin makes a pull carry unregistered records instead of refusing; the writer guards like the heartbeat store does.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The workspace's one CultLib pin moves 8fc74c70 -> 75188fdefa0b4baf131dbfd94e77d06a965f0cc6
(cultcache-rs 0.2.0 -> 0.3.1, cultnet-rs 0.1.0 -> 0.3.0 in the lock; the lock drops
the crates the old revision alone needed and gains sha2/stacker for the new one).
Adaptations the new cultcache-rs forces:
- CacheBackingStore::push/push_all return the stamps written; the five test
stores follow (store.rs, receipt.rs, read_tests.rs).
- A pull now carries a record no registered type claims instead of refusing it,
so the heartbeat writer's open() checks foreign_records() and keeps its
fail-closed refusal of an old initiative store.
- A cache refuses writes until it has pulled, and a zero-byte file is not a
store: two test fixtures pull first / plant a real store.
Not deployed.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A flush answer never showed her the revision, so spending it acked a batch she
had not answered. final_reply stays the send-basis switch.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
usage_line reads model_usage_since_last_result (never the cumulative modelUsage);
write_result writes it after the result line, so Self runs and Persona turns share it.
Unreported usage says "not reported", never zeros.
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>
A mouth that restarts keeps its seq counter but loses its pending, so its unacked events come back from the homeserver under fresh,
higher seqs. The client keyed everything on seq and told them twice. Progress now remembers the answered event ids; a delivery whose event
was answered is dropped from the poll and acked through (leading run only).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- ElementVisitor reads newtype-struct, some and enum shapes (msgpack ext, timestamp) as Other, so that delivery's reply link drops with the
warning and the message is delivered unchanged. Lists inside the link are skipped, not recursed into.
- The excerpt strip also removes U+034F, U+115F, U+1160, U+17B4, U+17B5, U+180B-180D, U+2800, U+3164; the header and the ReplyTo doc say an
emptied excerpt reads as no text.
- trace_inputs records the quote line she was shown under the message.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Exactly "1" is on, anything else is off, nothing is echoed.
Spec: gamecult-chat:cut_spec:cut-chat-reply-link-decode.r4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The quote is data on its own line after its message, every variable part
quoted, role derived from the sender id. Dropped links never render.
Spec: gamecult-chat:cut_spec:cut-chat-reply-link-decode.r4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
RudpChat::with_reply_link asks the v4 kind first and steps down one rung per
UnknownKind refusal (v4 -> v2 -> v1); flag off sends today's bytes. The
dropped-reply warning prints once per event id and reply_defects counts them.
Spec: gamecult-chat:cut_spec:cut-chat-reply-link-decode.r4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
ChatDelivery gains reply_to (tuple index 14): Absent, Quote(ReplyTo) or
Dropped(ReplyViolation). A reply_to outside the contract is dropped whole and
never fails the poll; reply_warnings words and deduplicates the organ-side
warning. Sender and event id are held to Matrix id shapes; the excerpt is
bounded at 240 code points as sent, then stripped of invisible characters.
Adds the v4 consts and the unicode-general-category direct dependency
(already in Cargo.lock).
Spec: gamecult-chat:cut_spec:cut-chat-reply-link-decode.r4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>