{
  "module": "analytics",
  "surface": "alpha",
  "name": "TimeBack Analytics Alpha API",
  "storageModel": "extend-only alpha.analytics_* typed derived-fact tables",
  "noOneEdTechBase": true,
  "endpoints": [
    "/alpha/analytics/v1/event-time-facts",
    "/alpha/analytics/v1/time-windows",
    "/alpha/analytics/v1/school-day-minutes",
    "/alpha/analytics/v1/xp-rollups",
    "/alpha/analytics/v1/accuracy-rollups",
    "/alpha/analytics/v1/attempt-rollups",
    "/alpha/analytics/v1/response-latency-rollups",
    "/alpha/analytics/v1/hint-usage-rollups",
    "/alpha/analytics/v1/mastery-deltas",
    "/alpha/analytics/v1/map-growth-rollups",
    "/alpha/analytics/v1/completion-rollups",
    "/alpha/analytics/v1/fluency-probes",
    "/alpha/analytics/v1/lab-progress",
    "/alpha/analytics/v1/source-imports",
    "/alpha/analytics/v1/norms",
    "/alpha/analytics/v1/norms/table",
    "/alpha/analytics/v1/norms/rit",
    "/alpha/analytics/v1/norms/percentile",
    "/alpha/analytics/v1/rit-to-grade",
    "/alpha/analytics/v1/rit-to-grade/table",
    "/alpha/analytics/v1/r90",
    "/alpha/analytics/v1/r90/table",
    "/alpha/analytics/v1/school-days-remaining",
    "/alpha/analytics/v1/grade-level-status",
    "/alpha/analytics/v1/students/{studentId}/streak",
    "/alpha/analytics/v1/students/{studentId}/daily-xp",
    "/dev/mint",
    "/alpha/analytics/v1/source-imports/timeback-xp-time-accuracy",
    "/alpha/analytics/v1/source-imports/timeback-map",
    "/alpha/analytics/v1/source-imports/timeback-grade-mastery",
    "/alpha/analytics/v1/source-imports/timeback-completion",
    "/alpha/analytics/v1/source-imports/migration-reconcile"
  ],
  "listQueryContract": {
    "dateCalendar": "proleptic Gregorian, years 0001 through 9999",
    "dateAcceptedForms": [
      "YYYY-MM-DD"
    ],
    "modifiedSinceAcceptedForms": [
      "YYYY-MM-DDTHH:mm:ssZ",
      "YYYY-MM-DDTHH:mm:ss.SSSZ"
    ],
    "modifiedSinceCanonicalForm": "YYYY-MM-DDTHH:mm:ss.SSSZ",
    "parametersByEndpoint": {
      "/alpha/analytics/v1/event-time-facts": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        },
        "startDate": {
          "componentName": "AnalyticsStartDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "endDate": {
          "componentName": "AnalyticsEndDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        }
      },
      "/alpha/analytics/v1/time-windows": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        },
        "startDate": {
          "componentName": "AnalyticsStartDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "endDate": {
          "componentName": "AnalyticsEndDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        }
      },
      "/alpha/analytics/v1/school-day-minutes": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        },
        "startDate": {
          "componentName": "AnalyticsStartDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "endDate": {
          "componentName": "AnalyticsEndDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        }
      },
      "/alpha/analytics/v1/xp-rollups": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        },
        "startDate": {
          "componentName": "AnalyticsStartDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "endDate": {
          "componentName": "AnalyticsEndDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        }
      },
      "/alpha/analytics/v1/accuracy-rollups": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        },
        "startDate": {
          "componentName": "AnalyticsStartDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "endDate": {
          "componentName": "AnalyticsEndDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        }
      },
      "/alpha/analytics/v1/attempt-rollups": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        },
        "startDate": {
          "componentName": "AnalyticsStartDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "endDate": {
          "componentName": "AnalyticsEndDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        }
      },
      "/alpha/analytics/v1/response-latency-rollups": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        },
        "startDate": {
          "componentName": "AnalyticsStartDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "endDate": {
          "componentName": "AnalyticsEndDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        }
      },
      "/alpha/analytics/v1/hint-usage-rollups": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        },
        "startDate": {
          "componentName": "AnalyticsStartDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "endDate": {
          "componentName": "AnalyticsEndDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        }
      },
      "/alpha/analytics/v1/mastery-deltas": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        },
        "startDate": {
          "componentName": "AnalyticsStartDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "endDate": {
          "componentName": "AnalyticsEndDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "asOfDate": {
          "componentName": "AnalyticsAsOfDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        }
      },
      "/alpha/analytics/v1/map-growth-rollups": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        }
      },
      "/alpha/analytics/v1/completion-rollups": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        },
        "startDate": {
          "componentName": "AnalyticsStartDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "endDate": {
          "componentName": "AnalyticsEndDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        }
      },
      "/alpha/analytics/v1/fluency-probes": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        },
        "startDate": {
          "componentName": "AnalyticsStartDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "endDate": {
          "componentName": "AnalyticsEndDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        }
      },
      "/alpha/analytics/v1/lab-progress": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        },
        "startDate": {
          "componentName": "AnalyticsStartDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        },
        "endDate": {
          "componentName": "AnalyticsEndDate",
          "description": "A real Gregorian calendar date in YYYY-MM-DD form (years 0001 through 9999).",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
            "examples": [
              "2000-02-29"
            ]
          }
        }
      },
      "/alpha/analytics/v1/source-imports": {
        "modifiedSince": {
          "componentName": "AnalyticsModifiedSince",
          "description": "An exact UTC polling timestamp in YYYY-MM-DDTHH:mm:ssZ or YYYY-MM-DDTHH:mm:ss.SSSZ form. Numeric offsets, other fractional precision, and nonexistent Gregorian dates are rejected; seconds-only input is canonicalized to milliseconds.",
          "schema": {
            "type": "string",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})T((?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d)(\\.\\d{3})?Z$",
            "examples": [
              "2000-02-29T23:59:59Z",
              "2000-02-29T23:59:59.999Z"
            ]
          }
        }
      }
    }
  },
  "referenceResources": {
    "normsAchievement": {
      "table": "alpha.analytics_norms_achievement",
      "version": "analytics.norms.achievement.v2026-06-12",
      "api": [
        "/alpha/analytics/v1/norms/table",
        "/alpha/analytics/v1/norms/rit",
        "/alpha/analytics/v1/norms/percentile"
      ]
    },
    "ritToGrade": {
      "table": "alpha.analytics_r90_table",
      "version": "analytics.rit_to_grade.powerpath.v2026-06-15",
      "ownerModule": "nweamap",
      "sourceRef": "powerpath:/powerpath/rit-to-grade",
      "ownerApi": [
        "/nweamap/v1/rit-to-grade/table",
        "/nweamap/v1/rit-to-grade"
      ],
      "api": [
        "/alpha/analytics/v1/rit-to-grade/table",
        "/alpha/analytics/v1/rit-to-grade"
      ],
      "legacyApi": [
        "/alpha/analytics/v1/r90/table",
        "/alpha/analytics/v1/r90"
      ]
    }
  },
  "publicContracts": {
    "mapGrowthRollup": {
      "table": "alpha.analytics_map_growth_rollup",
      "api": "/alpha/analytics/v1/map-growth-rollups",
      "fields": [
        "id",
        "student_id",
        "subject_id",
        "canonical_term_id",
        "growth_window",
        "norms_set",
        "map_score_id",
        "map_growth_window_ref",
        "rit_score",
        "start_rit",
        "achievement_percentile",
        "r50_grade",
        "r90_grade",
        "effective_grade",
        "r90_grade_level",
        "r90_percent_complete",
        "r90_table_version",
        "observed_growth",
        "typical_growth",
        "projected_growth",
        "growth_x",
        "growth_percentile",
        "conditional_growth_percentile",
        "growth_x_target",
        "on_track",
        "sitting_count",
        "retake_count",
        "map_sitting_refs",
        "source_import_id",
        "policy_ref",
        "null_reason",
        "quality_status",
        "calculation_version",
        "computed_at",
        "modified_at"
      ],
      "canonicalConditionalGrowthPercentileField": "conditional_growth_percentile",
      "compatibilityAliases": {
        "growth_percentile": "conditional_growth_percentile"
      },
      "startRitField": "start_rit",
      "governedBy": "aitd-009-map-growth-rollups"
    },
    "attemptCountRollup": {
      "table": "alpha.analytics_attempt_rollup",
      "api": "/alpha/analytics/v1/attempt-rollups",
      "fields": [
        "id",
        "student_id",
        "subject_id",
        "policy_ref",
        "window_kind",
        "window_start",
        "window_end",
        "attempt_count",
        "max_attempt_ordinal",
        "source_import_id",
        "source_event_refs",
        "quality_status",
        "null_reason",
        "calculation_version",
        "computed_at",
        "modified_at"
      ],
      "policyRef": "alpha.policy.analytics.attempt_count.v2026-07-08"
    },
    "responseLatencyRollup": {
      "table": "alpha.analytics_response_latency_rollup",
      "api": "/alpha/analytics/v1/response-latency-rollups",
      "fields": [
        "id",
        "student_id",
        "subject_id",
        "policy_ref",
        "window_kind",
        "window_start",
        "window_end",
        "response_count",
        "response_time_ms_total",
        "response_time_ms_avg",
        "response_time_ms_min",
        "response_time_ms_max",
        "source_import_id",
        "source_event_refs",
        "quality_status",
        "null_reason",
        "calculation_version",
        "computed_at",
        "modified_at"
      ],
      "policyRef": "alpha.policy.analytics.response_latency.v2026-07-08",
      "canonicalUnit": "milliseconds"
    },
    "hintUsageRollup": {
      "table": "alpha.analytics_hint_usage_rollup",
      "api": "/alpha/analytics/v1/hint-usage-rollups",
      "fields": [
        "id",
        "student_id",
        "subject_id",
        "policy_ref",
        "window_kind",
        "window_start",
        "window_end",
        "hint_request_count",
        "hint_view_count",
        "hint_used_count",
        "source_import_id",
        "source_event_refs",
        "quality_status",
        "null_reason",
        "calculation_version",
        "computed_at",
        "modified_at"
      ],
      "policyRef": "alpha.policy.analytics.hint_usage.v2026-07-08"
    },
    "fluencyProbe": {
      "table": "alpha.analytics_fluency_probe",
      "api": "/alpha/analytics/v1/fluency-probes",
      "fields": [
        "id",
        "student_id",
        "course_id",
        "kc_id",
        "source_event_id",
        "occurred_at",
        "probe_kind",
        "correct_units",
        "elapsed_ms",
        "rate_per_minute",
        "performance_band",
        "policy_ref",
        "quality_status",
        "calculation_version",
        "computed_at",
        "modified_at"
      ],
      "policyRef": "alpha.policy.analytics.fluency_probe.v2026-07-18.issue-1128"
    },
    "labProgress": {
      "table": "alpha.analytics_lab_progress",
      "api": "/alpha/analytics/v1/lab-progress",
      "fields": [
        "id",
        "student_id",
        "course_id",
        "policy_profile",
        "window_start",
        "window_end",
        "completed_hands_on_lab_count",
        "hands_on_minutes",
        "total_course_active_minutes",
        "hands_on_percent",
        "required_lab_count",
        "required_hands_on_percent",
        "meets_course_requirement",
        "source_event_refs",
        "null_reason",
        "policy_ref",
        "quality_status",
        "calculation_version",
        "computed_at",
        "modified_at"
      ],
      "policyRef": "alpha.policy.analytics.ap_lab_progress.v2026-07-18.issue-1128"
    }
  },
  "policies": {
    "groupGrowthX": "average_of_student_growth_x_ratios",
    "attemptCount": {
      "policyRef": "alpha.policy.analytics.attempt_count.v2026-07-08",
      "sourceFields": [
        "https://platform3.timeback.com/player/attempt_count",
        "https://platform3.timeback.com/player/attempt_ordinal"
      ],
      "eventAggregation": "sum_max_attempt_count_per_question_interaction"
    },
    "responseLatency": {
      "policyRef": "alpha.policy.analytics.response_latency.v2026-07-08",
      "sourceFields": [
        "https://platform3.timeback.com/player/response_time_ms"
      ],
      "unit": "milliseconds"
    },
    "hintUsage": {
      "policyRef": "alpha.policy.analytics.hint_usage.v2026-07-08",
      "sourceFields": [
        "https://platform3.timeback.com/player/hint_usage"
      ]
    },
    "fluencyProbe": {
      "policyRef": "alpha.policy.analytics.fluency_probe.v2026-07-18.issue-1128",
      "formula": "correct_units * 60000 / elapsed_ms",
      "bands": {
        "acquisition": "<10",
        "fluency_building": ">=10 and <20",
        "mastery": ">=20"
      },
      "sourceOwner": "Events fluency_probe_completed"
    },
    "apLabProgress": {
      "policyRef": "alpha.policy.analytics.ap_lab_progress.v2026-07-18.issue-1128",
      "chemistryLabFloor": 16,
      "environmentalScienceHandsOnPercentFloor": 25,
      "sourceOwner": "Events lab_completed and course-scoped active_duration_ms"
    },
    "xpGoal": {
      "policyRef": "alpha.policy.analytics.xp_goal.v2026-06-12",
      "dailyGoalsBySubject": {
        "language": 25,
        "math": 25,
        "reading": 25,
        "science": 12.5,
        "fastmath": 10,
        "vocabulary": 10,
        "writing": 12.5
      },
      "unit": {
        "xpPerExpectedMinute": 1,
        "xpPerHour": 60,
        "meaning": "1 XP = 1 expected minute; XP hours = XP / 60."
      }
    },
    "studentMotivation": {
      "policyRef": "alpha.policy.analytics.student_motivation.v2026-07-08",
      "streakPolicyRef": "alpha.policy.analytics.school_day_streak.v2026-07-08",
      "streakCalendarOwner": "People & Orgs alpha.school_calendar",
      "xpLedgerOwner": "Results alpha.xp_ledger",
      "dailyGoalPolicyRef": "alpha.policy.analytics.xp_goal.v2026-06-12",
      "dailyGoalDefaultSubjectScope": [
        "language",
        "math",
        "reading",
        "science",
        "fastmath",
        "vocabulary",
        "writing"
      ]
    },
    "ageGradeStatus": {
      "policyRef": "alpha.policy.analytics.age_grade_status.v2026-06-16",
      "canonicalFields": [
        "working_age_grade_status",
        "mastered_age_grade_status"
      ],
      "labels": [
        "working_behind_age_grade",
        "working_at_age_grade",
        "working_above_age_grade",
        "mastered_behind_age_grade",
        "mastered_at_age_grade",
        "mastered_above_age_grade"
      ],
      "deprecatedAliases": {
        "instructional_level_status": "working_age_grade_status",
        "strict_mastery_status": "mastered_age_grade_status"
      }
    }
  },
  "recipes": {
    "goalsPercentileToTrackPosition": [
      "/alpha/analytics/v1/norms/table?subject={subject}&grade={grade}&season={season}&normsSet={normsSet}",
      "/alpha/analytics/v1/norms/rit?subject={subject}&grade={grade}&season={season}&percentile={percentile}&normsSet={normsSet}",
      "/alpha/analytics/v1/rit-to-grade/table?subject={subject}",
      "/alpha/analytics/v1/rit-to-grade?subject={subject}&rit={rit}&normsSet={normsSet}",
      "/alpha/analytics/v1/school-days-remaining?studentId={studentId}&asOf={date}&xpRemaining={xpRemaining}&hoursPerSchoolDay={hoursPerSchoolDay}",
      "/alpha/analytics/v1/grade-level-status?studentId={studentId}&subjectId={subject}&asOfDate={date}",
      "/alpha/analytics/v1/students/{studentId}/streak?asOfDate={date}",
      "/alpha/analytics/v1/students/{studentId}/daily-xp?date={date}"
    ],
    "learningReportRollups": [
      "/alpha/analytics/v1/school-day-minutes",
      "/alpha/analytics/v1/xp-rollups",
      "/alpha/analytics/v1/accuracy-rollups",
      "/alpha/analytics/v1/attempt-rollups",
      "/alpha/analytics/v1/response-latency-rollups",
      "/alpha/analytics/v1/hint-usage-rollups",
      "/alpha/analytics/v1/mastery-deltas",
      "/alpha/analytics/v1/map-growth-rollups",
      "/alpha/analytics/v1/completion-rollups"
    ]
  },
  "docs": {
    "architecture": "https://platform3-andymontgomery-9773s-projects.vercel.app/analytics/alpha/architecture",
    "dataDictionary": "https://platform3-andymontgomery-9773s-projects.vercel.app/analytics/alpha/data_dictionary",
    "customerWebsite": "https://platform3-andymontgomery-9773s-projects.vercel.app/analytics/alpha/customer_website"
  }
}