尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證TRACE is a bounded AI revenue recovery agent that evaluates failed payments, determines whether recovery is worth pursuing, selects the best next intervention, adapts to outcomes, and stops when further effort is no longer justified.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
TRACE — Transaction Recovery Agent with Contextual Evaluation
Razorpay AI Buildathon — Track 03: AI Revenue Recovery
Live app → · Backend API: trace-backend-4uu2.onrender.com檢視完整 README ↗Razorpay AI Buildathon — Track 03: AI Revenue Recovery
Live app → · Backend API: trace-backend-4uu2.onrender.com
A failed payment is not a lost customer — most of the time the person still wants to buy. TRACE is a bounded AI agent that looks at a failed transaction, decides whether recovering it is actually worth the effort, picks the single best next action, executes it, watches what happens, adapts, and knows when to stop. Everything it proposes passes through a deterministic policy layer that can override it before anything executes, and every step is written to an immutable audit trail.
To prove it isn't just a good idea, TRACE runs the same 300 synthetic failed payments through itself and through a static "retry → wait → remind → stop" baseline, on identical data, and reports the difference.
It would be easy to assume TRACE wins by trying less. It doesn't — on the 300-case benchmark it takes more recovery actions than the baseline (310 vs 249). The thesis isn't attempt count, it's where the effort goes:
| TRACE | BASELINE | |
|---|---|---|
| Cases correctly never pursued at all | 98 | 43 |
| Recovery value per intervention | ₹873.42 | ₹766.20 |
TRACE spends more of its 310 actions on cases actually worth chasing, and declines to touch 98 of 300 cases up front — more than double the baseline's 43 — because a contextual read of value, history, and failure type says the expected return doesn't justify the cost. A dumb workflow chases a ₹200 transaction with four prior failures exactly as hard as it chases a ₹95,000 transaction that has never failed before. TRACE doesn't. The clearest evidence of judgment is the work correctly left undone, not the total number of things attempted. Full numbers: §7.
The agent (app/agent.py) can only ever pick from a fixed six-action space
(app/enums.py::ActionType) and never executes anything itself. Every proposal
passes through app/policy.py — a 9-rule, 100% deterministic control layer with
zero dependency on the LLM or the heuristic engine — before app/execution.py is
allowed to act. Confidence too low, a high-value transaction proposed for closure on
the first attempt, an expired recovery window, an attempt ceiling: the policy layer
catches all of it regardless of which engine made the proposal. That separation is
what makes TRACE's safety properties auditable independently of the AI component. The
full 9-rule table, with current thresholds, is in backend/README.md.
TRACE has two decision engines behind one interface — a deterministic HEURISTIC
scorer and a real LLM call (Groq) — plus a ROUTED dispatch mode that runs the
heuristic on every case (free, instant) and escalates to the LLM only when one of four
signals says the heuristic's answer isn't trustworthy enough on its own: an uncertain
failure classification, a top-two candidate action too close to call, a high-value
transaction with a failed prior attempt, or case history the heuristic's fit table
structurally can't represent. Full trigger definitions and thresholds are in
backend/README.md.
The 300-case benchmark is deliberately locked to HEURISTIC and never touches the
network — that's the only way a byte-reproducible comparison against the baseline is
possible, and a batch run that fired hundreds of live LLM calls would be slow, billed,
and non-reproducible by construction. The deployed live path runs ROUTED — every
individually ingested case gets a per-case decision on whether it needs real
reasoning, which is where the routing behaviour and the LLM's actual answers become
visible in the demo. See backend/README.md §5
for the specific bug this distinction had to survive.
| Action | Meaning | Direct recovery? |
|---|---|---|
RETRY_PAYMENT | Re-attempt the charge | yes |
SEND_RECOVERY_LINK | Email a payment link | yes |
SUGGEST_ALTERNATIVE_METHOD | Email suggesting another method | yes |
WAIT_AND_REASSESS | Do nothing now; re-evaluate later | no |
ESCALATE_FOR_REVIEW | Route to a human | no |
STOP_RECOVERY | Give up, close the case | no |
Nothing else exists. TRACE cannot invent an action, change an amount, move real money, or contact a customer outside these six paths — the worst case is bounded by construction, not by hoping the model behaves.
| URL | |
|---|---|
| Frontend (Vercel) | https://trace-xi-nine.vercel.app |
| Backend API (Render) | https://trace-backend-4uu2.onrender.com |
| API docs | https://trace-backend-4uu2.onrender.com/docs |
A fresh deploy auto-seeds one HEURISTIC, seed-42, 300-case evaluation run on boot, so the dashboard opens on real populated data instead of a wall of 404s. Render's free tier spins the backend down when idle — the first request after a quiet period can take 20-30s to wake it up.
cd backend
python -m venv venv
venv\Scripts\activate # macOS/Linux: source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # edit for real SMTP / a real Groq key
python run.py # or: uvicorn app.main:app --reload
Interactive API docs: http://localhost:8000/docs. SQLite (backend/trace.db) is
created automatically on first start.
cd frontend
npm install
cp .env.example .env # set VITE_API_BASE_URL if the backend isn't on :8000
npm run dev
Opens on http://localhost:5173.
300 synthetic failed payments, seed 42, run through TRACE (HEURISTIC, the mode the
benchmark is locked to) and the static baseline on identical data. Freshly re-run for
this document — reproduce it yourself with POST /evaluation/run {"seed": 42} (see
backend/README.md §5).
| Metric | BASELINE | TRACE |
|---|---|---|
| Total failed payments | 300 | 300 |
| Revenue at risk | ₹10,08,761.21 | ₹10,08,761.21 |
| Recovery actions taken | 249 | 310 |
| Transactions recovered | 61 | 75 |
| Revenue recovered (simulated) | ₹1,90,784.18 | ₹2,70,759.09 |
| Recovery rate | 20.33% | 25.00% |
| Unnecessary interventions | 188 | 212 |
| Interventions avoided | 43 | 98 |
| Cases stopped | 239 | 220 |
| Cases escalated | 0 | 5 |
| Policy-blocked actions | 0 | 71 |
| Recovery value per intervention | ₹766.20 | ₹873.42 |
TRACE recovers 42% more revenue, at a recovery rate 23% higher (relative), from the identical pot of failed payments — while declining more than twice as many cases up front. See §9 for the one bucket (BANK_TIMEOUT) where the baseline still edges it, and why.
Track 03 asks for an AI agent that decides whether a failed payment is worth pursuing,
takes the appropriate next action, and demonstrates measurable value over a naive
approach — with the judgment auditable, not just trusted. TRACE's pieces map directly:
a bounded, priced action space instead of free-form generation; an expected-value
economics layer (expected_value / intervention_cost / net_expected_value) that
makes "worth pursuing" a number, not a vibe; a deterministic policy layer that can
overrule the AI and is independently testable; a full audit trail so any case's
decision can be reconstructed after the fact; and a same-data, same-seed comparison
against a static baseline so "TRACE is better" is a measured claim rather than a
marketing one.
WAIT_AND_REASSESS first on a case that was still fresh, and the resulting time
jump can age it past that window before its next reassessment pass — at which point
its own policy layer correctly force-stops it. TRACE's deliberation costs it a
narrow, honest loss in exactly the bucket where hesitation is expensive. Left as an
observed property of the current heuristic ordering, not patched to force a win.POST /cases/{id}/click is not idempotent. Repeated calls append additional
outcome rows. The UI guards against this; the endpoint itself doesn't.POST /evaluation/run gets a clean 409 rather than racing. The
deployed backend runs Postgres.Backend internals, the orchestration loop, the four routing triggers, and three real bugs found once a live LLM key was exercised: backend/README.md. Frontend design system and page tour: frontend/README.md.