Reference · generated from the product
Where a student record sits, and what it takes to move one
Six components hold student data, and one boundary separates the district’s own devices from everything else. Everything on the district side is encrypted at rest, and crossing the boundary requires two independent conditions to hold at the same time.
Source. Components, tiers and the gate condition are read out of the shipped configuration.Where a claim carries no verified citation the badge says so rather than the page implying one.
above the line · the network
No box here holds a student record, because no such component exists to draw. This is the SHIPPED DEFAULT and a district can turn egress on. The accurate claim is that egress is district-configured and off by default, gated on a recorded DPA attestation — not that the product is incapable of it.
the device boundary
District configuration BOTH dc.provisioningAttested === true AND an https:// dc.auditRelayUrl. The two PII-egress tiers ('custodial', 'zk-cloud') degrade DOWN to 'local+meta'. Fail-safe, not fail-open.
below the line · this device
network layer Maps each request to an egress kind and enforces the SAME policy at the network layer. Fail-CLOSED: no policy yet, or an unknown kind, is BLOCKED. A PII canary tripwire inspects outbound bodies below the custodial tier; a raw identifier appearing in one is blocked and reported to the page. Defense in depth. The app-layer gate and the network-layer gate are separate code paths enforcing one policy, so a bug in one does not silently open the boundary.
| Component | Side of the boundary | Holds student data | Derived from |
|---|---|---|---|
| Browser localStorage | device | yes | MTSS2RTI.html — `const S` at S6; Stage-F field encryption |
| Browser IndexedDB | device | yes | MTSS2RTI.html — createObjectStore() census, deduped: caseload config groups roster snapshots yearHistory |
| Device keyring | device | no | MTSS2RTI.html — `var _KEYRING_PBKDF2_ITER = 600000;` (~29405); `{name:'AES-GCM', length:256}` (~29416) |
| Encrypted export / backup container | crossing | yes | MTSS2RTI.html — `async function _encryptExportContainer997(plaintext, password)` (~210027) |
| Static host (Cloudflare Pages) | network | no | deploy-pages.sh — the published set is an explicit allow-list of app assets; 'Cloudflare Pages: serves static files only; it stores no student data.' |
| District audit relay | network | no (not configured) | audit-relay-worker.js exists and compiles; dc.auditRelayUrl is empty in the shipped config |
What this paper is not
This page describes the architecture as shipped. A security brief would also contain a threat model, a key-rotation procedure, a recovery runbook and a penetration test result. None of those exist yet. They are listed as planned on Documents, and a reviewer who needs one should ask for it.