Graph, Applicability, and Composition-View Validation Rules
Generated artifact. Do not edit manually.
Generated by:
scripts/build_compendia.pyRegenerate with:python3 scripts/build_compendia.py --compendium qa-ci --web-and-texSource of truth:docs/qa-ci/source/
Language / Sprache: English (EN) · Deutsch (DE) | PDF: English PDF · Deutsches PDF
Compendium: §1 Maturity & Trials · §2 Scopes & CQR Rules · §3 Graph Validation · §4 Semantic Atomicity · §5 Champion Guide · §6 Four-Level Model
3. Graph, Applicability, and Composition-View Validation Rules
Authoritative CI source and November 2026 validation boundaries
Single source of truth for algorithmic graph and view validation in .github/workflows/ci.yml (graph-validation & backend-ci). Transitive minimality (Graph Definition §3.1) together with complete local assessment routes, protected explicit exam/card targets, and versioned learning-unit contracts (unit validity rules R1–R5 of 11 November 2026; Assessment-Gated Completion) are binding target requirements for forthcoming validator adaptations. Atomic normal form and transitive minimality (G17) are not checked by validate:graph; since 11 November 2026, CQR-001 checks them for the canonical Gymnasium catalog (2). Existing CI passes never substitute for content/rubric review verifying independent application of recognized competences.
3.1. CI Entrypoints, Enforcement Profiles, and Core DAG Checks
- Raw graph validator:
app/scripts/validateGraph.ts(npm run validate:graph) — profiles:default(structural andGVR-*rules fail CI aserror) vs. temporary migration modeVALIDATE_GRAPH_STRICT_RULES=0(legacy-warn, under whichGVR-012,GVR-014,GVR-015, andGVR-016remain unconditionalerrors). - Filter-projection validator:
app/scripts/validateViewFilters.ts(npm run validate:view-filters) covering the 17 reviewed canonical Gymnasium landscapes (Mathematik,Physik,Chemie,Biologie,Informatik,Deutsch,Englisch,Französisch,Griechisch,Chinesisch,Geschichte,Politik und Wirtschaft,Musik,Latein,Spanisch,Wirtschaft,Overview). - Duration-model & composition-view validators:
app/scripts/reportHeMathDurationProjection.ts --check(npm run check:he-math-duration-projectionfor Hesse Mathematics Sek-IG8/G9) andapp/scripts/validateCompositionViews.ts(npm run validate:composition-viewsacross all.view.jsonfiles undercurricula/DE/Gymnasium/composition-views/). - Archive & legacy-handoff gates:
scripts/validate_hessen_upper_secondary_{archive_paths,legacy_refs}.py,scripts/validate_hessen_lower_secondary_{archive_paths,legacy_refs}.py, andscripts/validate_bavaria_gymnasium_{archive_paths,legacy_refs}.pyenforcing the explicit*-retirement-registry.jsonallowlists undercurricula/DE/Gymnasium/provenance/andretained-asset-registry.json.
Always-active core checks (error): JSON parsing, goal-ID and logical shortKey uniqueness, referential integrity and self-reference guards on requires/contains, allowed phase/Leitideen/competency tag domains, acyclicity of direct requires, contains, and effective requires, curricula/curriculum_manifest.json sync, and project invariants (such as cross-subject Physics-to-Mathematics resolution).
3.2. Emitted Graph Validation Rules (GVR-001 through GVR-016)
| Rule | Default / Scope | Verified structural invariant |
|---|---|---|
GVR-001 |
error · local |
A goal must not directly require any of its contains ancestors. |
GVR-002 |
error · local |
Phase compatibility lint: effective prerequisites do not point to later phases (E, Q1..Q4, Abitur, S*, J*). |
GVR-003 |
error · local |
A goal must not directly require its immediate contains parent (primary deadlock guard). |
GVR-004 |
error · DE_HES_S_GYM_2_* |
First atomic node is a motivation anchor (Warum/Why; excluding OVERVIEW). |
GVR-005 |
error · DE_HES_S_GYM_2_* |
Every atomic node reaches the motivation anchor transitively via effective requires (\(R_{\mathrm{effective}}^+\)). |
GVR-006 |
error · DE_HES_S_GYM_2_* |
A goal must not directly require any of its direct contains children (including OVERVIEW). |
GVR-007 |
error · mit-ocw-* |
MIT OCW module atoms (module:*) include concept + practice + assessment links in resourceLinks targeting https://ocw.mit.edu/courses/.... |
GVR-008 |
error · local |
Canonical top-level resourceLinks is the sole permitted goal-level helper-link field. |
GVR-009 |
error · local |
Optional type metadata matches structural leaf/non-leaf classification (atomic iff contains is empty). |
GVR-010 |
error · landscapeId |
shortKey is unique within the logical landscapeId (locale file pairs allowed only on identical goal UUIDs). |
GVR-011 |
error · profile scopes |
Selected curricularAtomic goals reach their stage-specific motivation anchor via \(R_{\mathrm{effective}}^+\). |
GVR-012 |
unconditional error · Math DE Sek I & II |
Hard full-route invariant: Every curricularAtomic goal lies stage-locally on a direct atomic requires path from its orientation anchor to an atomic practiceAssessment terminal (Sek I: individual tasks under Prüfungen Jahrgangsstufe 5..10; Sek II: atomic tasks under Übungen E-Phase, Q1..Q4, Prozesskompetenzen; complete semanticKind ledger, zero cluster/structure shortcuts). |
GVR-013 |
error · Math DE |
Zero selected non-memory atomic goals carry direct local requires edges targeting cluster nodes. |
GVR-014 |
unconditional error · all |
Motivation/orientation nodes are pure, prerequisite-free atomic entry anchors with zero examData, examples, memory/SRS, or assessment tags. |
GVR-015 |
unconditional error · Math DE Sek I & II |
Reviewed bilingual orientation outlooks (2–4 paths with curricularArea roots plus atomic curricularAtomic entryGoalIds and milestoneGoalIds, direct atomic link to the anchor, zero internal authoring terms like Source-Extraction, and fail-closed runtime intersection with targetGoalIds). |
GVR-016 |
unconditional error · examData |
GFM table integrity across taskContent* and solutionContent* (valid delimiter row and uniform column count on consecutive pipe rows). |
3.3. Filter Projection (APV-*), Required-Learning Contract, and Assessment Applicability
| Rule | Default | Meaning in validate:view-filters & backend-ci |
|---|---|---|
APV-102 |
error |
A necessary canonical atom is missing from personal acquisition targets, emitted definitions, or completion inputs (enforced by the native backend gate). |
APV-103 |
error |
A visible goal is unreachable from the projected root (retired compatibility clusters must set extendedData.applicabilityProjection = "excluded"). |
APV-201 |
warning |
Explicit applicability override path used (accepted cases recorded with rationale in docs/qa-ci/applicability-accepted-warnings.json). |
APV-202 |
diagnostic |
Visibility backed solely by partial mappings (1:n mapping-shape diagnostic, not warning debt). |
APV-203 |
warning |
Compiled applicability diverges from committed applicability metadata. |
- Required-learning contract (Product Owner, 10 November 2026): Under the closed personal learning basis (View Projection & Goal Placement), every effective necessary atom must be an actual acquisition target in the full Personal Curriculum regardless of its source jurisdiction (without granting
CQR-003source coverage).APV-102is enforced in.github/workflows/ci.yml(backend-ci->./gradlew check) byFirstMathPrerequisiteReductionTest.currentCatalogLearningScopesRetainEveryCanonicalAcquisitionTargetacross all 20 subjects and 17 jurisdiction choices (including the Biology regression rejecting removed required targets). - Explicit assessment applicability basis (dormant compiler support): For atomic practice/assessment endpoints with
applicabilityFromRequires: true, optionalextendedData.assessmentApplicabilityBasis = { kind: "allOfGoalApplicability", goalRefs: [...] }supplies seed-eligibility evidence only (rejecting cycles, duplicates, foreign, and memory dependencies), while required learning still follows canonicalrequires. Proof extensions, emitted-targetAPVchecks, and native comparisons remain prerequisites before any production data admission.
3.4. Composition-View Validator (CPV-000 through CPV-216)
validate:composition-views compiles every .view.json under curricula/DE/Gymnasium/composition-views/ deterministically against its canonical graph:
| Rule | Level | Verified composition-view invariant |
|---|---|---|
CPV-000 |
error |
Composition-view JSON file could not be loaded or parsed. |
CPV-001 |
error |
Required view or structure-node metadata is missing or invalid. |
CPV-002 |
error |
Referenced canonical subtree root does not exist in the canonical graph. |
CPV-004 |
error |
Two referenced canonical subtree roots overlap or the same root is referenced multiple times. |
CPV-005 |
error |
Compiled default tree contains the same canonical goal more than once. |
CPV-006 |
error |
Compiled default tree assigns more than one visible parent to a canonical goal. |
CPV-007 |
error |
An empty structure node remains visible in the compiled view tree. |
CPV-008 |
error |
Unknown projectionRole used on a composition reference. |
CPV-009 |
error |
Direct goalEntry exposes a curricularArea cluster opaquely instead of expanding via canonicalSubtree or explicit atoms. |
CPV-101 |
warning |
Structure-node label is too generic to be review-safe. |
CPV-102 |
warning |
Referenced canonical subtree root still carries a phase- or state-specific title. |
CPV-210 |
error |
Canonical Mathematics Sek-I view omits the reviewed motivation anchor. |
CPV-211 |
error |
Canonical Mathematics Sek-I view omits required year exam folders or individual task nodes. |
CPV-212 |
error |
Malformed Mathematics Sek-I exam folder structure (missing year folder, non-atomic task, missing examData, cluster prerequisite, duplicate, or stale aggregate endpoint). |
CPV-213 |
error |
Mathematics Sek-I view still exposes the legacy Übungen Sekundarstufe I aggregate branch. |
CPV-214 |
error |
Mathematics Sek-II or cross-stage view omits the reviewed Sek-II motivation anchor. |
CPV-215 |
error |
Mathematics Sek-II or cross-stage view exposes zero atomic terminal assessment endpoints. |
CPV-216 |
error |
Learner-facing composition label exposes internal authoring terms such as Source-Extraction. |