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, presentnull, stale, and not-found are distinct, and presence is never inferred fromvalue === 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 fromupdateon 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.matchingandData.filteredderive conclusions from the facts held (p1matches 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 Dand page 3 isI J K L, a flat array would falsely claim they are adjacent. Segments with explicit boundaries make the unloaded middle an honest gap.