Education

Api Learning Mastery Summary

LEARN Mastery Definition plan §5 — per-layer rollup for the Dashboard panel + /learn/mastery-map page.

Self-only (OWNER #4 ratified 2026-04-17). Reads user_concept_mastery (v46, live) joined with learn_concepts (v46), runs each row through learn.mastery.layer.compute_layer, and aggregates by layer + by domain.

Schema state (updated 2026-07-19, S50 flip): the dormant v51/v52 migrations landed as v136 (mastery-layer fields on user_concept_mastery) + v137 (user_mastery_transitions), APPLIED 2026-06-29 (LR-B4 Phase 0+2). first_mastered_at + calibration_passes flow through layer_state_from_row below, and the Phase-9b calibration serve/submit path now records passes — so Mastered/Enduring counts are live here with no further code changes. Legacy rows (calibration_passes=0) still cap at Proficient, which matches their reality.

Response shape (stable across pre/post v136): { "by_layer": {"attempted": N, "familiar": N, "proficient": N, "mastered": N, "enduring": N}, "decaying_count": N, # subset of proficient/mastered/enduring "by_domain": [ {"domain": str, "title": str, "by_layer": {...}, "total": N, "attempted_count": N}, ... ], "total_attempted": N, # concepts the user has touched "total_concepts": N, # full taxonomy size "version": 1 }

get/api/learning/mastery/summary

Request

  • Base URL: https://www.oxfordledge.com (the document declares no server; this is the origin it was published from)
  • URL: https://www.oxfordledge.com/api/learning/mastery/summary
  • Auth: none declared

Response

Successful Response

by_layerobject required

{layer_slug -> count} across every layer in services.learn_mastery_layer.LAYERS.

decaying_countinteger required

Subset of proficient+mastered+enduring with stale last_practice_at.

total_attemptedinteger required

sum(by_layer.values()) — concepts the user has touched.

total_conceptsinteger required

Full taxonomy size (denominator for coverage).

versioninteger required

Schema version; bumped when a non-additive change ships.

Changes

No recorded changes to this operation across all 1 revision of this API.