{
  "generatedAt": "2026-06-23T22:38:44.765Z",
  "surface": "alpha",
  "module": "analytics",
  "pinnedSetName": "analytics-alpha-integration-launch-gate-v2",
  "baseUrl": "https://platform3-f8b04d3b9-andymontgomery-9773s-projects.vercel.app/api",
  "tenantId": "demo",
  "pass": true,
  "questionCount": 9,
  "passCount": 9,
  "failureCount": 0,
  "questions": [
    {
      "id": "analytics-001-event-time-fact",
      "domain": "active_inactive_waste_event_facts",
      "question": "What active_seconds contribution was written when Ada's demo event closed?",
      "apiMethod": "GET /alpha/analytics/v1/event-time-facts?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&factKind=active_seconds",
      "rawMethod": "select source_event_id, fact_kind, seconds_delta, subject_id, policy_ref, quality_status from alpha.analytics_event_time_fact where tenant_id = 'demo' and student_id = 'student_01HT7G3YZV7QB5N4YKQ1K0Z9A9' and fact_kind = 'active_seconds' and source_event_id = 'event_demo_closed_student_01ht7g3yzv7qb5n4ykq1k0z9a9'",
      "freeChoiceMethod": "Use the Learning Report time fact endpoint with a broad student filter, then select the active_seconds fact.",
      "dictionaryRule": "Read alpha.analytics_event_time_fact; do not parse Caliper payloads or old processed_facts rows.",
      "pass": true,
      "hashes": {
        "api": "bfc6c970fd829a46cfffb16ad4f2f6cb4f3c947f1312ab962c83471ef302044a",
        "raw": "bfc6c970fd829a46cfffb16ad4f2f6cb4f3c947f1312ab962c83471ef302044a",
        "freeChoice": "bfc6c970fd829a46cfffb16ad4f2f6cb4f3c947f1312ab962c83471ef302044a"
      },
      "answers": {
        "api": {
          "source_event_id": "event_demo_closed_student_01ht7g3yzv7qb5n4ykq1k0z9a9",
          "fact_kind": "active_seconds",
          "seconds_delta": 420,
          "subject_id": "math",
          "policy_ref": "alpha.policy.analytics.time_classification.v2026-06-10",
          "quality_status": "ok"
        },
        "raw": {
          "source_event_id": "event_demo_closed_student_01ht7g3yzv7qb5n4ykq1k0z9a9",
          "fact_kind": "active_seconds",
          "seconds_delta": 420,
          "subject_id": "math",
          "policy_ref": "alpha.policy.analytics.time_classification.v2026-06-10",
          "quality_status": "ok"
        },
        "freeChoice": {
          "source_event_id": "event_demo_closed_student_01ht7g3yzv7qb5n4ykq1k0z9a9",
          "fact_kind": "active_seconds",
          "seconds_delta": 420,
          "subject_id": "math",
          "policy_ref": "alpha.policy.analytics.time_classification.v2026-06-10",
          "quality_status": "ok"
        }
      }
    },
    {
      "id": "analytics-002-school-day-minutes",
      "domain": "minutes_per_enrolled_school_day",
      "question": "How many active minutes per enrolled school day should Ada's May report show?",
      "apiMethod": "GET /alpha/analytics/v1/school-day-minutes?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&subjectId=math&startDate=2026-05-01&endDate=2026-06-01",
      "rawMethod": "select active_minutes, enrolled_school_day_count, minutes_per_enrolled_school_day, school_day_policy_ref from alpha.analytics_school_day_minutes where tenant_id = 'demo' and student_id = 'student_01HT7G3YZV7QB5N4YKQ1K0Z9A9' and subject_id = 'math' and window_start::date = date '2026-05-01' and window_end::date = date '2026-06-01'",
      "freeChoiceMethod": "Use the approved Learning Report recipe and select the time commitment panel.",
      "dictionaryRule": "Read alpha.analytics_school_day_minutes; do not intersect events with calendars or enrollment windows in the client.",
      "pass": true,
      "hashes": {
        "api": "01f61e13511c25e84f52f4a1c4c40c08f32bfcbb20e918ef3017ab3a35d4ad13",
        "raw": "01f61e13511c25e84f52f4a1c4c40c08f32bfcbb20e918ef3017ab3a35d4ad13",
        "freeChoice": "01f61e13511c25e84f52f4a1c4c40c08f32bfcbb20e918ef3017ab3a35d4ad13"
      },
      "answers": {
        "api": {
          "active_minutes": 980,
          "enrolled_school_day_count": 20,
          "minutes_per_enrolled_school_day": 49,
          "school_day_policy_ref": "alpha.policy.school_day.v2026-06-10",
          "null_reason": "none"
        },
        "raw": {
          "active_minutes": 980,
          "enrolled_school_day_count": 20,
          "minutes_per_enrolled_school_day": 49,
          "school_day_policy_ref": "alpha.policy.school_day.v2026-06-10",
          "null_reason": "none"
        },
        "freeChoice": {
          "active_minutes": 980,
          "enrolled_school_day_count": 20,
          "minutes_per_enrolled_school_day": 49,
          "school_day_policy_ref": "alpha.policy.school_day.v2026-06-10",
          "null_reason": "none"
        }
      }
    },
    {
      "id": "analytics-003-xp-rollup",
      "domain": "xp_totals_and_goal_progress",
      "question": "What XP earned, remaining, and goal percent should Ada's term report show?",
      "apiMethod": "GET /alpha/analytics/v1/xp-rollups?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&subjectId=math&windowKind=term&startDate=2026-01-01&endDate=2026-06-01",
      "rawMethod": "select xp_total, xp_goal, xp_remaining, xp_completion_percent, on_track, positive_xp, negative_xp, net_xp, award_count, reversal_count, source_import_id, policy_ref from alpha.analytics_xp_rollup where tenant_id = 'demo' and student_id = 'student_01HT7G3YZV7QB5N4YKQ1K0Z9A9' and subject_id = 'math' and window_kind = 'term' and source_ledger_refs @> '[\"xp_ledger_demo_001\"]'::jsonb",
      "freeChoiceMethod": "Use the Learning Report recipe's XP panel and render the returned goal-progress fields.",
      "dictionaryRule": "Read alpha.analytics_xp_rollup; do not sum processed_facts or recompute XP remaining / XP percent from goal policy in the client.",
      "pass": true,
      "hashes": {
        "api": "af4557523679c49650e654b71997931345c528b5aed0657246ff83a029bc77bf",
        "raw": "af4557523679c49650e654b71997931345c528b5aed0657246ff83a029bc77bf",
        "freeChoice": "af4557523679c49650e654b71997931345c528b5aed0657246ff83a029bc77bf"
      },
      "answers": {
        "api": {
          "xp_total": 1220,
          "xp_goal": 1500,
          "xp_remaining": 280,
          "xp_completion_percent": 81.333,
          "on_track": false,
          "positive_xp": 1240,
          "negative_xp": -20,
          "net_xp": 1220,
          "award_count": 86,
          "reversal_count": 1,
          "source_import_id": "import_demo_demo",
          "policy_ref": "alpha.policy.analytics.xp_rollup.v2026-06-10"
        },
        "raw": {
          "xp_total": 1220,
          "xp_goal": 1500,
          "xp_remaining": 280,
          "xp_completion_percent": 81.333,
          "on_track": false,
          "positive_xp": 1240,
          "negative_xp": -20,
          "net_xp": 1220,
          "award_count": 86,
          "reversal_count": 1,
          "source_import_id": "import_demo_demo",
          "policy_ref": "alpha.policy.analytics.xp_rollup.v2026-06-10"
        },
        "freeChoice": {
          "xp_total": 1220,
          "xp_goal": 1500,
          "xp_remaining": 280,
          "xp_completion_percent": 81.333,
          "on_track": false,
          "positive_xp": 1240,
          "negative_xp": -20,
          "net_xp": 1220,
          "award_count": 86,
          "reversal_count": 1,
          "source_import_id": "import_demo_demo",
          "policy_ref": "alpha.policy.analytics.xp_rollup.v2026-06-10"
        }
      }
    },
    {
      "id": "analytics-004-mastery-delta",
      "domain": "mastery_delta",
      "question": "Which durable mastery change did Ada have in May?",
      "apiMethod": "GET /alpha/analytics/v1/mastery-deltas?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&stateDimension=durable_mastery&startDate=2026-05-01&endDate=2026-06-01",
      "rawMethod": "select kc_id, state_dimension, previous_value, new_value, delta_value, transition_kind from alpha.analytics_mastery_delta where tenant_id = 'demo' and student_id = 'student_01HT7G3YZV7QB5N4YKQ1K0Z9A9' and state_dimension = 'durable_mastery'",
      "freeChoiceMethod": "Use the Learning Report recipe's mastery transition panel and select durable_mastery.",
      "dictionaryRule": "Read alpha.analytics_mastery_delta; current mastery state stays in Results and the client does no mastery or decay math.",
      "pass": true,
      "hashes": {
        "api": "c8f0523d451b44093b73b40448cdd1e4213c7a82e2ed8602b9742eb09771aef4",
        "raw": "c8f0523d451b44093b73b40448cdd1e4213c7a82e2ed8602b9742eb09771aef4",
        "freeChoice": "c8f0523d451b44093b73b40448cdd1e4213c7a82e2ed8602b9742eb09771aef4"
      },
      "answers": {
        "api": {
          "kc_id": "kc_math_fraction_equivalence_04",
          "state_dimension": "durable_mastery",
          "previous_value": {
            "value": 0.71
          },
          "new_value": {
            "value": 0.92
          },
          "delta_value": 0.21,
          "transition_kind": "acquired",
          "policy_ref": "alpha.policy.results.mastery_state.v2026-06-10"
        },
        "raw": {
          "kc_id": "kc_math_fraction_equivalence_04",
          "state_dimension": "durable_mastery",
          "previous_value": {
            "value": 0.71
          },
          "new_value": {
            "value": 0.92
          },
          "delta_value": 0.21,
          "transition_kind": "acquired",
          "policy_ref": "alpha.policy.results.mastery_state.v2026-06-10"
        },
        "freeChoice": {
          "kc_id": "kc_math_fraction_equivalence_04",
          "state_dimension": "durable_mastery",
          "previous_value": {
            "value": 0.71
          },
          "new_value": {
            "value": 0.92
          },
          "delta_value": 0.21,
          "transition_kind": "acquired",
          "policy_ref": "alpha.policy.results.mastery_state.v2026-06-10"
        }
      }
    },
    {
      "id": "analytics-005-accuracy-rollup",
      "domain": "accuracy_rollups",
      "question": "What question accuracy should Ada's term report show?",
      "apiMethod": "GET /alpha/analytics/v1/accuracy-rollups?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&subjectId=math&windowKind=term&startDate=2026-01-01&endDate=2026-06-01",
      "rawMethod": "select correct_question_count, total_question_count, incorrect_question_count, accuracy_percent, policy_ref, null_reason from alpha.analytics_accuracy where tenant_id = 'demo' and student_id = 'student_01HT7G3YZV7QB5N4YKQ1K0Z9A9' and subject_id = 'math' and window_kind = 'term' and window_start::date = date '2026-01-01' and window_end::date = date '2026-06-01'",
      "freeChoiceMethod": "Use the Learning Report recipe's accuracy panel and render the returned stored percent.",
      "dictionaryRule": "Read alpha.analytics_accuracy; do not count source question rows or divide correct/total in the client.",
      "pass": true,
      "hashes": {
        "api": "315738662738e988e3347d95e6c91f283b5a7dfcfc2ff6e435c63f6a97f91c68",
        "raw": "315738662738e988e3347d95e6c91f283b5a7dfcfc2ff6e435c63f6a97f91c68",
        "freeChoice": "315738662738e988e3347d95e6c91f283b5a7dfcfc2ff6e435c63f6a97f91c68"
      },
      "answers": {
        "api": {
          "correct_question_count": 8,
          "total_question_count": 10,
          "incorrect_question_count": 2,
          "accuracy_percent": 80,
          "policy_ref": "alpha.policy.analytics.accuracy.v2026-06-12",
          "null_reason": "none"
        },
        "raw": {
          "correct_question_count": 8,
          "total_question_count": 10,
          "incorrect_question_count": 2,
          "accuracy_percent": 80,
          "policy_ref": "alpha.policy.analytics.accuracy.v2026-06-12",
          "null_reason": "none"
        },
        "freeChoice": {
          "correct_question_count": 8,
          "total_question_count": 10,
          "incorrect_question_count": 2,
          "accuracy_percent": 80,
          "policy_ref": "alpha.policy.analytics.accuracy.v2026-06-12",
          "null_reason": "none"
        }
      }
    },
    {
      "id": "analytics-006-map-growth",
      "domain": "rit_growthx_map_windows",
      "question": "What RIT and Growth X should Ada's winter MAP panel show?",
      "apiMethod": "GET /alpha/analytics/v1/map-growth-rollups?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&subjectId=math&termId=term_2026_winter&growthWindow=winter_to_winter&normsSet=2025",
      "rawMethod": "select rit_score, start_rit, observed_growth, projected_growth, growth_x, conditional_growth_percentile, growth_percentile, growth_x_target, on_track, sitting_count, retake_count from alpha.analytics_map_growth_rollup where tenant_id = 'demo' and student_id = 'student_01HT7G3YZV7QB5N4YKQ1K0Z9A9' and canonical_term_id = 'term_2026_winter' and growth_window = 'winter_to_winter' and norms_set = '2025'",
      "freeChoiceMethod": "Use the customer-facing termId filter from the Learning Report recipe.",
      "dictionaryRule": "Read alpha.analytics_map_growth_rollup by typed term, growth_window, and norms_set; use start_rit and canonical conditional_growth_percentile; growth_percentile is only a compatibility alias.",
      "pass": true,
      "hashes": {
        "api": "25796883f2960521c2f993aa6084b5fb8b4dcc97c03acdd43b72394596c31f71",
        "raw": "25796883f2960521c2f993aa6084b5fb8b4dcc97c03acdd43b72394596c31f71",
        "freeChoice": "25796883f2960521c2f993aa6084b5fb8b4dcc97c03acdd43b72394596c31f71"
      },
      "answers": {
        "api": {
          "rit_score": 221,
          "start_rit": 212,
          "observed_growth": 9,
          "projected_growth": 4.5,
          "growth_x": 2,
          "conditional_growth_percentile": 43,
          "growth_percentile": 43,
          "growth_x_target": 2,
          "on_track": true,
          "sitting_count": 2,
          "retake_count": 1
        },
        "raw": {
          "rit_score": 221,
          "start_rit": 212,
          "observed_growth": 9,
          "projected_growth": 4.5,
          "growth_x": 2,
          "conditional_growth_percentile": 43,
          "growth_percentile": 43,
          "growth_x_target": 2,
          "on_track": true,
          "sitting_count": 2,
          "retake_count": 1
        },
        "freeChoice": {
          "rit_score": 221,
          "start_rit": 212,
          "observed_growth": 9,
          "projected_growth": 4.5,
          "growth_x": 2,
          "conditional_growth_percentile": 43,
          "growth_percentile": 43,
          "growth_x_target": 2,
          "on_track": true,
          "sitting_count": 2,
          "retake_count": 1
        }
      }
    },
    {
      "id": "analytics-007-completion",
      "domain": "completion_percent",
      "question": "What percent of Ada's PowerPath course is complete?",
      "apiMethod": "GET /alpha/analytics/v1/completion-rollups?studentId=student_01HT7G3YZV7QB5N4YKQ1K0Z9A9&completionScope=course&scopeId=course_math_grade_4_powerpath",
      "rawMethod": "select completed_count, expected_count, completion_percent, numerator_policy_ref, denominator_policy_ref, null_reason from alpha.analytics_completion_rollup where tenant_id = 'demo' and student_id = 'student_01HT7G3YZV7QB5N4YKQ1K0Z9A9' and completion_scope = 'course' and scope_id = 'course_math_grade_4_powerpath'",
      "freeChoiceMethod": "Use the Learning Report recipe's course completion panel and keep the denominator policy from Analytics.",
      "dictionaryRule": "Read alpha.analytics_completion_rollup; do not walk Curriculum trees or count Results rows in the client.",
      "pass": true,
      "hashes": {
        "api": "d6c3a3585941c4e89ce3dd817261048d09ef83b1a9a5285294682f8cec2b16a0",
        "raw": "d6c3a3585941c4e89ce3dd817261048d09ef83b1a9a5285294682f8cec2b16a0",
        "freeChoice": "d6c3a3585941c4e89ce3dd817261048d09ef83b1a9a5285294682f8cec2b16a0"
      },
      "answers": {
        "api": {
          "completed_count": 70,
          "expected_count": 100,
          "completion_percent": 70,
          "numerator_policy_ref": "alpha.policy.analytics.course_progress.v2026-06-15",
          "denominator_policy_ref": "alpha.policy.analytics.course_progress.v2026-06-15",
          "null_reason": "none"
        },
        "raw": {
          "completed_count": 70,
          "expected_count": 100,
          "completion_percent": 70,
          "numerator_policy_ref": "alpha.policy.analytics.course_progress.v2026-06-15",
          "denominator_policy_ref": "alpha.policy.analytics.course_progress.v2026-06-15",
          "null_reason": "none"
        },
        "freeChoice": {
          "completed_count": 70,
          "expected_count": 100,
          "completion_percent": 70,
          "numerator_policy_ref": "alpha.policy.analytics.course_progress.v2026-06-15",
          "denominator_policy_ref": "alpha.policy.analytics.course_progress.v2026-06-15",
          "null_reason": "none"
        }
      }
    },
    {
      "id": "analytics-008-age-grade-status",
      "domain": "age_grade_status",
      "question": "Which named age-grade comparisons should the status endpoint return?",
      "apiMethod": "GET /alpha/analytics/v1/grade-level-status?studentId=b6fa7128-f641-4efd-9075-375411fd6c39&subjectId=language&asOfDate=2026-05-20",
      "rawMethod": "select age_grade, highest_mastered_grade, working_grade, working_age_grade_status, mastered_age_grade_status from People & Orgs age_grade_history plus Results highest_mastered_grade / working_grade as of 2026-05-20",
      "freeChoiceMethod": "Use the same status endpoint with its documented aliases, subject and asOf, then read the named status fields.",
      "dictionaryRule": "Read People & Orgs age_grade_history plus Results working_grade / highest_mastered_grade at the same asOfDate; Analytics returns only working_age_grade_status and mastered_age_grade_status, not generic ahead/behind fields.",
      "pass": true,
      "hashes": {
        "api": "ff4dc454222272bd85b7c8d3584c3c75a648b9daae837368ea34dd88f363211e",
        "raw": "ff4dc454222272bd85b7c8d3584c3c75a648b9daae837368ea34dd88f363211e",
        "freeChoice": "ff4dc454222272bd85b7c8d3584c3c75a648b9daae837368ea34dd88f363211e"
      },
      "answers": {
        "api": {
          "object": "analytics.age_grade_status",
          "student_id": "b6fa7128-f641-4efd-9075-375411fd6c39",
          "subject_id": "language",
          "as_of_date": "2026-05-20",
          "policy_ref": "alpha.policy.analytics.age_grade_status.v2026-06-16",
          "age_grade": 5,
          "highest_mastered_grade": 10,
          "working_grade": 11,
          "working_grade_basis": "mastery_gate_hmg",
          "working_age_grade_delta": 6,
          "working_age_grade_status": "working_above_age_grade",
          "mastered_age_grade_delta": 5,
          "mastered_age_grade_status": "mastered_above_age_grade",
          "null_reason": "none"
        },
        "raw": {
          "object": "analytics.age_grade_status",
          "student_id": "b6fa7128-f641-4efd-9075-375411fd6c39",
          "subject_id": "language",
          "as_of_date": "2026-05-20",
          "policy_ref": "alpha.policy.analytics.age_grade_status.v2026-06-16",
          "age_grade": 5,
          "highest_mastered_grade": 10,
          "working_grade": 11,
          "working_grade_basis": "mastery_gate_hmg",
          "working_age_grade_delta": 6,
          "working_age_grade_status": "working_above_age_grade",
          "mastered_age_grade_delta": 5,
          "mastered_age_grade_status": "mastered_above_age_grade",
          "null_reason": "none"
        },
        "freeChoice": {
          "object": "analytics.age_grade_status",
          "student_id": "b6fa7128-f641-4efd-9075-375411fd6c39",
          "subject_id": "language",
          "as_of_date": "2026-05-20",
          "policy_ref": "alpha.policy.analytics.age_grade_status.v2026-06-16",
          "age_grade": 5,
          "highest_mastered_grade": 10,
          "working_grade": 11,
          "working_grade_basis": "mastery_gate_hmg",
          "working_age_grade_delta": 6,
          "working_age_grade_status": "working_above_age_grade",
          "mastered_age_grade_delta": 5,
          "mastered_age_grade_status": "mastered_above_age_grade",
          "null_reason": "none"
        }
      }
    },
    {
      "id": "analytics-009-source-import",
      "domain": "source_shaped_imports",
      "question": "Did the source-shaped TimeBack processed_facts row materialize readable Analytics facts?",
      "apiMethod": "POST /alpha/analytics/v1/source-imports/timeback-xp-time-accuracy with Idempotency-Key",
      "rawMethod": "select import_kind, status, submitted_row_count, accepted_row_count, materialized_row_count, rejected_row_count from alpha.analytics_source_import where tenant_id = 'demo' and import_id = 'analytics_integration_xp_time_import_v5'",
      "freeChoiceMethod": "Read source-imports and select the deterministic source_batch_ref emitted by this integration.",
      "dictionaryRule": "The documented timeback-xp-time-accuracy import accepts source-shaped processed_facts rows and reports readable materialized facts; validation or adapter failures use typed Problems.",
      "pass": true,
      "hashes": {
        "api": "370e40323fe19c506e48830de49783f2948eef04002a2b49b92782fe7b51deb7",
        "raw": "370e40323fe19c506e48830de49783f2948eef04002a2b49b92782fe7b51deb7",
        "freeChoice": "370e40323fe19c506e48830de49783f2948eef04002a2b49b92782fe7b51deb7"
      },
      "answers": {
        "api": {
          "import_kind": "timeback-xp-time-accuracy",
          "status": "materialized",
          "submitted_row_count": 1,
          "accepted_row_count": 1,
          "materialized_row_count": 9,
          "rejected_row_count": 0
        },
        "raw": {
          "import_kind": "timeback-xp-time-accuracy",
          "status": "materialized",
          "submitted_row_count": 1,
          "accepted_row_count": 1,
          "materialized_row_count": 9,
          "rejected_row_count": 0
        },
        "freeChoice": {
          "import_kind": "timeback-xp-time-accuracy",
          "status": "materialized",
          "submitted_row_count": 1,
          "accepted_row_count": 1,
          "materialized_row_count": 9,
          "rejected_row_count": 0
        }
      }
    }
  ]
}
