Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ still takes from CHANGELOG.md is which release is current, which reaches the
masthead, the home page, the install page and llms.txt through
`scripts/releases.mjs`.

The blog under `/blog/` is the one authored section about a moment: a post per
release, in `src/content/blog/`. A post names its release in its frontmatter,
and what it quotes of that release's notes `scripts/notes.mjs` reads out of
CHANGELOG.md at the release's tag, so the next release does not change it.
Write the post after the site has been regenerated at the release (below):
the build refuses a post for a release CHANGELOG.md does not yet state.

## Building

The scripts look for an iyi checkout beside this one, named `iyi`, or wherever
Expand Down
17 changes: 15 additions & 2 deletions doc/STACK.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ site/
of INSTALL.md, writes generated/targets.json
releases.mjs reads CHANGELOG.md's release headings, writes
generated/releases.json
notes.mjs reads the section of CHANGELOG.md each post names,
at that release's tag, writes generated/notes.json
samples.mjs transcludes samples/iyi, samples/tour, records/break
and records/agent into generated/samples/
record-agent.mjs recorder: runs the agent loop against a real
Expand All @@ -61,10 +63,10 @@ site/
src/
styles/ tokens.css, base.css, code.css
components/ Measure, Stamped, DurationChart, Sample, Quote,
Compare, Frame, Lifted
Compare, Frame, Lifted, ReleaseNote, Heading
layouts/Page.astro masthead, colophon, fonts, styles, scheme switch
pages/ index, why, agents, playground, learn, install,
download, targets, project
download, targets, project, blog
playground/ the slot: types, registry, engines
generated/ build output, gitignored, never edited
```
Expand Down Expand Up @@ -132,6 +134,17 @@ The two classes of number are rendered differently by design; see
repository changes on the site. Renaming a sample a lesson names fails the
build.
- **Generated, measured:** all numbers, via the pipeline above.
- **Authored, quoting a release at its tag:** the posts under `/blog/`, in
`src/content/blog/`. A post is the one page about a moment rather than about
the tree as it is. Its `release` must be one CHANGELOG.md states and its
`date` no earlier than that release's (`src/lib/posts.ts`), and what it
quotes of the release's notes is read by `scripts/notes.mjs` out of
CHANGELOG.md at the release's tag and set by `ReleaseNote` with the lines it
came from, so a later edit to the changelog does not move a sentence in an
announcement. A listing or a command a post sets goes through `Sample` and
`Quote` like any other page's and follows the current release; a later
release that removes what one anchors on fails the build at that post.
`/blog/rss.xml` is built from the same list the index renders.
- **Authored fresh:** the marketing pages and the lessons. SPEC.md is a design
record, not teaching material, so the learning path is written by hand but is
grounded in real samples and real README passages, and every factual claim in
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"private": true,
"type": "module",
"scripts": {
"generate": "node scripts/fonts.mjs && node scripts/facts.mjs && node scripts/targets.mjs && node scripts/proofs.mjs && node scripts/releases.mjs && node scripts/modified.mjs && node scripts/install-targets.mjs && node scripts/samples.mjs && node scripts/thesis.mjs && node scripts/project.mjs && node scripts/download.mjs && node scripts/records.mjs && node scripts/stdlib.mjs && node scripts/contrast.mjs && node scripts/no-transcription.mjs && node scripts/blocker.mjs",
"generate": "node scripts/fonts.mjs && node scripts/facts.mjs && node scripts/targets.mjs && node scripts/proofs.mjs && node scripts/releases.mjs && node scripts/notes.mjs && node scripts/modified.mjs && node scripts/install-targets.mjs && node scripts/samples.mjs && node scripts/thesis.mjs && node scripts/project.mjs && node scripts/download.mjs && node scripts/records.mjs && node scripts/stdlib.mjs && node scripts/contrast.mjs && node scripts/no-transcription.mjs && node scripts/blocker.mjs",
"generate:install-targets": "node scripts/install-targets.mjs",
"record:wasm": "node scripts/record-wasm.mjs",
"record:diagnostics": "node scripts/record-diagnostics.mjs",
Expand Down
14 changes: 7 additions & 7 deletions records/agent.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"recorded": {
"compiler": "iyi 0.20.1 (built on Crystal 1.22.0-dev [91d012b1e] (2026-11-04))",
"commit": "91d012b1ed978c7df5cc033624ec161a2daf01b6",
"compiler": "iyi 0.21.0 (built on Crystal 1.22.0-dev [08ce6c1cb] (2026-11-09))",
"commit": "08ce6c1cb2ba5768b15485dbbd6413fcb17df19a",
"machine": "Linux 7.0.0-38-generic x86_64, QEMU Virtual CPU version 2.5+",
"command": "npm run record:agent",
"when": "2026-11-04T04:32:53.960Z"
"when": "2026-11-09T17:40:45.851Z"
},
"project": [
{
Expand Down Expand Up @@ -44,7 +44,7 @@
"command": "iyi mod context --json app.iyi",
"exitCode": 0,
"payload": "stdout",
"stdout": "{\"file\":\"agent/app.iyi\",\"imports\":[{\"import\":\"app/greeter\",\"api\":{\"module\":\"app/greeter\",\"interface_hash\":\"f2f9576ba7e3996e204d5c93ccf5f42d\",\"functions\":[{\"name\":\"polite\",\"parameters\":[\"name : String\"],\"returns\":\"String\",\"doc\":\"The exported surface carries its doc comment, so the grounding pack an agent\\nreads says what the function is for and not only what it takes.\",\"rendered\":\"def polite(name : String) : String\"},{\"name\":\"shout\",\"parameters\":[\"name : String\"],\"returns\":\"String\",\"rendered\":\"def shout(name : String) : String\"}],\"types\":[{\"name\":\"Greet\",\"kind\":\"trait\",\"visibility\":\"pub\",\"methods\":[{\"name\":\"greet\",\"parameters\":[],\"returns\":\"String\",\"required\":true,\"rendered\":\"abstract def greet : String\"}]}],\"impls\":[]}}]}\n",
"stdout": "{\"file\":\"agent/app.iyi\",\"imports\":[{\"import\":\"app/greeter\",\"api\":{\"module\":\"app/greeter\",\"interface_hash\":\"dadbf4541512680f291862fd67e8fbcf\",\"functions\":[{\"name\":\"polite\",\"parameters\":[\"name : String\"],\"returns\":\"String\",\"doc\":\"The exported surface carries its doc comment, so the grounding pack an agent\\nreads says what the function is for and not only what it takes.\",\"rendered\":\"def polite(name : String) : String\"},{\"name\":\"shout\",\"parameters\":[\"name : String\"],\"returns\":\"String\",\"rendered\":\"def shout(name : String) : String\"}],\"types\":[{\"name\":\"Greet\",\"kind\":\"trait\",\"visibility\":\"pub\",\"methods\":[{\"name\":\"greet\",\"parameters\":[],\"returns\":\"String\",\"required\":true,\"rendered\":\"abstract def greet : String\"}]}],\"impls\":[]}}]}\n",
"stderr": ""
},
{
Expand Down Expand Up @@ -104,7 +104,7 @@
"command": "iyi test --json .",
"exitCode": 0,
"payload": "stdout",
"stdout": "{\"tests\":[{\"file\":\"./app_test.iyi\",\"status\":\"pass\",\"seconds\":0.281}],\"passed\":1,\"failed\":0,\"skipped\":0}\n",
"stdout": "{\"tests\":[{\"file\":\"./app_test.iyi\",\"status\":\"pass\",\"seconds\":0.336}],\"passed\":1,\"failed\":0,\"skipped\":0}\n",
"stderr": ""
},
{
Expand Down Expand Up @@ -135,7 +135,7 @@
"bytes": 731,
"sourceBytes": 707,
"interfaceHashes": {
"app/greeter": "f2f9576ba7e3996e204d5c93ccf5f42d"
"app/greeter": "dadbf4541512680f291862fd67e8fbcf"
}
},
"suggested": [
Expand Down Expand Up @@ -167,7 +167,7 @@
},
"serverInfo": {
"name": "iyi",
"version": "0.20.1"
"version": "0.21.0"
}
},
"tools": [
Expand Down
8 changes: 4 additions & 4 deletions records/diagnostics.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"recorded": {
"compiler": "iyi 0.20.1 (built on Crystal 1.22.0-dev [91d012b1e] (2026-11-04))",
"commit": "91d012b1ed978c7df5cc033624ec161a2daf01b6",
"compiler": "iyi 0.21.0 (built on Crystal 1.22.0-dev [08ce6c1cb] (2026-11-09))",
"commit": "08ce6c1cb2ba5768b15485dbbd6413fcb17df19a",
"machine": "Linux 7.0.0-38-generic x86_64, QEMU Virtual CPU version 2.5+",
"command": "npm run record:diagnostics",
"when": "2026-11-04T04:32:47.944Z"
"when": "2026-11-09T17:40:39.969Z"
},
"cases": [
{
Expand Down Expand Up @@ -122,7 +122,7 @@
"path": "records/break/share_reach.iyi",
"command": "IYI_PATH=<iyi>/src iyi build --no-codegen --no-color --error-on-warnings records/break/share_reach.iyi",
"exitCode": 1,
"stderr": "In records/break/share_reach.iyi:19:24\n\n 19 | Server.serve(listener) do |req|\n ^\nWarning: the block Server.serve keeps, which may run on other threads reaches `GREETING : Array(String)` (not Share) through `greeting` → `GREETING.join`: Array(String)'s field @size is assigned in `append`. If it is only read, make it a `List(String)` (std/list), which is Share. Keep the value behind a `Mutex` (std/mutex), or, when every thread may reach it safely - it is set once and then only read, or guarded some other way - say why on the constant: `@[SafeReach(\"...\")]` (SPEC.md III.4.4)\n\nA total of 1 warnings were found.\n"
"stderr": "In records/break/share_reach.iyi:19:24\n\n 19 | Server.serve(listener) do |req|\n ^\nWarning: the block Server.serve keeps, which may run on other threads reaches `GREETING : Array(String)` (not Share) through `greeting` → `GREETING.join`: Array(String)'s field @size is assigned in `append`. If it is only read, make it a `List(String)` (std/list), which is Share. Keep the value behind a `Mutex` (std/mutex), or, when every thread may reach it safely - every write is before the first parallel task starts, or behind one `Mutex#lock` on a constant or a class variable - say why on the constant: `@[SafeReach(\"...\")]`, which the compiler proves (SPEC.md III.4.4)\n\nA total of 1 warnings were found.\n"
}
]
}
Loading
Loading