TimeBack Platform | Content Alpha | Skill Pack

Build Content apps from the live surface.

Install this instructions-only pack on Claude, Codex, or Perplexity. It calls Content Alpha for catalog, launch, media, references, curriculum links, trust, policy, QTI import, and effectiveness workflows without moving surface-owned logic into client code.

Installable Pack

The hosted pack is also mirrored locally under OUT_DIR/pack. It has no scripts/ directory by design.

Main instructions

pack/SKILL.md contains trigger metadata, first actions, API perimeter, non-negotiables, and the common build pattern.

References

Focused references are loaded only when needed: canonical surface, worked example, response samples, app-build protocol, and leak check.

Agent adapters

Claude, Codex, and Perplexity notes match the customer eval's three-agent install coverage.

Verifier

checks/verify-skill-pack.mjs proves static no-leak shape plus live assessment components, article, expected XP, content references, catalog facet, Common Cartridge export, and evidence calls without adding surface-owned logic.

Hosted install

# Hosted install for Claude Code
curl -fsSLL https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/skill_pack/install.sh | bash -s -- claude

# Hosted install for Codex
curl -fsSLL https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/skill_pack/install.sh | bash -s -- codex

# Hosted install for Perplexity Computer
curl -fsSLL https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/skill_pack/install.sh | bash -s -- perplexity ./skills/timeback-content-alpha

The installer fetches SKILL.md, all agent adapters, all references, the verifier, and latest evidence. Pass an optional second argument for a custom target directory.

Local workspace install

# Claude Code
mkdir -p ~/.claude/skills/timeback-content-alpha
cp -R pack/* ~/.claude/skills/timeback-content-alpha/

# Codex
mkdir -p ~/.codex/skills/timeback-content-alpha
cp -R pack/* ~/.codex/skills/timeback-content-alpha/

# Perplexity Computer or another file-backed agent
mkdir -p ./skills/timeback-content-alpha
cp -R pack/* ./skills/timeback-content-alpha/

Content Vocabulary

A fresh agent can start from these names without reading QTI XML, parsing tb-* markup, or guessing from titles. Values below are the approved canonical values; downstream apps should read GET / or the data dictionary instead of copying tables. Every row carries expected_xp; expected_xp_band is a governed facet. Interactive article/video composition is typed Content structure. Lessons, lesson sections, playlists, and question banks live in Curriculum. Video, audio, image, and script are first-class Content kinds when they are the primary student-touchable asset; captions, transcripts, thumbnails, source files, and supporting files are media_asset rows or media/reference sidecars.

Alpha ObjectMeaningUse In An App
content_itemCatalog row for a thing a student can touch.Browse, filter, select, and show status/subject/grade.
content_versionAppend-only launch material; TimeBack identical bytes replay and changed canonical bytes append hash-bound UUIDv5 exact versions.Render student_view, including governed tb-* HTML bodies, and carry etag/provenance while preserving pinned immutable history.
student_viewStudent-safe blank projection.Render the article/question/test without answer keys; HTML bodies use the Content-owned tb-* contract.
answer_slotBlank response slot definition.Show input affordances without scoring or submitting through Content.
assessment_componentBlank assessment structure over QTI component rows.Render sections, parts/interactions, question refs, distractors, rubrics, and pre-authored feedback without parsing QTI.
interactive_compositionTyped delivery composition for interactive article/video; current aggregates can mix member versions.Read segment-to-question and cue-to-question bindings without parsing HTML, and verify exact member versions when required.
scoring_planScoring provenance and rules; the current route requires only read:content.Show provenance context without implementing scoring or assuming teacher-only authorization.
media_assetReusable or supporting asset row, plus first-party media attached to a version.Fetch delivery_url exactly as returned when the media endpoint returns one.
external_linkGoverned outside URL facts.Open by returned policy without storing secrets.
curriculum_linkFrozen historical Content-to-Curriculum relationship archive.Use archive rows only for reconciliation. Curriculum owns placement/order; the curriculum_node_id item filter read-only projects active subtree targets plus historical matches for thin clients.
content_referenceReal relationship from one flat Content row to another; optional version ownership is not currently enforced.Render related material without nesting payloads, and verify caller-supplied version ids.
content_catalog_facetGoverned discovery facet definition.Build library/LOR/catalog filters from the surface.
content_catalog_facet_assignmentDiscovery sidecar at content/version/media grain.Show quality, rights, modality, expected XP band, KC refs, and standards refs.
content_effectivenessRead-only rollup from Results.Display counts/rate/freshness; never compute it.
content_trust_evidenceTrust and validation state.Show trusted/unknown/problem evidence.
content_policyCurrent policy projection.Read /policies where the tenant is provisioned; the source adapter currently executes a versioned bundled policy.

content_kind

  • question
  • test
  • test_spec
  • test_bank
  • article
  • video
  • audio
  • image
  • interactive
  • media_asset
  • external_link
  • script

interactive_composition_type

  • interactive_article
  • interactive_video

assessment_component_role

  • test
  • section
  • part
  • question
  • question_ref
  • distractor
  • rubric
  • preauthored_feedback

subject_id

  • math
  • reading
  • language
  • science
  • computer_science
  • vocabulary
  • writing
  • social_studies

target_grade_id

  • pre_k
  • k
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • postsecondary
  • ungraded

expected_xp_band

  • 0_to_10
  • 10_to_20
  • 20_to_45
  • 45_plus

content_reference_relationship_kind

  • embeds
  • depends_on
  • transcript_for
  • caption_for
  • thumbnail_for
  • source_file_for
  • source_script_for
  • alternative_form_of
  • bank_member
  • related_material

catalog_facet_key

  • subject
  • grade_band
  • language
  • accessibility_profile
  • rights_license
  • provenance
  • quality_rating
  • kc_refs
  • standards_framework_refs
  • content_kind
  • expected_xp_band
  • modality

Endpoint Catalog

The pack uses one paginated REST convention. Ordinary authentication, authorization, validation, resource, release-eligibility, and server failures use Problem JSON; active and expired idempotency claims instead use explicit 202/503 status envelopes without stable Content problem codes. Release eligibility is a read-only exact-version Content answer: callers consume the exact eight-field lifecycle and item-revocation result (owner ruling #2534: failed trust is the single revocation lever; receipts are provenance) and never append producer evidence or copy producer verdict/bar/policy fields into Curriculum. The article-browser example uses the list, detail, student-view, media, references, weighted KC tags, catalog-facets, effectiveness, trust, and policies endpoints; curriculum-links is a frozen read-only archive; question/test renderers use the assessment-components endpoint; package jobs use the Common Cartridge export endpoint.

GET  /
POST /dev/mint?tenantId=demo

GET  /tenants/{tenantId}/alpha/content/items
POST /tenants/{tenantId}/alpha/content/items
GET  /tenants/{tenantId}/alpha/content/items/{contentId}
PATCH /tenants/{tenantId}/alpha/content/items/{contentId}

GET  /tenants/{tenantId}/alpha/content/items/{contentId}/versions
POST /tenants/{tenantId}/alpha/content/items/{contentId}/versions
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/versions/{versionId}
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/versions/{versionId}/release-eligibility?producer_surface={module/surface}
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/student-view
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/answer-slots?version_id={versionId}
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/answer-keys?version_id={versionId}
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/assessment-components?version_id={versionId}
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/blueprint
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/bank-members
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/interactive-composition
PUT  /tenants/{tenantId}/alpha/content/items/{contentId}/interactive-composition
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/scoring-plan?version_id={versionId}

GET  /tenants/{tenantId}/alpha/content/items/{contentId}/media
POST /tenants/{tenantId}/alpha/content/items/{contentId}/media
GET  /tenants/{tenantId}/alpha/content/items/{contentLocator}/media/{mediaLocator}
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/references
POST /tenants/{tenantId}/alpha/content/items/{contentId}/references
DELETE /tenants/{tenantId}/alpha/content/items/{contentId}/references/{referenceId}
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/external-link
POST /tenants/{tenantId}/alpha/content/items/{contentId}/external-link
GET  /tenants/{tenantId}/alpha/content/catalog-facets
POST /tenants/{tenantId}/alpha/content/catalog-facets
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/catalog-facets
POST /tenants/{tenantId}/alpha/content/items/{contentId}/catalog-facets

GET  /tenants/{tenantId}/alpha/content/items/{contentId}/kc-tags
POST /tenants/{tenantId}/alpha/content/items/{contentId}/kc-tags
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/curriculum-links
POST /tenants/{tenantId}/alpha/content/items/{contentId}/curriculum-links  # HTTP 410; route lessons from Curriculum; kc-tags are attribution only
POST /tenants/{tenantId}/alpha/content/exports/common-cartridge
GET  /tenants/{tenantId}/alpha/content/exports/common-cartridge/{exportId}/download
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/effectiveness
GET  /tenants/{tenantId}/alpha/content/items/{contentId}/trust

POST /tenants/{tenantId}/alpha/content/imports/timeback-production
POST /tenants/{tenantId}/alpha/content/imports/qti-package
GET  /tenants/{tenantId}/alpha/content/trust-status
GET  /tenants/{tenantId}/alpha/content/policies

Canonical Inputs

The pack is grounded in approved hosted artifacts, not memorized implementation behavior.

ArtifactURLUse In Pack
Data dictionaryhttps://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/data_dictionary/Fields, meanings, provenance, allowed values.
Architecturehttps://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/architecture/ITDs, alias map, module-placement boundaries.
Customer contracthttps://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/customer_website/Current complete operation catalog generated from the descriptor.
Implementationhttps://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/implementation/apiLive API the pack calls.

Content Surface-QC and the Integration proof app remain withdrawn status pages, not current validation evidence.

What It Regenerates

The worked example produces article-browser data for a student-facing app from the live demo tenant. The app protocol also supports student launchers, teacher authoring tools, governed Content publication, named catalog and LOR-style browsing, transport-only Common Cartridge export, trust/effectiveness dashboards, QTI import probes, and QA probes.

The browser facts come from GET /, GET /items?content_kind=article&facet=kc_refs:..., GET /student-view, GET /media, GET /references, GET /kc-tags, GET /catalog-facets, GET /effectiveness, GET /trust, and GET /policies.
Article bodies are authored with POST /items/{contentId}/versions and student_view.blocks; item writes are metadata-only. QTI-backed questions/tests go through POST /imports/qti-package with package bytes and explicit governed X-Content-Subject-Id, X-Content-Target-Grade-Id, and calibrated X-Content-Expected-Xp headers. Package metadata is not classification authority, missing or invalid values reject before mutation, and ungraded is the target grade when Content is intentionally not tied to one grade. Referenced assessment-stimulus resources become question student_view.stimuli[] and prompt HTML, with images attached as question media; no public stimulus/article row is created, and players render the question view without stitching references. Stimulus-only packages remain invalid. Same-key retries are request-exact, including those three metadata values, and QTI writes finalize atomically with the completed replay response: completed imports replay, active imports return 202 with Retry-After, expired unfinished claims return terminal 503 without rerunning, and different requests under the key return 409. Recovery never scans Content by source name, title, or time window. Assessment-item resources become question rows, assessment-test resources become test rows, and a new Idempotency-Key creates new rows instead of source-identity upserting. Source-shaped TimeBack production imports go through POST /imports/timeback-production; content-kind folding and expected-XP calibration currently execute a versioned policy bundled with the runtime, and real-tenant /policies rows may be absent until provisioning exists. Common Cartridge goes through POST /exports/common-cartridge; its current round_trip_check is export inspection metadata, not reimport proof. The pack does not unpack, parse, score, classify QTI, pre-normalize source rows, or generate package bytes locally.
# Worked Example: Browse Articles By Curriculum Topic

This example builds the exact student-facing browsing workflow from the customer eval: find Articles for a curriculum topic, show what is available, read a selected article's student-safe view, and display surface-returned evidence. It also proves the current Content contract: the public Content kinds are Content-owned, every row carries `expected_xp`, catalog discovery uses named sidecar facets, Content embeds are relationship rows, Results-owned effectiveness is exposed read-only, and Common Cartridge is generated as transport by the surface. It uses only Content Alpha API calls. It does not parse QTI XML, infer content type, compute scores, compute effectiveness, rewrite media URLs, generate Common Cartridge packages, nest referenced Content payloads, or store Content rows outside the API. Legacy `customerWebsite` links shown in API response examples point to a withdrawn status surface; use the generated data dictionary and architecture for current documentation.

Prerequisites: `curl` and `jq`.

## 1. Set Base URL And Mint Demo Token

```bash
export CONTENT_BASE_URL="${CONTENT_BASE_URL:-https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/implementation/api}"
export CONTENT_TENANT="${CONTENT_TENANT:-demo}"

if [ -z "${CONTENT_TOKEN:-}" ]; then
  export CONTENT_TOKEN="$(curl -fsS -X POST "$CONTENT_BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
fi
```

For a real tenant, set `CONTENT_BASE_URL`, `CONTENT_TENANT`, and `CONTENT_TOKEN` from operator-supplied credentials. Do not call `/dev/mint` for non-demo tenants.

## 2. Read The Descriptor

```bash
curl -fsS "$CONTENT_BASE_URL" \
  -H "Authorization: Bearer $CONTENT_TOKEN" \
  > /tmp/content-skill-descriptor.json

jq '{module, surface, status, allowedFilters, allowedValues: (.allowedValues | {content_kind, alpha_subject_id, alpha_grade_id, assessment_component_role, expected_xp_band, content_reference_relationship_kind, catalog_facet_key})}' \
  /tmp/content-skill-descriptor.json
```

Expected response shape:

```json
{
  "module": "content",
  "surface": "alpha",
  "status": "ok",
  "allowedFilters": [
    "content_kind",
    "subtype",
    "dok",
    "assessment_role",
    "subject_id",
    "alpha_subject_id",
    "target_grade_id",
    "curriculum_node_id",
    "usage_scope",
    "test_type",
    "is_mastery_gate",
    "source_system",
    "source_record_id",
    "source_activity_ref",
    "facet",
    "modifiedSince",
    "cursor",
    "limit",
    "subject",
    "grade_band",
    "language",
    "accessibility_profile",
    "rights_license",
    "provenance",
    "quality_rating",
    "kc_refs",
    "standards_framework_refs",
    "expected_xp_band",
    "modality"
  ],
  "allowedValues": {
    "content_kind": ["question", "test", "test_spec", "test_bank", "article", "video", "audio", "image", "interactive", "media_asset", "external_link", "script"],
    "alpha_subject_registry_ref": "references/authoring-subject-registry.json#canonicalValues",
    "alpha_grade_id": ["pre_k", "k", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "postsecondary", "ungraded"],
    "assessment_component_role": ["test", "section", "part", "question", "question_ref", "distractor", "rubric", "preauthored_feedback"],
    "expected_xp_band": ["0_to_10", "10_to_20", "20_to_45", "45_plus"],
    "content_reference_relationship_kind": ["embeds", "depends_on", "transcript_for", "caption_for", "thumbnail_for", "source_file_for", "source_script_for", "alternative_form_of", "bank_member", "related_material"],
    "catalog_facet_key": ["subject", "grade_band", "language", "accessibility_profile", "rights_license", "provenance", "quality_rating", "kc_refs", "standards_framework_refs", "content_kind", "expected_xp_band", "modality"]
  }
}
```

Use these values as live descriptor output. Do not copy them into a downstream app as a private enum table. Lessons, lesson sections, playlists, and question banks are Curriculum containers. Video, audio, image, and script are first-class Content kinds when they are the primary student-touchable asset; captions, transcripts, thumbnails, source files, and supporting files are `media_asset` rows or media/reference sidecars.

## 3. List Articles For A KC Discovery Facet

The demo tenant currently has Article rows with the `kc_refs` discovery facet `case:math:7.ee.b.4`. This compatibility catalog value is not registry proof; read `/kc-tags` for the canonical weighted registry relationship.

```bash
export KC_REF="${KC_REF:-case:math:7.ee.b.4}"

curl -fsS "$CONTENT_BASE_URL/tenants/$CONTENT_TENANT/alpha/content/items?content_kind=article&facet=kc_refs:$KC_REF&limit=10" \
  -H "Authorization: Bearer $CONTENT_TOKEN" \
  > /tmp/content-skill-articles.json

jq -r '.data[] | "\(.content_id)\t\(.title)\t\(.subject_id)\tgrade \(.target_grade_id)\t\(.status)"' \
  /tmp/content-skill-articles.json
```

Expected response shape:

```json
{
  "data": [
    {
      "content_id": "f71f3b0a-e271-40ea-b990-89940f371012",
      "workspace_id": "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3",
      "content_kind": "article",
      "subtype": null,
      "dok": null,
      "title": "Integration article 1d0b6d39 revised",
      "language": "en-US",
      "source_identifier": null,
      "subject_id": "math",
      "target_grade_id": "7",
      "expected_xp": 12,
      "usage_scope": "practice_eligible",
      "assessment_role": null,
      "test_type": null,
      "is_mastery_gate": null,
      "test_family_id": null,
      "phonics_constraint": null,

Response Samples

The pack includes live demo JSON for descriptor, assessment components, article list, detail, student view, media, curriculum links, effectiveness, trust, policies, and Problem JSON.

# Response Samples

These samples are aligned to the tracked 2026-07-15 Content Alpha contract. Item list/detail examples include the exact 27-key `publicItem` projection, including nullable conditional slices. Other examples may use the explicit `jq` projection shown above them. For current live values, run the calls in `worked-example.md`; the surface is the answer key.

Do not turn these samples into a private enum table or fixture database. They are examples of what the API returns. The legacy `customerWebsite` response links currently lead to a withdrawn status surface; use `dataDictionary` and `architecture` as the current documentation authorities.

## Descriptor

```bash
curl -fsS "$CONTENT_BASE_URL" -H "Authorization: Bearer $CONTENT_TOKEN" \
  | jq '{module, surface, status, docs: (.docs | {architecture, dataDictionary, customerWebsite}), quickstart: (.quickstart | {mintDemoToken, listContent, studentView}), allowedFilters, allowedValues: (.allowedValues | {content_kind, assessment_component_role, expected_xp_band, content_reference_relationship_kind, catalog_facet_key})}'
```

```json
{
  "module": "content",
  "surface": "alpha",
  "status": "ok",
  "docs": {
    "architecture": "https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/architecture",
    "dataDictionary": "https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/data_dictionary",
    "customerWebsite": "https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/customer_website"
  },
  "quickstart": {
    "mintDemoToken": "POST /content/alpha/implementation/api/dev/mint?tenantId=demo",
    "listContent": "GET /content/alpha/implementation/api/tenants/{tenantId}/alpha/content/items",
    "studentView": "GET /content/alpha/implementation/api/tenants/{tenantId}/alpha/content/items/{contentId}/student-view"
  },
  "allowedFilters": [
    "content_kind",
    "subtype",
    "dok",
    "assessment_role",
    "subject_id",
    "alpha_subject_id",
    "target_grade_id",
    "curriculum_node_id",
    "usage_scope",
    "test_type",
    "is_mastery_gate",
    "source_system",
    "source_record_id",
    "source_activity_ref",
    "facet",
    "modifiedSince",
    "cursor",
    "limit",
    "subject",
    "grade_band",
    "language",
    "accessibility_profile",
    "rights_license",
    "provenance",
    "quality_rating",
    "kc_refs",
    "standards_framework_refs",
    "expected_xp_band",
    "modality"
  ],
  "allowedValues": {
    "content_kind": ["question", "test", "test_spec", "test_bank", "article", "video", "audio", "image", "interactive", "media_asset", "external_link", "script"],
    "assessment_component_role": ["test", "section", "part", "question", "question_ref", "distractor", "rubric", "preauthored_feedback"],
    "expected_xp_band": ["0_to_10", "10_to_20", "20_to_45", "45_plus"],
    "content_reference_relationship_kind": ["embeds", "depends_on", "transcript_for", "caption_for", "thumbnail_for", "source_file_for", "source_script_for", "alternative_form_of", "bank_member", "related_material"],
    "catalog_facet_key": ["subject", "grade_band", "language", "accessibility_profile", "rights_license", "provenance", "quality_rating", "kc_refs", "standards_framework_refs", "content_kind", "expected_xp_band", "modality"]
  }
}
```

## List Assessment Components

```bash
curl -fsS "$CONTENT_BASE_URL/tenants/demo/alpha/content/items/58612cab-9c46-426c-8c20-0e9f19c807c5/assessment-components?component_role=rubric" \
  -H "Authorization: Bearer $CONTENT_TOKEN"
```

```json
{
  "data": [
    {
      "assessment_component_id": "0e732fd3-2df8-5d08-b436-fc5b20fe1b0c",
      "content_id": "58612cab-9c46-426c-8c20-0e9f19c807c5",
      "version_id": "efcf3561-3a66-4825-9588-e792ef20c312",
      "parent_assessment_component_id": "e74ec8f3-1825-5c6d-b60f-b2bbef3f4c87",
      "component_role": "rubric",
      "ordinal": 2,
      "element_name": "qti-rubric-block",
      "qti_identifier": "short-response-rubric",
      "response_identifier": null,
      "outcome_identifier": null,
      "feedback_identifier": null,
      "show_hide": null,
      "display_text": "Full credit requires a correct equation step and solution.",
      "source_trace": {
        "element": "qti-rubric-block",
        "schemaFile": "imsqti_itemv3p0p1_v1p0.xsd"
      }
    },
    {
      "assessment_component_id": "5e86f3ed-6ff7-5cae-af04-d016d2fd9f99",
      "content_id": "58612cab-9c46-426c-8c20-0e9f19c807c5",
      "version_id": "efcf3561-3a66-4825-9588-e792ef20c312",
      "parent_assessment_component_id": "e74ec8f3-1825-5c6d-b60f-b2bbef3f4c87",
      "component_role": "preauthored_feedback",
      "ordinal": 3,
      "element_name": "qti-modal-feedback",
      "qti_identifier": "correct",
      "response_identifier": null,
      "outcome_identifier": null,
      "feedback_identifier": "correct",

Binary Leak Gate

The pack passes only if it remains instructions-first and every domain fact comes from surface responses or canonical docs. The verifier is runnable and the latest evidence is recorded below.

No QTI parser or answer-key extractor.
No scoring, mastery, Results, Events, or gradebook logic.
No content-effectiveness formula, expected-XP math, source-adapter mapping, or policy cutoff.
No runtime/downstream copied enum tables or kind inference; verifier-only exact contract goldens are allowed.
No media URL rewriting or storage-path lookup.
No local catalog facet recomputation or LOR-specific storage.
No local Common Cartridge manifest or ZIP generation.
No Content domain persistence outside the API.
# Binary Leak Check

Run this before shipping any app, report, QA probe, or customer deliverable built with the Content Alpha skill pack.

Verdict is binary:

- PASS if every fact comes from Content Alpha API responses or canonical docs, and the client only formats those facts.
- FAIL if the pack or downstream artifact does work the surface promised to own.

## Runnable Pack Check

From the installed skill directory, run:

```bash
node checks/verify-skill-pack.mjs
```

Default behavior:

- Uses `CONTENT_BASE_URL` or the canonical implementation URL.
- Uses `CONTENT_TOKEN` for an operator-supplied tenant, or mints a demo token with `POST /dev/mint?tenantId=demo`.
- Reads the descriptor, assessment-component rows, article-by-curriculum list, selected article detail, student view, media, content references, curriculum links, catalog facets, effectiveness, trust, policies, Common Cartridge export metadata, and an unsupported-filter Problem JSON response.
- Performs static file-shape checks: no `scripts/`, `data/`, fixture, database, XML, ZIP, package-manager, or executable implementation files in the installable pack except this verifier.
- Prints JSON evidence with `result: "pass"` or exits non-zero.

The verifier is not app logic. It does not parse QTI, reconstruct assessment components, score, compute effectiveness, rewrite media URLs, copy catalog facet rows into an app, generate Common Cartridge bytes, inspect package internals, or maintain domain data. It only calls the surface and checks that the pack remains instructions-first. Its exact kind, role, and facet arrays are verifier-only contract goldens used to reject descriptor additions, omissions, and reorderings; downstream apps must read those values from the descriptor instead of importing or copying the goldens.

## Forbidden In The Skill Pack Or Downstream Artifact

Do not ship any of these:

- QTI XML/ZIP parsing, response-declaration parsing, answer-key extraction, assessment-component reconstruction, scoring-plan reconstruction, or media-path repair.
- Distractor, rubric, pre-authored feedback, question-ref, section, or part extraction from raw QTI/XML/JSONB/package files instead of `/assessment-components`.
- Content kind, subject, grade, test type, mastery gate, or source-system inference from titles, URLs, filenames, package paths, XML, or MIME extensions.
- Runtime or downstream enum/value tables copied from the data dictionary. Verifier-only exact contract goldens are allowed solely to detect descriptor drift and must never be imported into app logic.
- Catalog facet recomputation, local discovery indexes, LOR-specific storage, or sidecar rows inferred from Content base fields at read time.
- Referenced Content nested, copied, or hydrated inside a parent Content row instead of read through `content_reference` relationship rows and the referenced row's own endpoints.
- Expected XP averaging from student attempts, awarded-XP calculation, or local expected-XP banding outside the surface.
- Score calculation, result processing, student-answer persistence, attempt persistence, event logging, mastery/decay math, advancement math, report-card rollups, or gradebook state.
- Content-effectiveness counters, effectiveness-rate formulas, freshness-window formulas, or policy cutoffs.
- Curriculum graph reconstruction, curriculum-node deduplication, or curriculum/content links represented as tags instead of API relationship rows.
- Common Cartridge / IMSCP manifest construction, ZIP generation, round-trip validation, or package translation logic outside the export endpoint.
- Media URL rewriting, signed URL construction, storage bucket lookup, or credential query strings.
- Secrets, bearer tokens, or student app credentials stored in Content metadata, tags, local storage, or output files.
- Local persistence for Content domain rows that bypasses the surface.
- Private implementation source reads or database reads to complete a customer workflow.

## Required Evidence

For a passing deliverable, record:

1. Canonical docs opened.
2. Base URL used.
3. Credential path used: demo mint or operator-supplied token.
4. Exact endpoint calls made, or the response evidence the user can reproduce.
5. Any Problem JSON returned by the API.
6. Confirmation that no forbidden surface-owned logic was added.

This pack records its latest doer-side verification at `evidence/verification-latest.json`. Re-run the verifier after install because the live surface is the answer key.

## Stop Conditions

Stop and report a surface gap if the user job requires:

- Search or filters not documented by the generated data dictionary or service descriptor.
- A catalog facet key or value not available from `/catalog-facets` or the descriptor.
- An `expected_xp` or expected-XP band that the API does not return.
- Student answer submission or score persistence through Content.
- A content-effectiveness value the API does not return.
- A policy threshold not available from `/policies`.
- A media URL that can only be made to work by rewriting it locally.
- A QTI package interpretation that the import endpoint does not expose.
- An assessment section, part, question ref, distractor, rubric, or pre-authored feedback row not available from `/assessment-components`.
- A Common Cartridge package or round-trip proof that the export endpoint does not expose.
- A curriculum relationship that can only be represented as a tag.
- An embedded/supporting Content relationship that can only be represented by nesting one Content payload inside another.
- Any secret or credential value on a Content row.

When reporting a gap, cite the canonical URL and the missing endpoint, field, or behavior. Do not hide the gap with client code.

Latest Verification Evidence

{
  "checked_at": "2026-08-10T12:21:49.001Z",
  "check": "timeback-content-alpha-skill-pack",
  "base_url": "https://platform3-content-46dh2rfea-andymontgomery-9773s-projects.vercel.app/api",
  "tenant_id": "demo",
  "curriculum_node_id": "case:math:7.ee.b.4",
  "credential_path": "demo mint",
  "static_checks": [
    {
      "files_checked": 13,
      "allowed_executable": "checks/verify-skill-pack.mjs",
      "disallowed_dirs": [
        "scripts",
        "data",
        "fixtures",
        "node_modules"
      ],
      "disallowed_extensions": [
        ".csv",
        ".db",
        ".go",
        ".java",
        ".py",
        ".rb",
        ".sqlite",
        ".ts",
        ".tsv",
        ".tsx",
        ".xlsx",
        ".xml",
        ".zip"
      ]
    }
  ],
  "live_checks": [
    {
      "method": "POST",
      "route": "/dev/mint?tenantId=demo",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items?content_kind=question&subject_id=math&target_grade_id=7&limit=50",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/58612cab-9c46-426c-8c20-0e9f19c807c5/assessment-components?limit=100",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/58612cab-9c46-426c-8c20-0e9f19c807c5/answer-keys",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/58612cab-9c46-426c-8c20-0e9f19c807c5/assessment-components?component_role=rubric&limit=10",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/58612cab-9c46-426c-8c20-0e9f19c807c5/versions/efcf3561-3a66-4825-9588-e792ef20c312/release-eligibility?producer_surface=incept%2Falpha",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items?content_kind=article&facet=kc_refs%3Acase%3Amath%3A7.ee.b.4&limit=3",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items?expected_xp_band=10_to_20&limit=10",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items?facet=expected_xp_band:10_to_20&limit=10",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/catalog-facets?limit=20",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/be64f58f-f7ae-6327-daea-1335d73b4473",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/be64f58f-f7ae-6327-daea-1335d73b4473/student-view",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/be64f58f-f7ae-6327-daea-1335d73b4473/media",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/content/alpha/implementation/api/tenants/demo/alpha/content/items/be64f58f/media/3cc7f3e6",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/be64f58f-f7ae-6327-daea-1335d73b4473/references",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/be64f58f-f7ae-6327-daea-1335d73b4473/kc-tags",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/be64f58f-f7ae-6327-daea-1335d73b4473/curriculum-links",
      "status": 200,
      "code": null
    },
    {
      "method": "POST",
      "route": "/tenants/demo/alpha/content/items/be64f58f-f7ae-6327-daea-1335d73b4473/curriculum-links",
      "status": 410,
      "code": "content.curriculum_link_write_deprecated"
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/be64f58f-f7ae-6327-daea-1335d73b4473/catalog-facets?facet_key=expected_xp_band",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/be64f58f-f7ae-6327-daea-1335d73b4473/effectiveness",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items/be64f58f-f7ae-6327-daea-1335d73b4473/trust",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/policies?policy_key=alpha.policy.content_effectiveness",
      "status": 200,
      "code": null
    },
    {
      "method": "POST",
      "route": "/tenants/demo/alpha/content/exports/common-cartridge",
      "status": 202,
      "code": null
    },
    {
      "method": "GET",
      "route": "/content/alpha/implementation/api/tenants/demo/alpha/content/exports/common-cartridge/cc_export_20260810_dc7fbc90eb26/download?state=...",
      "status": 200,
      "code": null
    },
    {
      "method": "GET",
      "route": "/tenants/demo/alpha/content/items?title=local-parser",
      "status": 400,
      "code": "content.unsupported_filter"
    }
  ],
  "selected_content": {
    "content_id": "be64f58f-f7ae-6327-daea-1335d73b4473",
    "title": "Deployed smoke article demo 608537d7ae86 revised",
    "subject_id": "math",
    "target_grade_id": "7",
    "expected_xp": 12,
    "source_system": "alpha_content",
    "status": "draft"
  },
  "selected_assessment_content": {
    "content_id": "58612cab-9c46-426c-8c20-0e9f19c807c5",
    "title": "Demo QTI assessment seed",
    "roles": [
      "distractor",
      "part",
      "preauthored_feedback",
      "question_ref",
      "rubric",
      "section"
    ],
    "component_count": 9,
    "rubric_display_text": "Full credit requires a correct equation step and solution.",
    "feedback_identifiers": [
      "correct",
      "incorrect"
    ],
    "answer_key_count": 1,
    "filtered_rubric_count": 1
  },
  "pack_source_sha256": "def4c904af4c7d97e6b9e11add8ca863688eeb0dac217655f615316929c8d5b6",
  "pack_source_files": 12,
  "verification_mode": "live",
  "result": "pass",
  "notes": "Verifier performed HTTP calls and exact response assertions only. Its exact kind, role, and facet arrays are verifier-only contract goldens, never runtime app tables. It did not parse QTI, score, compute effectiveness, rewrite media URLs, copy catalog facet rows into app logic, nest referenced Content payloads, inspect Common Cartridge bytes, or persist Content rows. It also proved KC-tag reads and the typed 410 boundary on the frozen curriculum-link archive."
}

SKILL.md Preview

The installable skill body is concise and points agents to references only when needed.

---
name: timeback-content-alpha
description: Use when building apps, reports, QA probes, or deliverables against the TimeBack platform3 Content Alpha surface. The skill teaches agents to browse, launch, author, package, and report on student-touchable Content kinds: question, test, test_spec, test_bank, article, video, audio, image, interactive, media_asset, external_link, and script, with expected_xp, named catalog facets, assessment components, typed interactive composition, media, the frozen curriculum-link archive, content-to-content references, student-safe views, trust evidence, policy reads, QTI package imports, Common Cartridge exports, and content-effectiveness rollups by calling the live surface only. A stimulus is question anatomy, not a public Content kind. Do not re-implement QTI parsing, assessment-component reconstruction, interactive cue/segment reconstruction, scoring, answer-key extraction, media URL rewriting, content-kind inference, catalog facet logic, Common Cartridge packaging, effectiveness math, mastery/results/events logic, runtime/downstream copied enum tables, or business rules.
---

# TimeBack Content Alpha

Use this skill when the user asks for a working app, report, integration proof, API probe, or customer deliverable that uses the platform3 Content Alpha surface.

Do not use it for the 1EdTech QTI surface, generic QTI research, Results, Events, Curriculum graph authoring, roster work, or database work outside the public API.

## Install

Install the whole `pack/` directory as one skill. Do not split the reference files away from `SKILL.md`.

Hosted one-command installs:

Claude Code:

```bash
curl -fsSLL https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/skill_pack/install.sh | bash -s -- claude
```

Codex:

```bash
curl -fsSLL https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/skill_pack/install.sh | bash -s -- codex
```

Perplexity Computer or another file-backed agent:

```bash
curl -fsSLL https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/skill_pack/install.sh | bash -s -- perplexity ./skills/timeback-content-alpha
```

Local workspace install, when you already have this `OUT_DIR` checked out:

```bash
# Claude Code
mkdir -p ~/.claude/skills/timeback-content-alpha
cp -R pack/* ~/.claude/skills/timeback-content-alpha/

# Codex
mkdir -p ~/.codex/skills/timeback-content-alpha
cp -R pack/* ~/.codex/skills/timeback-content-alpha/

# Perplexity Computer or another file-backed agent
mkdir -p ./skills/timeback-content-alpha
cp -R pack/* ./skills/timeback-content-alpha/
```

The hosted installer fetches `SKILL.md`, all agent adapters, all references, the verifier, and the latest evidence. Set a custom install directory with the optional second argument, for example `bash -s -- codex /tmp/timeback-content-alpha`.

## Alpha Content In 60 Seconds

Content is the stuff a student can open or touch. The canonical Content storage kinds are `question`, `test`, `test_spec`, `test_bank`, `article`, `video`, `audio`, `image`, `interactive`, `media_asset`, `external_link`, and `script`. A stimulus is a sub-part of a `question`, not an independently addressable Content row. `test` is a renderable form, `test_spec` is the blueprint/table of specifications, `test_bank` is a stored bank of equivalent forms, and `script` is authored text used by audio/video or as its own student-touchable asset. Content stores the blank instrument, assessment components, typed interactive article/video composition, student-safe launch projection, student-independent `expected_xp`, media/external-link/script facts, content-to-content references, and catalog discovery sidecars. It does not store a student's answer, score, event stream, mastery state, gradebook row, report card, course, unit, chapter, lesson, lesson section, playlist, question bank, LOR/library clone, or Common Cartridge bundle.

Every Content row has typed fields. Use them directly; never parse a title, URL, filename, XML package, or media type to infer meaning.

Core objects:

- `content_item`: the catalog row. Key fields are `content_id`, `content_kind`, `title`, `subject_id`, `target_grade_id`, `expected_xp`, `latest_version_id`, `source_system`, and `status`.
- `content_version`: append-only versioned launch material. It returns `student_view`, `editing_draft`, `etag`, and provenance. HTML student views may carry the Content-owned `tb-*` body contract. TimeBack identical bytes replay, while changed canonical bytes append a hash-bound UUIDv5 version with the next ordinal and supersedes edge.
- `student-view`: the blank student-safe projection. It must have `answerKeysIncluded: false` for student launchers.
- `test_spec`: first-class test blueprint row with KC/DOK coverage, item-type mix, difficulty constraints, passing rule, form count, overlap limit, and enemy-item rules.
- Create a `test_spec` through the authenticated `POST /tenants/{tenantId}/alpha/content/items` route with `content_kind=test_spec`, `Idempotency-Key`, and all seven blueprint fields. The response's native `content_id` is the `spec_id` returned by `GET /items/{contentId}/blueprint`; never persist an app-local blueprint row.
- `test_bank`: first-class equivalent-form bank row linked to one `test_spec`; fixed forms are `content_reference` rows with `relationship_kind=bank_member`.
- On `test_bank` item create, reuse a stable `Idempotency-Key`. Existing completed/in-progress/conflicting same-key state is handled first. A fresh request acquires the tenant graph fence and resolves its active same-tenant `test_spec` before claiming the key or writing the item. If the target is invalid, fix the body and reuse that same still-unclaimed key; do not rotate it.
- To change a `test_bank` definition, `PATCH /items/{bankId}` with the last ETag and only the new `spec_id` and/or `membership_rule`. Never send either required field as `null`. The `spec_id` must resolve in the routed tenant to an unretired, non-archived, non-status-retired `content_kind=test_spec`, `assessment_role=spec` item with a readable blueprint sidecar. An actual change is allowed only for an unretired draft with unknown trust. Active bank-member rows—fixed forms or PP100 adaptive shards—forbid both a blueprint swap and a switch to `qti_adaptive_selection`; retire those members first. A rejected `400 content.validation_failed`, `409 content.bank_membership_frozen`, or `409 content.invalid_test_bank_member_contract` preserves the item, bank sidecar, graph, and ETag. Full member-form blueprint comparability and active-KC coverage validation remain pending.
- `script`: first-class authored script row. Link produced audio/video back to it with `content_reference.relationship_kind=source_script_for`; do not store it as an article subtype.
- `assessment_component`: blank QTI-backed structure rows for sections, parts/interactions, question refs, distractors, rubrics, and pre-authored feedback. Read them from `/assessment-components`; do not parse raw QTI.
- `interactive_composition`: typed Content-owned delivery structure for interactive articles/videos. Read and write it at `/interactive-composition`; it stores article segment order or video cue timestamps to QTI-backed question refs. Current active-row uniqueness is item-scoped, so an aggregate can mix versions and reports the first active row's `version_id`; do not claim member-version coherence without checking it. Do not put cue timing or segment order in QTI or Curriculum, and do not parse `tb-*` markup as canonical composition when this endpoint is available.
- `media_asset`: reusable or supporting Content row, plus first-party media attached to a version. Fetch `delivery_url` exactly as returned when the media endpoint returns one.
- `external_link`: governed outside URL facts for `content_kind=external_link`; never store credentials or secret-bearing URLs.
- `curriculum_link`: a frozen historical Content-to-Curriculum relationship archive. Use archive rows only for reconciliation; existing rows have no automatic TTL. Current lesson membership has one ordered use per Content item: one primary object may use the lesson target once, while a many-item lesson on the deployed CASE adapter uses one targeted child `practice`/`review` component per item. Repeatedly PATCHing the lesson target replaces the prior item. Curriculum remains authoritative for placement and order. For thin-client item discovery, `GET /items?curriculum_node_id={lessonId}` read-only projects both historical archive matches and active Content targets on that Curriculum component and its active descendants; it writes no placement rows.
- `content_reference`: a real relationship row from one flat Content row to another. Use it for embeds, dependencies, captions, transcripts, thumbnails, source files, alternatives, and related material; never nest referenced content inside the parent payload. Caller-supplied optional version UUIDs are not currently proven to belong to the paired item or tenant, so resolve them before writing.
- Active reference, KC-tag, QTI-import, and TimeBack-import graph writes share one tenant fence and a bounded validation budget. One write may affect at most 1,024 active test banks; each affected bank may contain at most 1,024 active members and at most 4,096 joined question/KC facts. Those limits are inclusive and apply even to revivals, cardinality-neutral upserts, and exact active repository replays. A cap-plus-one write returns typed `409 content.invalid_test_bank_member_contract` with `fieldErrors.name=bank_members` for member overflow or `form_graph` for affected-bank/joined-fact overflow, and leaves the graph, item timestamp/ETag, fresh idempotency claim, and completed ledger unchanged. Retire or split the graph, then retry. An already-completed HTTP idempotency replay is mutation- and budget-free after ledger arbitration.
- `content_catalog_facet`: governed discovery facet definition. The twelve named facets are `subject`, `grade_band`, `language`, `accessibility_profile`, `rights_license`, `provenance`, `quality_rating`, `kc_refs`, `standards_framework_refs`, `content_kind`, `expected_xp_band`, and `modality`.
- `content_catalog_facet_assignment`: sidecar assignment at content, version, or media grain. Use it for LOR/library/catalog discovery; do not recompute it from titles or related rows.
- `content_effectiveness`: read-only rollup from Results. Display counts/rate/freshness exactly as returned.