Bremen Chemistry Cutover Readiness Audit
Date: 2026-05-11
Scope: DE-HB Chemistry on the canonical Gymnasium landscape.
Decision
DE-HB Chemistry is cutover-ready on the canonical route.
Bremen does not have an active committed legacy Chemistry learner route comparable to the Hessen or Bavaria runtime trees. The operational route is therefore:
- select
Gymnasium (DE); - use the
DE-HBstate filter; - select canonical Chemistry through the Bremen GK or LK composition view;
- keep Bremen source extractions as retained archive and evidence surfaces only.
Evidence
- Source inventories are persisted for both stages:
curricula/DE/Gymnasium/input/HB/lower-secondary/source-extraction/DE_HB_CHEMIE_SEKI_BILDUNGSPLAN_2006_2022.source-extraction.jsoncurricula/DE/Gymnasium/input/HB/upper-secondary/source-extraction/DE_HB_CHEMIE_SEKII_GYO_2022.source-extraction.json- Source-landscape registry entries load both retained source landscapes and resolve
DE-HBjurisdiction. - Runtime mapping files exist for backend
GoalMappingServicediscovery: curricula/DE/Gymnasium/mapping/DE-HB/lower-secondary/hb_chemistry_lower_secondary_to_canonical_chemistry.jsoncurricula/DE/Gymnasium/mapping/DE-HB/upper-secondary/hb_chemistry_upper_secondary_to_canonical_chemistry.json- Learner-facing Bremen Chemistry composition views exist and validate:
curricula/DE/Gymnasium/composition-views/chemie/de-hb-gk.view.jsoncurricula/DE/Gymnasium/composition-views/chemie/de-hb-lk.view.json- Retained source-extraction landscapes are now classified as compatibility-only archive surfaces, so fresh UI curriculum selection cannot route a learner into them.
Backend Fence
The Bremen retained source landscapes remain readable for provenance, mapping, and audit use. They are not writable learner paths:
LandscapeService.isCompatibilityOnlyLandscape(...)now treats source-landscape registry IDs as compatibility-only.- UI curriculum selection of Bremen Chemistry source-extraction IDs returns
409 Conflict. - If a retained Bremen source-extraction ID is already present on a learner, active-goal and planned-goal writes are rejected as retired compatibility-session writes.
Verification
Targeted backend verification:
./gradlew test --tests com.skillpilot.backend.landscape.LandscapeServiceTest --tests com.skillpilot.backend.controller.LearnerControllerIntegrationTest.retainedBremenChemistrySourceExtractionsCannotBeSelectedViaUiEndpoint --tests com.skillpilot.backend.controller.LearnerControllerIntegrationTest.retainedBremenChemistrySourceExtractionSessionRejectsLearningWrites
Result: passed locally.