{
  "schema": "kbatch-district-api-s6-v1",
  "generated": "2026-07-19T21:00:00.000Z",
  "status": "contract-stub",
  "humanGate": true,
  "claimForbidden": "Do not mark S6 live or raise accounts bar until hosted API + auth + pilot roster exist.",
  "dependsOn": "S5.5 local district export (live on Learn)",
  "localExportSchema": "kbatch-learn-district-export-v1",
  "localExportSurface": "https://kbatch.ugrad.ai/learn",
  "baseUrlPlanned": "https://api.ugrad.ai/kbatch/district/v1",
  "authPlanned": {
    "type": "Bearer district-token",
    "issuance": "human ops \u00b7 per school/district pilot",
    "scopes": [
      "progress:read",
      "progress:write",
      "roster:read"
    ]
  },
  "endpoints": [
    {
      "method": "GET",
      "path": "/health",
      "status": "planned",
      "note": "liveness"
    },
    {
      "method": "POST",
      "path": "/progress/import",
      "status": "planned",
      "body": "kbatch-learn-district-export-v1",
      "note": "merge or replace device export"
    },
    {
      "method": "GET",
      "path": "/progress/{localId}",
      "status": "planned",
      "note": "fetch cloud progress for device resume"
    },
    {
      "method": "POST",
      "path": "/progress/{localId}",
      "status": "planned",
      "note": "push incremental skill done + SRS"
    },
    {
      "method": "GET",
      "path": "/roster",
      "status": "planned",
      "note": "opt-in class list \u00b7 privacy minimal"
    },
    {
      "method": "POST",
      "path": "/evidence/attest",
      "status": "planned",
      "note": "path-first evidence hash \u00b7 no exam dumps"
    }
  ],
  "privacy": [
    "Local-first: device works offline without S6",
    "No sold badges \u00b7 no exam dumps",
    "Roster opt-in only \u00b7 handle + localId \u00b7 no government ID required",
    "District can delete: DELETE planned under same auth"
  ],
  "pilotChecklistHuman": [
    "Confirm one pilot school/district contact",
    "Issue sandbox district-token off-repo",
    "Accept one Export progress JSON as first import fixture",
    "Stand up health + import only before roster",
    "Only after 2-week pilot: mark S6 partial live \u00b7 then score accounts carefully"
  ],
  "compatibility": {
    "exportFile": "kbatch-learn-district-YYYY-MM-DD.json",
    "fields": [
      "progress",
      "srs",
      "streak",
      "identity",
      "summary"
    ]
  }
}
