The shared codebase is ready to support a controlled Milan pilot, but a many-node global launch should wait for hosted cold-start, no-change, and incremental evidence from Milan and at least two additional, operationally different nodes.
This branch closes the repository-safety and reproducibility blockers found in
the opensidewalkmap_beta template. It does not claim that best-effort public
data providers can sustain simultaneous global cold starts.
The investigation started from a shallow clone of the reference node and changed only its node identity to Milan. That exposed two separate classes of risk:
The Milan boundary resolves to OSM administrative relation 44915, with the
configured fallback bounds (45.3867381, 9.0408867, 45.5358482, 9.2781103).
An earlier public-provider probe showed the full Milan OSWM tag union timing
out at one public Overpass endpoint; even a highway-only subset returned about
70,000 elements. Fleet enrollment therefore needs staggered jobs and, beyond
the pilot, controlled bulk/Overpass capacity.
node_outputs.py is the canonical generated-output contract.
# Dry-run: list inherited generated paths without changing them.
python oswm_codebase/node_outputs.py --root . reset-node
# Apply only when deliberately turning a template into a new node.
python oswm_codebase/node_outputs.py --root . reset-node --apply
# Reconcile all derived products before a complete regeneration.
python oswm_codebase/node_outputs.py --root . reset-derived
# Enforce the deployment-product contract and GitHub size guard.
python oswm_codebase/node_outputs.py --root . manifest
python oswm_codebase/node_outputs.py --root . require
python oswm_codebase/node_outputs.py --root . validate-sizes --max-mib 95
Both reset commands refuse filesystem roots and directories that do not look
like OSWM nodes. Initialization preserves README.md, index.html,
config.py, Git metadata, and the oswm_codebase gitlink, then recreates only
an empty update registry. Derived reconciliation preserves the weekly
quality_check/keys_without_wiki.json input while deleting undeclared products
from complete-rebuild directories.
OSM_RELATION_ID avoids fuzzy city selection for known administrative
boundaries. Nominatim lookup has an OSWM user agent, timeout, bounded retry,
exponential backoff, and polygon validation.pipeline_decision.py emits JSON with one of three modes:
generate: cold start, OSM change/inconclusive check, or explicit force;rebuild: unchanged raw inputs but a new core revision or missing derived
product;skip: no OSM change, the exact core revision already succeeded, and all
declared outputs exist.OSWM_FORCE_REGEN is wired into the daily runner. A codebase revision change
forces a derived rebuild even when the OSM watcher reports no changes. The
daily runner records success only after every stage and every required output
passes.
Registry writes use timezone-aware UTC ISO-8601 strings. Existing
DD/MM/YYYY HH:MM:SS values are interpreted in METADATA_TIMEZONE (UTC when
unspecified) and remain readable during migration.
The manifest includes every public entry page, including acquisition, API,
quality, statistics, and watcher pages. Full rebuilds re-render the watcher
dashboard and feeds after derived-output cleanup, and the final require gate
fails the run when any declared page or feed is missing or empty.
oswm-node-writer-$ with
overlap disabled.main, then records that exact gitlink.node_outputs.py; broad
git add . and git add -A are absent.special_updates.py synchronizes only workflows/manifest.json entries,
removes retired core workflows, preserves node-only workflows, and no longer
overwrites the node .gitignore.requirements.txt is an exact, universal Python 3.12 lock generated from
requirements.in; the development lock adds pytest and PyYAML. Core CI runs
the Python suite, browser-module tests under Node, shell parsing, and package
consistency checks.
Current local evidence on this branch:
git diff --check pass;These are contract and fixture tests. They are intentionally not presented as a successful live Milan generation.
CITY_NAME, CITY_SHORTNAME, REPO_NAME, bounding box,
midpoint, OSM_RELATION_ID, NODE_DAILY_CRON, and NODE_WEEKLY_CRON.python oswm_codebase/special_updates.py and review the workflow/state
diff.skip. Then test a known small incremental fixture/change.Priority 0 for Milan:
Priority 0 before many nodes:
Priority 1:
Milan is accepted only when cold, no-change, and incremental hosted runs pass, obsolete sentinels are removed, the exact core SHA is visible in node state, no history is rewritten, Pages is verified, and provider failure yields a bounded actionable error rather than a false success. Global enrollment begins only after the same contract passes on multiple staggered pilots.