TimelineEntry
Purpose
One place in a member's readable timeline. Because a member reads only their own inbox and receives
only copies sealed for them, an entry is one of two shapes: readable, where the message opened
and its writing is presented; or missing, where a message the member did hold names a parent
MessageId no received message answers to — a message still travelling, withheld, or one from before
the member's time that was never addressed to them. A missing entry is not yet an accusation, and
there is no sealed placeholder for a message never delivered: an epoch you were not in is simply
absent from your inbox, not a closed box on your timeline. There is no third shape: a message is
readable whole or not at all.
Attributes
- kind: is one of "readable", "missing" that names the entry's shape
Readable attributes
- message id: the
MessageIdof the message presented - sender: is
Textthat carries the sub of the member who wrote it, read from inside the seal - writing: is
Textthat carries the readable text
Missing attributes
- awaited: is a
MessageIdthat a received message follows while it has not itself arrived
Invariants
- A readable entry carries the writing and its sender; a missing entry carries only the awaited id.
Scenarios
A readable entry carries the writing
Given: kind "readable", the MessageId "m-8001", sender "anne.bruun", and writing "The hearing moved to Thursday."
When: a TimelineEntry is created
Then: it is accepted as a readable entry carrying that writing from "anne.bruun"
A missing entry names what it awaits
Given: kind "missing" and an awaited MessageId "m-8000"
When: a TimelineEntry is created
Then: it is accepted as a missing entry awaiting "m-8000"
An unknown shape is rejected
Given: kind "shouted", with no writing and no awaited id When: a TimelineEntry is created Then: the creation is rejected because the kind is not a recognised entry shape