← The specification

What the phone keeps

Rendered from spec at76d46f3 (2026-10-25) · its source · Edit this page

Status: Accepted · Audience: Operator · Area: N — Companion


Purpose

The app forgets everything a stack told it when it closes. Opening it again is a spinner, a stack that is out of reach says only that it is out of reach, and a choice the operator makes — how soon to ask for the passcode again, which stack comes first — has nowhere to stay.

This page is what the phone keeps between launches, and the rules for keeping it: the last reading of each kind per stack, shown for what it is; the operator’s own settings; and a note of what they have already seen, so that the app can say what is new. How it is kept, and why that way, is ADR-0035.

Behaviour

Opening shows what the phone last knew

A screen that has a kept reading draws it at once, with when it was read, and then asks the stack (N1-R24, N1-R25, N1-R9). The kept reading is replaced when the fresh one arrives. Until then, nothing that acts on the stack can be used: a restart, taking an update or agreeing to anything is shown, disabled, with the reading’s age beside it. A stack that cannot be reached shows what it last said and when, beside the reason it cannot be reached now.

Four kinds of reading are kept per stack: health, what runs, updates and household. A repair offer is not kept: it is something the operator agrees to, and an agreement is only ever given against a fresh offer (N13-R7).

What is kept stays on the phone, sealed

Everything kept is encrypted with a key the phone’s secure storage holds, and can be read only while the phone is unlocked. Nothing kept is ever a password, a sign-in or pairing material (N1-R23), an action the stack did not receive (N1-R41) or the confirmation of one (N1-R24). A phone with no secure storage keeps nothing and says so; a phone whose key has gone — restored onto another device, its keychain reset — clears what it had kept, keeps its pairings and says once that it did.

Artwork is held, never kept

Posters and backdrops are drawn from memory and gone when the app closes. They come from the core’s own API, which serves a held title’s pictures and the poster of a title a member’s search found, or from the location the core states for a title through the media server’s guarded front door. Either way the request is the app’s own, on the session’s credential, over a connection pinned as that request is — to the stack for the core’s API, to the door for the door — and never to an address the app put together (D11). A title the core has no artwork for is drawn as its lettered poster, so a cold start draws immediately and the art arrives as it loads.

How long, and clearing it

The operator chooses how long readings are kept: any whole number of days from 1 to 365, or until the stack is removed from the phone. It is 30 days until they choose. Readings older than that are deleted when the app opens and when the setting changes. Removing a stack from the phone removes everything kept about it. Clear saved data removes every reading, setting and marker the phone keeps, and leaves every stack paired and signed in.

Settings the phone remembers

App settings, for the whole phone: when to ask for the passcode again (N4-R19), how long readings are kept, the order of the stacks, and clearing saved data. It is also where a phone with no secure storage says that it keeps nothing.

A stack’s settings, one per stack: which of the kinds of notification that stack raises may reach the phone, within the phone’s own notification settings, and which kinds are marked as new. The kinds of notification are the core’s (N4-R11): a closed list the contract publishes, of which each stack says the ones it raises (ARCH-R279, ARCH-R280), so the app offers a stack’s kinds and no others.

The app also remembers where the operator was — which stack and which tab — and opens there, after the lock.

What is new

For each stack, the phone notes the newest update, request and problem the operator has seen. Anything newer, of a kind the operator wants marked, is new. An update is newer by its place in the stack’s record, a request by its number, and a problem by when it began (C1-R17), which are the orders the stack itself vouches for (ARCH-R140). The tab it belongs to carries a mark, and What’s new lists every new item across the stacks, filtered by kind and by stack. Opening an item marks it as seen; Mark all seen clears the list. A mark is announced to a screen reader and never shown by colour alone.

States

State Meaning
Kept A reading from an earlier session, shown with when it was read. Its actions wait.
Fresh Read in this session. Replaces what was kept.
Nothing kept No reading of this kind yet, or none kept for this stack. The only place a spinner may show (N1-R28).
Not keeping The phone has no secure storage. Nothing survives a launch, and the app says why.
Cleared The key could not be read. Saved data was removed; pairings stayed. Said once.
New An item newer than the last one seen, of a kind the operator wants marked.

Edge cases

  • The first reading of a stack. Nothing has been seen yet, so nothing is new: the first reading records what it holds as seen, and only what arrives after it is marked.
  • A kind switched off in a stack’s settings. Its marks disappear at once; switched on again, it starts from what is current, not from everything since it was off.
  • The stack last used has been removed. The app opens on the first stack in the operator’s order, or on first run if none is left (N1-R35).
  • A reading kept by an older version of the app. Its shape is not this build’s, so it is discarded and read again; a setting from an older version is carried over (N1-R32, N1-R33).
  • The lifetime shortened below the age of what is kept. Everything older is deleted at once, not at the next launch.
  • A stack re-paired after moving address. It is the same stack (N1-R22), and what was kept for it stays.

Requirements

ID Requirement
N27-R1 The app MUST keep between launches only readings of a stack’s health, what it runs, its updates and its household; the operator’s settings on this page; and, per stack and kind, an identifier of the newest item seen. It MUST NOT keep anything else a stack sends, artwork included (N27-R23).
N27-R2 The app MUST NOT keep a repair offer, an agreement (N13-R7), an action the stack did not receive (N1-R41) or the confirmation of an action (N1-R24), and MUST NOT keep a credential, a session token or pairing material outside the storage N4-R5 defines (N1-R23).
N27-R3 Everything kept MUST be encrypted with a key held in the platform’s secure storage and readable only while the device is unlocked, and MUST NOT be encrypted with a key kept in the application’s own files.
N27-R4 A kept row MUST identify its stack only by a keyed hash, and MUST NOT store the stack’s identity, name or address in the clear.
N27-R5 Where the device offers no secure storage, the app MUST keep nothing between launches and MUST say so on App settings (N4-R6).
N27-R6 Where the key cannot be read, the app MUST delete what it kept, create a new key, keep every pairing and its fingerprint (N1-R34), and MUST say once that saved data was cleared.
N27-R7 A kept reading MUST be shown on opening with when it was read (N1-R9), and MUST be replaced by a fresh reading when one arrives.
N27-R8 While a kept reading is shown and no fresh reading has arrived, every control that acts on the stack MUST be shown and MUST NOT be usable, with the reading’s age beside it; such a control MUST NOT be hidden (N1-R3).
N27-R9 The operator MUST be able to set how long readings are kept, as a whole number of days from 1 to 365 or until the stack is removed from the phone, and it MUST be 30 days until they set it.
N27-R10 Readings older than the kept period MUST be deleted when the app opens and when the period changes.
N27-R11 Removing a stack from the phone MUST remove every reading, setting and marker kept for it, in the same act.
N27-R12 Clear saved data MUST remove every reading, setting and marker the phone keeps, and MUST NOT remove a pairing or a session.
N27-R13 A kept reading written in a shape this version does not read MUST be discarded; a kept setting MUST be migrated to the current shape (N1-R32, N1-R33).
N27-R14 App settings MUST offer when to ask for the passcode again (N4-R19): immediately, which MUST be the choice until the operator sets one, or after 1, 5 or 15 minutes, or 1 hour.
N27-R15 App settings MUST offer the order of the stacks, and every list of stacks MUST follow it.
N27-R16 The app MUST open, after the lock, on the stack and tab the operator last used, and on the first stack in their order where that stack is gone.
N27-R17 Each stack’s settings MUST offer, for each kind of notification that stack raises, whether it may reach the phone, and a kind switched off MUST NOT be notified; the kinds offered MUST be the ones the stack declares, and the app MUST NOT add a kind of its own (N4-R11).
N27-R18 Each stack’s settings MUST offer which of updates, requests and problems are marked as new.
N27-R19 An update, request or problem newer than the newest of its kind the operator has seen for that stack MUST be marked as new, where that kind is switched on; the first reading of a stack MUST record what it holds as seen.
N27-R20 What’s new MUST list every item marked as new across the stacks, filterable by kind and by stack; opening an item MUST mark it as seen, and the list MUST offer marking everything seen.
N27-R21 A tab holding an item marked as new MUST carry a mark that a screen reader announces, and the mark MUST NOT rely on colour alone (N4-R21).
N27-R22 Nothing kept MUST be drawn while the app is locked (N4-R24).
N27-R23 Artwork MUST be held in memory only, for as long as the app runs. It MUST NOT be written to a disk cache, the platform’s URL cache, a temporary file or a backup. It MUST be dropped when the stack it came from is removed from the phone or its session ends, and MUST NOT be drawn while the app is locked (N27-R22).
N27-R24 Artwork MUST be fetched only from the core’s own API (D11-R9, D11-R10), or from a location the core states for it (D11-R3) which the media server’s guarded front door serves (ADR-0027), on a request the app makes itself carrying the credential of the session the screen is drawn for. The app MUST NOT compose an artwork address of its own beyond the core’s paths for a title it listed, MUST NOT carry a credential in an address, and MUST NOT log one (N1-R15).
N27-R25 Artwork MUST be fetched over TLS pinned the way the request it was fetched on is: to the stack’s certificate where it came from the core’s API (N1-R22), and to the certificate the core states for the guarded front door where it came from there (D11-R7). An answer presenting any other certificate MUST be refused, and the title drawn as its lettered poster (N3-R24).

Notes

Where each thing is kept is a decision about the app, not about behaviour. Which module keeps what, the sealing port and the rules that test it are in ADR-0035; the companion’s architecture document carries each rule beside its test.

Where these screens sit in the app — the menu that reaches What’s new, App settings and a stack’s settings — is the navigation page, not this one.

  • ADR-0035 — how it is kept
  • N1 — retained readings, shapes and pairings
  • N4 — secure storage, notifications and the lock
  • N13 — why an agreement is never kept
  • N2, N3 — the screens whose readings are kept
  • G3 — marks a screen reader can hear