Build
The mark that could only go forward
Why can rule-generated brand marks look too similar?
Rule-generated brand marks can look too similar when a rule fixes the overall gesture and varies only point positions. Collective Stars' five-point marks on a 5x5 field always moved left to right. The 1,202 legal variants differed numerically but read alike: the paths could not double back, cross themselves, or enclose space.
The name could select a figure, but could not give it character
We built a rule that could reliably assign a figure to a name. We mistook the reliability of the assignment for the strength of the identity.
The proposal was a five-point figure on a 5x5 field, with one point per column. An entity's name determined the figure. Deterministic means the same input produces the same output: the same name would recover the same mark without anyone having to draw it again. A generative identity uses a shared rule to produce related marks rather than prescribing a single fixed drawing.
There was a useful promise in the mechanism. The field would hold the family together, while the name would select a member. We could describe where a figure came from. We could reproduce it. Those are properties you can check in code, and we had built something that satisfied them.
They did not establish whether the figure was worth reproducing.
For the rule to earn its place, the outputs needed both a family resemblance and enough character to make variation useful. Instead, the resemblance consumed the variation. Changing the name could change the coordinates without changing what you saw. The mechanism had an answer for which figure belonged to an entity. The drawing had very little to say about why you would recognise or remember it.
Every segment had to move right
The column rule removed the movements that could have made the figures materially different. Once we connected the points from left to right, the path could only go forward.
A polyline is a chain of straight segments joined at their endpoints. Ours was monotone in the horizontal direction, meaning its x-coordinate always increased as you followed it. The legal figures alternated up and down, but every bend still advanced into the next column. Alternating height gave us a zigzag. It did not give us a way back.
The restriction is visible without the name generator. Written as coordinates, every figure had the following shape. The y-values are the selected rows; the fixed x-values are the constraint:
P0 = (0, y0)
P1 = (1, y1)
P2 = (2, y2)
P3 = (3, y3)
P4 = (4, y4)
For every segment:
x(next) - x(current) = 1
Each segment occupies the horizontal interval between neighbouring columns. Nonadjacent segments occupy separate intervals, so they cannot cross. Adjacent segments meet at their shared point. The final point cannot return to the first because it sits in a different column. Without an added closing edge, the path cannot enclose a region.
These were consequences of the construction, not defects in particular outputs. Selecting different rows could make a segment steeper or shallower. Changing how the name selected those rows could redistribute the figures. Neither change could produce a loop, a crossing, or a return. We had excluded those possibilities before a name ever entered the system.
The enumeration counted differences the eye did not care about
The original enumeration yielded 1,202 legal variants. They were numerically distinct and perceptually identical: different coordinates, the same visual reading.
Perceptually identical describes our judgement of the drawings, not a measured recognition rate. The figures were not duplicates. Their rises and falls differed. But the variation stayed inside such a narrow gesture that the result kept reading as a line chart with the data removed. The eye could find a taller peak or a deeper trough. It still found a chart.
The count made the system sound more capable than it was. It answered how many legal outputs existed. It did not answer how many useful visual distinctions the rule could support. Those questions had come apart, and the larger number could not repair the drawing.
There is nothing inherently wrong with an open line as a mark. The failure was specific to our ambition for a family generated from names. We needed the rule to make variation visible, and had given it mostly height to work with. The dominant structure remained fixed across the entire set.
The enumeration had shown the extent of the limitation. The rule was working exactly as specified, and the specification was the failure.
The replacement made the missing movement explicit
We replaced the name-generated figures with the living print: an editorial paper layout with a moving Möbius ribbon. The relevant difference is in the geometry before anything animates.
In lib/ribbon.ts, we compute 48 stroked paths through a sweep of 4π radians, or two full turns. The radius and depth change with the half-angle, then the points are rotated in three dimensions and projected onto the page. Horizontal position is an output of that projection. It is free to reverse direction as a path travels around the form. The figure can return and overlap in ways the column rule prohibited.
We also compute INITIAL_RIBBON at module scope. In components/living-ribbon.tsx, those paths supply the server-rendered SVG, the vector drawing sent with the page. Pointer movement adjusts tilt and turn after the drawing exists. Reduced-motion preferences leave a finished still image, and the visitor can pause the movement. Animation is not responsible for making the geometry legible.
That implementation makes the earlier mistake easier to name. We had spent the old rule's freedom on selecting coordinates, while fixing the relationship between those coordinates so tightly that every output made the same gesture. The ribbon has a form before it has motion. The failed mark had a generator before it had a form we wanted to keep.