← The board

N27 What the phone keeps

Area
N — Companion
Audience
operator
Kind
feature
Status
accepted
Maturity
building
Labels
mobile, storage, security, ux
Requires
N1N4
Relates to
N2N3N13G3

The feature in the specification · Read at

Requirements

  1. N27-R1acceptedMUST

    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
  2. N27-R2acceptedMUST

    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
  3. N27-R3acceptedMUST

    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
  4. N27-R4acceptedMUST

    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.

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/kernel/src/Api/SealedStack.phpapp-modules/seal/src/Api/EncrypterSeal.phpapp-modules/connection/tests/Api/ClearingWhatCannotBeReadTest.phpapp-modules/connection/tests/Api/LettingGoOfOldReadingsTest.php
  5. N27-R5acceptedMUST

    Where the device offers no secure storage, the app MUST keep nothing between launches and MUST say so on App settings (N4-R6).

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/kernel/src/Api/SealStanding.phpapp-modules/kernel/src/Api/Sealing.phpapp-modules/kernel/tests/Api/SealStandingTest.phptests/Contract/SealedContractTest.php
  6. N27-R6acceptedMUST

    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.

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/kernel/src/Api/ForgetsEverythingKept.phpapp-modules/kernel/src/Api/Sealed.phptests/Contract/ForgetsEverythingKeptContractTest.phptests/Feature/ClearingWhatThePhoneKeepsLeavesPairingsTest.php
  7. N27-R7acceptedMUST

    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.

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/operator/src/Internal/Screens/HowCurrentThisStackIs.phpapp-modules/operator/src/Internal/Screens/HowThisStackIs.phptests/Feature/OpeningOnTheKeptListingTest.phptests/Feature/OpeningOnTheKeptRequestsTest.php
  8. N27-R8acceptedMUST

    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).

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/operator/resources/views/how-current-this-stack-is.blade.phpapp-modules/operator/resources/views/what-the-household-asked.blade.phptests/Feature/OpeningOnTheKeptListingTest.phptests/Feature/OpeningOnTheKeptRequestsTest.php
  9. N27-R9acceptedMUST

    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
  10. N27-R10acceptedMUST

    Readings older than the kept period MUST be deleted when the app opens and when the period changes.

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/kernel/src/Api/ForgetsOldReadings.phpapp-modules/operator/src/Internal/Screens/YourStacks.phpapp-modules/connection/tests/Api/LettingGoOfOldReadingsTest.phptests/Contract/ForgetsOldReadingsContractTest.php
  11. N27-R11acceptedMUST

    Removing a stack from the phone MUST remove every reading, setting and marker kept for it, in the same act.

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/kernel/src/Api/ForgetsAStack.phpapp-modules/kernel/src/Api/RemovalsUnderWay.phptests/Feature/RemovingAStackFromThePhoneTest.phptests/Feature/RemovingAStackOnItsSettingsPageTest.php
  12. N27-R12acceptedMUST

    Clear saved data MUST remove every reading, setting and marker the phone keeps, and MUST NOT remove a pairing or a session.

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/kernel/src/Api/ForgetsEverythingKept.phpapp-modules/connection/src/Api/ClearingWhatThePhoneKeeps.phptests/Feature/ClearingWhatThePhoneKeepsLeavesPairingsTest.phptests/Feature/SettingHowThisPhoneIsSetTest.php
  13. N27-R13acceptedMUST

    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).

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/kernel/src/Api/NewestReading.phpapp-modules/kernel/src/Api/Shape.phpapp-modules/requests/tests/Api/KeepingWhatWasAskedTest.phpapp-modules/services/tests/Api/KeepingWhatItRunsTest.php
  14. N27-R14acceptedMUST

    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.

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/kernel/src/Api/DeviceAuth.phpapp-modules/kernel/src/Api/LockAfter.phptests/Contract/DeviceAuthContractTest.phptests/Contract/NotifierContractTest.php
  15. N27-R15acceptedMUST

    App settings MUST offer the order of the stacks, and every list of stacks MUST follow it.

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/kernel/src/Api/Stacks.phpapp-modules/operator/src/Internal/Screens/HowThisPhoneIsSet.phptests/Contract/StacksContractTest.phptests/Feature/EveryListOfStacksFollowsTheOrderTest.php
  16. N27-R16acceptedMUST

    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.

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/kernel/src/Api/WhereTheOperatorWas.phpapp-modules/kernel/src/Api/WhichTab.phptests/Contract/WhereTheOperatorWasContractTest.phptests/Feature/OpeningWhereTheOperatorLeftOffTest.php
  17. N27-R17acceptedMUST

    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
  18. N27-R18acceptedMUST

    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
  19. N27-R19acceptedMUST

    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.

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/news/src/Api/MarkingAsNew.phpapp-modules/news/src/Api/Noticing.phpapp-modules/news/tests/Api/MarkingAsNewTest.phpapp-modules/news/tests/Api/NoticingTest.php
  20. N27-R20acceptedMUST

    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
  21. N27-R21acceptedMUST

    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).

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/kernel/src/Api/TheNewestNamed.phpapp-modules/sdk/src/Api/Listeners.phpapp-modules/news/tests/Api/NoticingTest.phptests/Feature/CountingWhatIsNewTest.php
  22. N27-R22acceptedMUST

    Nothing kept MUST be drawn while the app is locked (N4-R24).

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/operator/src/Internal/Screens/Locked.phpapp-modules/connection/src/Api/TheLock.phptests/Feature/NothingIsBuiltBehindTheLockTest.phptests/Feature/NothingIsDrawnBehindTheLockTest.php
  23. N27-R23acceptedMUST

    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
  24. N27-R24acceptedMUST

    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).

    locked by
    no version locks it yet
    recorded done
    lemonfiber-companionapp-modules/sdk/src/Api/Pictures.phpapp-modules/household/src/Internal/ThePicturesItDraws.phptests/Contract/FetchingArtworkContractTest.phptests/Arch/TheAppOpensOnlyTheseDoorsTest.php
  25. N27-R25acceptedMUST

    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