Remote / Server-derived state

What is normalized

An entity is stored once, keyed by its name and id, regardless of how many views read it. A connection stores references with explicit boundaries.

Project:p1            name PRESENT   status STALE   owner PRESENT → User:u7
User:u7               name PRESENT   avatarUrl MISSING
ProjectsByOwner(u7)   Project:p9  Project:p7  Project:p4  [gap]  Project:p1
  • Presence is separate from values. Missing, present undefined, present null, stale, and not-found are distinct, and presence is never inferred from value === undefined.
  • Tombstones make absence cacheable. A not-found entity is not refetched forever; a later write clears the tombstone.
  • A withheld field is knowledge too. The server settles a field it will not answer with, without saying why; the client marks it unavailable and does not ask again until a refresh. The whole entity stays.
  • Everything is known for a principal. Values, tombstones, unavailable fields and list membership are what the server told this session. Data.forget, called from update on a login, a logout or a switch of organization, drops all of it and restarts every active read and stream.
  • Local execution is not a second authority. Remote.matching and Data.filtered derive conclusions from the facts held (p1 matches this query) and never promote them into knowledge of the whole dataset (this query is [p1]) unless a connection's terminal boundaries prove it. A new list is a server query.
  • A connection is an ordered structure with boundaries. If page 1 is A B C D and page 3 is I J K L, a flat array would falsely claim they are adjacent. Segments with explicit boundaries make the unloaded middle an honest gap.