Nordhavn / specs / convene / core / TimelineEntry

convene / coredata

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

Readable attributes

Missing attributes

Invariants

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