# Binary Leak Check

Run this check before shipping any People & Orgs app, report, QA probe, migration check, or customer deliverable.

## Pass Conditions

The deliverable passes only if all statements are true:

- It calls the live People & Orgs Alpha API.
- It opens or cites the canonical customer website and data dictionary.
- Every roster answer has an explicit `asOfDate`.
- It uses returned `role_kind`, `place_id`, `school_id`, `learning_group_id`, `membership_id`, `brand`, `modality`, `nwea_district_id`, and `is_time_locatable` fields.
- It reads `policy_config` for policy numbers instead of hardcoding them.
- It treats `app_credential` as existence and rotation status only.
- It preserves Problem JSON when calls fail.
- It stores no People & Orgs domain rows outside the surface.

## Automatic Fail Conditions

Stop and report a surface gap if the deliverable contains any of these:

- local role inference from names, emails, titles, URLs, or class labels;
- school-period title parsing;
- tenure bucket math or school-year boundary constants in client code;
- NWEA account grouping reconstructed from school-level data;
- credential secret storage, display, or `secret_ref` exposure;
- client-side soft-delete dedupe, hygiene filtering, or real-student filtering;
- client-side point-in-time null rules for memberships;
- direct reads of `oneroster.*`, `alpha.*`, Supabase, Postgres, implementation source, or private logs;
- copied enum/value tables instead of reading descriptor, dictionary, or `tag_definitions`;
- Results, Events, Content, Curriculum, gradebook, mastery, MAP scoring, or content-effectiveness logic;
- local persistence of roster-shaped data.

## Pack Shape Check

The installed pack may contain Markdown instructions, OpenAI agent metadata, recorded evidence, and the verifier script. It must not contain:

- CSV, TSV, XLSX, XML, SQL, SQLite, or database files;
- schema/OpenAPI parser code;
- package dependencies or `node_modules`;
- scripts that transform roster data for app use.

`checks/verify-skill-pack.mjs` is allowed because it performs live-response assertions against platform-pinned answers and pack-shape checks only. It is not a reusable data-processing library.
