← Files DesignlyARCHIVED FILE

skills/visual-qa/scripts/score_review.py

3.45 KB · Sep 30, 2026 · 23:14 UTC

↓ Download file

#!/usr/bin/env python3
import json, sys
from pathlib import Path

WEIGHTS = {
    "brief_accuracy": 8,
    "concept_strength": 10,
    "marketing_clarity": 8,
    "hierarchy": 10,
    "composition": 10,
    "grouping_alignment": 6,
    "spacing_density": 5,
    "typography": 8,
    "color_contrast": 5,
    "brand_fidelity": 8,
    "product_fidelity": 6,
    "physical_believability": 5,
    "lighting_materials": 4,
    "cultural_fit": 3,
    "platform_fit": 2,
    "craft": 2,
}
THRESHOLD = 92.0
FLOORS = {
    "brief_accuracy": (85, None),
    "concept_strength": (85, None),
    "marketing_clarity": (85, None),
    "hierarchy": (88, None),
    "composition": (88, None),
    "grouping_alignment": (82, None),
    "typography": (88, "typography"),
    "color_contrast": (85, "color_contrast"),
    "brand_fidelity": (92, "brand"),
    "product_fidelity": (95, "product"),
    "physical_believability": (88, "physical_believability"),
}


def evaluate(data):
    scores=data.get("scores",{})
    missing=[k for k in WEIGHTS if k not in scores]
    if missing:
        raise ValueError("Missing scores: " + ", ".join(missing))
    applicability=data.get("applicability",{})
    optional_flags={
        "typography":"typography",
        "color_contrast":"color_contrast",
        "brand_fidelity":"brand",
        "product_fidelity":"product",
        "physical_believability":"physical_believability",
    }
    active_weights={}
    for k,w in WEIGHTS.items():
        flag=optional_flags.get(k)
        if flag is None or bool(applicability.get(flag,False)):
            active_weights[k]=w
    denom=sum(active_weights.values())
    weighted=sum(float(scores[k])*w for k,w in active_weights.items())/denom if denom else 0.0
    floor_failures=[]
    for key,(minimum,flag) in FLOORS.items():
        applies=True if flag is None else bool(applicability.get(flag,False))
        if applies and float(scores[key]) < minimum:
            floor_failures.append({"category":key,"score":float(scores[key]),"minimum":minimum})

    hard=data.get("hard_gates",{})
    valid_status={"pass","fail","na"}
    invalid_hard=[k for k,v in hard.items() if v not in valid_status]
    hard_failures=[k for k,v in hard.items() if v == "fail"]
    hard_ok=bool(hard) and not invalid_hard and not hard_failures

    findings=data.get("slop_findings",[]) or []
    counts={"minor":0,"major":0,"critical":0}
    for f in findings:
        sev=f.get("severity")
        if sev in counts: counts[sev]+=1
    pressure=counts["minor"] + 3*counts["major"]
    slop_ok=counts["critical"] == 0 and counts["major"] < 2 and counts["minor"] < 4 and pressure < 6

    approved=weighted >= THRESHOLD and not floor_failures and hard_ok and slop_ok
    return {
        "weighted_score": round(weighted,2),
        "threshold": THRESHOLD,
        "category_floors_pass": not floor_failures,
        "floor_failures": floor_failures,
        "hard_gates_pass": hard_ok,
        "hard_gate_failures": hard_failures,
        "invalid_hard_gate_status": invalid_hard,
        "slop_veto_pass": slop_ok,
        "slop_counts": counts,
        "slop_pressure": pressure,
        "approved": approved,
    }


def main():
    if len(sys.argv)!=2:
        print("Usage: score_review.py <visual-review.json>",file=sys.stderr); return 2
    data=json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
    result=evaluate(data)
    print(json.dumps(result,indent=2))
    return 0 if result["approved"] else 1

if __name__ == "__main__":
    raise SystemExit(main())

SHA-256: 940636d030ba5c92aa22ce4d1579218180f1678d3e2287caf065077863a142e1