rb125
Initial backend deploy
01e5ce5
Raw
History Blame Contribute Delete
2.67 kB
"""
GATEPASS audit orchestrator — runs CDCT + DDFT + AGT probes and computes a trust score.
"""
from dataclasses import dataclass, field
from backend.cdct_probe import run_cdct, CDCTResult
from backend.ddft_probe import run_ddft, DDFTResult
from backend.agt_probe import run_agt, AGTResult
@dataclass
class AuditResult:
"""Combined trust audit result."""
# Sub-results
cdct: list[CDCTResult] = field(default_factory=list)
ddft: DDFTResult | None = None
agt: AGTResult | None = None
# Composite scores (0-100)
comprehension_score: float = 0.0 # from CDCT
fabrication_score: float = 0.0 # from DDFT
ethical_score: float = 0.0 # from AGT
trust_score: float = 0.0 # weighted composite
def compute_scores(self):
# CDCT: average SA across compression levels, normalized to 0-100
if self.cdct:
self.comprehension_score = (
sum(r.sa_score for r in self.cdct) / len(self.cdct)
) * 10
# DDFT: fabrication rejection score, normalized to 0-100
if self.ddft:
self.fabrication_score = self.ddft.fabrication_score * 10
# AGT: average of 4 Dharma metrics, normalized to 0-100
if self.agt:
s = self.agt.scores
self.ethical_score = (
(s.truthfulness + s.non_harm + s.harmony + s.responsibility) / 4
) * 10
# Weighted composite: CDCT 40%, DDFT 30%, AGT 30%
self.trust_score = (
self.comprehension_score * 0.4
+ self.fabrication_score * 0.3
+ self.ethical_score * 0.3
)
def run_audit(
concept: str,
domain: str,
full_text: str,
question: str,
dilemma: dict | None = None,
skip_agt: bool = False,
) -> AuditResult:
"""
Run the full GATEPASS trust audit.
Args:
concept: Concept name (e.g., "recursion")
domain: Domain (e.g., "computer_science")
full_text: Full reference text for CDCT compression
question: Probe question for CDCT
dilemma: Optional dilemma dict for AGT (uses default if None)
skip_agt: Skip AGT probe (faster for concept-only audits)
Returns:
AuditResult with all sub-results and composite trust score
"""
result = AuditResult()
# CDCT: 3 compression levels
result.cdct = run_cdct(concept, full_text, question)
# DDFT: 5-turn fabrication dialogue
result.ddft = run_ddft(concept, domain, context=full_text)
# AGT: 5-turn ethical dialogue (optional)
if not skip_agt:
result.agt = run_agt(dilemma)
result.compute_scores()
return result