N27 What the phone keeps
- Area
- N — Companion
- Audience
- operator
- Kind
- feature
- Status
- accepted
- Maturity
- building
- Labels
- mobile, storage, security, ux
The feature in the specification · Read at
Requirements
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).
- locked by
- no version locks it yet
- recorded done
- lemonfiber-companionapp-modules/health/src/Api/KeepingTheLastReading.phpapp-modules/requests/src/Api/KeepingWhatWasAsked.phpapp-modules/news/tests/Internal/TheNewsAsKeptTest.php
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).
- locked by
- no version locks it yet
- recorded done
- lemonfiber-companionapp-modules/kernel/src/Api/APairingCode.phpapp-modules/kernel/src/Api/APairingLine.phptests/Arch/WhatThePhoneMayKeepTest.php
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.
- locked by
- no version locks it yet
- recorded done
- lemonfiber-companionapp-modules/kernel/src/Api/HoldsTheSealKeys.phpapp-modules/seal/src/Api/EncrypterSeal.phptests/Feature/WhatThePhoneKeepsIsUnreadableOnDiskTest.php
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.
Where the device offers no secure storage, the app MUST keep nothing between launches and MUST say so on App settings (N4-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.
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.
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).
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.
- locked by
- no version locks it yet
- recorded done
- lemonfiber-companionapp-modules/kernel/src/Api/DaysAsked.phpapp-modules/kernel/src/Api/HowLongReadingsAreKept.phpapp-modules/kernel/tests/Api/DaysAskedTest.php
Readings older than the kept period MUST be deleted when the app opens and when the period changes.
Removing a stack from the phone MUST remove every reading, setting and marker kept for it, in the same act.
Clear saved data MUST remove every reading, setting and marker the phone keeps, and MUST NOT remove a pairing or a session.
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).
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.
App settings MUST offer the order of the stacks, and every list of stacks MUST follow it.
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.
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).
- locked by
- no version locks it yet
- recorded open
- lemonfiber-companion
Each stack's settings MUST offer which of updates, requests and problems are marked as new.
- locked by
- no version locks it yet
- recorded done
- lemonfiber-companionapp-modules/operator/src/Internal/Screens/ThisStackOnThisPhone.phpapp-modules/news/src/Api/MarkingAsNew.phptests/Feature/ChoosingWhatAStackMarksAsNewTest.php
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.
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.
- locked by
- no version locks it yet
- recorded done
- lemonfiber-companionapp-modules/operator/src/Internal/Screens/WhatIsNewOnEveryStack.phptests/Feature/SeeingWhatIsNewTest.php
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).
Nothing kept MUST be drawn while the app is locked (N4-R24).
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).
- locked by
- no version locks it yet
- recorded done
- lemonfiber-companionbridge/resources/ios/ArtworkHeld.swiftbridge/resources/android/ArtworkHeld.ktscripts/patch_nativephp/55-artwork-is-drawn-from-memory-on-ios.patchscripts/patch_nativephp/56-artwork-is-drawn-from-memory-on-android.patchbootstrap/Composition/ArtworkGoesWithTheSession.phpbridge/ios/Tests/ArtworkHeldTests/ArtworkHeldTests.swiftbridge/android/src/test/kotlin/ArtworkHeldTest.kttests/Contract/HoldingArtworkContractTest.php
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).
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).
- locked by
- no version locks it yet
- recorded done
- lemonfiber-companionapp-modules/sdk/src/Api/Pictures.phptests/Contract/EveryAdapterAnswersWhatItCannotReadTest.phptests/Feature/SearchingForATitleTest.php