← All docs changelog/2026-05-07.md

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.pyTradesparkEmailAdmin auth dependency (57 lines)
  • dev/static_site/templates/demos/traction.html — Traction dashboard UI (611 lines)

Changed:

  • dev/core/__init__.py — export TradesparkEmailAdmin
  • dev/core/core.py — add TradesparkAdmins Modal Secret
  • dev/static_site/endpoint.py — register traction in FULLSCREEN_DEMOS
  • dev/static_site/templates/index.html — add Traction card to landing page
  • dev/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 — add progress_callback support, 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 in FULLSCREEN_DEMOS
  • dev/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 spec
  • dev/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 pattern
  • dev/static_site/DESIGN.md — replaced with canonical spec pointer
  • CLAUDE.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)