Full-width hero, three cards, a strip of numbers, a form, a four-column footer. Every time. Whatever the trade, whatever the client, whatever the colour. These pages came out of a generator I have been building since June 2026 to offer a client a redesign of their site, in several art directions.
For weeks, I corrected the wrong things. A slightly dull colour, spacing too loose, one shadow too many. The prototype came out cleaner and just as recognisable. The problem was in what I had stopped looking at: the overall shape.
Repetition is judged at three scales
At page scale, it is the macrostructure: six sections following one another on the same pattern. At the scale of repetition, it is two consecutive sections built on the same template. At block scale, it is a section lining up N entries at equal weight, a table disguised as design.
All three are independent, which is why they get through. A page can be varied as a whole and stacked with cards on the inside. My rules file, anti-slop.md, ended up being split along exactly that line, because three waves of fixes kept missing one another. The first paragraph judges the page, the second the repetition, the third the block.
The day I added the third, the first two were green and the « services » section was still unreadable: eight rows at equal weight, two of them entries of two words. The intent note said, honestly, « index of services in rows, each service on its own row ».
The card is the lazy container
A row of identical cards, icon then title then text, repeated section after section.
Taken in isolation, a row of cards is one composition among others. Repeated, it is giving up: the generator has stopped deciding the shape of each section and applied the default container.
The rule that ended up holding: one section, one composition. If two consecutive sections are two rows of cards on the same template, one of them must be rewritten, as a dense list, a full-width band, alternating text and visual, an editorial column.
The threshold is a count. Two sections of cards on the same template, blocking. Just one, nothing to say. That is what lets a machine apply the rule without starting to overcorrect.
What made it onto the list, and why
Each entry comes from a real case.
The em dash. No common keyboard types it. Its presence in a site’s text signs the generation. Colon, comma, full stop or parentheses carry the same nuance without betraying it. It has become a lint error.
Italics on a heading. The most reliable typographic tell after the em dash. All headings are roman. To set a heading apart: weight, colour, size, a rule.
The key-figures strip. Three boxes of big number over small label, « 20+ years », « 100% », « 48 h ». It is a recognisable template. When the client’s real numbers deserve to be seen, they fit into a sentence or a timeline specific to the trade.
Decorative numbering, 01 then 02 then 03 in front of steps. The reader can count, the layout already carries the order, and the counter takes the title’s place. You number when the number serves elsewhere, in a cited reference or in a process the client talks about as « step 3 ».
The systematic eyebrow, that small tracked capital above every section. Used once, for what it signals, it is a system. Everywhere, it is a grammar nobody chose.
Each of these findings can be checked on a screenshot, by someone who did not write the page. That criterion is what got a rule onto the list, and took the others off.
Being right in the system’s units
The touch target of a menu button must be 44 px, in absolute value, never a token from the scale. Because the scale is fluid, and the token named « 48 » drops to 30.5 px on a 390 px wide screen. The drawn sign, for its part, stays at 24 px: finger comfort does not dictate the size of the drawing.
An instruction with the right intent, « big button », gives a wrong result if the system executing it has its own laws.
And the limit of all this
My file ends with ten questions the generator must answer yes to before handing over its work. A single no, and it corrects before concluding. It works, partly.
A generator assessing itself on its own code answers the ten questions from what it meant to write, not from what is displayed. It ticks « distinct macrostructure » because it stated it in its intent note. The note is sincere and the page is generic.