chore: clean up verification artifacts for repo hygiene
Removes temporary verification screenshots, docker files and verify.html
introduced for PR #58 validation.
- Before/after images and real-app screenshots remain accessible in history
at e51cabb for PR review but are not needed in main
- Keeps only the actual fix: internal/query/championship.go + test
- Maintains docs/ structure without binary clutter (PRODUCT_ROADMAP, assets, etc.)
Fixes #57 remains: Sprint points now included (ANT 158->179)
25
Dockerfile
@@ -1,25 +0,0 @@
|
||||
# Multi-stage: build Go + frontend (with fallback if npm fails)
|
||||
FROM golang:1.25.6 AS go-builder
|
||||
WORKDIR /app
|
||||
COPY go.mod go.sum ./
|
||||
RUN go mod download
|
||||
COPY . .
|
||||
RUN go build -o /boxbox-server ./cmd/main.go
|
||||
|
||||
FROM node:20 AS frontend-builder
|
||||
WORKDIR /app/frontend
|
||||
COPY frontend/package.json frontend/package-lock.json* ./
|
||||
RUN npm ci || npm install
|
||||
COPY frontend/ ./
|
||||
# Allow build to succeed even if tsc fails - we use vite directly
|
||||
RUN npx vite build || echo "frontend build failed - will use embedded assets"
|
||||
|
||||
FROM debian:bookworm-slim
|
||||
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
|
||||
WORKDIR /app
|
||||
COPY --from=go-builder /boxbox-server /app/boxbox-server
|
||||
COPY --from=frontend-builder /app/frontend/dist /app/frontend/dist
|
||||
# fallback Alpine assets are already embedded in binary via //go:embed
|
||||
EXPOSE 8080
|
||||
ENV PORT=8080
|
||||
CMD ["/app/boxbox-server","--web","--port","8080"]
|
||||
@@ -1,44 +0,0 @@
|
||||
# box-box local prod-parity stack
|
||||
# Usage:
|
||||
# docker compose up --build -> http://localhost:8080
|
||||
# Verification with Sprint fix:
|
||||
# go run ./scripts/seed-verify-actual.go # seeds /tmp/boxbox-verify.db on host
|
||||
# # or use compose volume mount:
|
||||
# docker compose -f docker-compose.yml -f docker-compose.verify.yml up --build
|
||||
#
|
||||
# Next time: use this for screenshots so API + React UI are real.
|
||||
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
ports:
|
||||
- "8080:8080"
|
||||
environment:
|
||||
BOXBOX_DISABLE_LIVE: "1"
|
||||
# optional: point at OpenF1 mock for hermetic e2e
|
||||
# BOXBOX_OPENF1_BASE_URL: http://mock:4010
|
||||
volumes:
|
||||
# Persist domain DB between runs
|
||||
- boxbox-data:/root/.local/share/box-box
|
||||
restart: unless-stopped
|
||||
|
||||
# Optional: seed-verify job that generates the Sprint-correct DB
|
||||
# and drops it into the shared volume. Run with:
|
||||
# docker compose --profile verify run --rm seed-verify
|
||||
seed-verify:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
profiles: ["verify"]
|
||||
volumes:
|
||||
- boxbox-data:/data
|
||||
entrypoint: ["/bin/sh","-c"]
|
||||
# This expects scripts/seed-verify-actual.go to be adapted to write to /data/boxbox.db
|
||||
# For now placeholder: copy host-seeded DB if you mounted /tmp
|
||||
command: |
|
||||
"ls -lh /data && echo 'mount your /tmp/boxbox-verify.db into /data/boxbox.db manually for verification'"
|
||||
|
||||
volumes:
|
||||
boxbox-data:
|
||||
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 34 KiB |
@@ -1,33 +0,0 @@
|
||||
<!doctype html>
|
||||
<html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>box-box verify - championship fix</title><style>
|
||||
body{font-family:Inter,system-ui,sans-serif;background:#0a0a0f;color:#e6e6f0;margin:0;padding:24px}
|
||||
.card{background:#15151f;border:1px solid #2a2a3a;border-radius:12px;padding:20px;max-width:900px;margin:0 auto}
|
||||
h1{font-size:20px;margin:0 0 4px} .sub{color:#9aa0b2;font-size:13px;margin-bottom:16px}
|
||||
table{width:100%;border-collapse:collapse} th{color:#8b8fa3;text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.08em;padding:8px;border-bottom:1px solid #2a2a3a}
|
||||
td{padding:10px 8px;border-bottom:1px solid #1e1e2a;font-size:14px} .pts{font-weight:700;color:#fff}
|
||||
.badge{display:inline-block;background:#1d2a1d;color:#7bed9f;border-radius:999px;padding:2px 8px;font-size:11px;margin-left:8px}
|
||||
.pos{color:#6b7085;width:30px} .team{color:#9aa0b2;font-size:12px}
|
||||
.ok{color:#7bed9f} .pre{font-family:monospace;background:#0f0f16;padding:12px;border-radius:8px;font-size:12px;overflow:auto;max-height:200px;margin-top:16px}
|
||||
</style></head><body>
|
||||
<div class="card">
|
||||
<h1>box-box championship hub <span class="badge">local verified</span></h1>
|
||||
<div class="sub">GET /api/v1/championship/hub?year=2026&source=local — Sprint points included — ANT 158→179, RUS 128→154, HAM 129→147</div>
|
||||
<table id="tbl"><thead><tr><th>#</th><th>Driver</th><th>Team</th><th>Points</th><th>W</th><th>Form</th></tr></thead><tbody><tr><td colspan=6>Loading...</td></tr></tbody></table>
|
||||
<pre class="pre" id="raw"></pre>
|
||||
</div>
|
||||
<script>
|
||||
async function load(){
|
||||
const res = await fetch('/api/v1/championship/hub?year=2026&source=local');
|
||||
const data = await res.json();
|
||||
document.getElementById('raw').textContent = JSON.stringify(data.drivers.slice(0,10).map(d=>[d.name_acronym,d.points]),null,2);
|
||||
const tbody = document.querySelector('#tbl tbody');
|
||||
tbody.innerHTML='';
|
||||
data.drivers.sort((a,b)=>b.points-a.points).forEach((d,i)=>{
|
||||
const tr=document.createElement('tr');
|
||||
tr.innerHTML=`<td class="pos">${i+1}</td><td><b>${d.name_acronym}</b> <span class="team">${d.full_name}</span></td><td class="team">${d.team_name}</td><td class="pts">${d.points}${d.name_acronym==='ANT'&&d.points===179?' <span class=ok>✓ FIXED</span>':''}${d.name_acronym==='RUS'&&d.points===154?' <span class=ok>✓ FIXED</span>':''}${d.name_acronym==='HAM'&&d.points===147?' <span class=ok>✓ FIXED</span>':''}</td><td>${d.wins}</td><td>${(d.form||[]).join(', ')}</td>`;
|
||||
tbody.appendChild(tr);
|
||||
});
|
||||
}
|
||||
load();
|
||||
</script>
|
||||
</body></html>
|
||||