Repository navigation
feat: dial and orbit, where the separator is the geometry - #12
Merged
Merged
Conversation
A semantic version is separated by dots and a dash. These two renderers take that literally: each component gets a field of its own, and the field boundary is the punctuation. In dial the separator is an angle — four quadrants, and the spokes between them are the dots. In orbit it is a radius — four concentric rings, major innermost, read outwards in the order the version is written. Within a field the value is written in binary, one cell per bit, most significant first: outermost band in dial, first cell clockwise from noon in orbit. Binary rather than a tally because version components are unbounded and a tally stops being readable somewhere around sixteen. The field width is common to all four fields and rounded up to a whole nibble, so the mark reads as a table and cells can be counted in groups of four by eye. Both are ordered renderers, like cistercian: nothing is hashed, 1.4.2 and 1.4.3 differ by one cell, and the suite holds them to uniqueness rather than to the distance thresholds. Unlike cistercian they come with a decoder, so injectivity is demonstrated rather than argued — the round-trip test reads the number back out of the cells for values up to the full range of uint64. The unset cells are drawn faintly rather than left blank. With only the set bits shown, a small version lights a handful of cells at one end of its field and the rest of the mark is empty: no visible grid, nothing to count against, no way to tell which bit position a mark belongs to. The ghosts turn it into a form with boxes to tick, which is the difference between a mark that can be read and one that merely could be in principle. The prerelease field is the exception. It carries hash bits from the prerelease stream rather than a number, because there is no useful ordering over "rc.1" against "beta.2". The field says that this is a prerelease and which one, without pretending to be legible, and an empty field means a release — the distinction that actually matters at a glance. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KwWthYNYf1egKNFrFS83Dm
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two renderers built from the observation that a semantic version is already
punctuated. Each component gets a field of its own, and the field boundary is
the dot.
dial— the separator is an angle. Four quadrants, read clockwise fromnoon; the spokes between them are the dots.
orbit— the separator is a radius. Four concentric rings, majorinnermost, read outwards in the order the version is written.
Within a field the value is written in binary, one cell per bit, most
significant first: outermost band in
dial, first cell clockwise from noon inorbit. Binary rather than a tally because version components are unboundedand a tally stops being readable somewhere around sixteen. The field width is
shared by all four fields and rounded up to a whole nibble, so the mark reads
as a table and cells can be counted in fours by eye.
One cell moves per patch. That is the point, not a defect.
Ordered, and this time provably so
Both are
Ordered, likecistercian: nothing is hashed, so the suite holdsthem to uniqueness rather than to the distance thresholds.
Unlike
cistercian, they ship a decoder.TestCodexRoundTripreads thenumber back out of the cells for values up to the full range of
uint64, soinjectivity is demonstrated rather than argued.
Why the empty cells are drawn
With only the set bits shown, a small version lights a handful of cells at one
end of its field and the rest of the mark is blank — no visible grid, nothing
to count against, no way to tell which bit position a lit cell belongs to. The
faint ghost cells turn the mark into a form with boxes to tick, which is the
difference between a mark that can be read and one that merely could be in
principle.
The prerelease field
Hash bits from the prerelease stream, not a number: there is no useful ordering
over
rc.1againstbeta.2. The field says that this is a prerelease andwhich one, without pretending to be legible — and an empty field means a
release, which is the distinction that matters at a glance.
🤖 Generated with Claude Code
https://claude.ai/code/session_01KwWthYNYf1egKNFrFS83Dm