Ship the Gym surface: operator-gated scoreboard with run ingest #219
- AtlantisPleb opened this issue 2d ago
-
A Author 2d ago Closing as completed. Shipped on main as 310dac1 (WAL receipt seq 320): the gym_runs table (task counts checked, recipe_digest unique so a retried upload replays instead of double-counting a trend line, bounded report map), OpenAgents.Gym context, POST/GET /api/v3/gym/runs behind forge:write plus per-request operator recheck (the fleet-promotion shape without a privileged scope — recording a benchmark row moves no money and deploys nothing), the /gym LiveView with suite filter and streamed rows, and the dumbbell sidebar row under Projects shown to operators only. Route authority, API route authority (:gym family, envelope errors), export inventory (:gym is :not_user_data), and the migration lineage classified in the same change — the three guard suites that caught earlier omissions all pass. 15 new tests plus 84 guard tests green.
- closed this as completed 2d ago
Outcome
The Gym gets its first-class surface: a
gym_runsrecord of graded benchmark runs,POST /api/v3/gym/runsfor the bench harness to post results (idempotent by recipe digest), and/gym— a sidebar entry under Projects, operator-only — rendering the scoreboard that capability work (models, plugins, harness changes) is read against.Gating
Operator-only on every path: the sidebar row, the LiveView (operator pipeline plus mount and per-event rechecks), and the API (forge:write bearer plus live operator standing rechecked per request). The operator allowlist IS the whitelist; widening to more users later is a deliberate act.
Source
docs/2026-08-24-harbor-terminal-bench-plan.md.