---
name: case-1edtech-standards-browser
description: Build standards-browser apps, Alignment workflows, reports, and QA probes against the live platform3 CASE 1EdTech surface without local CASE persistence, graph repair, schema parsing, copied CASE tables, or other surface-owned logic.
---

# CASE 1EdTech Standards Browser Skill

Use this skill when an AI agent is asked to build an app, report, QA probe, or delivery artifact against the platform3 CASE 1EdTech surface.

This pack is instructions-only. It does not contain data-processing code, schema parsers, CASE enumeration tables, standards catalogs, dedup rules, graph-repair logic, or business rules. The live CASE API owns those behaviors.

## Install From The Hosted Pack

Install the entire folder, not just this file. From the canonical hosted page, fetch `SKILL.md`, `agents/openai.yaml`, every file under `references/`, and the runnable check under `checks/`. The primary hosted skill index is `/pack`; `/install` is only a compatibility mirror.

```bash
mkdir -p case-1edtech-standards-browser/agents case-1edtech-standards-browser/references case-1edtech-standards-browser/checks
curl -fsSL "$CASE_SKILL_PACK_URL/pack/SKILL.md" \
  -o case-1edtech-standards-browser/SKILL.md
curl -fsSL "$CASE_SKILL_PACK_URL/pack/agents/openai.yaml" \
  -o case-1edtech-standards-browser/agents/openai.yaml
for file in worked-example app-build-protocol auth-and-headers leak-check; do
  curl -fsSL "$CASE_SKILL_PACK_URL/pack/references/$file.md" \
    -o "case-1edtech-standards-browser/references/$file.md"
done
curl -fsSL "$CASE_SKILL_PACK_URL/pack/checks/case_surface_check.sh" \
  -o case-1edtech-standards-browser/checks/case_surface_check.sh
chmod +x case-1edtech-standards-browser/checks/case_surface_check.sh
```

If `CASE_SKILL_PACK_URL` is not already set, use:

```bash
export CASE_SKILL_PACK_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/skill_pack"
```

After install, load this `SKILL.md` first. Load the referenced files only when the current task needs them.

## Source Of Truth

Always ground work in the hosted platform3 CASE docs before making claims:

- Customer website: https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/customer_website
- Data dictionary: https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/data_dictionary
- Architecture: https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/architecture
- Live implementation base URL: https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api
- Official CASE 1.1 specification: https://www.imsglobal.org/spec/case/v1p1/
- 1EdTech CASE standards landing page: https://www.1edtech.org/standards/case

When these disagree, platform3 approved docs win for this surface. Do not rely on model memory of CASE, OpenSALT, or prior workspace code.

## What This Skill Helps Build

- Visual standards browser apps that list CFDocuments, browse CFItems, and inspect CFAssociations.
- Alignment workflows that link an external system's lesson, resource, or assessment identifier to a CFItem.
- CFPackage import/export verification reports.
- CASE API smoke tests that prove auth, pagination, error, idempotency, and ETag contracts.
- Human-readable standards snapshots generated from live API responses.

## Required Credential Flow

Set the base URL once:

```bash
export CASE_BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
```

For a cold demo workflow, mint a demo token:

```bash
export CASE_TOKEN="$(curl -s -X POST "$CASE_BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
```

For a real tenant, use an operator-minted bearer token such as `CASE_REVIEWER_JWT`. Never call `/dev/mint` for a non-demo tenant; the endpoint is intentionally demo-only.

All CASE calls use:

```bash
-H "Authorization: Bearer $CASE_TOKEN"
```

Write calls also need:

```bash
-H "Content-Type: application/json"
-H "Idempotency-Key: <unique-key-for-this-operation>"
```

PUT, PATCH, and DELETE on mutable resources also need the current validator:

```bash
-H "If-Match: <ETag from detail read or X-Case-ETag from prior write>"
```

After a successful PUT or PATCH, chain the next write from `X-Case-ETag`, not from the response `ETag`, unless a follow-up GET confirms the current `ETag`.

## Surface Calls To Prefer

Use these calls as the first path for apps and reports:

- `GET /ims/case/v1p1/CFDocuments?limit=...&offset=...` to list frameworks.
- `GET /ims/case/v1p1/CFDocuments/{sourcedId}` to fetch one framework and its `ETag`.
- `GET /ims/case/v1p1/CFItems?CFDocumentURI=<encoded-uri>&limit=...&offset=...` to list standards inside a framework.
- `GET /ims/case/v1p1/CFItems/{sourcedId}` to fetch one standard and its `ETag`.
- `GET /ims/case/v1p1/CFItemAssociations/{sourcedId}` to fetch the CASE association set for one CFItem.
- `GET /ims/case/v1p1/CFAssociations?...` to list graph edges by documented filters.
- `POST /ims/case/v1p1/Alignments` to link an external identifier to a CFItem.
- `GET /ims/case/v1p1/Alignments?externalSystem=...&externalId=...` to verify or resolve an external-ID link.
- `POST /ims/case/v1p1/CFPackages` to import a CASE package transactionally.
- `GET /ims/case/v1p1/CFPackages/{sourcedId}` to export a spec-pure CASE package and verify one imported document graph.

Follow `links.next` by resolving its path and query against `CASE_BASE_URL`. Do not switch origins while paging.
For post-import verification, prefer `GET /ims/case/v1p1/CFPackages/{sourcedId}` over one `GET /CFItems/{id}` per item. Use paged `CFItems?CFDocumentURI=...` and `CFAssociations?CFDocumentURI=...` only for spot checks and UI pagination.

## Non-Negotiable Boundaries

Do not build or install any of these inside the agent, app, or report:

- A local standards database that duplicates CASE rows.
- A CASE schema parser or local CFPackage validator.
- A copied table of association types, target types, problem codes, framework types, or allowed values.
- A publisher-specific URI-hostname classifier to infer CFDocument membership.
- A dedup or graph-repair layer for CFItems, CFAssociations, or Alignments.
- A rule that stores external lesson IDs inside CFAssociation, CFItem extensions, or CFPackage export.
- A second auth, tenant, pagination, error, idempotency, or concurrency primitive.

If any of those become necessary to complete the user's job, stop and report a surface leak. Route the finding to the earliest upstream deliverable:

- Architecture if the needed primitive was never committed.
- Data dictionary if a field's meaning, range, nullability, or allowed values are missing.
- Customer website if the public instructions do not let a cold integrator build.
- Implementation if the live API contradicts the approved docs.

## Standard Agent Workflow

1. Read the customer website and data dictionary sections for the resources you will touch.
2. Establish `CASE_BASE_URL` and a demo or operator token.
3. Discover frameworks through `CFDocuments`, then select a framework by `identifier` and `uri`.
4. List CFItems through the documented `CFDocumentURI` filter.
5. Fetch CFItem association sets or CFAssociation list filters for graph edges.
6. Use Alignment for external-system IDs. Keep Alignment outside the CASE graph and outside CFPackage export.
7. For writes, generate one idempotency key per operation. For updates/deletes, fetch the resource first and send `If-Match`.
8. Store app-chrome state in browser storage if needed. Store standards data and alignments through the CASE surface only.
9. For every app or report, include the base URL, tenant mode, endpoints called, and enough response snippets for a reviewer to rerun the work.

## Worked Examples

Use `references/worked-example.md` for an end-to-end demo that regenerates a standards-browser snapshot and Alignment proof using only live surface calls.

Use `checks/case_surface_check.sh` to prove the pack can reproduce the platform's own answer key. The check calls `CFDocument`, `CFItems?CFDocumentURI`, `CFItemAssociations`, and `CFPackages/{sourcedId}`; it compares list results to the platform's package export and does not parse CASE schemas, validate packages locally, infer graph membership, or carry copied standards data. Add `--write-alignment` only when the job explicitly needs a live Alignment write probe.

Use `references/app-build-protocol.md` when building a full app.

Use `references/auth-and-headers.md` when debugging auth, errors, idempotency, pagination, or ETag behavior.

Use `references/leak-check.md` before shipping any app or report built with this skill.

## Expected Output Quality

A deliverable built with this skill should be able to show:

- Which canonical CASE docs it used.
- Which live endpoints it called.
- Which tenant mode it used.
- Which rows came from the API.
- Which external IDs were stored through Alignment.
- Which behavior was not implemented locally because the surface owns it.
