Skip to content

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:

  1. Tiles: Leaflet with a raster tile URL template per area (tiles in areas.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.
  2. 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.
  3. Hour slider: yes; every daylight hour is in the board.
  4. LLM summary: not in the board for v1 (no GPU host builds it); the deterministic notes are the "why". Adding an optional summary field later is a serializer change only.
  5. 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.