docs(knowledge): TKP 4-level lifecycle + 3 enrichments + ISMS->TISAX (genericity proof)
Transition KNOWLEDGE Patterns (renamed term -- curated knowledge, not an algorithm): - 4 maturity levels: draft -> reviewed -> validated (domain expert) -> proven (field). "approved" dropped; target is validated. TP-ISO27001-CRA set to reviewed (L2). - 3 enrichments per pattern: confidence_source: relationship (curated, not an LLM estimate -> computed-not-stored); why_asked (customer-facing: why the source does not suffice here); dropped_if (what makes the question unnecessary). Applied to TP-ISO27001-CRA. - New TP-ISMS-TISAX (draft): different character -- info-security module mostly covered; delta is automotive-specific (prototype protection, TISAX labels, VDA ISA self-assessment, ENX assessment, Art. 28 data protection). Proves the architecture is GENERIC, not CRA-tailored. - Reference scenario 4 generalized to loop over ALL patterns through RS-005: both carried (CRA 17->17, TISAX 13->13) -> a living genericity + regression test for every future pattern. Non-runtime knowledge + reference harness -> no deploy (ADR-001). Next: ISO9001->IATF16949. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -241,53 +241,43 @@ coverage_table([
|
||||
])
|
||||
|
||||
# ── Scenario 4 — Transition (RS-005 Planning Engine + Knowledge Pattern) ───
|
||||
w("## Szenario 4 — Transition ISO27001 → CRA (RS-005 + Pattern TP-ISO27001-CRA-v1)")
|
||||
w("## Szenario 4 — Transition (RS-005 fährt JEDEN Knowledge Pattern)")
|
||||
w("")
|
||||
w('_Frage: „Ich bin ISO27001-zertifiziert — was fehlt mir für den CRA?"_')
|
||||
w("_Genericity-Beweis: derselbe Algorithmus trägt jeden Transition Knowledge Pattern, nicht nur den CRA._")
|
||||
w("")
|
||||
_pat_path = os.path.join(os.path.dirname(__file__), "..", "knowledge", "transition_patterns",
|
||||
"transition_pattern_iso27001_to_cra_v1.yaml")
|
||||
with open(_pat_path, encoding="utf-8") as _f:
|
||||
PAT = yaml.safe_load(_f)
|
||||
# „habe": ISO27001 -> the pattern's likely_covered capabilities become INFERRED via Company 2A
|
||||
_iso_caps = [a["capability"] for a in PAT["likely_covered"]]
|
||||
_iso_map = {"ISO27001": CapabilityMappingEntry(capability_ids=_iso_caps, confidence=Confidence.MEDIUM)}
|
||||
_profile = build_company_profile(
|
||||
CompanyContext(company_id="iso-kunde", certifications=[Certification(certification_id="ISO27001")]), _iso_map)
|
||||
# „required": likely_covered + delta -> TargetRequirements (here read from the pattern)
|
||||
_reqs = [TargetRequirement(capability_id=a["capability"], question_intent="verify_existence",
|
||||
expected_evidence=a.get("expected_evidence", [])) for a in PAT["likely_covered"]]
|
||||
_reqs += [TargetRequirement(capability_id=d["capability"], question_intent=d.get("needed_information", "verify_existence"),
|
||||
expected_evidence=d.get("expected_evidence", [])) for d in PAT["delta_requirements"]]
|
||||
_tc = TransitionContext(company_id="iso-kunde", known_certifications=["ISO27001"],
|
||||
target=TransitionGoal(target_id="CRA", target_type=TargetType.REGULATION,
|
||||
label=PAT["transition_goal"]["to"]["regulation"]))
|
||||
_a = assess_transition(_tc, _reqs, _profile)
|
||||
w("**Input:** ISO27001-zertifiziert (Pattern TP-ISO27001-CRA-v1) → %d ISMS-Capabilities inferred; Ziel CRA." % len(_iso_caps))
|
||||
w("")
|
||||
w("**Expected Transition Assessment (RS-005 v0 gegen den Pattern):**")
|
||||
w("> Ziel %s · %s" % (_a.target_id, _a.summary.headline))
|
||||
w("")
|
||||
w("**Delta zuerst (HIGH — fehlt einem ISO-27001-only-Hersteller):**")
|
||||
for _r in _a.question_requests:
|
||||
if _r.priority.value == "high":
|
||||
w("- `%s` — intent=%s, Nachweis=%s" % (_r.capability_id, _r.question_intent, _r.expected_evidence))
|
||||
w("")
|
||||
w("**Aus ISO27001 vermutlich abgedeckt (Produkt-Nachweis bestätigen):** %s" % ", ".join(_a.summary.probably_covered))
|
||||
w("")
|
||||
_carried = len(_a.coverage) == len(_reqs) and len(_a.question_requests) > 0
|
||||
_n_high = sum(1 for _r in _a.question_requests if _r.priority.value == "high")
|
||||
w("**Architektur-Test — trägt RS-005 den Pattern vollständig?** %d Pattern-Capabilities → %d Coverage + %d Question-Requests → **%s**."
|
||||
% (len(_reqs), len(_a.coverage), len(_a.question_requests), "ja, vollständig getragen" if _carried else "NICHT vollständig"))
|
||||
w("")
|
||||
coverage_table([
|
||||
("Pattern-Load (YAML)", "PASS", "TP-ISO27001-CRA-v1 (draft, gold-standard)"),
|
||||
("Company 2A (habe)", "PASS", "ISO27001 → %d inferred caps" % len(_a.summary.probably_covered)),
|
||||
("RS-005 Planning Engine", "PASS" if _carried else "PARTIAL", "Pattern → TransitionQuestionRequests"),
|
||||
("Transition ISO27001→CRA", "PASS" if _carried else "PARTIAL",
|
||||
"%d Delta-Fragen (HIGH) + %d zu bestätigen" % (_n_high, len(_a.summary.probably_covered))),
|
||||
("RS-005.1 Renderer (Fragetext)", "TODO", "verschoben — Engine liefert nur Requests"),
|
||||
])
|
||||
_pat_dir = os.path.join(os.path.dirname(__file__), "..", "knowledge", "transition_patterns")
|
||||
_pat_files = sorted(f for f in os.listdir(_pat_dir)
|
||||
if f.startswith("transition_pattern_") and f.endswith(".yaml"))
|
||||
_t_rows: List[Row] = []
|
||||
for _pf in _pat_files:
|
||||
with open(os.path.join(_pat_dir, _pf), encoding="utf-8") as _f:
|
||||
PAT = yaml.safe_load(_f)
|
||||
_src = "".join(c for c in PAT["transition_goal"]["from"]["standard"] if c.isalnum()) # e.g. ISOIEC27001
|
||||
_tgt = PAT["transition_goal"]["to"].get("regulation") or PAT["transition_goal"]["to"].get("framework") or "TARGET"
|
||||
_have = [a["capability"] for a in PAT["likely_covered"]]
|
||||
_map = {_src: CapabilityMappingEntry(capability_ids=_have, confidence=Confidence.MEDIUM)}
|
||||
_profile = build_company_profile(
|
||||
CompanyContext(company_id="kunde", certifications=[Certification(certification_id=_src)]), _map)
|
||||
_reqs = [TargetRequirement(capability_id=a["capability"], question_intent="verify_existence",
|
||||
expected_evidence=a.get("expected_evidence", [])) for a in PAT["likely_covered"]]
|
||||
_reqs += [TargetRequirement(capability_id=d["capability"], question_intent=d.get("needed_information", "verify_existence"),
|
||||
expected_evidence=d.get("expected_evidence", [])) for d in PAT["delta_requirements"]]
|
||||
_tc = TransitionContext(company_id="kunde", known_certifications=[_src],
|
||||
target=TransitionGoal(target_id=_tgt, target_type=TargetType.REGULATION, label=_tgt))
|
||||
_a = assess_transition(_tc, _reqs, _profile)
|
||||
_carried = len(_a.coverage) == len(_reqs) and len(_a.question_requests) > 0
|
||||
_n_high = sum(1 for _r in _a.question_requests if _r.priority.value == "high")
|
||||
w("**%s → %s** _(%s, status=%s)_" % (PAT["transition_goal"]["from"]["standard"], _tgt, PAT["id"], PAT["status"]))
|
||||
w("> %s" % _a.summary.headline)
|
||||
w("- Delta zuerst (HIGH): %s" % (", ".join(_r.capability_id for _r in _a.question_requests if _r.priority.value == "high") or "—"))
|
||||
w("- vermutlich abgedeckt: %s" % (", ".join(_a.summary.probably_covered) or "—"))
|
||||
w("- Pattern getragen: **%s** (%d caps → %d coverage + %d requests)"
|
||||
% ("ja" if _carried else "NEIN", len(_reqs), len(_a.coverage), len(_a.question_requests)))
|
||||
w("")
|
||||
_t_rows.append(("Transition %s→%s" % (_src, _tgt), "PASS" if _carried else "PARTIAL",
|
||||
"%s · %d HIGH-Delta + %d zu bestätigen" % (PAT["status"], _n_high, len(_a.summary.probably_covered))))
|
||||
_t_rows.append(("RS-005.1 Renderer (Fragetext)", "TODO", "verschoben — Engine liefert nur Requests"))
|
||||
coverage_table(_t_rows)
|
||||
|
||||
# ── Epics + roll-up ───────────────────────────────────────────────────────
|
||||
w("## Gaps → Epics (Backlog — nur erfasst, NICHT implementiert)")
|
||||
|
||||
Reference in New Issue
Block a user