AiSSAY
Ask later. Know now.

FERPA — student education records (34 CFR Part 99)

This page is generated from the requirement table the AiSSAY engine ships for this framework. When the engine produces an evidence pack, each row below gets a status computed from the operator's own records at that moment. This page shows the table, not anyone's results.

Read this first

Informational mapping prepared by the operator's own tooling. Not a legal opinion, not a certification, and not a substitute for advice of counsel. It organizes the operator's records against the cited requirements; whether those records satisfy the requirements is a determination for the operator, counsel, and the examiner.

About this framework

No FERPA regulation specific to AI had issued by September 2026. The Department of Education's July 2025 letter says AI use must comply with FERPA. Access by a provider acting as a school official is not a disclosure that 99.32 requires the school to record; this store logs it anyway.

The requirement table

6 rows: 2 mechanism, 2 organizational, 1 named gap, 1 computed

RequirementMechanism, duty or gapType
99.31(a)(1)(i)(B) — an outside provider acts as a school official only under the school's direct control over use and maintenance of recordsorganizational: the contract and the control are the school's. Self-hosting keeps the records on the school's own systems under its key, with no vendor-side copy.organizational
99.31(a)(1)(ii) — reasonable methods so officials reach only records they have a legitimate educational interest inDELEGATED when the store is sealed by your key manager (the kms provider): whoever your key manager refuses cannot open the store at all, and every open appears in your key manager's own audit log. This store itself has no authentication, roles or permissions and refuses no read: once a key is unwrapped, the process holding it can read every record. Under any other provider, NOT IMPLEMENTED — the operating system's file permissions are the only access control. The status is computed from the provider this store declares, not assumed.computed
99.32(a) — record each request for and disclosure of personally identifiable information, with the requester and their interestevery read and export is logged with the actor and a stated reason in a hash-chained access logmechanism
99.32(b)–(c) — record redisclosures; parents, eligible students and auditors may inspect the record of disclosuresthe access log exports with the records at any timemechanism
99.33 — limits on redisclosure by recipientsorganizational: telling recipients of the limit, and holding them to it, are the school'sorganizational
Reliance on this tool — independent evaluation of its controlsNOT IMPLEMENTED. No penetration test, no third-party review of the cryptography and no independent report on this software's controls exist yet. Anyone relying on these records as evidence must evaluate the tool themselves, and this row says so first.named gap

How a status is earned

Evidenced
a deterministic check ran against your records and the counts support the row. A store holding no relevant records reads unevidenced — a true statement, not a passing one. Empty never counts as clean.
Delegated
the mechanism is enforced by a system you already trust — a store sealed by your own key manager delegates access control to it, and the pack says the enforcing log is your key manager's, not ours. The pack names the endpoint the key manager was reached at. An AWS endpoint other than AWS's own default for the region reads delegated to that endpoint, with a request that you confirm it is your key management service. One backend — AWS KMS — has run against the real AWS KMS service; no other backend has.
Test seam
sealed by an in-process test backend — a stub, or a stand-in for the AWS client — and the status names which. No key manager enforces access. The seam is built and tested, and the pack refuses to call that delegation.
Partially evidenced
the mechanism is built and some of your runs carry its evidence, but not all — usually because they were sealed before the mechanism existed. The pack says how many runs are in each group, and never counts the missing ones as passing.
Organizational
the requirement is a procedure only people can perform. The pack names it as yours instead of dressing a policy up as a mechanism.
Named gap
the pack cannot evidence it — either the mechanism is not built, or no software can supply it — and it says which. The gap is printed, because a reviewer should read it here rather than discover it.

No status is typed in by hand: every status is recomputed from the store each time a pack is produced, the requirement and mechanism text is written and reviewed as part of the engine, and the dependency evidence comes from our release scan. A failing mechanism can never be read as evidence that the control works.

Rows marked “computed” are the access-control rows. Their status is computed from the provider your store declares: a gap unless your key manager seals the store, “test seam” under a stub or stand-in backend, “delegated” only under a real one. Today they can never read evidenced, and marking them as a built mechanism would overstate them.