Spaces:
Sleeping
Sleeping
Commit History
-
fix: hide inert provider toggle on public demo; report real model name in telemetry
On the public Space (PUBLIC_DEMO=1) the provider is forced to Anthropic, so the Anthropic/Ollama toggle was inert — now hidden on the public demo, kept for local dev. Also fixes a telemetry label bug: the run footer always showed the Claude model id even on Ollama runs; triage() now reads the real model's .model_name. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>d641c27
-
Deploy-readiness: Neon persistence, moderator identity, run telemetry, warm redesign
Port the key infra gaps from the sibling supportops project so Amana is a durable, accountable, polished live demo (HF Spaces + Neon + keepalive). Backend: - Persistence: new src/db.py writes the moderator audit log to Neon Postgres (JSONB) behind the existing src/audit.py interface; JSONL fallback when DATABASE_URL is unset. api.py untouched. (psycopg added to requirements.) - Moderator identity: /api/decisions now requires a `moderator` name (server-enforced) and records it on every decision. - Run telemetry: agent.triage captures input/output tokens + wall-clock latency and the model name as optional GatedDecision fields. - test_api: force DATABASE_URL off for offline runs; cover the moderator rule. Frontend (warm, mission-branded redesign): - Tailwind tokens: parchment/surface/ink + pine (deep green) + gold (antique), warm stone neutrals; Fraunces/Inter/IBM Plex Mono. - Signature: verdict rendered as a stamped seal; policy-gate intervention shown as a bronze "counters…8e98f03
-
Phase 5 prep: bound /api/triage spend by construction (PUBLIC_DEMO)
A public Space with a billed /api/triage is a potential spend faucet. Close it structurally rather than with after-the-fact limits. The endpoint already only triages the 18 fixed campaigns (it takes a campaign_id, never free-form text — arbitrary input can't reach the model). The one remaining leak was force=true re-running past the per-campaign cache. - New PUBLIC_DEMO config flag (src/config.py). When on, /api/triage ignores force (no cache bypass) and locks the provider to Anthropic (also neutralizes the Ollama toggle, which can't run on a Space anyway). - ENV PUBLIC_DEMO=1 baked into the Dockerfile, so the deployed image is locked with no extra Space secret. Local dev (no flag) keeps force + provider toggle. - Result: max spend = 18 Haiku triages per container restart, then cache hits. Pairs with the operator-side backstop (a hard monthly cap on a dedicated key in the Anthropic Console) — documented in STATUS as the first deploy step. Tested: scripts.test_api 9/9 (new PUB…09213ce -
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
-
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
-
Scaffold YouTube Channel Knowledge Base (RAG)
developerf4d9ca1