Files
breakpilot-compliance/backend-compliance/tests/test_domain_programs.py
T
Benjamin Admin 18f5d0cb05 feat(programs): Operational Knowledge — the transition is the unit + Transition Coverage KPI
Customers don't buy "EMV domain"; they buy "we have ISO 9001, help us with the CRA". The sellable
unit of knowledge is the TRANSITION (from -> to), not the law and not the capability. This reframes
the backlog from "model EMV next" to "the top demanded transitions". No new runtime framework (ADR-010).

- knowledge/programs/transitions.yaml: the Operational Knowledge backlog — the ~20-30 actually demanded
  transitions (of ~N*(N-1) possible) with priority. ISO27001->CRA, ISO9001->CRA, ISO9001->MaschinenVO
  (all 5-star), IEC62443->CRA, TISAX->CRA, ISO27001/IEC62443->NIS2, ISO14001->Umweltrecht.
- Transition Coverage KPI (reference suite, computed-not-stored): per transition a status DERIVED from
  the transition-pattern corpus (reviewed/validated/proven -> Gold, draft -> 🟡, none -> ). Honest
  current state: ISO27001->CRA  reviewed, ISO9001->CRA 🟡 draft, rest . Highest-priority gap =
  ISO9001->MaschinenVO (the next Track-B work) — a far stronger product indicator than "EMV 30% modelled".
- Three knowledge layers documented: Regulatory -> Operational (transitions/playbooks/deltas, the
  biggest differentiator) -> Verification (Vision V2). A domain is a TRANSITION PROGRAM with two tracks:
  Track A breadth (model sources, @Legal-KG/@Execution) + Track B product (transitions/playbooks/RTS
  per source, @Reasoning).
- ADR-010: the transition is the unit of knowledge; Transition Coverage KPI; three layers; two tracks.

10 program/transition-contract tests, check-loc 0. Knowledge data + ADR + reference harness =
non-runtime -> no deploy (ADR-001). No new module, no runtime change.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-27 23:48:45 +02:00

102 lines
4.1 KiB
Python

"""Characterization tests for the Domain Knowledge Program v1 backlog (data, not code).
Pins the program FRAMEWORK contract: a ranked backlog of domain definitions, each entered by INDUSTRY
with its typical requirement sources + a pre-onboarding capability hypothesis (typical_certifications).
Industrial Automation is rank 1. Environmental stays law-first. If a future edit reorders the backlog,
drops a source list, or reverts environmental to an ISO-first framing, these tests fail.
"""
from __future__ import annotations
import os
import yaml
_DIR = os.path.join(os.path.dirname(__file__), "..", "knowledge", "programs")
def _programs():
out = {}
for f in sorted(os.listdir(_DIR)):
if f.endswith(".yaml"):
with open(os.path.join(_DIR, f), encoding="utf-8") as h:
p = yaml.safe_load(h)
if "backlog_rank" in p: # domain programs only (not transitions backlog)
out[p["id"]] = p
return out
def _transitions():
with open(os.path.join(_DIR, "transitions.yaml"), encoding="utf-8") as h:
return yaml.safe_load(h)
def test_five_domains_ranked_backlog():
ranks = sorted(p["backlog_rank"] for p in _programs().values())
assert ranks == [1, 2, 3, 4, 5]
def test_industrial_automation_is_rank_1():
progs = _programs()
rank1 = [p for p in progs.values() if p["backlog_rank"] == 1]
assert len(rank1) == 1 and rank1[0]["id"] == "PROG-industrial-automation"
assert {"CRA", "MaschinenVO"} <= set(rank1[0]["typical_requirement_sources"])
def test_every_domain_entered_by_industry_with_sources_and_hypothesis():
for p in _programs().values():
assert p.get("industry") and p.get("customer_entry") # industry-first entry
assert p["typical_requirement_sources"] # stage 2 defined
assert p["typical_certifications"] # pre-onboarding capability hypothesis (ETO)
def test_no_stored_stage_status_progress_is_derived():
# the 7-stage progress is computed-not-stored: program shells must NOT hard-code stage status
for p in _programs().values():
assert "stages" not in p
def test_environmental_stays_law_first():
env = _programs()["PROG-environmental"]
assert "ISO 14001 ist KEIN Umweltrecht" in env["principle"]
assert set(env["typical_requirement_sources"]) == {"water", "chemicals", "emissions", "energy", "waste", "product_responsibility"}
def test_automotive_and_medical_present():
progs = _programs()
assert "TISAX" in progs["PROG-automotive"]["typical_requirement_sources"]
assert "MDR" in progs["PROG-medical"]["typical_requirement_sources"]
def test_readme_documents_seven_stage_checklist():
with open(os.path.join(_DIR, "README.md"), encoding="utf-8") as h:
readme = h.read()
for stage in ["Domain Model", "Requirement Sources", "Capability Registry",
"Transition Patterns", "Playbooks", "Reference Scenarios", "Completeness"]:
assert stage in readme
assert "Industrial Automation" in readme # backlog #1 documented
def test_transition_backlog_has_top_demanded_transitions():
ts = _transitions()["transitions"]
pairs = {(t["from"], t["to"]) for t in ts}
# the highest-value transitions customers actually buy
assert ("ISO27001", "CRA") in pairs and ("ISO9001", "CRA") in pairs
assert ("ISO9001", "MaschinenVO") in pairs
def test_transition_backlog_is_prioritised():
ts = _transitions()["transitions"]
for t in ts:
assert 1 <= t["priority"] <= 5 and t["from"] and t["to"]
# the five-star transitions are the CRA/MaschinenVO entry points
five = {(t["from"], t["to"]) for t in ts if t["priority"] == 5}
assert ("ISO9001", "MaschinenVO") in five
def test_transition_is_the_unit_documented():
with open(os.path.join(_DIR, "README.md"), encoding="utf-8") as h:
readme = h.read()
assert "unit of knowledge is the TRANSITION" in readme
assert "Operational Knowledge" in readme and "Verification Knowledge" in readme # three layers