|
|
import hashlib, json, time |
|
|
from typing import Dict |
|
|
|
|
|
def sha256(x: str) -> str: |
|
|
return hashlib.sha256(x.encode("utf-8")).hexdigest() |
|
|
|
|
|
def build_attestation(model: str, prompt: str, output: str, anchors) -> Dict: |
|
|
return { |
|
|
"ack_mandate": True, |
|
|
"anchors_match": True, |
|
|
"model": model, |
|
|
"continuity": anchors.continuity, |
|
|
"truth_lock": anchors.truth_lock, |
|
|
"prompt_sha256": sha256(prompt), |
|
|
"output_sha256": sha256(output), |
|
|
"timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), |
|
|
} |
|
|
|
|
|
def continuity_gate(previous_terms: Dict[str, str], new_terms: Dict[str, str]) -> Dict[str, str]: |
|
|
""" |
|
|
Enforce 'no redefinition': if a previously locked term appears with a conflicting |
|
|
definition, raise a violation that downstream can route to REPORT_VIOLATION_TOOL. |
|
|
""" |
|
|
violations = {} |
|
|
for k, v in new_terms.items(): |
|
|
if k in previous_terms and previous_terms[k].strip() != v.strip(): |
|
|
violations[k] = f"Changed from: {previous_terms[k]} -> {v}" |
|
|
return violations |
|
|
|