e1b270c36e
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>
37 lines
1.4 KiB
Python
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()
|