Skip to content

CASE / competency lane milestone — starting brief (v1)

Status: ordered-work items 1–3 implemented (2026-06-12/13 — case-competency-v1.md): core schema rework, consumer + neutral vocabulary, and the provider/export projection with its round-trip totality gate. Lane complete; the credential lane consumes the durable-node URIs it now emits Decisions this builds on: ADR-0018 (CASE is a boundary adapter; competency nodes become durable referents), ADR-0012 (the projection pattern and its consumer architecture), ADR-0005/0007 (immutable pooling units, research reproducibility), ADR-0014 (erasure classes; competency evidence is sever)

This brief is the handoff into the design session. The strategic decision is made (boundary adapter + core absorbs durable nodes); the session designs the schema rework and the consumer.

  • Current competency schema (packages/db/src/schema/competency-framework.ts): framework / immutable version / per-version node / version-scoped edge / time-aware alignment / person evidence / derived person state. Zero application code uses these tables (seeds and schema tests only, plus one FK from package_evidence_link.competency_node_id in external-package.ts) — this is an ADR-0010-style in-place reshape at its historic minimum cost.
  • Contracts: @conform-ed/contracts case/v1_1 (CFPackage, CFDocument, CFItem, CFAssociation + groupings, CFRubric, concepts, subjects, licenses, REST binding).
  • The consumer architecture to mirror: OneRoster staging snapshots keyed by batch + external id, reconcile service, external identifiers held in boundary mappings, never as core identity (oneroster-consumer-v1.md).
  • Glossary already updated: Competency Node is a durable referent with per-edition revisions (CONTEXT.md, ADR-0018).
  1. Core schema rework (precedes the consumer) — ✅ implemented 2026-06-12 (settled field split and reference rules recorded in competency-framework-model.md; crosswalk provenance, CFRubric, and the education-level/subject vocabulary remain open for the consumer session):
    • Split competency_node into a durable node (the object of longitudinal mastery history, stable across editions) and per-edition node revision (statement text + metadata).
    • Replace the version-scoped edge table with an association table: CASE association-type vocabulary (exactMatchOf, isPartOf, precedes, replacedBy, isTranslationOf, …) and cross-framework endpoints (crosswalks and framework translations are core features).
    • Add the descriptive field set as neutral columns (coding scheme, item type, education level, language, abbreviated statement, …).
    • Re-point evidence/state/alignment FKs (durable node for longitudinal identity; edition where psychometric pooling requires it) and the package_evidence_link FK; re-declare erasure classes.
    • Update docs/architecture/competency-framework-model.md (stale per ADR-0018) and regenerate migrations (docs/runbooks/regenerate-migrations.md).
  2. CASE consumer: CFPackage import → staging snapshots → reconcile into framework/edition/node/revision/association rows; CASE GUIDs/URIs as boundary bindings; re-imports of an updated document create a new edition, with node continuity resolved through the GUID bindings.
  3. Provider/export projection (✅ implemented 2026-06-13): emergent-authored frameworks exported as CASE CFPackages, gated by a round-trip totality test (the ADR-0012 CI-gate pattern). Export-projection scope only — no separate OAuth/IMS surface (the brief’s cross-lane note keeps it light); CFItem/ CFAssociation identifiers are the durable core uuids, so the emitted URIs are the stable, durable-node-addressed ones the credential lane consumes.

Decisions left for the design session — all resolved

Section titled “Decisions left for the design session — all resolved”

These were the open questions at brief time; every one was settled and implemented. Resolutions are recorded in case-competency-v1.md (the design doc); summarized here:

  • Node/revision field split: durable node carries identity only (framework FK + node_key); all descriptive state is edition-scoped on competency_node_revision.
  • Reference rules: state → durable node only; evidence → node + capture-time edition (both required); alignment → node + optional authored-against edition.
  • Crosswalk provenance: mapping tables, not core columns — an imported association gets a case_association_mapping row; locally authored rows have none (Anton’s decision 8).
  • CFRubric: boundary-only in v1 (case_rubric_snapshot); the structured core rubric reshape is a future slice on product need (decision 9).
  • Education-level / subject vocabularies: neutral education_level and subject core registries landed now, shared with OneRoster grades/subjects (decision 10).
  • One-vocabulary rule: CASE terms (CFItem, CFDocument, fullStatement) appear only at the @conform-ed/contracts boundary.
  • Immutable editions remain the research invariant — imported mutability (status dates, lastChangeDateTime) is boundary metadata, never in-place core mutation.
  • External identifiers are bindings, never identities (ADR-0013 pattern).

The credential lane (credential-export-v1-brief.md) consumes durable node URIs for OB 3.0 Achievement.alignment. Stable, durable-node-addressed URIs are a v1 output of this lane; the full provider API is not.