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
pull from: heimdall/desk-unix-door
merge into: GameCult:main
GameCult:main
GameCult:eureka/mouth-fetch-attachment
GameCult:heimdall/pending-v4-lows-two
GameCult:heimdall/pending-v4-lows
GameCult:heimdall/desk-door-revendor
GameCult:heimdall/desk-card-repin
GameCult:heimdall/desk-credential
GameCult:heimdall/desk-docs-door-spec
GameCult:heimdall/desk-feed-note
GameCult:heimdall/ratatoskr-voting-auth
GameCult:heimdall/docs-no-refresh
GameCult:heimdall/approve-null-membership
GameCult:heimdall/pending-v4-fixes
GameCult:heimdall/chat-pending-v4
GameCult:heimdall/chat-consent-gate
GameCult:heimdall/htmx-drop
GameCult:heimdall/susp-gaps
GameCult:heimdall/prefix-val
GameCult:self/suspension-survives-sign-in
GameCult:self/chat-pending-tail
GameCult:self/oidc-chat-tier
GameCult:self/oidc-limits-prune-brake
GameCult:heimdall/test-cultlib-path
GameCult:heimdall/drop-index-roles
GameCult:heimdall/desk-pin-vectors-de8a062a
GameCult:heimdall/desk-answer-fork-too-large
GameCult:heimdall/desk-pin-vectors-f6c9bf5
GameCult:heimdall/desk-read-fork-too-large
GameCult:heimdall/desk-bifrost-half
GameCult:heimdall/mill-ranked-read
GameCult:mouth-open-direct
GameCult:docs/dump-readable-by-restore
GameCult:heimdall/mouth-read-through
GameCult:heimdall/scope-cultlib-ts-names
GameCult:heimdall/reserved-identities
GameCult:heimdall/bifrost-guest-accounts
GameCult:heimdall/sealed-key-path
GameCult:heimdall/standard-close-concurrency
GameCult:heimdall/sealed-mind-intake
GameCult:heimdall/sealed-ballot-motion
GameCult:heimdall/deploy-main-plan
GameCult:eureka/deploy-plan-revise
GameCult:heimdall/feedback-receiver
GameCult:heimdall/delete-publish-workflow
GameCult:heimdall/workflow-runs-on-docker
GameCult:heimdall/host-only-cookies
GameCult:heimdall/pin-vote-refusal-branches
GameCult:heimdall/mouth-receipts-presence
GameCult:heimdall/chat-images-cut-a
GameCult:heimdall/estate-sim-purchased-stake
GameCult:heimdall/credit-arm
GameCult:heimdall/stale-estate-numbers
GameCult:heimdall/stake-vectors
GameCult:heimdall/estate-rule-sim
GameCult:heimdall/charter-amendment-proposal
GameCult:heimdall/mouth-media-line
GameCult:eureka-body/optimistic-send-mouth
GameCult:eureka-body/mouth-context-from-matrix
GameCult:eureka-body/mouth-per-persona-rooms
GameCult:eureka-body/mouth-many-peers
GameCult:gamecult-chat/bifrost-oidc-backchannel-logout
GameCult:gamecult-chat/bifrost-oidc-issuer
GameCult:security/bifrost-dependency-pins
GameCult:hands/heimdall-callback-signed
GameCult:hands/mill-votes-cut-5b
GameCult:hands/mill-votes-cut-5
GameCult:hands/mill-votes-cut-3
GameCult:hands/mill-votes-cut-4
GameCult:hands/mill-votes-cut-2
GameCult:hands/mill-votes-cut-1
GameCult:hands/mill-votes-cut-0a
GameCult:hands/watchdog-bifrost-retry
GameCult:hands/watchdog-bifrost-reader
GameCult:hands/watchdog-bifrost-suite
GameCult:hands/watchdog-bifrost-retire
GameCult:codex/bifrost-migration-metadata
2026-11-11
Fixtures: pin line endings of the sha256-pinned vectors and READMEs (Soul)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Desk tests: census of every vector section, replayed or not judged by Bifrost
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>
Desk door: close Huginn's Answered, Forks and Fork wrapper maps
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>
Desk door: the wire walker's Closed is the only owner of required keys
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>
Desk door tests: a binary or invalid UTF-8 anywhere in a reply is a door failure
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>
Desk tests: replay the vectors' wire bytes through the real UnixSocketDeskDoor
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>
Desk: re-vendor Huginn desk fixtures at b299d6f7 (71 files, CultLib 3a51bbab subdirectory) and CultLib vectors at d3025d3c
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>
Desk door: strict reply decoding (control characters, closed typed maps, duplicate keys, strict base64, no floats or binary)
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>
Desk: re-pin CultLib card contract 3a51bbab and Huginn desk-feed fixtures 79d954c
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>
Desk: UnixSocketDeskDoor, the production IDeskDoor over Huginn's desk socket
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>
Desk: the card is an opaque JsonElement, not a typed ForkCard
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>
Vendor Huginn desk-feed golden fixtures (9dde93e) with a sha256 pin test
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>