Skip to content

Say what things are, not what they are not - #3

Merged
sdogruyol merged 18 commits into
iyilang:mainfrom
jwaldrip:prose/de-ai-pass
Sep 20, 2026
Merged

sdogruyol merged 18 commits into
iyilang:mainfrom
jwaldrip:prose/de-ai-pass

Conversation

@jwaldrip

Copy link
Copy Markdown
Contributor

A de-AI prose pass over the site's rendered copy, judged against the writing rules in my own ai-tells and voice skills rather than against general taste.

I scanned every rendered surface first: 8 MDX lessons, 17 pages, 10 components, the layout shell, and the human-written strings in the 23 build generators. 86 findings, grouped into classes. This fixes the ones where the rule is unambiguous and leaves the ones that are a judgement call, listed below.

Net effect is 9 lines shorter and every page slightly lighter.

What this changes

Negation-identity, the largest class. The site argued by denial. Nine headings were defined by what something is not, and three of them were literally the same heading:

Before After
## What this does not do yet (errors-are-values) ## Limits
## What this does not do yet (traits-and-impl) ## Limits
## What it does not reach yet (typed-at-definition) ## Limits
## It is a gate, not a slogan ## The roundtrip gate
## The clause the deletion did not use ## Acyclic imports
## Why the dictionary is not a free afternoon ## What the dictionary requires
## Ask for the clause that is not there ## Forced monomorphization
## forall, and why it is not noise ## Binding parameters with forall
<h2>Measured, not promised</h2> <h2>Measured</h2>

The "this site does not" cluster. Four places defined the site by what it withholds: the digests, the changelog, SPEC.md, CHANGELOG.md. Each was defensible alone; together they read as a site with a grievance. Each now leads with where the thing actually is. The reason clauses survive, because "a hash copied by hand is exactly the thing a hash exists to catch" is the real content of that paragraph.

Performed honesty. Six sentences announced the site's own candour: "Said plainly", "said here", "said out loud rather than passed over", "Both are said here rather than left to be found", "the README says so rather than publishing the flattering column". Five were on /why/. The page still publishes the losing benchmark row and the list of young parts. It just no longer congratulates itself for it. <h3>Where it loses</h3> over a genuine loss is stronger than Where it loses, said here.

Hedged measurements. Four "about {N}x" where N is read straight from a recorded benchmark, plus "starts in a fraction of the time" sitting next to an exact ratio. A site whose argument is that it measures should not hedge its own measurements.

Blanket claims. "Most languages were designed for one audience", "Most projects say supports the platform", "Nobody uses a language through full builds", "Most languages give it neither". Four unsourced claims about everyone else. Replaced with the narrower true statement.

Banned phrases and filler. Five "worth noting / worth knowing / worth understanding", two "quietly" as a mood word, two "Read the premise again", two robotic tricolons.

American English. 26 British spellings in rendered copy: colour, behaviour, honour, licence, summarise, specialise, monomorphise, initialise, optimise, serialise, the other way round. The tree was inconsistent rather than British, which is the worse state. monomorphization and specialized are also the standard spellings in this domain.

This is a separate commit on each branch, so it can be dropped on its own if you would rather keep British spellings and make them consistent the other way.

What this deliberately does not change

Two British spellings inside recorded artifacts. scripts/record-diagnostics.mjs:66 ("does not honour its written return type") and scripts/record-agent.mjs:363 ("an optimisation that might be wrong") are mirrored into records/diagnostics.json and records/agent.json. Fixing the recorder without the record makes them disagree, and hand-editing a record is exactly what this repository is built to prevent. They need a npm run record against 0.12.0 with the compiler and wasi-sdk present. Left alone and flagged rather than smuggled in.

In-prose negations that carry information. Roughly 15 kept, each because the contrast corrects a specific wrong assumption a reader would otherwise hold. Examples: "never their bodies" (the literal statement of R-1), "Two modules exporting one name is not a mistake" (the collision is only an error at the bare name), "no agent mode, no forked behaviour", "not iyi's win: tied N and lost M". Denial that stands in front of an assertion was cut; denial that is the point was kept.

Verification

The gates are the proof, and they all pass:

IYI_REPO=<iyi at v0.12.0> npm run check && npm run build
astro check              0 errors, 0 warnings
prose                    81 built pages carry no word welded to an inline element
links                    81 pages, 5171 internal references (154 with a fragment) all resolve
budget                   81 routes under their ceilings, heaviest 272.5 KiB at /playground/evidence/
contrast                 52 pairs over 26 tokens, lowest gated 3.15:1
no-transcription         no recorded number is hand-typed in authored copy
records                  56 wasm modules verified, 11 diagnostics, 89 listings, agent record verified
project                  4 documents, 207 lines, reassembled byte for byte

The links line is the one that matters most here: renaming nine headings changes nine auto-generated anchors, and all 154 fragment references still resolve. Nothing in the tree hardcoded them.

Also checked by hand: zero em-dashes or en-dashes added, no {" "} separator removed, no number, identifier, rule name or sample path altered.

CI will be red, and it is not this branch

iyilang/iyi has released 0.13.0 and reworded the README sentence scripts/install-targets.mjs reads the platform names out of. Since CI checks iyi out at its default branch, the build now fails there before it reaches anything I touched:

Error: install-targets: README.md no longer names the platforms under its
one-liner ("... ; the tarball by hand"), so there is no sentence in the
repository to take the prose name of each target from.

I reproduced this on a pristine upstream/main with no changes at all, and on this branch, and the failure is byte-identical at the same generator. The delta from this PR is zero. The site's records also still pin 0.12.0 while releases.mjs now reads 0.13.0 as latest.

That is a real staleness problem worth its own fix, and it is not a prose change, so it is not in here.

@sdogruyol
sdogruyol merged commit 068e608 into iyilang:main Sep 20, 2026
2 checks passed
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.

2 participants