# Results Alpha Leak Check

Run this before shipping any app, report, QA probe, migration check, or deliverable built with this pack.

## Binary Pass

The output passes only if every answer below is "no":

- Did you include a norms table or local 2020/2025 lookup?
- Did you dedupe MAP sittings or choose the test of record locally?
- Did you unpivot NWEA Goal1..Goal5 columns?
- Did you switch over growth-window column names?
- Did you parse term strings, assessment names, student ids, emails, URLs, or free text to infer typed fields?
- Did you compute Growth X, group Growth X, projected growth, percentile-to-RIT, RIT-to-percentile, RIT50, RIT90, effective grade, working grade, either named grade-movement metric, 99-levels, quadrants, intervention flags, or target gaps?
- Did you parse Ed-Fi source payloads or decide academic-record/transcript source precedence?
- Did you blend `initial_mastery`, `current_retention`, `durable_mastery`, and `fluency_state` into one local mastery value?
- Did you compute mastery state, confidence, evidence count, decay, report-card status, or gate cooldown?
- Did you copy Curriculum track definitions into a Results app or infer student position outside `student_track_state`?
- Did you rank next lessons, reviews, practice, remediation, or gate retries instead of using `next-task`?
- Did you compute XP awards, effort bonuses, repeat-attempt discounts, passive-activity verification, penalties, or reversals instead of reading `xp-ledger`?
- Did you compute XP-goal remaining work, hours-to-target, target dates, or goal projection instead of reading returned Results fields or reporting a missing surface primitive?
- Did you increment `validated_by_count`, `failed_by_count`, or `effectiveness_rate` instead of reading `content-effectiveness`?
- Did you parse `canonical_response` JSON to rebuild a test result instead of reading `test-result-components`?
- Did you scrape AI grader logs or result JSON for model/prompt/feedback provenance instead of reading `ai-grading-audit`?
- Did you reconstruct closed-loop reconciliation for RIT, Growth X, group Growth X, mastery, or minutes, or aggregate Events locally to create time commitment?
- Did you join private OneRoster, NWEAMap, QTI, Caliper, Supabase, or Postgres tables?
- Did you store Results domain rows in a local database instead of writing through the surface?
- Did you persist bearer tokens, producer secrets, raw payloads, or student app credentials?
- Did you read implementation source or private logs to finish a user-facing task?

If any answer is "yes", stop. The surface leaked. Report the missing Results endpoint, field, report view, policy output, or answer-key row. Do not patch the client with private logic.

## Required Evidence

For reports:

- Include the exact Results endpoint path.
- Include typed request parameters.
- Include row count and, when present, `meta.resultHash`.
- For worked examples, cite the matching `/reports/answer-key` row.
- Link back to the customer website or data dictionary for field meaning.

For writes:

- Include the `Idempotency-Key` behavior.
- For corrections, include the prior detail-read ETag and the correction response.
- Preserve Problem JSON for rejected requests.

## Safe Client Work

These are rendering choices, not leaked surface logic:

- Sort rows by returned `term_order` or `frame_index`.
- Group rows already returned by a report endpoint for display sections.
- Format numbers and dates for a chart or table.
- Store browser UI preferences.
- Compare a report response to answer-key fields returned by the surface.
- Filter already-returned rows by user-selected display tabs.

Do not let display work become business logic.
