diff --git a/src/pages/download.astro b/src/pages/download.astro
index 5cdd08e..e75034e 100644
--- a/src/pages/download.astro
+++ b/src/pages/download.astro
@@ -88,10 +88,9 @@ const machineOf = (target: string) =>
What that prints has to equal the line for the same file in{" "}
{download.checksums}, which
- is attached to the release. This site does not restate the digests: it
- cannot read them at build time, and a hash copied by hand is exactly the
- thing a hash exists to catch. They are on the release page, beside the
- files they are about.
+ is attached to the release. The digests are on the release page, beside the
+ files they verify: a hash copied by hand is exactly the thing a hash
+ exists to catch, and the site cannot read them at build time.
Where {preferred.tool} is missing, the installer falls back
@@ -106,8 +105,8 @@ const machineOf = (target: string) =>
What the installer checks, in its own words
- This is the passage, not a summary of it. Note the last branch: a release
- that published no checksum file is said out loud rather than passed over.
+ The verification passage from install.sh. The final branch halts with an
+ explicit error if a release published no checksum file.
Machines it refuses
- Releases ship {download.accepted.map((entry) => entry.target).join(" and ")},
- and the installer names what it will not do rather than guessing. Anything
- else gets this sentence and a pointer to building from source:
+ Releases ship {download.accepted.map((entry) => entry.target).join(" and ")}.
+ Anything else gets this refusal and a pointer to building from source:
{download.refused}
Every release
- The notes for each are on its own page in the repository, written from
- the tag's own message. This site does not publish the changelog.
+ The changelog lives in the repository, where it stays current with the
+ code. Notes for each release are on its own page there, written from the
+ tag's own message.
{history.map((entry) => (
diff --git a/src/pages/index.astro b/src/pages/index.astro
index bff81a7..1c34a78 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -139,7 +139,7 @@ const starts = [
Try iyi
- Looks like Crystal, reads like Ruby, builds like a systems language.
+ It reads like Crystal or Ruby, and builds like a systems language.
This is the first program of the tour, and the output beside it is
what the compiler's build of it printed.
@@ -180,9 +180,9 @@ const starts = [
-
- Grounding is one command. Not a convention, not a
- retrieval step:
iyi mod context --json prints the
- surface an edit is allowed to know.
+ Grounding is one command.{" "}
+ iyi mod context --json prints the surface an edit is
+ allowed to know.
-
The verdict is data.
iyi check -f json{" "}
@@ -273,7 +273,7 @@ const starts = [
Change one line in one module and build again. iyi reads the
declarations of everything else and none of the bodies, so the edit
- loop is about {loop.claim.value}x shorter than the same compiler
+ loop is {loop.claim.value}x shorter than the same compiler
without the rule.
Why it is fast
@@ -305,8 +305,8 @@ const starts = [
Small and quick to start
Native code through LLVM, and a program links only what it uses. A
- hello world is about {massRatio}x smaller than the same program
- with Crystal's library, and starts in a fraction of the time.
+ hello world is {massRatio}x smaller than the same program with
+ Crystal's library.
The numbers, with the machine they ran on
@@ -316,7 +316,7 @@ const starts = [
-
Measured, not promised
+
Measured
One line changed in one of modules,{" "}
lines
diff --git a/src/pages/learn/index.astro b/src/pages/learn/index.astro
index a2a0419..445d678 100644
--- a/src/pages/learn/index.astro
+++ b/src/pages/learn/index.astro
@@ -153,8 +153,7 @@ const further = [
Or start with the syntax. The tour is{" "}
{tourSamples.length} short programs that run in your browser, from one{" "}
- puts to tasks and channels, and it is the second track at
- the foot of this page.
+ puts to tasks and channels.
@@ -210,7 +209,7 @@ const further = [
Then step {next.data.order}, {next.data.title}.
>
) : (
- <>The last step. After it, the tour below is the syntax.>
+ <>The last step. The syntax tour follows below.>
)
}
@@ -242,12 +241,12 @@ const further = [
The second track
The syntax, in {tourSamples.length} short programs
- The steps above are the rules, which is what makes iyi a different
- language from the one it forked. The tour is everything else: the
- syntax, in the order a person learns a language, each step a program
- that runs in your browser from the module the compiler built for it.
- Read the rules first and the tour reads as confirmation. Read the tour
- first and the rules read as the reason.
+ The rules are what make iyi a different language from the one it
+ forked. The tour is everything else: the syntax, in the order a person
+ learns a language, each step a program that runs in your browser from the
+ module the compiler built for it. Read the rules first and the tour
+ reads as confirmation. Read the tour first and the rules read as the
+ reason.
@@ -279,9 +278,9 @@ const further = [
And the rest of the samples
- Neither track is the whole repository. samples/iyi holds{" "}
+ Beyond both tracks, samples/iyi holds{" "}
programs, each written to document a part of
- the design rather than to show off. The ones no step above is grounded
+ the design rather than to show off. The samples no step is grounded
in are the ones to read next, and each of them runs here too:
diff --git a/src/pages/llms.txt.ts b/src/pages/llms.txt.ts
index 278b18a..a365b3a 100644
--- a/src/pages/llms.txt.ts
+++ b/src/pages/llms.txt.ts
@@ -72,7 +72,7 @@ for Type\` lives with the trait or the type (R-3).
- Developer experience: change one line in a ${s.generated.toLocaleString("en-GB")}-line project of ${s.modules}
modules and rebuild in ${loop.best.iyi} s, against ${loop.best.crystal} s under Crystal's rules on the
- same compiler binary: about ${loop.claim.value}x less. Measured by \`${loop.command}\`
+ same compiler binary: ${loop.claim.value}x less. Measured by \`${loop.command}\`
on ${loop.machine}.
- AI experience: a module's interface is a file (.iyimod). \`iyi mod context\`
grounds an edit at ${pack.size_low} to ${pack.size_high}% of the sources' size; a model writing
@@ -105,7 +105,7 @@ libraries and the samples. Details: ${origin}/install/
The same compiler builds .cr files unchanged. \`iyi build --crystal\` gives an
iyi program Crystal's standard library, \`require\`, and shards (Kemal, db,
ameba, sqlite3 among those swept through it). A Crystal program cannot require
-an iyi module; iyi consumes Crystal, not the other way round.
+an iyi module; iyi consumes Crystal, not the other way around.
## Pages
@@ -120,8 +120,8 @@ an iyi module; iyi consumes Crystal, not the other way round.
- [Targets](${origin}/targets/): what CI type-checks, audits and runs, per triple.
- [Project](${origin}/project/): contributing, security, the code of conduct, the notices.
-The design record and the release notes are not on this site: SPEC.md and
-CHANGELOG.md are read in the repository, which is where they are kept current.
+The design record and the release notes live in the repository: SPEC.md and
+CHANGELOG.md are read there, which is where they are kept current.
## The tour
diff --git a/src/pages/playground/evidence.astro b/src/pages/playground/evidence.astro
index 2c56512..95a3bc0 100644
--- a/src/pages/playground/evidence.astro
+++ b/src/pages/playground/evidence.astro
@@ -238,8 +238,7 @@ const marked = diagnosticEvents.map((event) => {
playground evidence
- Worth being exact, because "runs in your browser" is a claim a lot of
- pages make loosely. This page is the recording behind the{" "}
+ This page is the recording behind the{" "}
playground: which bytes came from where, what checked them, and what the compiler
@@ -292,7 +291,7 @@ const marked = diagnosticEvents.map((event) => {
-
- The colouring is the compiler's lexer or it is nothing, and this
+ The coloring is the compiler's lexer or it is nothing, and this
build checked that.
{" "}
There is no grammar in the playground and there will not be one. A
@@ -301,32 +300,31 @@ const marked = diagnosticEvents.map((event) => {
type paints from that same highlighter, and only after the page
recovers the text out of the stream and finds it byte identical to the
characters on screen. Otherwise it paints plain ink, because a listing
- with no emphasis is worth more than a listing whose every keyword sits
+ with no emphasis beats a listing whose every keyword sits
where no compiler put it. This build turned all{" "}
{curatedSamples.length} recordings back into what a live lexer sends,
- re-emphasised them through the live path, and required{" "}
+ re-emphasized them through the live path, and required{" "}
{liveLinesChecked} lines and {liveWordsRebuilt} rule words to come
back identical. It also required the check to refuse a stream that
lies, and the emphasis pass to leave an already marked recording
alone. Any one of those failing stops this page from building.
-
- The type checking is not in this page, and the reason
+ The type checking here is recorded, and the reason
changed. It used to be that the compiler could not report a
diagnostic from wasm at all. Work on{" "}
wasm/compiler-in-browser cleared that, so a checker in
the page is reachable now and when one lands it feeds this same event
- path. What is not reachable is running the program afterwards: a
- browser has no linker and producing a program out of a module needs
- one. So the diagnostics below are recorded, and the page says so
- rather than leaving a reader to assume.
+ path. The limit is running the program afterwards: a browser has no
+ linker and producing a program out of a module needs one. So the
+ diagnostics below are recorded.
-
{differing.length} of the samples do not print the same
thing on both targets, on purpose. The recording marks them,
the menu marks them, and the card carries the sentence. They are in the
- set because a target that cannot open a file is a thing worth knowing
- about the target, and hiding them would make the other{" "}
+ set because a target that cannot open a file is a fact about the
+ target, and hiding them would make the other{" "}
{identical.length} less believable.
{nativeOnlySamples.length > 0 && (
@@ -517,7 +515,7 @@ const marked = diagnosticEvents.map((event) => {
? "no capabilities"
: caps.supported.map((cap) => CAPABILITY_LABEL[cap]).join(", ")}
-
- colouring
+
- coloring
-
the compiler's own lexer, recorded by {highlightProvenance.command}
diff --git a/src/pages/project/index.astro b/src/pages/project/index.astro
index a29bf69..4b71bd7 100644
--- a/src/pages/project/index.astro
+++ b/src/pages/project/index.astro
@@ -16,17 +16,17 @@ const lines = documents.reduce((total, document) => total + document.lines, 0);
The project
What the repository says about itself.
- Four documents, {lines} lines, published whole. Not summarised: a summary
- of a security policy is a security policy nobody wrote, and the
- difference between it and the real one is somebody's disclosure going to
- the wrong place. Each page is the file, reassembled from the repository
- at build time and checked byte for byte against it.
+ Four documents, {lines} lines, published whole. A summary of a security
+ policy is a security policy nobody wrote, and the difference between it
+ and the real one is somebody's disclosure going to the wrong place. Each
+ page is the file, reassembled from the repository at build time and
+ checked byte for byte against it.
@@ -44,10 +44,10 @@ const lines = documents.reduce((total, document) => total + document.lines, 0);
))}
- Two documents this site does not publish, and links to as text rather
- than as pages: SPEC.md, which is the design and its rules, and
- CHANGELOG.md, which is where a release states what changed. Both live in
- the repository, which is also where their line numbers mean something.
+ SPEC.md and CHANGELOG.md are linked as text rather than published here:
+ the design and its rules, and where a release states what changed. Both
+ live in the repository, which is also where their line numbers mean
+ something.
diff --git a/src/pages/targets.astro b/src/pages/targets.astro
index 595d25e..c3ae842 100644
--- a/src/pages/targets.astro
+++ b/src/pages/targets.astro
@@ -76,10 +76,9 @@ const otherSpelling = audit.values.filter(
Platforms
Compiles for . Runs on {ranCount}, every build.
- Most projects say "supports the platform" and mean the code generator had
- no objection. Here it means three different checks, and a target reaches
- a different number of them. This page is the table, and every cell in it
- is a job and a line in{" "}
+ Platform support here means three distinct checks, and each target
+ reaches a different number of them. This page is the table, and every
+ cell in it is a job and a line in{" "}
one workflow
.
@@ -170,9 +169,9 @@ const otherSpelling = audit.values.filter(
{audit.values.length} targets crossed with{" "}
{audit.samples.length} programs ({audit.samples.join(", ")}), each
- object read for what it leaves undefined. The programs are not a
- shorter list for a reason: each carries per-platform branches, and a
- branch only its own platform compiles is a branch nobody checks.
+ object read for what it leaves undefined. Each program carries
+ per-platform branches, and a branch only its own platform compiles
+ is a branch nobody checks.
@@ -108,7 +108,7 @@ const untouched = SPELLED[rest] ?? String(rest);
Change one line in a {facts.structural.generated.toLocaleString("en-GB")}-line
project and rebuild. iyi reads the declarations of the
other {untouched} modules and none of their bodies, so the line you just
- changed costs about {loop.claim.value}x less than under Crystal's
+ changed costs {loop.claim.value}x less than under Crystal's
rules, on the same compiler binary. The bars below run at real speed.
The measurement, with its machine
@@ -149,9 +149,9 @@ const untouched = SPELLED[rest] ?? String(rest);
1. Developer experience
The loop you are actually in is the loop that got fast.
- Nobody uses a language through full builds. You change a line, you
- build, you look. That loop is what R-1 was written for, and it is the
- number this project exists for.
+ Day-to-day work happens in the edit loop: change a line and rebuild.
+ That loop is what R-1 was written for, and it is the number this
+ project exists for.
2. AI experience
A compiler built to be an agent's tool, not wrapped as one.
- An agent needs two things from a language: a boundary it can read, and
- a loop it can afford. Most languages give it neither, so it reads whole
- repositories into a prompt and hopes. iyi gives it both, for the same
- reason a person gets them: a module's interface is a file, not
- a convention.
+ An agent needs a boundary it can read and a loop it can afford.
+ Without those, it reads whole repositories into a prompt and hopes.
+ iyi gives it both, for the same reason a person gets them: a module's
+ interface is a file, not a convention.
@@ -209,8 +208,8 @@ const untouched = SPELLED[rest] ?? String(rest);
A
.iyimod holds a module's declarations, with every
type written down, and its machine code. A tool can read exactly
what a module offers without the repository that produced it, and
- check a change against it without building the world. That is not
- an agent feature bolted on. It is R-1 and R-2, asked a question.
+ check a change against it without building the world. It is R-1
+ and R-2, asked a question.
"Did my change reach anybody?" has an answer
@@ -277,7 +276,7 @@ const untouched = SPELLED[rest] ?? String(rest);
Protocol for agents and the Language Server Protocol for editors.
Each is a shell around the same binary, so what a harness gets over
the wire is byte for byte what a shell would have printed. No agent
- mode, no forked behaviour.
+ mode, no forked behavior.
@@ -301,9 +300,9 @@ const untouched = SPELLED[rest] ?? String(rest);
- Said plainly, as the README says it: the mechanism is built and the
- claim is young. If the rules turn out not to be enough for agents,
- that is a thing to measure rather than to promise.
+ The mechanism is built and the claim is young. If the rules turn out
+ not to be enough for agents, that is a thing to measure rather than
+ to promise.
@@ -348,7 +347,7 @@ const untouched = SPELLED[rest] ?? String(rest);
))
}{" "}
are not. Windows compiles and links, and what it prints at run time
- cannot be trusted yet. Both are said here rather than left to be found.
+ cannot be trusted yet.
@@ -411,7 +410,7 @@ const untouched = SPELLED[rest] ?? String(rest);
- Where it loses, said here
+ Where it loses
As it runs, the same workload is {stringRow.as_it_runs.toFixed(2)}x,
- within noise. The collector is masking a slower builder, and the
- README says so rather than publishing the flattering column. iyi is
- also not quick at compiling a lot of code it has never seen; it is
- quick on the loop, which is the row that matters.
+ within noise. The collector masks a slower builder. Cold builds of
+ unseen code are slower; the speed is on the edit loop, which is the
+ row that matters.
{/* README.md's own "Where it loses" and the paragraph after it, said in
@@ -433,13 +431,12 @@ const untouched = SPELLED[rest] ?? String(rest);
* tree and it is the prelude that stops short. */}
Young parts, named: iyi's own prelude carries the small-tool floor and
- no more, so it has no TLS and no serialisation, and sockets and format
+ no more, so it has no TLS and no serialization, and sockets and format
strings live in std/socket and std/format,{" "}
outside the prelude every program carries; concurrency runs on Linux
and macOS arm64 only; dependencies resolve and pin, but there is no
registry and no artifact distribution yet, and --crystal{" "}
- still leans on shards. Every one of these is a line in the README, not
- a footnote.
+ still leans on shards.