A small framework for naming glacial proglacial lakes consistently, and for representing the whole naming scheme as a directed temporal graph.
Proglacial lakes split and merge as ice advances and retreats, and their outlets jump between drainage basins. The literature names the results inconsistently — sometimes a merged lake gets a new combined name (Lake Superior from glacial Lakes Duluth + Minong), sometimes a co-equal lake is quietly demoted to a "phase" of its neighbour (Lake Agassiz absorbing Lake Ojibway as its "Ojibway phase," even though the merged body is elsewhere called Lake Agassiz-Ojibway). This repo makes the scheme explicit so the inconsistencies are visible and fixable.
Three moves, one criterion — what the ice is doing:
| situation | naming |
|---|---|
| two water bodies separated by ice at the same time | distinct names (two lakes) |
| the ice between them clears and they join | one lake, a NEW combined name |
| one lake drops through successive outlets over time | one lake, phase names |
Corollaries:
- A migrating outlet — even to a different ocean — is still one lake. Lake Agassiz flipped Gulf → Great Lakes → Arctic and stayed Agassiz; the Mohawk-lowland lake flipped Susquehanna → Hudson and stayed one lake.
- A merge of two independently-named lakes takes a new combined name, applied consistently. Not "Lake A (with a B phase)." This is the rule Superior obeys and that "Lake Agassiz" (post-Ojibway) violates — see docs/case-studies/agassiz-ojibway.md.
- Node = a named water body: a whole lake, or one outlet-controlled phase of a lake.
- Edge = a transition:
phase— same lake, next lower outlet, same drainage directionoutlet_shift— same lake, outlet jumps to a different basin/oceanmerge— two+ ice-separated lakes join into one lake with a new namesplit— one lake divided by advancing ice (→ two names)drain— terminal drawdown / catastrophic release
The consistency invariant: a merge edge must target a node whose name is
new/combined, not a verbatim continuation of a parent. build_graph.py checks
this and warns on violations.
python src/build_graph.py # data/lakes.yaml -> build/lakes.{dot,svg,png}Data lives in data/lakes.yaml; rules in
docs/naming-rules.md; worked examples in
docs/case-studies/.
Early / exploratory. The schema (node & edge fields, edge types) is expected to
change — treat data/lakes.yaml as a draft. Current examples: Lake Agassiz →
Agassiz-Ojibway; Lake Superior (Duluth + Minong); the Mohawk-lowland lake (from
the NY Mohawk luminescence project), including its unresolved terminal merger
(Iroquois to the west vs. Glacial Lake Albany to the east — see the case study).
This repository is dual-licensed, by content type:
- Code — everything under
src/andtests/— is licensed under the GNU General Public License v3.0 or later (GPL-3.0-or-later); seeLICENSE. - Data and documentation —
data/,docs/, thisREADME, and the generated graph underbuild/— are licensed under the Creative Commons Attribution-ShareAlike 4.0 International license (CC-BY-SA-4.0); seeLICENSE-CC-BY-SA-4.0.txt.
The PDFs under literature/ are third-party copyrighted works. They are git-ignored, not
part of this repository, and not covered by either license — literature/references.md
records the citations.
