Desk feed door: reader-count shapes pinned to CultLib 3a51bbab (vendored vectors) #58

Merged
eureka merged 4 commits from eureka-substrate/desk-counts-shape into main 2026-11-11 18:28:00 +00:00
Owner

Reader-count shapes for the desk door, pinned to CultLib 3a51bbabad244a56ec4521080530d88744001ce4 (#117 on #115). Follow-ups eureka-substrate:follow_up:chat-s6094-6094, chat-s6132-6133; ruling draft desk-reader-counts-shape. Spec, fixtures and tests only.

  • Vendored CultLib's own bytes (unedited messagePackHex from contracts/cultnet/governance/fork-card-vectors.json) in crates/huginn-mind/tests/fixtures/desk-feed/cultlib-3a51bbab/: cards operator_fork, raised_at_nil, withheld_deciders; answers counted, revision, retraction, withheld_answerer, refused_stale; entries open_counted, withheld_open_counted, closed_with_ruling_and_a_refusal, withheld_closed_with_ruling_and_a_refusal. The README there names the sha and each vector. The earlier .synthetic and .mirror fragments and their mirror types are deleted; record-whole (what the door sends today) stays.
  • Read off the vectors: card header DE 00 12 is 18 keys (schemaVersion + 17 fields, raised_at 11th, decider_count right after deciders); record header 86, answerer_count the fifth key, before answers; answer keeps 16 keys (DE 00 10), answerer string or nil; entry 83. options_hash untouched.
  • docs/desk-feed-door.md states those shapes and the pin; the "Pending" paragraph is gone.
  • Tests: SHA-256 of every vendored file; an own msgpack decoder checks headers, key order, decider_count 1..64 with empty-or-exact deciders, answerer_count (distinct answerers incl. refusals for deciders, 1..answers for non-deciders), no account id in a non-decider's bytes; Huginn's real types decode the decider answers and refuse the card (raised_at), record (answerer_count) and nil answerer, pinning the gap cut-desk-feed-listing closes.

Verification: cargo test -p huginn-mind --test desk_feed_fixtures 7 passed; corrupting one vendored byte fails two tests. Independent python3 -I msgpack decode of all twelve vectors equals the vector's JSON message and re-encodes to the same bytes.

Consumers: Bifrost branch heimdall/desk-card-repin (f977a43) vendors Huginn desk fixtures from 79d954c and needs a re-pin after this PR. Bifrost's DeskDocuments.cs requires answerer_count (JsonRequired), so its merge must wait for cut-desk-feed-listing.

Nullable answerer: the bytes pin nil on Counted and Refused; all four variants is the ruling desk-reader-counts-shape, and no CultLib vector nulls a Revision or Retraction (their vectors, vendored, carry a string).

Not merged: awaits a Soul pass.

🤖 Generated with Claude Code

Reader-count shapes for the desk door, pinned to CultLib `3a51bbabad244a56ec4521080530d88744001ce4` (#117 on #115). Follow-ups `eureka-substrate:follow_up:chat-s6094-6094`, `chat-s6132-6133`; ruling draft `desk-reader-counts-shape`. Spec, fixtures and tests only. - Vendored CultLib's own bytes (unedited `messagePackHex` from `contracts/cultnet/governance/fork-card-vectors.json`) in `crates/huginn-mind/tests/fixtures/desk-feed/cultlib-3a51bbab/`: cards `operator_fork`, `raised_at_nil`, `withheld_deciders`; answers `counted`, `revision`, `retraction`, `withheld_answerer`, `refused_stale`; entries `open_counted`, `withheld_open_counted`, `closed_with_ruling_and_a_refusal`, `withheld_closed_with_ruling_and_a_refusal`. The README there names the sha and each vector. The earlier `.synthetic` and `.mirror` fragments and their mirror types are deleted; `record-whole` (what the door sends today) stays. - Read off the vectors: card header `DE 00 12` is 18 keys (`schemaVersion` + 17 fields, `raised_at` 11th, `decider_count` right after `deciders`); record header `86`, `answerer_count` the fifth key, before `answers`; answer keeps 16 keys (`DE 00 10`), `answerer` string or nil; entry `83`. `options_hash` untouched. - `docs/desk-feed-door.md` states those shapes and the pin; the "Pending" paragraph is gone. - Tests: SHA-256 of every vendored file; an own msgpack decoder checks headers, key order, `decider_count` 1..64 with empty-or-exact `deciders`, `answerer_count` (distinct answerers incl. refusals for deciders, 1..answers for non-deciders), no account id in a non-decider's bytes; Huginn's real types decode the decider answers and refuse the card (`raised_at`), record (`answerer_count`) and nil answerer, pinning the gap `cut-desk-feed-listing` closes. Verification: `cargo test -p huginn-mind --test desk_feed_fixtures` 7 passed; corrupting one vendored byte fails two tests. Independent `python3 -I` msgpack decode of all twelve vectors equals the vector's JSON `message` and re-encodes to the same bytes. Consumers: Bifrost branch `heimdall/desk-card-repin` (`f977a43`) vendors Huginn desk fixtures from `79d954c` and needs a re-pin after this PR. Bifrost's `DeskDocuments.cs` requires `answerer_count` (`JsonRequired`), so its merge must wait for `cut-desk-feed-listing`. Nullable `answerer`: the bytes pin nil on `Counted` and `Refused`; all four variants is the ruling `desk-reader-counts-shape`, and no CultLib vector nulls a `Revision` or `Retraction` (their vectors, vendored, carry a string). Not merged: awaits a Soul pass. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
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 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>
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>
eureka changed title from Desk feed door: reader-count shapes (decider_count, nullable answerer, answerer_count) as mirror fixtures to Desk feed door: reader-count shapes pinned to CultLib 3a51bbab (vendored vectors) 2026-11-11 18:19:17 +00:00
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>
eureka merged commit b299d6f732 into main 2026-11-11 18:28:00 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
GameCult/Huginn!58
No description provided.