May 7, 2026
Commits
972012a — Add Traction admin demo with email-allowlist gate
New admin-only demo at /demos/traction showing live user/project signal from Supabase: total users with registered/anonymous split, homeowner vs pro counts based on accounts.account_type membership, per-month calendar grids for daily signups and project creation (Jan–Dec, Less→More legend with hover ranges), and a paginated project list with drawer showing the initial prompt, AI refinement Q&A, and generated plan tree.
Auth: new core.TradesparkEmailAdmin dependency checks the logged-in user's email against a comma-separated TS_ADMIN_EMAILS env var sourced from a new TradesparkAdmins Modal Secret. Decoupled from Supabase profiles.role.
Backend endpoints at /admin/traction/{stats,daily-signups,daily-projects,projects,projects/{id}} on the users service. All paginate past the 1000-row PostgREST default.
Added:
dev/users/traction.py— Traction admin endpoints (296 lines)dev/core/admin.py—TradesparkEmailAdminauth dependency (57 lines)dev/static_site/templates/demos/traction.html— Traction dashboard UI (611 lines)
Changed:
dev/core/__init__.py— exportTradesparkEmailAdmindev/core/core.py— addTradesparkAdminsModal Secretdev/static_site/endpoint.py— register traction inFULLSCREEN_DEMOSdev/static_site/templates/index.html— add Traction card to landing pagedev/users/users_endpoint.py— include traction router
8e7ef69 — Add non-blocking eval pipeline + multi-model comparison dashboard
Builds the eval surface using the same spawn-and-poll pattern as the training workers. run_eval (eval_runner.py) accepts an optional progress_callback emitting eval_started → record_started/record_completed → eval_completed events. New eval_jobs/eval_runs Modal Dicts and an eval_worker function (timeout=3600). POST /ml/eval/run is now non-blocking: takes a RunEvalMultiRequest, spawns one worker per model, returns {run_id, jobs} immediately.
New endpoints: GET /ml/eval/jobs/{job_id}, GET /ml/eval/runs, GET /ml/eval/runs/{run_id} — all share a _probe_running_eval_job helper mirroring training's zombie self-heal.
New /demos/ml-eval dashboard with golden-set picker (+ "Create from raw" modal), task-type/max-examples/judge filters, multi-model picker, per-job progress bars with per-record tick marks, comparison table (rows=metrics+judge subscores, cols=models), per-record diff drawer, and recent-runs list.
Added:
dev/static_site/templates/demos/ml-eval.html— ML eval dashboard UI (725 lines)
Changed:
dev/ml/eval/eval_runner.py— addprogress_callbacksupport, event emission (+66/-23)dev/ml/ml_endpoint.py— eval worker, eval_jobs/eval_runs Dicts, non-blocking POST, GET endpoints, zombie probe (+323/-1)dev/static_site/endpoint.py— register ml-eval inFULLSCREEN_DEMOSdev/static_site/templates/index.html— add ML eval card
3dd7a0c — Defer traction router import so non-users services don't crashloop
users/traction.py imports tsweb.queries at module load. The tsweb package is mounted only on the users service's image. Every other service that imports users.auth transitively pulls in users_endpoint → traction → tsweb.queries and crashes with ModuleNotFoundError.
Wraps the traction router import in try/except so it's a no-op when tsweb isn't on sys.path. The warning fires once per non-users-service cold start; users service still mounts /admin/traction normally.
Changed:
dev/users/users_endpoint.py— wrap traction import in try/except (+14/-2)
363987f — Update Synthetic Generate test for non-blocking response shape
Updates the Bruno Synthetic Generate test assertion to match the new non-blocking response shape from the eval pipeline changes.
Changed:
bruno/.../ML API/Synthetic Generate.bru— response shape assertion update (+2/-3)
570201f — Adopt TradeSpark Design System across dev/static_site/ + wire skill
Major commit checking in /design/TradeSpark Design System/ as the canonical brand spec (README, SKILL.md, colors_and_type.css, preview HTML components, JSX UI kit, font guidance). Symlinked into .claude/skills/tradespark-design for session availability.
Replaces dev/static_site/ tokens with canonical TradeSpark values: navy #183e6d, spark #e45125, bg #f4f8fb, hairline #d0dbe6, navy-tinted shadows, brand radii 6/10/14/18px. Adds .eyebrow, .spark-text, .btn-arrow, .hero-glow utilities and the brand H1 type scale (clamp 32–72px, weight 800, -0.02em track). Restyles index/login/posts shared templates with eyebrow → headline → subhead. Swaps site-logo wordmark for the TradeSpark SVG; adds favicon.
Replaces dev/static_site/DESIGN.md (Material-You) with a stub pointing at the canonical spec. Cross-references from root CLAUDE.md and dev/CLAUDE.md.
Added:
design/TradeSpark Design System/— canonical brand spec (README, SKILL.md, tokens CSS, preview components, JSX UI kit) — 53 new files.claude/skills/tradespark-design— symlink to design specdev/static_site/assets/img/TradeSpark_logo*.{png,svg},favicon.svg— brand assets
Changed:
dev/static_site/assets/css/site.css— replace Material-You tokens with TradeSpark brand; add eyebrow/spark-text/btn-arrow/hero-glow utilities (+575/-392)dev/static_site/templates/index.html,login.html,posts_index.html,_header.html,_fullscreen_header.html— restyle with brand eyebrow → headline → subhead patterndev/static_site/DESIGN.md— replaced with canonical spec pointerCLAUDE.md,dev/CLAUDE.md— cross-reference design spec
1d0edb6 — ml-eval: tooltips on metrics, judge-score legend, project titles in records
Polishes the ml-eval dashboard: tooltips on each metric name explaining what it measures, a judge-score legend (gradient scale with cutoff labels), and project titles shown alongside record IDs in the per-record list.
Changed:
dev/ml/eval/eval_runner.py— emit project title alongside record data (+35)dev/ml/ml_endpoint.py— pass project title through to dashboard (+1)dev/static_site/templates/demos/ml-eval.html— metric tooltips, judge-score legend, project titles (+318/-16)
87df64e — traction: brand restyle — tokens, voice, eyebrow + spark-text headline
Applies TradeSpark brand restyle to the traction demo: swaps hard-coded colors for --ts-* token variables, applies eyebrow → .spark-text headline pattern, follows voice guidelines.
Changed:
dev/static_site/templates/demos/traction.html— brand restyle (+36/-21)
b9aace7 — traction: regrade calendar ramp to 0.20/0.40/0.60/0.80/solid navy
Adjusts the traction calendar heatmap color ramp to use opacity-graded navy at 0.20/0.40/0.60/0.80/1.0 instead of the previous grading.
Changed:
dev/static_site/templates/demos/traction.html— regraded color ramp (+11/-11)
27ec5f6 — mobile-session: brand restyle — tokens, eyebrow + spark-text headline
Applies TradeSpark brand restyle to the mobile-session demo.
Changed:
dev/static_site/templates/demos/mobile-session.html— brand restyle (+9/-8)