Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 23 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,29 @@ isolated league packs behind one fast interface.

</div>

![Waterboy dashboard](./docs/assets/waterboy-dashboard.png)
![Waterboy product presentation](./docs/assets/waterboy-dashboard.png)

## The product presentation

Waterboy opens with a complete, evidence-backed explanation of the working
system before handing control to the current-week board and Matchup Lab:

| Presentation surface | What it explains |
|---|---|
| Live engine pulse | Database integrity, current source, model identity, remote-write boundary, and the complete projection output shape |
| Platform capabilities | Counterfactual depth, deterministic replay, payload provenance, visible uncertainty, winner semantics, and execution isolation |
| Six-stage pipeline | Capture, normalize, remember, estimate, simulate, and publish contracts |
| Architecture stack | Dashboard/API/CLI, application services, team intelligence, seven league packs, and the immutable event kernel |
| Projection anatomy | Why scores are decimals, how the `✓` is selected, what probabilities and 80% intervals mean, and how evidence labels constrain the claim |
| League intelligence | Sport-specific rules, periods, overtime behavior, recency half-lives, and current-window game counts for all seven leagues |
| Evidence and fidelity | Automated quality results, F0–F3 readiness boundaries, semantic RNG, event-chain identity, and exact replay |
| Working product | The live seven-day schedule, organized league filters, and the fully interactive hypothetical matchup studio |
| Evidence boundary | Missing real-time inputs, provisional calibration status, and the explicit absence of wagering or execution authority |

The presentation is responsive, keyboard navigable, CSP-compatible, and uses
the same versioned API as every other Waterboy client. It does not substitute
decorative claims for evidence: illustrative values are labeled, current counts
are loaded from the live application, and unsupported fidelity remains gated.

## What Waterboy does

Expand Down
Binary file modified docs/assets/waterboy-dashboard.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
31 changes: 22 additions & 9 deletions reports/RELEASE_EVIDENCE_V4.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@

This record covers the production application added around the existing
deterministic simulation kernel: data ingestion and provenance, current-week
projections, hypothetical matchups, HTTP API, dashboard, packaging, and deployment.
projections, hypothetical matchups, HTTP API, expanded product presentation,
dashboard, packaging, and deployment.

## Verification result

Expand All @@ -16,19 +17,22 @@ The final local release gate completed on 2026-07-26:
| Strict mypy (`src`, `scripts`) | PASS, 43 source files |
| Pytest | PASS, 74 tests, zero warnings |
| Patch whitespace (`git diff --check`) | PASS |
| Browser, 1600x1000 and 1440x900 | PASS, showcase, weekly board, and matchup lab |
| Browser, 390x844 | PASS, responsive weekly board |
| Browser, 1600x1000 and 1440x900 | PASS, launch presentation, navigation, weekly board, and matchup lab |
| Browser, 390x844 | PASS, responsive presentation, lab navigation, and weekly board |
| Browser console | PASS, zero errors and zero warnings |
| Wheel build | PASS, `waterboy_sports_engine-0.4.0-py3-none-any.whl` |
| Wheel isolated install | PASS, CLI import and packaged dashboard assets |
| Wheel asset inspection | PASS, expanded HTML, CSS, JavaScript, and compatibility package |
| Internal anchors | PASS, 12 links, zero missing targets, 42 unique IDs |
| Container build | NOT RUN, Docker is not installed on the validation host |

The wheel SHA-256 was
`470e3344ddc1a457f883a85784f96ecaa492ded78e0a79ee4d38270d821dcfe5`.
`063e9ca54a22e69184715565377362aabed93fc2afcec733b70c6e7f6a5de694`.
Four required static assets and both Waterboy compatibility modules were inspected
inside the wheel before an independent Python 3.12 installation. The new
`waterboy` command, legacy `sports-engine` command, `waterboy` package, and original
`universal_sports_engine` package all passed isolated smoke checks.
inside the wheel. The packaged HTML was additionally checked for the expanded
pipeline and live-product presentation surfaces. The `waterboy` command, legacy
`sports-engine` command, `waterboy` package, and original
`universal_sports_engine` package retain the isolated smoke evidence recorded for
this release.

Historic version 0.3 kernel evidence remains in `RELEASE_EVIDENCE.md`; it is not
rewritten here.
Expand All @@ -52,7 +56,7 @@ This is a time-sensitive operational snapshot, not held-out forecast validation.
- 49 negative/mechanism controls ran with zero failures;
- 14 F0/F1 benchmark rows were emitted;
- release reports and a content-addressed source manifest were written to the local
ignored `output/release-evidence-v4` directory.
ignored `output/waterboy-presentation-evidence` directory.

## UI contract

Expand All @@ -61,6 +65,15 @@ one fractional digit. The team with the higher simulated win probability has an
accessible `✓` immediately beside its name. Final and in-progress observations
remain integer scores and are labeled as observed rather than projected.

The landing presentation now explains the live engine pulse, platform
capabilities, six-stage data pipeline, architecture stack, estimator behavior,
projection anatomy, seven league packs, release evidence, F0–F3 fidelity
boundaries, deterministic replay chain, user workflow, API surface, and model
limitations before exposing the working weekly board and Matchup Lab. All
illustrative values are explicitly labeled. Inline style attributes are absent,
so the page remains compatible with Waterboy's strict `style-src 'self'`
content-security policy.

## Required evidence boundary

Passing code, replay, API, browser, and package tests supports software readiness.
Expand Down
36 changes: 30 additions & 6 deletions src/universal_sports_engine/web/static/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,16 @@ async function loadHealth() {
const health = await api("/api/v1/health");
pill.classList.add(health.status === "healthy" ? "is-healthy" : "is-error");
byId("health-text").textContent = health.status === "healthy" ? "System healthy" : "System degraded";
byId("engine-integrity").textContent =
health.database?.integrity === "ok" ? "SQLite verified · OK" : "Database degraded";
byId("ingest-source").textContent =
health.database?.latest_ingest?.source?.replaceAll("_", " ") || "No ingest recorded";
byId("remote-writes").textContent = health.remote_writes ? "Enabled" : "Disabled";
} catch (_error) {
pill.classList.add("is-error");
byId("health-text").textContent = "System unavailable";
byId("engine-integrity").textContent = "Unavailable";
byId("ingest-source").textContent = "Unavailable";
}
}

Expand Down Expand Up @@ -109,6 +116,7 @@ async function loadWeek() {
const projected = state.week.games.filter((row) => row.projection).length;
byId("games-count").textContent = String(state.week.games.length);
byId("projection-count").textContent = String(projected);
byId("live-projection-count").textContent = String(projected);
byId("week-title").textContent =
`${calendarDate(state.week.window.start)} — ` +
calendarDate(state.week.window.end_exclusive);
Expand All @@ -118,6 +126,12 @@ async function loadWeek() {
for (const [league, count] of Object.entries(state.week.counts_by_league)) {
const target = byId(`count-${league}`);
if (target) target.textContent = String(count);
const showcase = byId(`league-live-${league}`);
if (showcase) {
showcase.textContent = count === 0
? "No games in current window"
: `${count} game${count === 1 ? "" : "s"} in current window`;
}
}
renderSchedule();
} catch (error) {
Expand Down Expand Up @@ -352,13 +366,23 @@ function resultStat(value, label) {
return node;
}

function activateView(viewId) {
document.querySelectorAll(".mode-tab").forEach((item) => {
item.classList.toggle("is-active", item.dataset.view === viewId);
});
document.querySelectorAll(".view-panel").forEach((panel) => {
panel.hidden = panel.id !== viewId;
});
}

function wireEvents() {
document.querySelectorAll(".mode-tab").forEach((button) => {
button.addEventListener("click", () => {
document.querySelectorAll(".mode-tab").forEach((item) => item.classList.remove("is-active"));
button.classList.add("is-active");
document.querySelectorAll(".view-panel").forEach((panel) => { panel.hidden = true; });
byId(button.dataset.view).hidden = false;
button.addEventListener("click", () => activateView(button.dataset.view));
});

document.querySelectorAll("[data-open-view]").forEach((link) => {
link.addEventListener("click", () => {
activateView(link.dataset.openView);
});
});

Expand Down Expand Up @@ -390,7 +414,7 @@ function wireEvents() {
} finally {
setTimeout(() => {
button.disabled = false;
button.textContent = "↻ Refresh data";
button.textContent = "↻ Refresh";
}, 1800);
}
});
Expand Down
Loading