Desk door: listing gate and account-id grammar at decode (PR B of cut-desk-feed-listing.r8; stacked on #62) #63

Open
eureka wants to merge 3 commits from eureka-substrate/desk-listing-gate into main
Owner

Stacked on #62 (PR A, the reader shapes): merge #62 first; until then this diff also shows its commit.

  • Read gate: a fork is visible to a call when showable AND (subject in the call's deciders OR its desk_listing is in force). Counts, pages, cursors are over the visible set; a hidden fork is fork_unknown with the same bytes as a missing one. order and stamp still leak gaps, as ruled.
  • New kind desk_listing (epiphany.pipeline.desk_listing.v2, key <campaign>:desk_listing:<label>), new CitationRole::Listed (ALL = 27). Unlist = Withdrawn resolution, relist = withdraw it. Admit door only; the desk door's batch is refused (DeskRequestInvalid{desk_listing}).
  • subject and every deciders entry are AccountId at decode (lowercase D-format UUID; error names the field, never the value). Stored desk_answer.answerer is AccountId. Longest kind name is now desk_listing: resolution local bound 111 -> 112.
  • Tests migrated to account ids; refused fixtures with failure frames; schemas, golden envelopes and the catalog index regenerated.
  • Operator note (doc and here): after deploy a non-decider's Desk row is empty until the Mind lists a fork.

🤖 Generated with Claude Code

Stacked on #62 (PR A, the reader shapes): merge #62 first; until then this diff also shows its commit. - Read gate: a fork is visible to a call when showable AND (subject in the call's deciders OR its `desk_listing` is in force). Counts, pages, cursors are over the visible set; a hidden fork is `fork_unknown` with the same bytes as a missing one. `order` and `stamp` still leak gaps, as ruled. - New kind `desk_listing` (`epiphany.pipeline.desk_listing.v2`, key `<campaign>:desk_listing:<label>`), new `CitationRole::Listed` (ALL = 27). Unlist = `Withdrawn` resolution, relist = withdraw it. Admit door only; the desk door's batch is refused (`DeskRequestInvalid{desk_listing}`). - `subject` and every `deciders` entry are `AccountId` at decode (lowercase D-format UUID; error names the field, never the value). Stored `desk_answer.answerer` is `AccountId`. Longest kind name is now `desk_listing`: resolution local bound 111 -> 112. - Tests migrated to account ids; refused fixtures with failure frames; schemas, golden envelopes and the catalog index regenerated. - Operator note (doc and here): after deploy a non-decider's Desk row is empty until the Mind lists a fork. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The card gains raised_at (the question's first admission, UTC, nil when unknown; an import's
source time wins) and decider_count (1..64) right after deciders: 18 keys, DE 00 12. The record
gains answerer_count (distinct answerers over every stored answer, refusals included) fifth:
header 86. ForkDeskAnswer.answerer is a required nullable key. The reads now take the call's
subject: a subject in the call's deciders is a decider and is told the ids; any other reader gets
deciders empty, answerer nil and the counts. The card decoder refuses a count outside 1..64 or a
non-empty deciders of another length.

Huginn's types decode and re-encode all 14 vendored CultLib vectors byte for byte (replaces
huginn_types_do_not_yet_carry_the_pinned_shapes); vectors/fork-card-vectors.json re-vendored at
d3025d3c; entry-bearing golden fixtures for both views; desk request/response schemas regenerated;
docs/desk-feed-door.md describes the built shapes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A non-decider reads a fork only while the Mind's desk_listing for it is in force; a decider sees
every showable fork. Counts, pages and cursors are over the visible set; a hidden fork reads as a
missing one (same bytes). New kind desk_listing (epiphany.pipeline.desk_listing.v2, key
<campaign>:desk_listing:<question-label>; unlist = Withdrawn resolution, relist = withdraw that),
new citation role Listed (ALL is 27), admitted on the Admit door only (the desk door refuses one).

subject and every deciders entry are AccountId (lowercase D-format UUID) at decode, refused as
payload-not-a-request naming the field and never the value; the stored desk_answer.answerer is an
AccountId. The longest kind name is now desk_listing, so the resolution local bound is 112.

Tests move to account ids (fixtures::account); refused-request fixtures and their failure frames;
all published schemas, the golden envelopes and the catalog index regenerated.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
eureka force-pushed eureka-substrate/desk-listing-gate from 4dc97f6416 to 227ed9e350 2026-11-11 21:24:22 +00:00 Compare
eureka force-pushed eureka-substrate/desk-listing-gate from 227ed9e350 to f35cca0b88 2026-11-11 21:30:04 +00:00 Compare
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 eureka-substrate/desk-listing-gate:eureka-substrate/desk-listing-gate
git switch eureka-substrate/desk-listing-gate

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 eureka-substrate/desk-listing-gate
git switch eureka-substrate/desk-listing-gate
git rebase main
git switch main
git merge --ff-only eureka-substrate/desk-listing-gate
git switch eureka-substrate/desk-listing-gate
git rebase main
git switch main
git merge --no-ff eureka-substrate/desk-listing-gate
git switch main
git merge --squash eureka-substrate/desk-listing-gate
git switch main
git merge --ff-only eureka-substrate/desk-listing-gate
git switch main
git merge eureka-substrate/desk-listing-gate
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/Huginn!63
No description provided.