Files
breakpilot-compliance/scripts/obligation_discovery/merge_review_diff.py
T
Benjamin Admin e1b270c36e Add obligation discovery pipeline tooling
Sichert die validierte Obligation Discovery Pipeline aus /tmp als dauerhaftes,
committetes Tooling (scripts/obligation_discovery/) — der eigentliche Vermögenswert.

Stufen: precluster (Embedding-Cache + Mikro-Cluster) → meta_cluster (Review Units,
Skalierungs-Fix) → synthesize_obligations (Opus, Key aus ENV, Streaming, harte Tier-Regel,
Provenance) → validate_registry → merge_review_diff. Reine Helfer in _core.py, 16 Unit-Tests.

Doku docs-src/development/obligation_discovery_pipeline_v1.md mit Meilensteinen
(SBOM/Vuln reproduziert, Auth 4408→170 Review Units→54→kuriert 29) und der Architekturregel:
Runtime deterministisch, Discovery LLM-gestützt.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-25 07:41:45 +02:00

37 lines
1.4 KiB
Python

"""Stufe 5 — Review-Diff mergen: vorgeschlagene Beziehungskanten (review_status=proposed)
dedupliziert in die Registry mergen (kein LLM/Key). Kleine Beziehungs-Sprache:
depends_on/supports/produces_evidence_for/implements/derived_from.
python3 scripts/obligation_discovery/merge_review_diff.py obligations/cra.json /tmp/cra_edges_review.json
"""
from __future__ import annotations
import argparse
import json
from _core import SEMANTIC_EDGE_TYPES, merge_edges
def main() -> None:
ap = argparse.ArgumentParser()
ap.add_argument("registry")
ap.add_argument("review_diff")
ap.add_argument("--write", action="store_true", help="in die Registry schreiben (sonst dry-run)")
a = ap.parse_args()
reg = json.load(open(a.registry, encoding="utf-8"))
diff = json.load(open(a.review_diff, encoding="utf-8"))
proposed = diff.get("proposed_edges", diff if isinstance(diff, list) else [])
merged, added = merge_edges(reg.get("relationships", []), proposed)
print(f"proposed: {len(proposed)} | added (dedupliziert): {added}")
if a.write:
reg["relationships"] = merged
reg["relationship_types"] = list(SEMANTIC_EDGE_TYPES)
json.dump(reg, open(a.registry, "w", encoding="utf-8"), ensure_ascii=False, indent=1)
print(f"written: {a.registry}")
else:
print("dry-run (use --write to apply)")
if __name__ == "__main__":
main()