Skip to content

feat: dial and orbit, where the separator is the geometry - #12

Merged
timzifer merged 1 commit into
mainfrom
feat/codex-renderers
Sep 10, 2026
Merged

timzifer merged 1 commit into
mainfrom
feat/codex-renderers

Conversation

@timzifer

Copy link
Copy Markdown
Owner

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 from
    noon; the spokes between them are the dots.
  • orbit — the separator 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
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.

1.0.0  →  1.0.1  →  1.0.2  →  1.1.0  →  2.0.0

orbit family strip

One cell moves per patch. That is the point, not a defect.

Ordered, and this time provably so

Both are Ordered, like cistercian: nothing is hashed, so the suite holds
them to uniqueness rather than to the distance thresholds.

Unlike cistercian, they ship a decoder. TestCodexRoundTrip reads the
number back out of the cells for values up to the full range of uint64, so
injectivity 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.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, which is the distinction that matters at a glance.

🤖 Generated with Claude Code

https://claude.ai/code/session_01KwWthYNYf1egKNFrFS83Dm

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
@timzifer
timzifer merged commit e0e891d into main Sep 10, 2026
9 checks passed
@timzifer
timzifer deleted the feat/codex-renderers branch September 10, 2026 07:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant