feat(manifold): audit matching quality with ManifoldMatchResult and manifold_match_audit table
CI/CD / build-and-push (push) Successful in 14s
CI/CD / build-and-push (push) Successful in 14s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+22
@@ -209,6 +209,28 @@ async def get_attribution():
|
||||
return {"attribution": attribution, "total_attributed_trades": total}
|
||||
|
||||
|
||||
@app.get("/api/metrics/manifold-matches")
|
||||
async def get_manifold_matches():
|
||||
"""Manifold match audit — summary stats and recent match attempts.
|
||||
|
||||
summary:
|
||||
total_accepted — matches accepted (score >= 0.40, inversion unambiguous)
|
||||
total_rejected — matches rejected (low score or ambiguous inversion)
|
||||
total_no_results — no Manifold market found or API error
|
||||
avg_match_score — mean Jaccard score for accepted matches
|
||||
trades_dominated_by_mfld — open trades where feat_mfld_lo is the largest signal
|
||||
|
||||
recent_matches: last 50 rows from manifold_match_audit, newest first.
|
||||
used_in_trade=True only when status='accepted' AND a trade was actually executed.
|
||||
"""
|
||||
data = await db.get_manifold_matches(limit=50)
|
||||
for match in data["recent_matches"]:
|
||||
ts = match.get("timestamp")
|
||||
if ts is not None and hasattr(ts, "isoformat"):
|
||||
match["timestamp"] = ts.isoformat()
|
||||
return data
|
||||
|
||||
|
||||
@app.get("/api/summary")
|
||||
async def get_summary():
|
||||
"""Dashboard summary card data.
|
||||
|
||||
Reference in New Issue
Block a user