MIP-0005 tasks¶
Ordered delivery of MIP-0005 as stacked PRs
(.claude/skills/mip-tasks/SKILL.md, scripts/stack.sh). Branch mip-0005/<k>-<slug>, each based
on the previous; merge bottom-up, scripts/stack.sh restack after each squash-merge.
| # | slug | delivers | tests (must exist before the PR) | depends on |
|---|---|---|---|---|
| 1 | board-json | Recommender.scoreDays (one forecast fetch, N days scored), core/site/Board (per-beach board over every daylight hour → JsonValue), site/board.schema.json, this task list, MIP → Accepted |
BoardSpec (cli): board from PipelineGoldenSpec's fixture transport, daylight-only hours, best hour = highest score, water/tide/sea fields equal Report's, round-trips through JsonValue.parse, conforms to the schema (a small structural validator in the spec); PipelineGoldenSpec unchanged and still green |
– |
| 2 | site-build | --site [area] in Main → SiteBuilder (cli): site/areas.json (floripa, rio), site/dist/data/<area>/<day>.json + latest.json, site/static/ copied to site/dist/; just site-build, just site-serve; site/dist/ ignored |
SiteBuilderSpec: build from fixtures into a temp dir with no network → data/floripa/2026-09-05.json, 2026-09-06.json, latest.json pointing at both, static files copied; AreasSpec: areas.json parses, ids are slugs |
1 |
| 3 | map-page | site/static/: index.html, app.js (Leaflet markers coloured by score, card, ranked list, day picker, hour slider, footer with generated-at + sources + lore + bot link), style.css, vendored Leaflet 1.9.4 |
manual (just site-build && just site-serve, tap Campeche, see Ponto 73); SiteBuilderSpec extended: dist/index.html and dist/app.js exist after a build |
2 |
| 4 | scheduling | .github/workflows/site.yml (schedule every 3 h + workflow_dispatch, build with no Ollama, deploy to GitHub Pages), just site-deploy (GitHub Pages via the workflow; Cloudflare wrangler documented), docs: RUN-LOCALLY.md §9 (local cron), ARCHITECTURE.md §3/§11, README, MIP → Implemented after merge |
actionlint (just quality); one manual workflow_dispatch run after merge |
3 |
Decisions taken for v1 (MIP §11), so that the tasks above are unambiguous:
- Tiles: Leaflet with a raster tile URL template per area (
tilesinareas.json), default OpenStreetMap's public tiles with the required attribution, acceptable for the friends-only phase only. Switching to Protomaps (self-hosted PMTiles) before any public link stays open and is documented in the MIP; nothing in the page depends on the tile source. - Areas: Florianópolis (
floripa, radius 30 km) and Rio (rio, radius 20 km, no water provider there, so the card says "no data"). Two areas prove the multi-area path at the cost of two Overpass queries per run. - Hour slider: yes; every daylight hour is in the board.
- LLM summary: not in the board for v1 (no GPU host builds it); the deterministic notes are the
"why". Adding an optional
summaryfield later is a serializer change only. - Deploy: GitHub Pages from the scheduled workflow (free, no secret, the repo is already on GitHub); Cloudflare Pages documented as the one-line alternative.
Restack notes: task 3 only adds files under site/static/ that task 2 copies, and task 4 only adds
a workflow, a recipe and docs — no task rewrites a file an earlier task created.