Lay out the commit graph in Rust master
The engine emits instructions rather than pixels: a row, a column, a lane index, and the line segments crossing each row. Colours stay a styling concern, so light and dark themes cost nothing on this side. Rows are ordered by a lazy topological sort. The textbook approach — count every commit's children, then drain the zeroes — cannot stream, because nothing can be drawn until the last commit of a million-commit repository has been visited. Instead commits are loaded newest-first into a frontier, and a commit becomes emittable once everything that could still turn out to be its child has been loaded. Committer dates are not monotonic, so a skew window absorbs rebases and wrong clocks, and a pending ceiling stops a pathological history from stalling the walk or exhausting memory. Giving up on perfect ordering is reported through is_degraded rather than silently drawing a wrong graph. Columns are held by reservations, with the first parent inheriting its child's column so branches run straight down. Columns are reused but never shifted, which keeps pass-through lines vertical and lets a row be drawn without knowing anything about its neighbours. Measured on real repositories, the first 200 rows take 1.3-2.4ms whether the history is 4,800 commits or 58,000 — the lookahead is bounded by the skew window, not by how long the history is. A test asserts that property directly. 55 tests: the ordering against hand-built histories with no repository involved, the column rules in isolation, and both against the shapes real git produces — merges, octopus merges, criss-crosses, annotated tags, detached HEAD, and commits backdated before their parents. The topological property is checked against git's own answer for a commit's parents rather than against our own output. NOTICE.md credits Pierre Vigier's article, which the algorithms are written from, and records that its reference implementation gitamine is GPL-3.0 and was therefore never read or ported. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>