File size: 2,272 Bytes
5a05423
d47ae8b
96b82bc
69241fb
5a05423
 
 
96b82bc
d47ae8b
96b82bc
d47ae8b
96b82bc
d47ae8b
 
96b82bc
 
 
 
d47ae8b
6e87ff8
96b82bc
 
d47ae8b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96b82bc
6e87ff8
 
 
 
d47ae8b
 
 
 
 
 
 
96b82bc
6e87ff8
d47ae8b
96b82bc
d47ae8b
 
 
 
 
d8ef0e2
d47ae8b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from fastapi import FastAPI
from pydantic import BaseModel, Field
from typing import Dict, Any, List, Literal
from datetime import datetime

app = FastAPI()

class Metrics(BaseModel):
    TCS: float = Field(ge=0.0, le=1.0, default=0.0)
    HDI: float = 0.0
    PDS: float = Field(ge=0.0, le=1.0, default=0.0)
    EVI: int = 0
    CBS: float = Field(ge=0.0, le=1.0, default=0.0)
    LQS: float = Field(ge=0.0, le=1.0, default=0.0)

class AuditResult(BaseModel):
    metrics: Metrics
    decision: Literal['APPROVE','REWORK']
    deltas: List[str] = Field(default_factory=list)

@app.get("/health")
def health():
    return {"ok": True, "service": "auditor", "ts": datetime.utcnow().isoformat()}

@app.post("/audit", response_model=AuditResult)
def audit(payload: Dict[str, Any]):
    bundle = payload.get("bundle", {})
    m_in   = payload.get("metrics", {})

    # seed metrics from input
    m = Metrics(**{
        "TCS": float(m_in.get("TCS", 0.0)),
        "HDI": float(m_in.get("HDI", 0.0)),
        "PDS": float(m_in.get("PDS", 0.0)),
        "EVI": int(m_in.get("EVI", 0)),
        "CBS": float(m_in.get("CBS", 0.0)),
        "LQS": float(m_in.get("LQS", 0.0)),
    })

    edges   = len(bundle.get("network",{}).get("data",[]) or [])
    regions = len((bundle.get("regions",{}).get("data") or {}).get("regions_ranked",[]) or [])
    lit_ok  = bool(bundle.get("literature"))

    # heuristic patches
    m.TCS = min(1.0, (1 if edges>0 else 0) + (1 if regions>0 else 0) + (1 if lit_ok else 0)) * 0.9
    if regions > 8: m.HDI = max(m.HDI, 1.2)
    elif regions > 4: m.HDI = max(m.HDI, 1.0)
    else: m.HDI = max(m.HDI, 0.8)
    m.EVI = (1 if edges>0 else 0) + (1 if regions>0 else 0) + (1 if lit_ok else 0)
    m.CBS = max(0.2, float(m.CBS))

    deltas: List[str] = []
    decision: Literal['APPROVE','REWORK'] = 'APPROVE'

    if (m.HDI < 1.0) or (m.EVI < 3) or (m.CBS > 0.6):
        decision = 'REWORK'
        if m.HDI < 1.0: deltas.append("Increase hypothesis diversity: broaden regions search.")
        if m.EVI < 3:   deltas.append("Add at least one more evidence type (e.g., trials or review).")
        if m.CBS > 0.6: deltas.append("Surface and address contrary findings explicitly.")

    return AuditResult(metrics=m, decision=decision, deltas=deltas)