Desk: UnixSocketDeskDoor (Huginn desk door client), fixtures at 79d954c, card re-pin to CultLib 3a51bbab, card opaque #70

Open
heimdall wants to merge 12 commits from heimdall/desk-unix-door into main
Member

Production IDeskDoor for the Desk (no deploy; the Desk stays unmapped until configured, and still needs the credential PR).

  • Vendors Huginn's golden fixtures at 79d954c (UUID deciders, withheld-ids fragments) byte for byte (sha256 pin, exact file set) and CultLib fork-card-vectors.json at 3a51bbab (commit and file sha256 pin): card DE0012 (17 keys + decider_count), record 86 (answerer_count), answerer nullable.
  • Card is opaque (JsonElement): raised_at and any re-pinned key order pass through unchanged. ForkCard/ForkOption/ForkRef deleted.
  • UnixSocketDeskDoor: one connection per call, 1 s deadline, u32-BE framed CultNet/MessagePack, 65536 bound both ways, messageId echo checked. Any Refused, operation failure, CultNet Error, timeout, dead socket, malformed frame is DeskDoorException -> 503 for that Mind only.
  • Adds the MessagePack NuGet package (3.1.12).
  • Unpinned: the Answer request has no golden bytes (derived from desk_wire.rs and the schema).

Tests: 30 new door tests; full suite 1107 pass / 43 fail, the same 43 fail on f6a826b in this sandbox (node loader / environment).

🤖 Generated with Claude Code

Soul (door) findings fixed in e561170: control characters in notes no longer 503 the Mind (own MessagePack walker), strict closed-map decoding (every malformed reply is DeskDoorException, list.mind checked, duplicate keys refused), canonical base64, floats/bin/ext refused. Both reader kinds decode; Bifrost masks nothing.

Contradiction for Huginn: its decider record-whole at 79d954c has no answerer_count, which CultLib 3a51bbab requires in both views, so the door refuses it (503) until Huginn adds the key (a test pins this; retire it then).

Update (Soul pass three clean; no break found): Huginn fixtures re-vendored at b299d6f7 (71 files, sha256 + file-list pin), CultLib vectors at d3025d3c (c2b215a8...c24c). New #118 vectors replayed through the real door and the edge; bin/invalid UTF-8 pinned; walker Closed is the sole owner of required keys; wrapper maps closed (as_of u64); census test classifies every vector section. Not merged: the door waits for Huginn cut-desk-feed-raised-at and cut-desk-feed-listing; Huginn's record-whole (5 keys, no answerer_count) is still refused by the door (503) until Huginn emits the contract shape.

Production IDeskDoor for the Desk (no deploy; the Desk stays unmapped until configured, and still needs the credential PR). - Vendors Huginn's golden fixtures at 79d954c (UUID deciders, withheld-ids fragments) byte for byte (sha256 pin, exact file set) and CultLib fork-card-vectors.json at 3a51bbab (commit and file sha256 pin): card DE0012 (17 keys + decider_count), record 86 (answerer_count), answerer nullable. - Card is opaque (JsonElement): raised_at and any re-pinned key order pass through unchanged. ForkCard/ForkOption/ForkRef deleted. - UnixSocketDeskDoor: one connection per call, 1 s deadline, u32-BE framed CultNet/MessagePack, 65536 bound both ways, messageId echo checked. Any Refused, operation failure, CultNet Error, timeout, dead socket, malformed frame is DeskDoorException -> 503 for that Mind only. - Adds the MessagePack NuGet package (3.1.12). - Unpinned: the Answer request has no golden bytes (derived from desk_wire.rs and the schema). Tests: 30 new door tests; full suite 1107 pass / 43 fail, the same 43 fail on f6a826b in this sandbox (node loader / environment). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Soul (door) findings fixed in e561170: control characters in notes no longer 503 the Mind (own MessagePack walker), strict closed-map decoding (every malformed reply is DeskDoorException, list.mind checked, duplicate keys refused), canonical base64, floats/bin/ext refused. Both reader kinds decode; Bifrost masks nothing. Contradiction for Huginn: its decider record-whole at 79d954c has no answerer_count, which CultLib 3a51bbab requires in both views, so the door refuses it (503) until Huginn adds the key (a test pins this; retire it then). Update (Soul pass three clean; no break found): Huginn fixtures re-vendored at b299d6f7 (71 files, sha256 + file-list pin), CultLib vectors at d3025d3c (c2b215a8...c24c). New #118 vectors replayed through the real door and the edge; bin/invalid UTF-8 pinned; walker `Closed` is the sole owner of required keys; wrapper maps closed (as_of u64); census test classifies every vector section. Not merged: the door waits for Huginn cut-desk-feed-raised-at and cut-desk-feed-listing; Huginn's record-whole (5 keys, no answerer_count) is still refused by the door (503) until Huginn emits the contract shape.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
CultLib is still changing gamecult.fork.card.v0 (raised_at). Bifrost reads and
edits nothing in it, so it passes through with every key, number and key order.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
One connection per call, one request frame, one reply frame, 1 s deadline,
65536-byte bound each way. Request frames reproduce Huginn's golden bytes;
replies are decoded by key and every failure is one DeskDoorException (503).
Adds the MessagePack package for the wire codec.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
heimdall changed title from Desk: UnixSocketDeskDoor (Huginn desk door client), Huginn #55 fixtures vendored, card opaque to Desk: UnixSocketDeskDoor (Huginn desk door client), fixtures at 79d954c, card re-pin to CultLib 3a51bbab, card opaque 2026-11-11 18:27:22 +00:00
Vectors re-vendored byte for byte (sha256 13afdcba...); ForkRecord gains
answerer_count, DeskAnswerDocument.Answerer is nullable, both required keys
(a missing one is a door fault, never an invented 0 or nil). The card stays opaque.
Huginn fixtures at 79d954c with UUID deciders, synthetic/proposed view fragments.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
MessagePack is walked into JSON by the reader, so every control character is escaped and keys, order and
integers survive. Every contract map (list, entry, record, answer, refusal) is closed and typed; list.mind must
equal the call's Mind; a key written twice anywhere, a float, a binary, trailing bytes, or non-canonical base64
is a DeskDoorException, as is every malformed variant (null elements, non-map values).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Pins name the commits, the exact file list and each sha256; the verifier is proved to fail on a changed byte, an
extra file and a missing file, at both directory levels. The four golden request frames still reproduce. The
synthetic card-viewers and proposed non-decider fragments are gone: both reader views are now CultLib's own entry
bytes served through the door. Huginn's record-whole still has no answerer_count (its README says so), so the
fault test stays true and is re-pointed at it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
List pages (listScenarios and listShortPages), valid entries, scenario records, valid cards, valid stored answers
(withheld Revision and Retraction included), the entry and deskAnswer negatives and the resultsInvalid vectors are
served from responseHex / messagePackHex on a socket double and compared with the vector message as JSON text (keys,
key order, integers). The list pages also go through the HTTP edge for a decider and a non-decider. The typed
Deserialize replays and the FakeDeskDoor list replays they supersede are removed. Recorded in comments: what the door
judges (closed typed maps) and what it does not (the contract's rules).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Pins bin in note, answerer, next_cursor, a card position (value, nil position, key name) and a record id, and 0xff 0xfe
as text in the same places, through list, read and answer. The door already refuses both (Walk's default branch throws
on Binary; the strict UTF-8 decoder throws on bad bytes), so no source changes: the mutants (Binary written as null;
StrictUtf8 = new(false,false)) go red.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
JsonRequired on DeskAnswerDocument.Answerer and ForkRecord.AnswererCount was a second owner of what Closed already
decides at the boundary; nothing the typed vector replays needed is lost (they now go through the door). Every key of
the list, entry, record and answer documents, taken from a real CultLib entry, is removed and nulled: a missing key, or a
nil where the contract has none, is a door failure. First red: the test that the typed records declare no required keys.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
DeskResponse declares Answered { answer, counted_answer_id, as_of: u64 }, Forks { list, as_of: u64 } and
Fork { entry, as_of: u64 } (desk_wire.rs at b299d6f7; the golden replies carry exactly those keys). The door now
requires as_of as an unsigned integer and refuses any other key, like every other contract map. First red: the six
wrapper tests (missing, nil, negative, text, bool, array, object as_of; extra keys).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Each top-level section and each subsection down to depth 3 of the vendored vectors is classified: replayed by a named
test (which must exist) or not judged, with the owner of the rule named (CultLib validators, Huginn's door). A re-pin that
adds or drops a section fails until classified. Also replays transport.listInvalid on the wire: the door refuses a
negative count and passes the rules it does not hold.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This pull request can be merged automatically.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin heimdall/desk-unix-door:heimdall/desk-unix-door
git switch heimdall/desk-unix-door

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff heimdall/desk-unix-door
git switch heimdall/desk-unix-door
git rebase main
git switch main
git merge --ff-only heimdall/desk-unix-door
git switch heimdall/desk-unix-door
git rebase main
git switch main
git merge --no-ff heimdall/desk-unix-door
git switch main
git merge --squash heimdall/desk-unix-door
git switch main
git merge --ff-only heimdall/desk-unix-door
git switch main
git merge heimdall/desk-unix-door
git push origin main
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/Bifrost!70
No description provided.