TimeBack Platform · Analytics Alpha
Skill Pack

Build reports from derived facts, not private math.

This installable pack teaches agents to call the live Analytics Alpha surface for active minutes, school-day minutes, XP totals, accuracy, mastery deltas, MAP RIT/Growth X, norms/R90 translations, completion, school-days remaining, and source-shaped imports. It is instructions and verification only.

Installable unitSKILL.md, agent adapters, references, and verifier live under pack/.
Surface calls onlyThe pack contains no private norms or R90 tables, dedupe logic, calendar math, XP or accuracy formulas, mastery math, or completion counting.
Runnable proofThe verifier calls the live implementation, fetches the approved integration convergence answer key, and compares returned rows to those platform-owned answers.

Install

Install the same hosted files into the skill directory your agent reads. These commands create the full pack: SKILL.md, references, agent adapters, verifier, and evidence directory. They do not download data tables.

Claude Code

BASE="https://platform3-andymontgomery-9773s-projects.vercel.app/analytics/alpha/skill_pack"
DEST="$HOME/.claude/skills/timeback-analytics-alpha"
mkdir -p "$DEST/references" "$DEST/checks" "$DEST/agents" "$DEST/evidence"
curl -fsS "$BASE/pack/SKILL.md" -o "$DEST/SKILL.md"
for file in canonical-surface report-recipes worked-example runnable-check leak-check source-shaped-import response-samples; do
  curl -fsS "$BASE/pack/references/$file.md" -o "$DEST/references/$file.md"
done
curl -fsS "$BASE/pack/checks/expected.json" -o "$DEST/checks/expected.json"
curl -fsS "$BASE/pack/checks/verify-skill-pack.mjs" -o "$DEST/checks/verify-skill-pack.mjs"
for file in openai.yaml claude-code.md codex-cli.md perplexity-computer.md; do
  curl -fsS "$BASE/pack/agents/$file" -o "$DEST/agents/$file"
done
(cd "$DEST" && ANALYTICS_BASE_URL=https://platform3-andymontgomery-9773s-projects.vercel.app/analytics/alpha/implementation/api node checks/verify-skill-pack.mjs --write-evidence)

Codex CLI

BASE="https://platform3-andymontgomery-9773s-projects.vercel.app/analytics/alpha/skill_pack"
DEST="$HOME/.codex/skills/timeback-analytics-alpha"
mkdir -p "$DEST/references" "$DEST/checks" "$DEST/agents" "$DEST/evidence"
curl -fsS "$BASE/pack/SKILL.md" -o "$DEST/SKILL.md"
for file in canonical-surface report-recipes worked-example runnable-check leak-check source-shaped-import response-samples; do
  curl -fsS "$BASE/pack/references/$file.md" -o "$DEST/references/$file.md"
done
curl -fsS "$BASE/pack/checks/expected.json" -o "$DEST/checks/expected.json"
curl -fsS "$BASE/pack/checks/verify-skill-pack.mjs" -o "$DEST/checks/verify-skill-pack.mjs"
for file in openai.yaml claude-code.md codex-cli.md perplexity-computer.md; do
  curl -fsS "$BASE/pack/agents/$file" -o "$DEST/agents/$file"
done
(cd "$DEST" && ANALYTICS_BASE_URL=https://platform3-andymontgomery-9773s-projects.vercel.app/analytics/alpha/implementation/api node checks/verify-skill-pack.mjs --write-evidence)

Credential path: the verifier mints a demo token automatically. For real or reviewer tenants, set ANALYTICS_BASE_URL plus ANALYTICS_TOKEN or ANALYTICS_REVIEWER_JWT; never paste tokens into a prompt transcript.

The canonical page is served without a trailing slash. All links here are root-absolute or fully absolute so they resolve correctly after deployment.

Copy-Runnable Worked Example

This command builds Ada's six Learning Report panels from the live Analytics API. It selects the published demo rows by returned Analytics row id, then renders fields returned by the surface.

For this Ada fixture, the MAP row is growthWindow=winter_to_winter. The optional source-import proof uses a separate student/date and may accumulate repeated demo proof imports; Ada's Learning Report XP panel is a different row.

ANALYTICS_BASE_URL=https://platform3-andymontgomery-9773s-projects.vercel.app/analytics/alpha/implementation/api node --input-type=module - <<'NODE'
const baseUrl = process.env.ANALYTICS_BASE_URL;
const mint = await fetch(baseUrl + "/dev/mint?tenantId=demo", { method: "POST" });
const { token, tenantId = "demo" } = await mint.json();
const headers = { authorization: "Bearer " + token, "x-timeback-tenant": tenantId };
const endpoints = {
  timeCommitment: {
    path: "/alpha/analytics/v1/school-day-minutes?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&subjectId=math&startDate=2026-05-01&endDate=2026-06-01&limit=100",
    id: "school_day_minutes_demo_student_01ht7g3yzv7qb5n4ykq1k0z9a9_math_may"
  },
  xp: {
    path: "/alpha/analytics/v1/xp-rollups?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&subjectId=math&windowKind=term&startDate=2026-01-01&endDate=2026-06-01&limit=100",
    id: "xp_rollup_demo_student_01ht7g3yzv7qb5n4ykq1k0z9a9_term"
  },
  accuracy: {
    path: "/alpha/analytics/v1/accuracy-rollups?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&subjectId=math&windowKind=term&startDate=2026-01-01&endDate=2026-06-01&limit=100",
    id: "accuracy_rollup_canonical_89ce4e22de47b487fc4150d7"
  },
  mastery: {
    path: "/alpha/analytics/v1/mastery-deltas?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&kcId=kc_math_fraction_equivalence_04&stateDimension=durable_mastery&startDate=2026-05-01&endDate=2026-06-01&limit=100",
    id: "mastery_delta_demo_student_01ht7g3yzv7qb5n4ykq1k0z9a9"
  },
  map: {
    path: "/alpha/analytics/v1/map-growth-rollups?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&subjectId=math&termId=term_2026_winter&growthWindow=winter_to_winter&normsSet=2025",
    id: "map_growth_rollup_demo_student_01ht7g3yzv7qb5n4ykq1k0z9a9"
  },
  completion: {
    path: "/alpha/analytics/v1/completion-rollups?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&subjectId=math&completionScope=course&scopeId=course_math_grade_4_powerpath&startDate=2026-01-01&endDate=2026-06-01",
    id: "completion_rollup_demo_student_01ht7g3yzv7qb5n4ykq1k0z9a9"
  }
};
async function pinnedRow(name, config) {
  const path = config.path;
  const response = await fetch(baseUrl + path.replaceAll("&", "&"), { headers });
  const text = await response.text();
  if (!response.ok) throw new Error(path + " failed " + response.status + ": " + text);
  const payload = JSON.parse(text);
  if (!Array.isArray(payload.data) || payload.data.length === 0) throw new Error(path + " returned no rows");
  const row = payload.data.find((item) => item.id === config.id);
  if (!row) throw new Error(name + " did not include pinned demo row " + config.id);
  return row;
}
const panels = {};
for (const [name, config] of Object.entries(endpoints)) panels[name] = await pinnedRow(name, config);
console.log(JSON.stringify({
  studentId: "student_01HT7G3YZV7QB5N4YKQ1K0Z9A9",
  subjectId: "math",
  source: "Analytics Alpha surface",
  computedLocally: false,
  panels
}, null, 2));
NODE

Then run the verifier to compare the same live surface against the live convergence answer key: node checks/verify-skill-pack.mjs --write-evidence.

Read the full worked-example.md

What It Regenerates

Learning Report panelsTime commitment, XP, accuracy, mastery changes, MAP RIT/Growth X, and completion percent from Analytics reads.
GOALS and metric checksPercentile/RIT, R90 grade position, school-days remaining, minutes, XP, mastery, RIT/Growth X, completion, and source-shaped TimeBack processed_facts imports.

Core call sequence

GET /alpha/analytics/v1/school-day-minutes
GET /alpha/analytics/v1/xp-rollups
GET /alpha/analytics/v1/accuracy-rollups
GET /alpha/analytics/v1/mastery-deltas
GET /alpha/analytics/v1/map-growth-rollups
GET /alpha/analytics/v1/norms/rit
GET /alpha/analytics/v1/norms/percentile
GET /alpha/analytics/v1/rit-to-grade
GET /alpha/analytics/v1/rit-to-grade/table
GET /alpha/analytics/v1/r90
GET /alpha/analytics/v1/r90/table
GET /alpha/analytics/v1/school-days-remaining
GET /alpha/analytics/v1/grade-level-status
GET /alpha/analytics/v1/completion-rollups

Read report-recipes.md

Verifier

The verifier mints demo credentials by default, calls the live Analytics implementation, fetches the approved integration convergence key, and optionally writes evidence. checks/expected.json supplies selectors, row ids, endpoint perimeter, and source-import proof config; it is not a local answer table for the Learning Report panels.

ANALYTICS_BASE_URL=https://platform3-andymontgomery-9773s-projects.vercel.app/analytics/alpha/implementation/api \
node pack/checks/verify-skill-pack.mjs --write-evidence

HTTP-only No database reads No client math

Read runnable-check.md · Verifier config · Latest verification evidence

Binary Leak Check

Any local calculation means the surface leaked.

  • No active/inactive/waste classification outside Analytics.
  • No school-day calendar or enrollment intersection outside Analytics.
  • No XP award, penalty, repeat-discount, or reversal formula outside Analytics/Results.
  • No mastery, decay, MAP norms/R90, Growth X, accuracy, remaining-school-day, or completion math in the pack.
  • No raw Events, Results, Supabase, Postgres, private logs, or implementation source for user-facing work.

Read leak-check.md