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.
Already in place
Section titled “Already in place”- 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 frompackage_evidence_link.competency_node_idinexternal-package.ts) — this is an ADR-0010-style in-place reshape at its historic minimum cost. - Contracts:
@conform-ed/contractscase/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).
Ordered work
Section titled “Ordered work”- 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_nodeinto 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_linkFK; re-declare erasure classes. - Update
docs/architecture/competency-framework-model.md(stale per ADR-0018) and regenerate migrations (docs/runbooks/regenerate-migrations.md).
- Split
- 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.
- 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 oncompetency_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_mappingrow; 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_levelandsubjectcore registries landed now, shared with OneRostergrades/subjects(decision 10).
Constraints to keep honoring
Section titled “Constraints to keep honoring”- One-vocabulary rule: CASE terms (CFItem, CFDocument, fullStatement) appear
only at the
@conform-ed/contractsboundary. - 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).
Cross-lane touchpoint
Section titled “Cross-lane touchpoint”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.