Privacy
Privacy-program operational helpers. The first primitive, vendorReview, builds the annual third-party / EdTech vendor-review attestation that FERPA's school-official exception and California's SOPIPA expect a school or district to keep on file for every processor that touches student data: a dated, clause-by-clause record that the vendor uses the data only for the authorized educational purpose, runs no targeted advertising or commercial profiling, sells nothing, keeps reasonable security safeguards, deletes on request, and so on.
The builder follows the operator-feeds-metadata pattern: the operator supplies the vendor's attested answers and vendorReview returns a frozen report — { attested, gaps, reviewedAt, nextReviewDueAt, ... } — that composes into the operator's own retention / audit / export sink. It is not framework-persisted.
b.privacy.vendorReview(opts) #
{
vendorName: string, // required — the processor under review
reviewedAt: number, // required — epoch ms of this review
clauses: { : boolean }, // attested answer per clause (see listVendorReviewClauses)
reviewer: string, // optional — who performed the review
notes: string, // optional — free-text reviewer notes
}
Build a dated annual third-party / EdTech vendor-review attestation — the record a FERPA school-official arrangement and California SOPIPA expect a school or district to keep for every processor of student data. The operator supplies the vendor's attested answer (a boolean) per clause; vendorReview validates the shape, computes whether every REQUIRED clause is attested (attested) and which are not (gaps), and stamps the review date plus a 365-day nextReviewDueAt re-review clock. Operator-feeds-metadata: the returned report is frozen and is NOT framework-persisted — compose it into your retention / audit / export sink. A best-effort privacy.vendor_review.recorded audit event fires when an audit sink is wired.
var report = b.privacy.vendorReview({
vendorName: "Acme LMS",
reviewedAt: Date.now(),
clauses: {
educationalPurposeOnly: true, noTargetedAdvertising: true,
noCommercialProfiling: true, noSaleOfStudentData: true,
securitySafeguards: true, deletionOnRequest: true,
subProcessorsCurrent: true, breachNotification: true,
schoolOfficialDesignation: true,
},
});
// → { vendorName, reviewedAt, nextReviewDueAt, attested: true, gaps: [], clauses: {...} }
b.privacy.listVendorReviewClauses() #
Return the frozen FERPA / SOPIPA vendor-review clause set — each entry is { id, required, citation, description }. Use it to render a review form or to enumerate the clauses vendorReview evaluates.
b.privacy.listVendorReviewClauses().map(function (c) { return c.id; });
// → ["educationalPurposeOnly", "noTargetedAdvertising", ...]
Last updated 2026-08-08T16:39:49.652Z by seeder.