v0.11.0 ## Added - A Scoring page for staff, replacing the empty placeholder. It shows the top three teams, a score graph, and a breakdown table with each team's uptime, inject, IR report and adjustment totals and their sum. The table sorts on any column and the page refreshes every 30 seconds. If a refresh fails, the last loaded scores stay on screen with the error above them - A score graph over time, switchable between total, uptime, inject, IR report and adjustment scores, on a linear or symmetric log axis. Lines step instead of sloping, since a score holds until the next event changes it. Dots mark each grade and adjustment, and hovering names the team, the event, the score and the time - The graph starts on the top eight teams, each in its own colour. Teams can be toggled, all selected or cleared. Past eight, teams draw in grey underneath, and a team keeps its colour while others are added or removed - The graph only asks for as much uptime history as it can draw. `GET /api/scores/history` takes the chart's width in points (50 to 2000) and returns at most that many uptime events per team, keeping the last round in each time bucket. A pause between rounds stays a gap. The browser fetches and shapes the history in a web worker, so a long competition does not block the page - Score adjustments. Staff add a bonus or penalty to a blue team with a reason, and edit or delete it later. WHITE can read them, BLACK and up can change them. An adjustment cannot be moved to another team or round, since that would rewrite the other team's history. Deleting one keeps its history - An audit log of every adjustment change, recording who made it, when, the adjustment before and after, and the team's total before and after. Each adjustment has a History button, and the adjustments page lists recent changes across all teams, including deleted adjustments. Both page back through older entries - `GET /api/scores/dashboard`, `GET /api/scores/history`, and `GET`, `POST`, `PATCH` and `DELETE` on `/api/scores/adjustments`, plus `GET /api/scores/adjustments/audit` - Score requests in the Bruno collection, under "admin actions/scores" ## Changed - A team's inject total counts only the latest graded submission for each inject. A graded resubmission replaces the earlier grade, and an ungraded one leaves it standing. Before, every graded submission was added, so a regraded resubmission counted twice. Existing cached totals keep the old sum until `POST /api/scores/recalculate` runs or the team is graded again - The admin nav's "Scores" link is nashboard is titled "Engine Dashboard" - The frontend depends on `d3-scale` scales - Schema changes for an existing database, which `setup_db.go` does not touch: the new `Score_Adjustment_Audit` table and)` index