Troubleshooting¶
Things that have gone wrong at least once, with the fix that worked.
Builds¶
Route geometry worker killed (OOM) or runs for hours. A large city graph needs 10 to 15+ GiB. Keep
--route-geometry-jobs 1, compute on a workstation and copy dist/route-geometry-cache to the host (content-addressed
by BKS sha256, so it is portable); the build then reports generated=0 reused=N. The build aborts before the release
swap, so the live site is safe.
Pages fall back to straight route lines. The geometry for that BKS is not in the cache: geometry was skipped
(--skip-route-geometry), the OSM extract was missing and fetching disabled (--no-fetch-missing-osm), or the BKS
changed after the last materialization. Run site materialize-route-geometry --fetch-missing-osm.
Lera2026 / Poryos2026 TD instance pages have no schedule table or arc viewer. The ATF cache phase was skipped or
capped below that size (--atf-max-n, default 400). Run site materialize-atf --max-n <N> --jobs <k> (each worker
holds one full ATF set).
Floating-point overshoot at the horizon boundary in schedule tables. Cosmetic: IEEE-754 drift of the derived schedule, clamped in the publisher's display layer only; the checker and the stored data are unaffected.
Docs phase fails. Strict MkDocs: read the warning (a link to a page that does not exist, an API page whose module
moved). uv run mkdocs build --strict reproduces it in seconds. Missing toolchain: uv sync --group docs. A checkout
without mkdocs.yml skips the phase silently.
Dependencies and submodules¶
uv sync fails with two editable sources for mamut-routing-lib. The superproject must use the nested
MAMUT-routing-tools/MAMUT-routing-lib path (see Repository topology); never add a second
source.
The tools do not behave as their README says. A source checkout imports the nested lib, a PyPI install the
published one; check mamut-tools --version (prints the package directory) and the lib version it resolves.
A re-added submodule shows the old content or the wrong remote. Git reused the stale module clone under
<gitdir>/modules/<path>. Remove that directory, git submodule deinit -f <path>, then re-add. On a host with a
pre-rename clone: git -C <path> remote set-url origin <new url> then git submodule update --init <path>.
The deploy host cannot reach GitHub over SSH. Site repositories are public: GIT_SUBMODULE_TRANSPORT=https.
The private deploy superproject can be pushed to the host directly over ssh
(git push ssh://<host>/<path> main:refs/remotes/local-push/main, then fast-forward there).
Satellite directories are empty after a clone. Expected: git submodule update --init <path> per family.
Deployments¶
deploy.sh finished in seconds and only restarted the server. START_API_ONLY=1 was exported in the shell. Pass
START_API_ONLY=0 explicitly every time.
The host thrashes and sshd stops answering during a deploy. Something was unpacked under a tmpfs /tmp. Use a
directory under /home (or the releases root) for archives and scratch.
Disk full. Releases keep the newest KEEP_RELEASES; check df -h, the stale-submodule archive directory and old
osmdata copies.
/docs/ returns 404 after a deploy. The build ran with --skip-docs, or an older publisher without the phase.
Rebuild (or site docs --site-output-dir <release dir> into the live release, then precompress).
Data¶
A BKS file fails validation on load. The write path re-validates before replacing, so this is a hand edit, a sidecar whose pin changed, or a checker change. Recompute with the checker; never adjust the stored cost by hand.
A sidecar pin mismatch. The instance references a sidecar by sha256; regenerate the sidecar with the tool that
made it (materialize-distances, the family pipeline) so the pin and the bytes agree.
Overpass errors or truncated extracts. The fetch mirrors rotate (overpass-api.de, maps.mail.ru,
overpass.private.coffee); large cities are tiled with a persistent cache, so rerun the same command. mamut-tools osm
validate rejects incomplete files.