# Runnable Check

From the installed Claude Code pack root:

    cd ~/.claude/skills/timeback-analytics-alpha
    node checks/verify-skill-pack.mjs --write-evidence

From the installed Codex pack root:

    cd ~/.codex/skills/timeback-analytics-alpha
    node checks/verify-skill-pack.mjs --write-evidence

Or from this artifact directory before install:

    node pack/checks/verify-skill-pack.mjs --write-evidence

Fresh-install proof for this attempt was run from a temporary copy of the deployable `site/pack` mirror. That path includes `checks/expected.json`, which tells the verifier which rows to read and where to fetch the live platform answer key.

The check:

1. Opens the live Analytics implementation.
2. Mints demo credentials unless ANALYTICS_TOKEN or ANALYTICS_REVIEWER_JWT is already supplied.
3. Calls the report-ready endpoints for event time facts, school-day minutes, XP rollups, accuracy rollups, attempt rollups, response-latency rollups, hint-usage rollups, mastery deltas, MAP growth rollups, and completion rollups, and checks descriptor parity for every advertised Analytics endpoint including norms/R90, RIT-to-grade, grade-level status, and school-days remaining.
4. Loads checks/expected.json for selectors, then fetches the approved integration convergence key from `https://platform3-andymontgomery-9773s-projects.vercel.app/analytics/alpha/integration/convergence.json`.
5. Compares returned fields to that live platform-owned answer key. The XP alias check requires `xp_goal_percent` to equal the answer key's `xp_completion_percent`, so the previous `null` regression fails.
6. Records that the optional source-shaped import smoke is skipped unless `ANALYTICS_RUN_IMPORT=1` is set.
7. Writes evidence to evidence/verification-latest.json when --write-evidence is present.

Live Vercel/Supabase checks can occasionally return transient transport or lock-timeout failures while another run is importing demo proof rows. The verifier retries only those HTTP failures, records them in `http_retries`, and still compares every returned value to the live convergence answer key.

The pinned-answer phases do not stop at the first mismatched row. If one answer-key comparison fails, the check still records the remaining Learning Report panels in that phase, including MAP RIT/Growth X and completion, then fails with the full mismatch list.

The optional source-import proof does not use `source_import_id` as the XP-row selector because that field is nullable on the separate proof rollup. The receipt proves which adapter run materialized; the XP-row read proves the surface exposes a report-ready typed XP fact. Repeated demo proof runs may accumulate in the same day rollup, so the write smoke checks typed row shape instead of a one-run exact XP value.

Optional write smoke:

    ANALYTICS_RUN_IMPORT=1 node checks/verify-skill-pack.mjs --write-evidence

Pass criteria: result is pass and checkedBySurfaceCallsOnly is true.

The check does not read a database, inspect implementation source, load private norms/R90 tables, parse terms, classify time, apply calendars, compute XP, compute accuracy, compute mastery, compute Growth X, treat R90 grade-band percent as progress, count remaining school days, or count completion.
