docs(privacy): private studysets as built (ADR 0019)

Learn's AGENTS.md says how private studysets work (keys, the envelope,
locked rows, rewriting a tree) and what changed for the connector,
publishing, uploads and the learner count; ADR 0019 records what was built
otherwise than decided or not yet (a private studyset's files); the
halkyon_app README describes the content cipher and device keys.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-21 21:50:29 +02:00
commit dcdc9c1542
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -68,6 +68,15 @@ Written as the apps are: Dart 3.13's primary constructors, Material from
hands it to the screens, which then offer no Add, and the start screen
offers an account to create in place of the app's sentence on adding
GitHub; `gitHubProblemText` says why a GitHub sign-in was refused.
- **Content sealed with data keys** (`lib/src/privacy/`, ADR 0019):
`ContentCipher` (`SodiumContentCipher`, on the isolate it is used on, as an
app seals and opens rows one by one; `FakeContentCipher` in tests) makes a
store's data keys, sealed to the account and signed by it, opens them, and
seals and opens a row's content for the row it is stored in (its table, id
and column), the payload holding the signature before the ciphertext. An
anonymous person's device makes key pairs of its own
(`AccountCrypto.newDeviceKeys`), which `makePassword` keeps as the account's
once they set a password.
- **A password and TOTP** (`lib/src/password/`, ADR 0017): `PasswordRepository`
on a `PasswordGateway` (`ServerpodPasswordGateway`), an `AccountCrypto`
(`SodiumAccountCrypto`: halkyon_keys and SRP's client half, each step on an