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>
This commit is contained in:
@@ -21,10 +21,16 @@ def _programs():
|
||||
if f.endswith(".yaml"):
|
||||
with open(os.path.join(_DIR, f), encoding="utf-8") as h:
|
||||
p = yaml.safe_load(h)
|
||||
out[p["id"]] = p
|
||||
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]
|
||||
@@ -69,3 +75,27 @@ def test_readme_documents_seven_stage_checklist():
|
||||
"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
|
||||
|
||||
Reference in New Issue
Block a user