Spaces:
Sleeping
Sleeping
Commit History
-
Phase 4.1: gate hardening — corroborate hard citations + enforce ELIG-4
Close the two envelope holes the Phase-4 eval surfaced (confirmed live by an Ollama console run that rejected camp-011 on a fabricated PROH-2/PROH-4 hard citation, and approved >$10k campaigns with no fund-use breakdown). Both fixes stay inside the gate envelope — it still only routes toward the human, never manufactures an APPROVE/REJECT, never re-adjudicates a rule. - ELIG-4 on APPROVE: a >$10k goal carrying the medium-severity large_goal_no_breakdown_check signal now escalates citing ELIG-4 (the gate previously blocked only on high-severity signals, so it slipped through). - Citation corroboration: a hard REJECT is honored only if the cited rule is corroborated by the deterministic scanner (_HARD_RULE_SIGNALS). Genuine rejects (005/006/007/008) all carry their signal and survive; a fabricated hard category on a campaign with no matching content escalates (DEC-2). Detector-less content rules (PROH-1/5/6) are not confirmable -> escalate. Tests: smoke t_policy_gate +2 as…438e8e8
-
Phase 4: eval harness + CI (deterministic safety gate + LLM-judge)
Turn the 18 labelled campaigns into an eval set and make the policy-gate invariants a build gate. - eval/build_testset.py + eval/testset.json: collect each campaign's private _expected into a committed test set; --check fails CI if it drifts. - eval/run_eval.py (full rewrite; the old file was the retired YouTube-RAG eval): * deterministic, model-free layer (no key/index) — privacy boundary, ground- truth citation validity, and the policy-gate envelope probed from both sides (sanctions/injection/low-conf/unfounded-reject escalate; clean approve and founded reject pass through; escalate is terminal). 10 checks, gates CI. * triage scoring (needs key) — recommendation accuracy, escalation recall (overall + safety-critical subset, --strict gates at 100%), reject precision + false-reject ids, citation validity. Per-case error isolation. * LLM-as-judge (--judge) — rationale faithfulness + calibration 1-5 on a subset. - .github/workflows/eval.yml: deterministic gat…9561b34
-
Add policy reference drawer + clickable citations; fix check_sanctions retry loop
Two changes that surfaced during the live moderator-console click-through: Policy reference drawer (the acronym glossary moderators asked for): - src/policy.py: SECTION_META (prefix -> plain-English name + blurb) and policy_sections(), grouping parse_policy_rules() by rule-ID prefix. - api.py: new GET /api/policy route. - frontend: new PolicyReference.tsx side drawer (mirrors the audit-history drawer), opened by a Policy button in the header; lists all 26 rules grouped by the 5 sections, each with name + description. Cited rule IDs in the decision card and gate banner are now clickable RuleIdChips that open the drawer scrolled to + highlighting that rule. No AI/triage/gate code touched. check_sanctions retry-loop fix: - src/agent.py: the zero-arg check_sanctions tool now declares optional, ignored names/countries params so Haiku hallucinating those args validates instead of burning retries (was UnexpectedModelBehavior: exceeded max retries). Values still sourced from …063bf3a -
Pivot YouTube RAG scaffold into Amana — T&S triage copilot (Phases 1–3.6)
Repurposes the YouTube-transcript RAG app into a Trust & Safety campaign-review triage copilot: an AI agent screens a fundraising campaign against policy and recommends APPROVE / REJECT / ESCALATE with cited rule IDs; a human moderator decides. The AI never auto-decides. Data layer: - data/policy.md (26 citable rule IDs: ELIG/PROH/COMP/CONT/DEC) - data/campaigns/*.json (18 synthetic cases w/ private _design_note/_expected, stripped before the agent sees them), data/sanctions.json, data/past_cases.json Agent + tools (Pydantic AI, Claude; Ollama toggle for free local dev): - src/schemas.py, src/campaigns.py, src/policy.py, src/tools.py, src/agent.py - four tools: policy_search, similar_cases, check_sanctions (mock), scan_risk_signals - retired src/ingest.py, src/chunk.py, src/rag.py Deterministic policy gate (the "not-a-wrapper" layer): - src/gate.py reconciles the model's decision against policy invariants in code; may only route toward the human (-> ESCALATE), never auto-approve…250666a