Skip to content

MIP-0030 tasks

Ordered delivery of MIP-0030 from where main stands (the area Overpass query and the board's trails array shipped). Rows 1–3 put trails on the map and need nothing from the lake. Rows 4 onwards build on MIP-0075's filed rows ("0075-N" below, MIP-0075.tasks.md). Branches are mip-0030/<k>-<slug> in the repo the row lands in, and each row's delivers cell starts with that repo. Every marola-app row ends with just build && just test && just quality green, and every marola-oods and marola-site row with just quality green. A row that changes behaviour updates that repo's README and docs/ in the same PR. No row writes to the bucket from CI before MIP-0075's people's gates are done.

# slug delivers tests (must exist before the PR) depends on
1 trails-toggle-on marola-site — the trilhas toggle in index.html loses disabled and soon, and its title and catalog strings lose "(em breve)". The about page names OSM as the trail source, with its licence (citizen-science-site, ptbr-humanizer) site_check.js: the toggle is enabled, and a board with trails draws them with the toggle on by default. ?trails=0 hides them. Before and after screenshots of floripa and rio –
2 trail-relations marola-app — §5.2: TrailKind, Trail.osm, multi-line geometry, the relation clause in the Overpass query; a way that belongs to a returned relation is drawn only within it. board.schema.json gains the optional osm and kind, and the schema stays 1 Before writing it, §4.1's query is run live for the three areas, and the Appendix records the counts and times. TrailFinderSpec on a captured Rio answer: Transcarioca is one Route with osm = "relation/6906578" and no member way is drawn twice. BoardSpec: the new fields are written, and an old board still validates –
3 trail-relations-map marola-site — app.js draws a multi-line trail as one feature per line, a route slightly wider, and a tooltip link "ver no OpenStreetMap" to https://www.openstreetmap.org/<osm>. board.schema.json re-vendored with marola-image bumped to row 2's image site_check.js: a multi-line fixture trail gives one feature per line and its tooltip carries the link. A trail with no osm field has no link. just board-schema --check 1, 2
4 trails-schema marola-oods — contracts/migrations/0002_trails.sql (trail_source, trail_route partitioned by uf, lake, each with its schema_migration row), area_trail in views.sql, the trail_route checks in checks.sql (§5.3) lake-migrate.sh --self-test: an empty lake gets the three tables and schema_migration = 2, and a second run applies nothing. checks.sql fails with a trail_route row whose source_id has no trail_source, and with a geometry outside Brazil. area_trail on fixture rows gives one merged trail per name 0075-22
5 duckdb-spatial marola-app — spatial joins ducklake and httpfs in duckdbExtensions (pinned version and sha256) and in the image, loaded from a file with autoinstall off DuckDbExtensionsSpec: spatial loads from .tmp/duckdb/ and ST_Length_Spheroid answers on a fixture line. The docker-smoke.yml step loads it with --network none 0075-2
6 trail-load marola-app — marola.oods.trails: TrailRouteRow, LakeRow, OodsStore.upsertState, TrailLoad and oods trails --state UF --features FILE --sources FILE [--dry-run] (§5.4: midpoint in the state's ISO3166-2 boundary, SuspiciousShrink, one transaction per state, the fetch_run row and the status line). The SQL copy of row 4 is byte-identical TrailLoadSpec on a local lake, from a GeoJSONSeq fixture cut from a real Sul extract with row 8's osmium commands: exact rows; a way outside SC is dropped; a re-run makes no snapshot; a half-size input is refused; an unknown source_id fails oods check and writes nothing. LakeSqlSpec covers 0002_trails.sql 4, 5, 0075-5
7 trail-export marola-app — oods export writes exports/trails/<BeachSnapshot.key>.json per area from area_trail. TrailFinder.nearby reads MAROLA_TRAILS_DIR before Overpass (§5.2) LakeExportSpec: a loaded state's export decodes into Trails, and TrailFinder reads it from MAROLA_TRAILS_DIR with no request (through Http.withTransport). A second export is byte-identical 2, 6, 0075-10
8 trail-inputs marola-oods — etl/trail-states.json (SC → sul, RJ → sudeste, BA → nordeste), etl/trail-sources.json (osm-geofabrik: ODbL-1.0, attribution, URL, licence_checked_on), both checked by etl-inputs-check.sh. osmium-tool added to flake.nix, and scripts/trail-extract.sh runs §5.4's tags-filter and export etl-inputs-check.sh --self-test: an unknown region, a source with no licence and a duplicate UF each fail. trail-extract.sh --self-test on a small committed .osm.pbf fixture gives the expected features 0075-8
9 trail-workflow marola-oods — trail-etl.yml per §5.4: Sunday cron, dispatch with state and dry_run, a matrix with max-parallel: 1, concurrency: oods-lake, the Geofabrik download checked against its .md5, trail-extract.sh, oods trails in the pinned image, the oods-lake composite action, and oods export. marola-image bumped to row 7's image. README and docs/3-development.md name the workflow, its secrets and Geofabrik actionlint. A dry_run dispatch for SC, run by a person, is green and writes nothing. After merge, a person dispatches state=all twice and the second prints changed=0. The PR records the run links, counts, download time, peak disk and seconds per state 7, 8, 0075-11
10 site-trails-read marola-site — site.yml downloads exports/trails/ with the read-only key and sets MAROLA_TRAILS_DIR. The about page says the trails come from Geofabrik's weekly OSM extract site_check.js unchanged and green. A build with Overpass unreachable draws trails from the export (run link) 3, 9
11 drop-area-trail-sql marola-oods — contracts/migrations/0003_drop_area_trail.sql drops MIP-0075's trail table, and beach_card counts trails from area_trail lake-migrate.sh --self-test: schema_migration = 3, there is no trail table, and beach_card still returns a trail count 4, 10
12 beach-load-no-trails marola-app — BeachLoad stops calling TrailFinder, upsertArea loses its trails argument, and the copied SQL is byte-identical to row 11's BeachLoadSpec: a run makes no trail request. LakeSqlSpec covers 0003 11, 0075-9
13 mip-implemented marola — MIP-0030 flipped to Implemented, with every PR number mip_graph.py --check, docs-lint 1–12

The people's gates

These are not rows. No agent can do them, and none of them blocks writing or reviewing a row's code.

  • MIP-0075's gates (the Phase 2 exception, the smoke test, the lifecycle) come before row 9's first real dispatch.
  • The read-only key in marola-site (MIP-0075 §5.6, item 3) comes before row 10.
  • Every workflow dispatch is a person's.

Decisions

  1. MIP-0075's rows stay as they are. Its beach ETL keeps writing the area trail table through Overpass until rows 11 and 12 retire it, so nothing filed in marola-oods#9 to #19 is reopened.
  2. Rows 1–3 ship first. They need no store, and they put trails on the map from today's boards.