Nordhavn / specs / convene / surface / ChatList

convene / surfaceprojection

ChatList

Purpose

The fold from everything waiting at a member's own edge — every lineage — to the chats they may jump between, and the selection a single seat reads by. The sealed records a member's edge holds arrive from every conversation they were ever let into, mixed and in no promised order; this projection is where they are opened and told apart. A record that unseals under a key the ring holds joins the fold; a record the ring cannot open is noise on a public drop and is dropped without ceremony, exactly as a reading treats a copy it cannot open. It settles two things beyond the opening — the naming and the selection — and carries no judgement of its own beyond them: the chain's assembly, and its refusal of a fork as substitution evidence, is each lineage's Group composing underneath, at the rail as everywhere. A chat is named by its people: the domain has no group name and an invitee never learns a founder's local title, so each lineage presents under the shown names of its current members — the reader excluded, because a person does not list themselves among the people they talk to, and the reader's own shown name when they alone remain. A seat reads by its own lineage: the revisions of one lineage are one conversation's epochs and no other's — the judgement every one-conversation seat composes by, so no floor need carry it.

Props

Role Players

(none)

Role Methods

(none)

Functionalities

present

Opens the sealed records that unseal under a key the ring holds — the rest are dropped, noise and not evidence — and produces the Chats, one per distinct lineage among the opened revisions, in the order the lineages first appear. Each chat carries its lineage and its names: the shown names of the members of that lineage's current revision, as the lineage's Group answers it, with the reader excluded, and the reader's own shown name when they alone remain. It fails when an opened lineage's revisions refuse to assemble — a forked lineage is substitution evidence, carried in a substitution Alarm, at the rail as everywhere. Result: the Chats, one per lineage, in the lineages' first-appearance order; fails when an opened lineage's assembly refuses

revisions of

Given a lineage Text, produces the GroupRevisions of that lineage, opened from the sealed records the ring can unseal, assembled eldest first through that lineage's Group — what a seat in that conversation reads by. A lineage no opened revision belongs to gets an empty answer. It fails when the lineage's revisions refuse to assemble — the seat is not handed substitution evidence as its reading. Result: the GroupRevisions of the lineage, assembled eldest first; fails when the lineage's assembly refuses

Scenarios

Two lineages fold to two chats

Given: sealed records — one under key id "k-0163" sealing "g-7421" of lineage "g-7421" with members anne.bruun shown as "Anne Bruun" and sofie.lind shown as "Sofie Lind", then one under key id "k-0301" sealing "g-9001" of lineage "g-9001" with members karin.dahl shown as "Karin Dahl" and sofie.lind shown as "Sofie Lind" — sofie's opened ring holding the GroupKeys "k-0163" and "k-0301", and reader sofie.lind shown as "Sofie Lind" When: present is called Then: two chats in that order — "g-7421" named by "Anne Bruun", then "g-9001" named by "Karin Dahl" — the reader listed in neither

A chat is named by its current epoch, not its history

Given: sealed records — one under key id "k-0142" sealing "g-7421" of lineage "g-7421" with members anne.bruun shown as "Anne Bruun", and one under key id "k-0150" sealing its child "g-7421.2" of lineage "g-7421" naming parent "g-7421" with members anne.bruun shown as "Anne Bruun" and karin.dahl shown as "Karin Dahl" — anne's opened ring holding "k-0142" and "k-0150", and reader anne.bruun shown as "Anne Bruun" When: present is called Then: one chat, "g-7421" named by "Karin Dahl" — the current revision's members, the reader excluded

A founder alone hears their own name

Given: one sealed record under key id "k-0142" sealing "g-7421" of lineage "g-7421" with members anne.bruun shown as "Anne Bruun", anne's opened ring holding "k-0142", and reader anne.bruun shown as "Anne Bruun" When: present is called Then: one chat, "g-7421" named by "Anne Bruun" — the reader alone remains, and the chat still has somebody to name

A seat's selection holds one lineage only

Given: sealed records — one under key id "k-0163" sealing "g-7421" of lineage "g-7421" with members anne.bruun shown as "Anne Bruun" and sofie.lind shown as "Sofie Lind", one under key id "k-0301" sealing "g-9001" of lineage "g-9001" with members sofie.lind shown as "Sofie Lind", and one under key id "k-0180" sealing "g-7421.2" of lineage "g-7421" naming parent "g-7421" with members anne.bruun shown as "Anne Bruun", sofie.lind shown as "Sofie Lind", and karin.dahl shown as "Karin Dahl" — sofie's opened ring holding "k-0163", "k-0301", and "k-0180", and reader sofie.lind shown as "Sofie Lind" When: revisions of "g-7421" is called Then: the answer is "g-7421" and "g-7421.2", in that order — "g-9001" is another conversation's epoch

The seat's reading is chain order, not arrival order

Given: sealed records fetched child first — one under key id "k-0150" sealing "g-7421.2" of lineage "g-7421" naming parent "g-7421" with members anne.bruun shown as "Anne Bruun" and sofie.lind shown as "Sofie Lind", then one under key id "k-0142" sealing "g-7421" of lineage "g-7421" with members anne.bruun shown as "Anne Bruun" — anne's opened ring holding "k-0142" and "k-0150", and reader anne.bruun shown as "Anne Bruun" When: revisions of "g-7421" is called Then: the answer is "g-7421" then "g-7421.2" — assembled eldest first by parent references, not by the order the records stood

An unknown lineage answers empty

Given: one sealed record under key id "k-0142" sealing "g-7421" of lineage "g-7421" with members anne.bruun shown as "Anne Bruun", anne's opened ring holding "k-0142", and reader anne.bruun shown as "Anne Bruun" When: revisions of "g-5555" is called Then: the answer is empty — no revision belongs to that lineage

A record the ring cannot open is dropped, not presented

Given: sealed records — one under key id "k-0163" sealing "g-7421" of lineage "g-7421" with members anne.bruun shown as "Anne Bruun" and karin.dahl shown as "Karin Dahl", and one under key id "k-0264" sealing "g-7421.2" of lineage "g-7421" — karin's opened ring holding only the GroupKey "k-0163", and reader karin.dahl shown as "Karin Dahl" When: present is called Then: one chat is produced — "g-7421" named by "Anne Bruun" — and the record under "k-0264" is dropped without ceremony

A forked lineage is refused at the rail

Given: sealed records — one under key id "k-0142" sealing "g-7421" of lineage "g-7421" with members anne.bruun shown as "Anne Bruun", one under key id "k-0264" sealing "g-7421.4" of lineage "g-7421" naming parent "g-7421", and one under key id "k-0271" sealing "g-7421.4b" of lineage "g-7421" naming parent "g-7421" — anne's opened ring holding "k-0142", "k-0264", and "k-0271", and reader anne.bruun shown as "Anne Bruun" When: present is called Then: the presenting fails because two revisions name the parent "g-7421" — a substitution Alarm carries the fork as evidence, at the rail as everywhere

spoken of by