AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Live demo: agent-ops-sage.vercel.app
— browse completed sessions and inspect their full traces without signing in.
The free backend may take about a minute to wake up.
Recruiter walkthrough: open the no-credentials resilience demo
to see multi-step research, provider failover, tool-error recovery, prompt-injection
defense, and an explicit approval boundary in one auditable trace.檢視完整 README ↗Live demo: agent-ops-sage.vercel.app — browse completed sessions and inspect their full traces without signing in. The free backend may take about a minute to wake up.
Recruiter walkthrough: open the no-credentials resilience demo to see multi-step research, provider failover, tool-error recovery, prompt-injection defense, and an explicit approval boundary in one auditable trace.
Every stage emits structured events into the append-only trace. Irreversible tool calls pause at
the persisted approval gate, while transient provider and tool failures remain visible through
automatic failover and bounded recovery. See ARCHITECTURE.md for the detailed
state machine and design rationale.
A multi-agent orchestration copilot: a planner agent breaks an incoming task into steps and delegates each to a tool-using sub-agent (web search, a notes/document store, a calculator). Every irreversible action pauses for human approval before it runs. Every session has persistent memory and a full trace of what each agent decided, which tool it called, and why — visible in the UI, not just in logs.
See ARCHITECTURE.md for how it's built and
ADR.md for why each stack/design choice was made (including the
LangGraph-vs-CrewAI decision and the Gemini+OpenRouter failover design).
:free-model
fallback behind one provider interfacemaincd backend
python -m venv .venv
source .venv/Scripts/activate # Windows Git Bash; use .venv/bin/activate on macOS/Linux
pip install -r requirements-dev.txt
cp ../.env.example ../.env # fill in real values, see below
python -m scripts.migrate # applies backend/migrations/*.sql — run once, and again after any schema change
uvicorn app.main:app --reload
python -m scripts.archive_sessions prints which sessions its QA/demo-fixture
heuristics would soft-archive, without changing anything; add --apply to
archive them for real, or --restore-all to undo every archive in one shot.
python -m scripts.reap_sessions prints which sessions look stranded — a
running session with no update in over 15 minutes, or a created session
never messaged in over a day — without changing anything; add --apply to
mark the stalled ones failed and archive the never-messaged ones for real.
It never touches awaiting_approval sessions.
Set an AGENT_OPS_API_KEY containing at least 32 bytes, then check the service with
curl http://localhost:8000/health and
curl http://localhost:8000/health/ready (the second reports which of
Gemini/OpenRouter/Supabase/DB config is missing, without ever printing a
secret value). Readiness confirms configuration and database reachability;
it does not spend provider requests or prove that configured credentials are valid.
Sessions, messages, the trace log, and the approval state machine (Day 3)
live in Postgres — POST /sessions, GET /sessions,
GET /sessions/{id}, POST /sessions/{id}/messages,
GET /sessions/{id}/trace, POST /approvals/{id}/approve /
.../reject. See /docs for the full schema, or ADR.md (ADR-014/015/016)
for how the approval pause survives across separate requests.
A session accepts a follow-up message once it reaches done, degraded, or
failed (ADR-033) — the agent keeps its prior messages and notes for that
session, so a second message can build on the first. running and
awaiting_approval still reject a second message with a 409; a session is
never mid-flight across two requests in this fully synchronous design.
Sessions can be soft-archived without deleting them: POST /sessions/{id}/archive / .../restore set or clear archived_at. GET /sessions excludes archived sessions by default; pass
?include_archived=true to see everything. An archived session still opens
directly by GET /sessions/{id}.
Every POST requires X-Agent-Ops-Key. The frontend asks for that key at
runtime and keeps it in sessionStorage; it is never a VITE_* value and is
not compiled into the public bundle. Read-only session, trace, liveness, and
readiness requests remain unauthenticated for demo observability.
Run checks locally exactly as CI does:
ruff check .
black --check .
pytest -v
cd frontend
npm install
cp .env.example .env # VITE_API_URL — defaults to http://localhost:8000
npm run dev
npm run lint
npm run format:check
npm test
VITE_API_URL=https://api.example.invalid npm run build
Production builds require VITE_API_URL; local development falls back to
http://localhost:8000. See frontend/README.md for browser behavior and
Vercel setup.
The backend Dockerfile builds a non-root runtime image containing the app and
forward migrations. Its health check uses /health (liveness), never
dependency readiness.
pip install pre-commit
pre-commit install
Ruff and Black run in isolated pre-commit environments. Frontend hooks use the
project's installed ESLint and Prettier and check only the changed files, so
run npm install in frontend/ before installing the hooks.
Copy .env.example to .env at the repo root (backend reads it) and
frontend/.env.example to frontend/.env (Vite only reads env files from
within frontend/). Every variable is documented inline in the .example
files, including which free-tier signup page to get each key from and how to
pick a current OpenRouter :free tool-calling model (the lineup rotates —
see ADR-002 in ADR.md for the live-verification method).
Never commit .env. It's gitignored from the first commit in this repo;
double-check git status before pushing if you ever see it listed.
render.yaml defines one free Docker web service and points platform health
checks at /health. frontend/vercel.json defines the Vite output and SPA
rewrite. All secrets stay in provider dashboards.
Release order:
docker build -t agent-ops-backend:release ./backend.docker run --rm --env-file .env agent-ops-backend:release python -m scripts.migrate.
The runner holds a PostgreSQL advisory lock, records each applied filename,
and is safe to repeat. It is deliberately not part of API startup.
After a deploy that adds archived_at (or any future soft-delete flag),
dry-run docker run --rm --env-file .env agent-ops-backend:release python -m scripts.archive_sessions, read the printed plan, then re-run with --apply.docker run --rm --env-file .env agent-ops-backend:release python -m scripts.release_check.
This command logs only check names and outcomes, never provider response bodies.render.yaml, fill every sync: false
variable, and verify /health over HTTPS.frontend as the Root Directory.
Set VITE_API_URL to the exact Render origin and deploy.CORS_ORIGINS to the exact scheme-qualified Vercel production
origin, redeploy, then run the authenticated approval and rejection flows.Application rollback means redeploying the previous known-good commit. Database
migrations are forward-only: never edit or reverse an applied file; ship a new
corrective migration if a schema issue is found. Current public URLs and live
walkthrough evidence are recorded in .planning/SPRINT_03_RELEASE_CANDIDATE.md.
backend/ FastAPI app, agent graph, tests
backend/migrations/ SQL schema, applied by backend/scripts/migrate.py
frontend/ React + Vite + Tailwind app, tests
.github/ CI workflow, issue/PR templates
ADR.md Architecture Decision Records — what we chose and gave up
ARCHITECTURE.md System design: components, data flow, deployment topology
This project is being built in public over 7 days as a portfolio piece. Each
day is tagged (day-1-complete, day-2-complete, ...) once its scope from
the build plan is done. RETROSPECTIVE.md (Day 7) has the full writeup.