{
  "module": "nweamap",
  "surface": "1edtech",
  "deliverable": "customer_website",
  "generated_at": "2026-06-15T23:37:11.374Z",
  "base_url": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/implementation/api",
  "architecture_url": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture",
  "data_dictionary_url": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary",
  "upstream_source": {
    "workbook": "loop/nweamap/vendor/nwea/MAP_Export_Field_Descriptions.xlsx",
    "cdf_files": [
      "StudentsBySchool.csv",
      "AssessmentResults.csv",
      "ClassAssignments.csv",
      "ProgramAssignments.csv",
      "AccommodationAssignment.csv"
    ]
  },
  "commitments": [
    {
      "name": "nweamap_served_audiences",
      "chosen": "developer building MAP Growth CDF import, sync, read-back, or raw/current-result verification workflows against the public TimeBack NWEAMap 1EdTech surface using NWEA CDF pass-through plus documented platform gap-fill behavior",
      "source_itd": "overview",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#overview"
    },
    {
      "name": "nweamap_source_contract",
      "chosen": "NWEA MAP Growth CDF bundle plus MAP_Export_Field_Descriptions.xlsx is the upstream specification; platform docs pass through NWEA field definitions by reference and document only platform-owned sidecar metadata or behavior",
      "source_itd": "nitd-000-source-contract",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-000-source-contract"
    },
    {
      "name": "nweamap_raw_export_mirror",
      "chosen": "raw persistence mirrors the five NWEA CDF files 1:1 with NWEA field names and semantics, scoped by tenant, NWEA account, term, import batch, source file, source row number, source row hash, ingest timestamp, and deletion state",
      "source_itd": "nitd-001-mirror-export",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-001-mirror-export"
    },
    {
      "name": "nweamap_single_result_view",
      "chosen": "real-time MAP result observations and daily CDF backfill update one module-owned current result projection; no separate NWEA helper table and no separate batch table ship",
      "source_itd": "nitd-002-single-result-view",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-002-single-result-view"
    },
    {
      "name": "nweamap_test_of_record_highest_rit",
      "chosen": "test of record is the highest valid TestRITScore per tenant, NWEA account, student, subject, and term; valid MAP RIT is 100 through 350, ties choose latest TestStartDate/TestStartTime then larger TestID",
      "source_itd": "nitd-003-test-of-record-highest-rit",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-003-test-of-record-highest-rit"
    },
    {
      "name": "nweamap_soft_delete_retention",
      "chosen": "when a previously ingested row disappears from the next authoritative export for the same tenant, NWEA account, term, file, and natural identity, mark it soft-deleted with deletion metadata and never hard-delete through the public surface",
      "source_itd": "nitd-004-soft-delete",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-004-soft-delete"
    },
    {
      "name": "nweamap_sitting_scope_parameter",
      "chosen": "assessment result reads expose sittingScope with values test_of_record and all; clients choose the documented scope instead of learning internal tables or re-implementing dedupe",
      "source_itd": "nitd-005-sitting-scope-parameter",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-005-sitting-scope-parameter"
    },
    {
      "name": "nweamap_write_granularity",
      "chosen": "SHIP public bulk-only CDF bundle import through POST /nweamap/v1/imports; DEFER public per-row POST, PUT, PATCH, and DELETE until three integrator decisions in 90 days prove bundle import plus read-back blocks the served job",
      "source_itd": "nitd-006-axis-write-granularity",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-006-axis-write-granularity"
    },
    {
      "name": "nweamap_read_shape",
      "chosen": "SHIP list endpoints for CDF collections, detail reads for imports and assessment result rows, and narrow current-result projections controlled by sittingScope; DEFER unrestricted nested sub-collections and Alpha report graphs until Alpha approves a report-graph ITD or three integrator decisions in 90 days prove list/detail/projection reads block the served job",
      "source_itd": "nitd-007-axis-read-shape",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-007-axis-read-shape"
    },
    {
      "name": "nweamap_query_model",
      "chosen": "SHIP documented filters, stable sort keys, limit-based opaque cursor paging, and modifiedSince for imports, pass-through CDF collection lists, and assessment result projection reads",
      "source_itd": "nitd-008-axis-query-model",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-008-axis-query-model"
    },
    {
      "name": "nweamap_concurrency_model",
      "chosen": "DEFER If-Match and per-resource ETags because the public NWEAMap surface has no mutable row overwrite route; re-open with any approved public PUT, PATCH, or DELETE route",
      "source_itd": "nitd-009-axis-concurrency-model",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-009-axis-concurrency-model"
    },
    {
      "name": "nweamap_idempotency_model",
      "chosen": "SHIP canonical bundle content hash plus optional Idempotency-Key stored in platform.idempotency_key; same bundle repeats return prior/no-op status and key reuse with different content returns 409",
      "source_itd": "nitd-010-axis-idempotency-model",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-010-axis-idempotency-model"
    },
    {
      "name": "nweamap_auth_shape",
      "chosen": "SHIP platform HS256 Bearer JWTs with tenantId, role or roles, and scopes nweamap:import, nweamap:read, and nweamap:admin; DEFER school, class, and person scoped claims until repeated decisions prove tenant-level access blocks the served job",
      "source_itd": "nitd-011-axis-auth-shape",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-011-axis-auth-shape"
    },
    {
      "name": "nweamap_eventing_model",
      "chosen": "SHIP polling through modifiedSince and cursor-paged lists; DEFER webhooks until three integrator decisions in 90 days show polling blocks MAP sync/report jobs or a platform-wide webhook substrate ships",
      "source_itd": "nitd-012-axis-eventing-model",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-012-axis-eventing-model"
    },
    {
      "name": "nweamap_error_envelope",
      "chosen": "SHIP platform typed RFC 7807 Problems with stable NWEAMap codes, requestId, traceId, fieldErrors, and rowErrors for import failures",
      "source_itd": "nitd-013-axis-error-envelope",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-013-axis-error-envelope"
    },
    {
      "name": "nweamap_tenant_routing",
      "chosen": "SHIP platform tenant-in-JWT routing with request tenantId route-token match; nweaAccountId is a required tenant-local partition for imports and a query filter for reads, not a platform tenant",
      "source_itd": "nitd-014-axis-tenant-routing",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-014-axis-tenant-routing"
    },
    {
      "name": "nweamap_conformance_evidence",
      "chosen": "SHIP local executable evidence: workbook/header parity, CDF import round trip, row counts, idempotent re-import, highest-RIT retake fixture, soft-delete replacement fixture, typed Problem fixtures, live smoke tests, surface QC, integration app, and skill-pack leak check; DEFER official NWEA certification claim",
      "source_itd": "nitd-015-axis-conformance-evidence",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-015-axis-conformance-evidence"
    },
    {
      "name": "nweamap_privacy_retention",
      "chosen": "SHIP tenant-scoped rows, audit linkage, redaction from logs and Problems except minimal repair evidence, and soft deletion; DEFER age-based retention windows and public erasure APIs until platform privacy policy names the required workflow",
      "source_itd": "nitd-016-axis-privacy-retention",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-016-axis-privacy-retention"
    },
    {
      "name": "nweamap_list_endpoints",
      "chosen": "SHIP list endpoints for imports, students, assessment results, class assignments, program assignments, and accommodations, all tenant- and NWEA-account scoped with cursor paging and documented filters",
      "source_itd": "nitd-017-axis-list-endpoints",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-017-axis-list-endpoints"
    },
    {
      "name": "nweamap_report_oracle_boundary",
      "chosen": "DEFER report-oracle, report-contract, golden-cell, and report-verification primitives on the 1EdTech surface; exact MAP Quadrants report cells, norms=2020|2025 verification, Growth X, Alpha report-specific RIT50/RIT90/Effective Grade assembly, and Alpha report graphs belong to the Alpha surface. R6 carves out the module-owned PowerPath RIT-to-grade reference table/lookup as NWEAMAP-owned portable MAP reference data, not a report oracle. Any skill-pack eval asking 1edtech/skill_pack to regenerate Alpha reports must move to alpha/skill_pack",
      "source_itd": "nitd-018-report-oracle-boundary",
      "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-018-report-oracle-boundary"
    }
  ],
  "endpoints": [
    {
      "id": "mint-demo-token",
      "method": "POST",
      "path": "/dev/mint?tenantId=demo",
      "auth": "Unauthenticated. Restricted to tenantId=demo.",
      "scopes": "none",
      "summary": "Returns a short-lived HS256 Bearer JWT for the public demo tenant on the same deployment used by real tenants.",
      "trace": [
        "nitd-011-axis-auth-shape",
        "nitd-014-axis-tenant-routing"
      ],
      "request": [
        {
          "name": "tenantId",
          "in": "query",
          "type": "enum demo",
          "required": "Required",
          "description": "Only demo is accepted. Any real tenant id is rejected; real-tenant tokens are operator-minted out of band.",
          "trace": [
            "nitd-011-axis-auth-shape",
            "nitd-014-axis-tenant-routing"
          ]
        }
      ],
      "response": [
        {
          "name": "token",
          "type": "JWT string",
          "required": "Required",
          "description": "Bearer token signed with PLATFORM_JWT_SIGNING_SECRET and scoped to the demo tenant.",
          "trace": [
            "nitd-011-axis-auth-shape"
          ]
        },
        {
          "name": "token_type",
          "type": "const Bearer",
          "required": "Required",
          "description": "Authorization header token type.",
          "trace": [
            "nitd-011-axis-auth-shape"
          ]
        },
        {
          "name": "tenant_id",
          "type": "string",
          "required": "Required",
          "description": "Tenant id claim embedded in the token. Demo calls must use this token against the same BASE_URL.",
          "trace": [
            "nitd-014-axis-tenant-routing"
          ]
        },
        {
          "name": "scopes",
          "type": "array<string>",
          "required": "Required",
          "description": "Includes demo-safe NWEAMap scopes such as nweamap:read and nweamap:import.",
          "trace": [
            "nitd-011-axis-auth-shape"
          ]
        },
        {
          "name": "expires_at",
          "type": "timestamp",
          "required": "Required",
          "description": "Expiry time for the short-lived demo token.",
          "trace": [
            "nitd-011-axis-auth-shape"
          ]
        },
        {
          "name": "links",
          "type": "object",
          "required": "Required",
          "description": "Includes demoCdfBundle=/dev/cdf so cold integrators can download the sample CDF files before multipart import.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-015-axis-conformance-evidence"
          ]
        },
        {
          "name": "demo_cdf_bundle",
          "type": "nweamap.demo_cdf_bundle",
          "required": "Required",
          "description": "Manifest and five source-file URLs for the generated demo CDF bundle. Minting also pre-seeds demo rows for read-only exploration.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-001-mirror-export",
            "nitd-015-axis-conformance-evidence"
          ]
        }
      ],
      "responseExample": {
        "token_type": "Bearer",
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.demo",
        "tenant_id": "demo",
        "scopes": [
          "nweamap:read",
          "nweamap:import"
        ],
        "expires_at": "2026-06-03T13:00:00Z",
        "links": {
          "demoCdfBundle": "/dev/cdf",
          "customerWebsite": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/customer_website#quickstart"
        },
        "demo_cdf_bundle": {
          "object": "nweamap.demo_cdf_bundle",
          "manifest": {
            "nweaAccountId": "nwea-account-demo",
            "termName": "Spring 2025-2026"
          },
          "files": [
            {
              "source_file": "StudentsBySchool.csv",
              "url": "/dev/cdf/StudentsBySchool.csv"
            },
            {
              "source_file": "AssessmentResults.csv",
              "url": "/dev/cdf/AssessmentResults.csv"
            },
            {
              "source_file": "ClassAssignments.csv",
              "url": "/dev/cdf/ClassAssignments.csv"
            },
            {
              "source_file": "ProgramAssignments.csv",
              "url": "/dev/cdf/ProgramAssignments.csv"
            },
            {
              "source_file": "AccommodationAssignment.csv",
              "url": "/dev/cdf/AccommodationAssignment.csv"
            }
          ]
        }
      }
    },
    {
      "id": "list-demo-cdf-files",
      "method": "GET",
      "path": "/dev/cdf",
      "auth": "Unauthenticated. Demo helper only.",
      "scopes": "none",
      "summary": "Returns the demo NWEA account, term, and download URLs for the five generated CDF files used by the cold quickstart.",
      "trace": [
        "nitd-000-source-contract",
        "nitd-001-mirror-export",
        "nitd-015-axis-conformance-evidence"
      ],
      "request": [],
      "response": [
        {
          "name": "object",
          "type": "const nweamap.demo_cdf_bundle",
          "required": "Required",
          "description": "Descriptor object for the generated demo CDF bundle.",
          "trace": [
            "nitd-015-axis-conformance-evidence"
          ]
        },
        {
          "name": "manifest",
          "type": "object",
          "required": "Required",
          "description": "Demo nweaAccountId and termName to use in POST /nweamap/v1/imports.",
          "trace": [
            "nitd-001-mirror-export",
            "nitd-014-axis-tenant-routing"
          ]
        },
        {
          "name": "files",
          "type": "array<object>",
          "required": "Required",
          "description": "Exactly one source_file and URL for each required CDF file.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-001-mirror-export"
          ]
        }
      ],
      "responseExample": {
        "object": "nweamap.demo_cdf_bundle",
        "manifest": {
          "nweaAccountId": "nwea-account-demo",
          "termName": "Spring 2025-2026"
        },
        "files": [
          {
            "source_file": "StudentsBySchool.csv",
            "url": "/dev/cdf/StudentsBySchool.csv"
          },
          {
            "source_file": "AssessmentResults.csv",
            "url": "/dev/cdf/AssessmentResults.csv"
          },
          {
            "source_file": "ClassAssignments.csv",
            "url": "/dev/cdf/ClassAssignments.csv"
          },
          {
            "source_file": "ProgramAssignments.csv",
            "url": "/dev/cdf/ProgramAssignments.csv"
          },
          {
            "source_file": "AccommodationAssignment.csv",
            "url": "/dev/cdf/AccommodationAssignment.csv"
          }
        ]
      }
    },
    {
      "id": "download-demo-cdf-file",
      "method": "GET",
      "path": "/dev/cdf/{sourceFile}",
      "auth": "Unauthenticated. Demo helper only.",
      "scopes": "none",
      "summary": "Downloads one generated text/csv sample file so the multipart import cURL works for a cold reader with no local CDF bundle.",
      "trace": [
        "nitd-000-source-contract",
        "nitd-001-mirror-export",
        "nitd-015-axis-conformance-evidence",
        "nitd-016-axis-privacy-retention"
      ],
      "request": [
        {
          "name": "sourceFile",
          "in": "path",
          "type": "enum StudentsBySchool.csv | AssessmentResults.csv | ClassAssignments.csv | ProgramAssignments.csv | AccommodationAssignment.csv",
          "required": "Required",
          "description": "One of the five required NWEA CDF source file names. Other file names return a typed not-found Problem.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-013-axis-error-envelope"
          ]
        }
      ],
      "response": [
        {
          "name": "body",
          "type": "text/csv",
          "required": "Required",
          "description": "Generated demo CSV content for the requested source file. Demo content follows the NWEA header contract and is not the vendored real-student CDF.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-015-axis-conformance-evidence",
            "nitd-016-axis-privacy-retention"
          ]
        },
        {
          "name": "content-type",
          "type": "header text/csv; charset=utf-8",
          "required": "Required",
          "description": "CSV media type for curl -o downloads.",
          "trace": [
            "nitd-000-source-contract"
          ]
        },
        {
          "name": "content-disposition",
          "type": "header attachment",
          "required": "Required",
          "description": "Attachment filename matches sourceFile.",
          "trace": [
            "nitd-000-source-contract"
          ]
        }
      ],
      "responseExample": "TermName,DistrictName,District_StateID,SchoolName,School_StateID,StudentLastName,StudentFirstName,StudentMI,StudentID,Student_StateID,StudentDateOfBirth,StudentEthnicGroup,NWEAStandard_EthnicGroup,StudentGender,Grade,NWEAStandard_Grade\nSpring 2025-2026,Demo District,DD-1,Demo School,DS-1,Student,Example,,stu-12345,STU-12345,2013-09-01,Not Specified,Not Specified,F,6,6"
    },
    {
      "id": "create-import",
      "method": "POST",
      "path": "/nweamap/v1/imports",
      "auth": "Bearer JWT with nweamap:import",
      "scopes": "nweamap:import",
      "summary": "Imports one authoritative five-file MAP Growth CDF bundle for one tenant, one NWEA account, and one term.",
      "trace": [
        "nitd-001-mirror-export",
        "nitd-006-axis-write-granularity",
        "nitd-010-axis-idempotency-model",
        "nitd-013-axis-error-envelope",
        "nitd-014-axis-tenant-routing"
      ],
      "request": [
        {
          "name": "Authorization",
          "in": "header",
          "type": "Bearer JWT",
          "required": "Required",
          "description": "Token tenantId is the platform tenant boundary. It must match any tenant id supplied in the request.",
          "trace": [
            "nitd-011-axis-auth-shape",
            "nitd-014-axis-tenant-routing"
          ]
        },
        {
          "name": "Idempotency-Key",
          "in": "header",
          "type": "string",
          "required": "Recommended",
          "description": "Caller retry key. Same content and key replays the prior result; same key with different content returns 409.",
          "trace": [
            "nitd-010-axis-idempotency-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-idempotency-key\"><code>idempotency_key</code></a>"
        },
        {
          "name": "manifest",
          "in": "multipart field",
          "type": "application/json",
          "required": "Required",
          "description": "Contains nweaAccountId and termName. The term must match row TermName values when rows are present.",
          "trace": [
            "nitd-001-mirror-export",
            "nitd-014-axis-tenant-routing"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-nwea-account-id\"><code>nwea_account_id</code></a> <a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-term-name\"><code>term_name</code></a>"
        },
        {
          "name": "StudentsBySchool.csv",
          "in": "multipart file",
          "type": "text/csv",
          "required": "Required",
          "description": "Lossless pass-through source for student-by-school rows.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-001-mirror-export"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#table-raw_students_by_school\">nweamap.raw_students_by_school</a>"
        },
        {
          "name": "AssessmentResults.csv",
          "in": "multipart file",
          "type": "text/csv",
          "required": "Required",
          "description": "Lossless pass-through source for MAP result rows. The implementation expands and preserves all 143 CDF columns.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-001-mirror-export"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#table-raw_assessment_results\">nweamap.raw_assessment_results</a>"
        },
        {
          "name": "ClassAssignments.csv",
          "in": "multipart file",
          "type": "text/csv",
          "required": "Required",
          "description": "Lossless pass-through source for class assignments.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-001-mirror-export"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#table-raw_class_assignments\">nweamap.raw_class_assignments</a>"
        },
        {
          "name": "ProgramAssignments.csv",
          "in": "multipart file",
          "type": "text/csv",
          "required": "Required",
          "description": "May contain only the NWEA header and zero data rows; that is still a valid file.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-015-axis-conformance-evidence"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#table-raw_program_assignments\">nweamap.raw_program_assignments</a>"
        },
        {
          "name": "AccommodationAssignment.csv",
          "in": "multipart file",
          "type": "text/csv",
          "required": "Required",
          "description": "Lossless pass-through source for accommodations linked to TestID.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-001-mirror-export"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#table-raw_accommodation_assignments\">nweamap.raw_accommodation_assignments</a>"
        }
      ],
      "response": [
        {
          "name": "import",
          "type": "nweamap.import",
          "required": "Required",
          "description": "Import object containing import_id, status, bundle_hash, row_counts, tenant/account/term scope, and timestamps. Status is applied for new bundle content and no_op when the same bundle is already present, as happens after demo mint pre-seeding.",
          "trace": [
            "nitd-001-mirror-export",
            "nitd-010-axis-idempotency-model",
            "nitd-015-axis-conformance-evidence"
          ]
        },
        {
          "name": "files",
          "type": "array<nweamap.import_file>",
          "required": "Required",
          "description": "Header, hash, count, and validation state for each CDF file.",
          "trace": [
            "nitd-015-axis-conformance-evidence"
          ]
        }
      ],
      "responseExample": {
        "import": {
          "import_id": "018f4b4e-9c7a-7d3d-8b2f-2f673a000001",
          "tenant_id": "demo",
          "nwea_account_id": "nwea-account-demo",
          "term_name": "Spring 2025-2026",
          "status": "no_op",
          "bundle_hash": "sha256:2d3f6b4e8c1a0f9b7e6d5c4b3a291807060504030201000ffeeddbbccaa9988",
          "row_counts": {
            "StudentsBySchool.csv": 1124,
            "AssessmentResults.csv": 3491,
            "ClassAssignments.csv": 1128,
            "ProgramAssignments.csv": 0,
            "AccommodationAssignment.csv": 1412
          }
        },
        "files": [
          {
            "file_name": "AssessmentResults.csv",
            "status": "valid",
            "row_count": 3491,
            "header_hash": "sha256:..."
          }
        ]
      }
    },
    {
      "id": "get-import",
      "method": "GET",
      "path": "/nweamap/v1/imports/{importId}",
      "auth": "Bearer JWT with nweamap:read or nweamap:admin",
      "scopes": "nweamap:read",
      "summary": "Fetches the import record, row counts, file hashes, and redacted validation summary for one bundle.",
      "trace": [
        "nitd-013-axis-error-envelope",
        "nitd-015-axis-conformance-evidence"
      ],
      "request": [
        {
          "name": "Authorization",
          "in": "header",
          "type": "Bearer JWT",
          "required": "Required",
          "description": "Caller must be in the same tenant as the import.",
          "trace": [
            "nitd-011-axis-auth-shape",
            "nitd-014-axis-tenant-routing"
          ]
        },
        {
          "name": "importId",
          "in": "path",
          "type": "uuid",
          "required": "Required",
          "description": "Import identifier returned by POST /nweamap/v1/imports.",
          "trace": [
            "nitd-001-mirror-export"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-import-id\"><code>import_id</code></a>"
        }
      ],
      "response": [
        {
          "name": "import",
          "type": "object",
          "required": "Required",
          "description": "The import table row.",
          "trace": [
            "nitd-001-mirror-export"
          ]
        },
        {
          "name": "files",
          "type": "array<object>",
          "required": "Required",
          "description": "One file-evidence object per CDF file.",
          "trace": [
            "nitd-015-axis-conformance-evidence"
          ]
        },
        {
          "name": "problem_summary",
          "type": "object|null",
          "required": "Nullable",
          "description": "Redacted import-level repair summary; no raw student names, identifiers, or full row payloads.",
          "trace": [
            "nitd-013-axis-error-envelope",
            "nitd-016-axis-privacy-retention"
          ]
        }
      ],
      "responseExample": {
        "import": {
          "import_id": "018f4b4e-9c7a-7d3d-8b2f-2f673a000001",
          "status": "applied",
          "applied_at": "2026-06-03T11:18:43Z"
        },
        "files": [
          {
            "file_name": "ProgramAssignments.csv",
            "row_count": 0,
            "status": "empty_valid"
          }
        ],
        "problem_summary": null
      }
    },
    {
      "id": "list-imports",
      "method": "GET",
      "path": "/nweamap/v1/imports",
      "auth": "Bearer JWT with nweamap:read",
      "scopes": "nweamap:read",
      "summary": "Lists import records by NWEA account, term, status, and modifiedSince so consumers can poll for finished backfills.",
      "trace": [
        "nitd-008-axis-query-model",
        "nitd-012-axis-eventing-model",
        "nitd-017-axis-list-endpoints"
      ],
      "request": [
        {
          "name": "nweaAccountId",
          "in": "query",
          "type": "string",
          "required": "Required",
          "description": "Tenant-local NWEA account partition for reads.",
          "trace": [
            "nitd-014-axis-tenant-routing"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-nwea-account-id\"><code>nwea_account_id</code></a>"
        },
        {
          "name": "termName",
          "in": "query",
          "type": "string",
          "required": "Recommended",
          "description": "NWEA term string. Treat it as a source value; do not parse term text for business logic.",
          "trace": [
            "nitd-001-mirror-export",
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-term-name\"><code>term_name</code></a>"
        },
        {
          "name": "modifiedSince",
          "in": "query",
          "type": "ISO-8601 timestamp",
          "required": "Optional",
          "description": "Returns rows changed after this UTC timestamp for polling sync.",
          "trace": [
            "nitd-008-axis-query-model",
            "nitd-012-axis-eventing-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-modifiedsince\"><code>modifiedSince</code></a>"
        },
        {
          "name": "limit",
          "in": "query",
          "type": "integer",
          "required": "Optional",
          "description": "Maximum page size before the service returns an opaque cursor.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-limit\"><code>limit</code></a>"
        },
        {
          "name": "cursor",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Opaque cursor returned by the prior page. Clients must not parse it.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-cursor\"><code>cursor</code></a>"
        },
        {
          "name": "status",
          "in": "query",
          "type": "enum",
          "required": "Optional",
          "description": "Filter by received, validating, applied, failed, or no_op.",
          "trace": [
            "nitd-013-axis-error-envelope"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-status\"><code>status</code></a>"
        }
      ],
      "response": [
        {
          "name": "object",
          "type": "const list",
          "required": "Required",
          "description": "List envelope marker.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        },
        {
          "name": "data",
          "type": "array<nweamap.import>",
          "required": "Required",
          "description": "Import rows in stable modified_at then import_id order.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        },
        {
          "name": "next_cursor",
          "type": "string|null",
          "required": "Required",
          "description": "Opaque cursor for the next page.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        }
      ],
      "responseExample": {
        "object": "list",
        "data": [
          {
            "import_id": "018f4b4e-9c7a-7d3d-8b2f-2f673a000001",
            "status": "applied",
            "modified_at": "2026-06-03T11:18:43Z"
          }
        ],
        "next_cursor": null
      }
    },
    {
      "id": "list-assessment-results",
      "method": "GET",
      "path": "/nweamap/v1/assessment-results",
      "auth": "Bearer JWT with nweamap:read",
      "scopes": "nweamap:read",
      "summary": "Returns either the selected test of record or raw sittings, controlled by the explicit sittingScope parameter.",
      "trace": [
        "nitd-002-single-result-view",
        "nitd-003-test-of-record-highest-rit",
        "nitd-004-soft-delete",
        "nitd-005-sitting-scope-parameter",
        "nitd-008-axis-query-model"
      ],
      "request": [
        {
          "name": "nweaAccountId",
          "in": "query",
          "type": "string",
          "required": "Required",
          "description": "Tenant-local NWEA account partition for reads.",
          "trace": [
            "nitd-014-axis-tenant-routing"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-nwea-account-id\"><code>nwea_account_id</code></a>"
        },
        {
          "name": "termName",
          "in": "query",
          "type": "string",
          "required": "Recommended",
          "description": "NWEA term string. Treat it as a source value; do not parse term text for business logic.",
          "trace": [
            "nitd-001-mirror-export",
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-term-name\"><code>term_name</code></a>"
        },
        {
          "name": "modifiedSince",
          "in": "query",
          "type": "ISO-8601 timestamp",
          "required": "Optional",
          "description": "Returns rows changed after this UTC timestamp for polling sync.",
          "trace": [
            "nitd-008-axis-query-model",
            "nitd-012-axis-eventing-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-modifiedsince\"><code>modifiedSince</code></a>"
        },
        {
          "name": "limit",
          "in": "query",
          "type": "integer",
          "required": "Optional",
          "description": "Maximum page size before the service returns an opaque cursor.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-limit\"><code>limit</code></a>"
        },
        {
          "name": "cursor",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Opaque cursor returned by the prior page. Clients must not parse it.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-cursor\"><code>cursor</code></a>"
        },
        {
          "name": "sittingScope",
          "in": "query",
          "type": "enum test_of_record | all",
          "required": "Required",
          "description": "Use test_of_record for one row per student/subject/term; use all for retakes and audit history.",
          "trace": [
            "nitd-005-sitting-scope-parameter"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-sittingscope\"><code>sittingScope</code></a>"
        },
        {
          "name": "includeDeleted",
          "in": "query",
          "type": "boolean",
          "required": "Optional",
          "description": "Only meaningful with sittingScope=all. Deleted rows are never included in test_of_record responses.",
          "trace": [
            "nitd-004-soft-delete",
            "nitd-005-sitting-scope-parameter"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-includedeleted\"><code>includeDeleted</code></a>"
        },
        {
          "name": "studentId",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "NWEA StudentID filter inside the tenant/account/term scope.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-assessment_result_projection-student-id\"><code>student_id</code></a>"
        },
        {
          "name": "studentStateId",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "NWEA Student_StateID alternate identifier filter.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-assessment_result_projection-student-state-id\"><code>student_state_id</code></a>"
        },
        {
          "name": "subject",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Open NWEA Subject value, for example Math or Reading.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-assessment_result_projection-subject\"><code>subject</code></a>"
        },
        {
          "name": "course",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Open NWEA Course/Test scale value.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-assessment_result_projection-course\"><code>course</code></a>"
        },
        {
          "name": "testId",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "NWEA TestID filter and final test-of-record tiebreaker.",
          "trace": [
            "nitd-003-test-of-record-highest-rit",
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-assessment_result_projection-test-id\"><code>test_id</code></a>"
        },
        {
          "name": "normsReferenceData",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Pass-through NWEA NormsReferenceData filter. This base surface preserves the value; it does not compute Alpha norms outputs.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-assessment_result_projection-norms-reference-data\"><code>norms_reference_data</code></a>"
        }
      ],
      "response": [
        {
          "name": "object",
          "type": "const list",
          "required": "Required",
          "description": "List envelope marker.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        },
        {
          "name": "data",
          "type": "array<nweamap.assessment_result_projection | nweamap.raw_assessment_results>",
          "required": "Required",
          "description": "With sittingScope=test_of_record, array items are projection rows including is_test_of_record and test_of_record_reason. With sittingScope=all, array items are raw AssessmentResults rows with sidecars plus all 143 CDF columns.",
          "trace": [
            "nitd-002-single-result-view",
            "nitd-003-test-of-record-highest-rit",
            "nitd-005-sitting-scope-parameter"
          ]
        },
        {
          "name": "next_cursor",
          "type": "string|null",
          "required": "Required",
          "description": "Opaque cursor for the next page.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        }
      ],
      "responseExample": {
        "object": "list",
        "data": [
          {
            "projection_id": "018f4b4e-9c7a-7d3d-8b2f-2f673a000010",
            "student_id": "stu-12345",
            "term_name": "Spring 2025-2026",
            "subject": "Math",
            "test_id": "1110000001",
            "test_rit_score": 238,
            "growth_measure_yn": "FALSE",
            "is_valid_rit_for_record": true,
            "is_test_of_record": true,
            "test_of_record_reason": "highest_rit",
            "norms_reference_data": "2025",
            "modified_at": "2026-06-03T11:18:43Z"
          }
        ],
        "next_cursor": null
      }
    },
    {
      "id": "list-r90-table",
      "method": "GET",
      "path": "/nweamap/v1/r90/table",
      "auth": "Bearer JWT with nweamap:read",
      "scopes": "nweamap:read",
      "summary": "Returns the NWEAMAP-owned portable PowerPath RIT-to-grade reference rows so clients do not carry private R90 tables.",
      "trace": [
        "nitd-018-report-oracle-boundary",
        "nitd-008-axis-query-model"
      ],
      "request": [
        {
          "name": "Authorization",
          "in": "header",
          "type": "Bearer JWT",
          "required": "Required",
          "description": "Caller needs nweamap:read, nweamap:import, or nweamap:admin.",
          "trace": [
            "nitd-011-axis-auth-shape"
          ]
        },
        {
          "name": "subject",
          "in": "query",
          "type": "enum Math | Reading | Language | Science",
          "required": "Optional",
          "description": "Filters rows to one R90 source curve. Alias subjects such as FastMath map through the lookup endpoint.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-subject\"><code>subject</code></a>"
        },
        {
          "name": "tableVersion",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Pins the current R90 source version for reproducible clients.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-tableversion\"><code>tableVersion</code></a>"
        },
        {
          "name": "limit",
          "in": "query",
          "type": "integer",
          "required": "Optional",
          "description": "Maximum reference rows before next_cursor.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-limit\"><code>limit</code></a>"
        },
        {
          "name": "cursor",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Opaque cursor returned by the prior page.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-cursor\"><code>cursor</code></a>"
        }
      ],
      "response": [
        {
          "name": "object",
          "type": "const list",
          "required": "Required",
          "description": "List envelope marker.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        },
        {
          "name": "table",
          "type": "const nweamap.r90_table",
          "required": "Required",
          "description": "Reference object name.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "table_version",
          "type": "string",
          "required": "Required",
          "description": "Current NWEAMAP R90 source version.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "data",
          "type": "array<nweamap.r90_table>",
          "required": "Required",
          "description": "Reference rows from the module-owned grade2RIT source.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "next_cursor",
          "type": "string|null",
          "required": "Required",
          "description": "Opaque cursor for the next page.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        },
        {
          "name": "links",
          "type": "object",
          "required": "Required",
          "description": "Includes the canonical table route.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        }
      ],
      "responseExample": {
        "object": "list",
        "table": "nweamap.r90_table",
        "table_version": "nweamap.rit_to_grade.powerpath.v2026-06-15",
        "data": [
          {
            "id": "r90_math_239",
            "table_version": "nweamap.rit_to_grade.powerpath.v2026-06-15",
            "table_subject_id": "math",
            "subject_id": "math",
            "source_subject_name": "Growth: Math K-12",
            "rit_score": 239,
            "r90_grade": 4.8,
            "effective_grade": 5,
            "r90_grade_level": 4,
            "rit90_grade_band_percent": 80,
            "r90_percent_complete": 80,
            "observation_count": 1,
            "source_ref": "powerpath:/powerpath/rit-to-grade"
          }
        ],
        "next_cursor": null,
        "links": {
          "self": "/nweamap/v1/r90/table"
        }
      }
    },
    {
      "id": "lookup-r90",
      "method": "GET",
      "path": "/nweamap/v1/r90",
      "auth": "Bearer JWT with nweamap:read",
      "scopes": "nweamap:read",
      "summary": "Converts one subject/RIT pair to the module-owned R90 grade, effective grade, and grade-band percent fields.",
      "trace": [
        "nitd-018-report-oracle-boundary"
      ],
      "request": [
        {
          "name": "Authorization",
          "in": "header",
          "type": "Bearer JWT",
          "required": "Required",
          "description": "Caller needs nweamap:read, nweamap:import, or nweamap:admin.",
          "trace": [
            "nitd-011-axis-auth-shape"
          ]
        },
        {
          "name": "subject",
          "in": "query",
          "type": "string",
          "required": "Required",
          "description": "MAP subject name. FastMath maps to the Math table; Vocabulary/Writing map to Language.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-subject\"><code>subject</code></a>"
        },
        {
          "name": "rit",
          "in": "query",
          "type": "number",
          "required": "Required",
          "description": "Input RIT score to place on the R90 curve.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-rit\"><code>rit</code></a>"
        },
        {
          "name": "tableVersion",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Pins the current R90 source version for reproducible clients.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-tableversion\"><code>tableVersion</code></a>"
        }
      ],
      "response": [
        {
          "name": "object",
          "type": "const nweamap.r90_lookup",
          "required": "Required",
          "description": "Lookup response marker.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "table_version",
          "type": "string",
          "required": "Required",
          "description": "R90 table version used for the lookup.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "requested_subject_id",
          "type": "string",
          "required": "Required",
          "description": "Normalized subject requested by the caller.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "table_subject_id",
          "type": "string",
          "required": "Required",
          "description": "R90 subject curve used after alias mapping.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "subject_id",
          "type": "string",
          "required": "Required",
          "description": "Compatibility alias for requested_subject_id.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "rit_score",
          "type": "number",
          "required": "Required",
          "description": "Input RIT value supplied by the caller.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "table_rit_score",
          "type": "integer|null",
          "required": "Nullable",
          "description": "Source table RIT point selected for the lookup.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "r90_grade",
          "type": "number|null",
          "required": "Nullable",
          "description": "R90 grade position from the source curve.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "effective_grade",
          "type": "integer|null",
          "required": "Nullable",
          "description": "Integer school-grade bucket derived from r90_grade.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "r90_grade_level",
          "type": "integer|null",
          "required": "Nullable",
          "description": "Whole-number floor of r90_grade.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "rit90_grade_band_percent",
          "type": "number|null",
          "required": "Nullable",
          "description": "MAP-inferred position through r90_grade_level. This is not actual course or grade-level progress.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "r90_percent_complete",
          "type": "number|null",
          "required": "Nullable",
          "description": "Deprecated compatibility name for rit90_grade_band_percent; not actual course or grade-level progress.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "source_point_kind",
          "type": "enum exact | source_missing",
          "required": "Required",
          "description": "How the input RIT matched the source table.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "interpolation_rit_range",
          "type": "object|null",
          "required": "Nullable",
          "description": "Reserved interpolation metadata; currently null.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "calculator_version",
          "type": "string",
          "required": "Required",
          "description": "Compatibility alias for table_version.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "source_ref",
          "type": "string|null",
          "required": "Nullable",
          "description": "Canonical source reference for the selected grade2RIT row.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        },
        {
          "name": "links",
          "type": "object",
          "required": "Required",
          "description": "Includes the selected R90 table route.",
          "trace": [
            "nitd-018-report-oracle-boundary"
          ]
        }
      ],
      "responseExample": {
        "object": "nweamap.r90_lookup",
        "table_version": "nweamap.rit_to_grade.powerpath.v2026-06-15",
        "requested_subject_id": "math",
        "table_subject_id": "math",
        "subject_id": "math",
        "rit_score": 239,
        "table_rit_score": 239,
        "r90_grade": 4.8,
        "effective_grade": 5,
        "r90_grade_level": 4,
        "rit90_grade_band_percent": 80,
        "r90_percent_complete": 80,
        "source_point_kind": "exact",
        "interpolation_rit_range": null,
        "calculator_version": "nweamap.rit_to_grade.powerpath.v2026-06-15",
        "source_ref": "powerpath:/powerpath/rit-to-grade",
        "links": {
          "table": "/nweamap/v1/r90/table?subject=math"
        }
      }
    },
    {
      "id": "get-assessment-result",
      "method": "GET",
      "path": "/nweamap/v1/assessment-results/{rowId}",
      "auth": "Bearer JWT with nweamap:read",
      "scopes": "nweamap:read",
      "summary": "Returns one raw AssessmentResults row with platform sidecar metadata and all NWEA CDF fields preserved by name.",
      "trace": [
        "nitd-000-source-contract",
        "nitd-001-mirror-export",
        "nitd-007-axis-read-shape"
      ],
      "request": [
        {
          "name": "Authorization",
          "in": "header",
          "type": "Bearer JWT",
          "required": "Required",
          "description": "Caller tenant must own the row.",
          "trace": [
            "nitd-011-axis-auth-shape",
            "nitd-014-axis-tenant-routing"
          ]
        },
        {
          "name": "rowId",
          "in": "path",
          "type": "uuid",
          "required": "Required",
          "description": "Platform row_id assigned to the mirrored AssessmentResults row.",
          "trace": [
            "nitd-001-mirror-export"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-raw_assessment_results-row-id\"><code>row_id</code></a>"
        },
        {
          "name": "nweaAccountId",
          "in": "query",
          "type": "string",
          "required": "Required",
          "description": "Tenant-local NWEA account partition for row lookup.",
          "trace": [
            "nitd-014-axis-tenant-routing"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-raw_assessment_results-nwea-account-id\"><code>nwea_account_id</code></a>"
        }
      ],
      "response": [
        {
          "name": "row",
          "type": "nweamap.raw_assessment_results",
          "required": "Required",
          "description": "Sidecar metadata plus every NWEA AssessmentResults.csv field by original CDF header name, including TestRITScore and GrowthMeasureYN.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-001-mirror-export",
            "nitd-003-test-of-record-highest-rit"
          ]
        }
      ],
      "responseExample": {
        "row": {
          "row_id": "018f4b4e-9c7a-7d3d-8b2f-2f673a000020",
          "source_file": "AssessmentResults.csv",
          "StudentID": "stu-12345",
          "Subject": "Math",
          "GrowthMeasureYN": "FALSE",
          "TestID": "1110000001",
          "TestRITScore": "238",
          "NormsReferenceData": "2025",
          "deleted_at": null
        }
      }
    },
    {
      "id": "list-students",
      "method": "GET",
      "path": "/nweamap/v1/students",
      "auth": "Bearer JWT with nweamap:read",
      "scopes": "nweamap:read",
      "summary": "Reads mirrored StudentsBySchool rows for roster reconciliation and result joins.",
      "trace": [
        "nitd-000-source-contract",
        "nitd-001-mirror-export",
        "nitd-017-axis-list-endpoints"
      ],
      "request": [
        {
          "name": "nweaAccountId",
          "in": "query",
          "type": "string",
          "required": "Required",
          "description": "Tenant-local NWEA account partition for reads.",
          "trace": [
            "nitd-014-axis-tenant-routing"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-nwea-account-id\"><code>nwea_account_id</code></a>"
        },
        {
          "name": "termName",
          "in": "query",
          "type": "string",
          "required": "Recommended",
          "description": "NWEA term string. Treat it as a source value; do not parse term text for business logic.",
          "trace": [
            "nitd-001-mirror-export",
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-term-name\"><code>term_name</code></a>"
        },
        {
          "name": "modifiedSince",
          "in": "query",
          "type": "ISO-8601 timestamp",
          "required": "Optional",
          "description": "Returns rows changed after this UTC timestamp for polling sync.",
          "trace": [
            "nitd-008-axis-query-model",
            "nitd-012-axis-eventing-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-modifiedsince\"><code>modifiedSince</code></a>"
        },
        {
          "name": "limit",
          "in": "query",
          "type": "integer",
          "required": "Optional",
          "description": "Maximum page size before the service returns an opaque cursor.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-limit\"><code>limit</code></a>"
        },
        {
          "name": "cursor",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Opaque cursor returned by the prior page. Clients must not parse it.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-cursor\"><code>cursor</code></a>"
        },
        {
          "name": "studentId",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "NWEA StudentID filter.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-raw_students_by_school-studentid\"><code>StudentID</code></a>"
        },
        {
          "name": "studentStateId",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "NWEA Student_StateID filter.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-raw_students_by_school-student-stateid\"><code>Student_StateID</code></a>"
        },
        {
          "name": "schoolName",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Pass-through NWEA SchoolName filter. It is not tenant routing.",
          "trace": [
            "nitd-008-axis-query-model",
            "nitd-014-axis-tenant-routing"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-raw_students_by_school-schoolname\"><code>SchoolName</code></a>"
        }
      ],
      "response": [
        {
          "name": "object",
          "type": "const list",
          "required": "Required",
          "description": "List envelope marker.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        },
        {
          "name": "data",
          "type": "array<nweamap.raw_students_by_school>",
          "required": "Required",
          "description": "Sidecar metadata plus StudentsBySchool CDF fields.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-001-mirror-export"
          ]
        },
        {
          "name": "next_cursor",
          "type": "string|null",
          "required": "Required",
          "description": "Opaque cursor for the next page.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        }
      ],
      "responseExample": {
        "object": "list",
        "data": [
          {
            "row_id": "018f4...",
            "StudentID": "stu-12345",
            "StudentFirstName": "Example",
            "StudentLastName": "Student",
            "Grade": "6"
          }
        ],
        "next_cursor": null
      }
    },
    {
      "id": "list-class-assignments",
      "method": "GET",
      "path": "/nweamap/v1/class-assignments",
      "auth": "Bearer JWT with nweamap:read",
      "scopes": "nweamap:read",
      "summary": "Reads mirrored ClassAssignments rows. Teacher identifiers are NWEA/district-supplied source values; this surface does not invent a teacher directory.",
      "trace": [
        "nitd-000-source-contract",
        "nitd-001-mirror-export",
        "nitd-017-axis-list-endpoints"
      ],
      "request": [
        {
          "name": "nweaAccountId",
          "in": "query",
          "type": "string",
          "required": "Required",
          "description": "Tenant-local NWEA account partition for reads.",
          "trace": [
            "nitd-014-axis-tenant-routing"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-nwea-account-id\"><code>nwea_account_id</code></a>"
        },
        {
          "name": "termName",
          "in": "query",
          "type": "string",
          "required": "Recommended",
          "description": "NWEA term string. Treat it as a source value; do not parse term text for business logic.",
          "trace": [
            "nitd-001-mirror-export",
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-term-name\"><code>term_name</code></a>"
        },
        {
          "name": "modifiedSince",
          "in": "query",
          "type": "ISO-8601 timestamp",
          "required": "Optional",
          "description": "Returns rows changed after this UTC timestamp for polling sync.",
          "trace": [
            "nitd-008-axis-query-model",
            "nitd-012-axis-eventing-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-modifiedsince\"><code>modifiedSince</code></a>"
        },
        {
          "name": "limit",
          "in": "query",
          "type": "integer",
          "required": "Optional",
          "description": "Maximum page size before the service returns an opaque cursor.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-limit\"><code>limit</code></a>"
        },
        {
          "name": "cursor",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Opaque cursor returned by the prior page. Clients must not parse it.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-cursor\"><code>cursor</code></a>"
        },
        {
          "name": "studentId",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "NWEA StudentID filter.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-raw_class_assignments-studentid\"><code>StudentID</code></a>"
        },
        {
          "name": "schoolName",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Pass-through SchoolName filter.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-raw_class_assignments-schoolname\"><code>SchoolName</code></a>"
        }
      ],
      "response": [
        {
          "name": "object",
          "type": "const list",
          "required": "Required",
          "description": "List envelope marker.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        },
        {
          "name": "data",
          "type": "array<nweamap.raw_class_assignments>",
          "required": "Required",
          "description": "Sidecar metadata plus ClassAssignments CDF fields.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-001-mirror-export"
          ]
        },
        {
          "name": "next_cursor",
          "type": "string|null",
          "required": "Required",
          "description": "Opaque cursor for the next page.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        }
      ],
      "responseExample": {
        "object": "list",
        "data": [
          {
            "row_id": "018f4...",
            "StudentID": "stu-12345",
            "ClassName": "Math 6",
            "TeacherID": "teacher-100"
          }
        ],
        "next_cursor": null
      }
    },
    {
      "id": "list-program-assignments",
      "method": "GET",
      "path": "/nweamap/v1/program-assignments",
      "auth": "Bearer JWT with nweamap:read",
      "scopes": "nweamap:read",
      "summary": "Reads mirrored ProgramAssignments rows. A valid import can contain a header-only ProgramAssignments.csv file and return an empty list.",
      "trace": [
        "nitd-000-source-contract",
        "nitd-001-mirror-export",
        "nitd-015-axis-conformance-evidence",
        "nitd-017-axis-list-endpoints"
      ],
      "request": [
        {
          "name": "nweaAccountId",
          "in": "query",
          "type": "string",
          "required": "Required",
          "description": "Tenant-local NWEA account partition for reads.",
          "trace": [
            "nitd-014-axis-tenant-routing"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-nwea-account-id\"><code>nwea_account_id</code></a>"
        },
        {
          "name": "termName",
          "in": "query",
          "type": "string",
          "required": "Recommended",
          "description": "NWEA term string. Treat it as a source value; do not parse term text for business logic.",
          "trace": [
            "nitd-001-mirror-export",
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-term-name\"><code>term_name</code></a>"
        },
        {
          "name": "modifiedSince",
          "in": "query",
          "type": "ISO-8601 timestamp",
          "required": "Optional",
          "description": "Returns rows changed after this UTC timestamp for polling sync.",
          "trace": [
            "nitd-008-axis-query-model",
            "nitd-012-axis-eventing-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-modifiedsince\"><code>modifiedSince</code></a>"
        },
        {
          "name": "limit",
          "in": "query",
          "type": "integer",
          "required": "Optional",
          "description": "Maximum page size before the service returns an opaque cursor.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-limit\"><code>limit</code></a>"
        },
        {
          "name": "cursor",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Opaque cursor returned by the prior page. Clients must not parse it.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-cursor\"><code>cursor</code></a>"
        },
        {
          "name": "studentId",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "NWEA StudentID filter.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-raw_program_assignments-studentid\"><code>StudentID</code></a>"
        }
      ],
      "response": [
        {
          "name": "object",
          "type": "const list",
          "required": "Required",
          "description": "List envelope marker.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        },
        {
          "name": "data",
          "type": "array<nweamap.raw_program_assignments>",
          "required": "Required",
          "description": "Sidecar metadata plus ProgramAssignments CDF fields. Empty arrays are valid.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-015-axis-conformance-evidence"
          ]
        },
        {
          "name": "next_cursor",
          "type": "string|null",
          "required": "Required",
          "description": "Opaque cursor for the next page.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        }
      ],
      "responseExample": {
        "object": "list",
        "data": [],
        "next_cursor": null
      }
    },
    {
      "id": "list-accommodations",
      "method": "GET",
      "path": "/nweamap/v1/accommodations",
      "auth": "Bearer JWT with nweamap:read",
      "scopes": "nweamap:read",
      "summary": "Reads mirrored AccommodationAssignment rows linked to AssessmentResults by TestID.",
      "trace": [
        "nitd-000-source-contract",
        "nitd-001-mirror-export",
        "nitd-004-soft-delete",
        "nitd-017-axis-list-endpoints"
      ],
      "request": [
        {
          "name": "nweaAccountId",
          "in": "query",
          "type": "string",
          "required": "Required",
          "description": "Tenant-local NWEA account partition for reads.",
          "trace": [
            "nitd-014-axis-tenant-routing"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-nwea-account-id\"><code>nwea_account_id</code></a>"
        },
        {
          "name": "termName",
          "in": "query",
          "type": "string",
          "required": "Recommended",
          "description": "NWEA term string. Treat it as a source value; do not parse term text for business logic.",
          "trace": [
            "nitd-001-mirror-export",
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-import-term-name\"><code>term_name</code></a>"
        },
        {
          "name": "modifiedSince",
          "in": "query",
          "type": "ISO-8601 timestamp",
          "required": "Optional",
          "description": "Returns rows changed after this UTC timestamp for polling sync.",
          "trace": [
            "nitd-008-axis-query-model",
            "nitd-012-axis-eventing-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-modifiedsince\"><code>modifiedSince</code></a>"
        },
        {
          "name": "limit",
          "in": "query",
          "type": "integer",
          "required": "Optional",
          "description": "Maximum page size before the service returns an opaque cursor.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-limit\"><code>limit</code></a>"
        },
        {
          "name": "cursor",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "Opaque cursor returned by the prior page. Clients must not parse it.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-cursor\"><code>cursor</code></a>"
        },
        {
          "name": "studentId",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "NWEA StudentID filter.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-raw_accommodation_assignments-studentid\"><code>StudentID</code></a>"
        },
        {
          "name": "testId",
          "in": "query",
          "type": "string",
          "required": "Optional",
          "description": "NWEA TestID filter, linking accommodations to assessment result rows.",
          "trace": [
            "nitd-008-axis-query-model"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-raw_accommodation_assignments-testid\"><code>TestID</code></a>"
        },
        {
          "name": "includeDeleted",
          "in": "query",
          "type": "boolean",
          "required": "Optional",
          "description": "Include soft-deleted accommodation rows for audit reads.",
          "trace": [
            "nitd-004-soft-delete"
          ],
          "dictionary": "<a href=\"https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/data_dictionary#field-api-parameters-includedeleted\"><code>includeDeleted</code></a>"
        }
      ],
      "response": [
        {
          "name": "object",
          "type": "const list",
          "required": "Required",
          "description": "List envelope marker.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        },
        {
          "name": "data",
          "type": "array<nweamap.raw_accommodation_assignments>",
          "required": "Required",
          "description": "Sidecar metadata plus AccommodationAssignment CDF fields.",
          "trace": [
            "nitd-000-source-contract",
            "nitd-001-mirror-export"
          ]
        },
        {
          "name": "next_cursor",
          "type": "string|null",
          "required": "Required",
          "description": "Opaque cursor for the next page.",
          "trace": [
            "nitd-008-axis-query-model"
          ]
        }
      ],
      "responseExample": {
        "object": "list",
        "data": [
          {
            "row_id": "018f4...",
            "StudentID": "stu-12345",
            "TestID": "1110000001",
            "AccommodationCategory": "Presentation",
            "Accommodation": "Text-to-speech"
          }
        ],
        "next_cursor": null
      }
    }
  ],
  "no_alpha_leakage": [
    "No Growth X",
    "No norms table",
    "No Alpha report RIT50/RIT90",
    "No Alpha report-specific Effective Grade calculator",
    "No term-string parser",
    "No report contracts",
    "No golden-cell oracle",
    "No report-generation logic"
  ],
  "report_oracle_boundary": {
    "source_itd": "nitd-018-report-oracle-boundary",
    "commitment_name": "nweamap_report_oracle_boundary",
    "chosen": "DEFER report-oracle, report-contract, golden-cell, and report-verification primitives on the 1EdTech surface; exact MAP Quadrants report cells, norms=2020|2025 verification, Growth X, Alpha report-specific RIT50/RIT90/Effective Grade assembly, and Alpha report graphs belong to the Alpha surface. R6 carves out the module-owned PowerPath RIT-to-grade reference table/lookup as NWEAMAP-owned portable MAP reference data, not a report oracle. Any skill-pack eval asking 1edtech/skill_pack to regenerate Alpha reports must move to alpha/skill_pack",
    "not_shipped": [
      {
        "name": "exact report-contract boundary",
        "meaning": "No 1EdTech table, field, or endpoint defines exact MAP Quadrants report families, report cells, or canonical report filters."
      },
      {
        "name": "golden-cell boundary",
        "meaning": "No 1EdTech persistence object stores expected report-cell values or a report-verification oracle."
      },
      {
        "name": "Alpha outcome-metric boundary",
        "meaning": "No Growth X field is defined on the 1EdTech surface; that Alpha outcome metric must be pinned on the Alpha surface before use."
      },
      {
        "name": "Alpha RIT-derived boundary",
        "meaning": "No Alpha report-specific RIT50/RIT90/Effective Grade, Alpha minimum RIT, or Alpha predicted RIT field is defined here; the R6 PowerPath RIT-to-grade/R90 reference table/lookup is NWEAMAP-owned portable MAP reference data, not report assembly."
      },
      {
        "name": "norms-calculation boundary",
        "meaning": "No local norms table or term-string parser is part of the 1EdTech data dictionary; NWEA NormsReferenceData is preserved only as a pass-through value."
      }
    ],
    "allowed_1edtech_work": [
      "CDF import and idempotent read-back.",
      "Raw all-sittings reads, including soft-deleted rows when requested.",
      "Current test-of-record projection through sittingScope=test_of_record.",
      "Source-fidelity, header-parity, row-count, and import validation evidence.",
      "Module-owned PowerPath RIT-to-grade/R90 reference table and lookup through /nweamap/v1/rit-to-grade*; /nweamap/v1/r90* remains a compatibility alias."
    ],
    "alpha_route": "Requests for MAP Quadrants exact report regeneration, Growth X, Alpha report-specific RIT50/RIT90/Effective Grade assembly, norms-flipped golden cells, or report graphs route to Alpha architecture; observed RIT-to-grade/R90 reference lookup routes to NWEAMAP.",
    "publish_in_doc": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/architecture/#nitd-018-report-oracle-boundary"
  }
}
