The demo shows the refusal it claims - #964
Merged
Merged
Conversation
`demo/README.md` and the site's one-clause page both say a host that offers `Io.read` and not `Io.save` refuses `read_write`, and that the refusal happens before any code runs. The test under that sentence ran the module with no host at all and asserted only that the answer began `deed:io`. Asked it to name the operation it is named for. It said `deed:io.read`. So a test called `running_read_write_without_save_names_what_it_wanted` never mentioned `save`, and the operation it did name is the one both modules share, which is the opposite of the difference the whole demo is about. A host behaving that way would have read the file before noticing it could not save. The second test's own comment already admitted it — "depending on execution order" — while the first one's name and comment claimed otherwise. `Host::link` is the mechanism the prose describes: it reads the whole import section and refuses before an instruction runs. The demo uses it now, and asserts the refusal names `save` exactly. Beside it, the half that makes the first half mean something: the same host links `read_only` and hands it back ready to call, because a host that refused both would be a host with no filesystem and would say nothing about the clause. Running with no host is kept, renamed for what it shows, and asserts both modules stop at `deed:io.read` — the weaker guarantee, now distinguishable from the stronger one. Also: the list of test names printed in the README was typed, said `running 5 tests`, and named a test that no longer exists. It is now read back and compared to the tests the file declares, which is what has held the import listing on the same page since #783. Writing that ratchet immediately found one more thing: it counted itself, because the string it splits on is spelled in the file it reads. And `demo/README.md` said the host is "the runner in `crates/deed-rt`". That crate is hashing, http, reach and sandbox; `Host`, `link` and `call` are in `crates/deed-codegen`.
onatozmenn
added a commit
to deed-lang/deed-lang.github.io
that referenced
this pull request
Aug 9, 2026
The page's own heading says "A host without `Io.save` refuses the second module, before any of it runs." The snippet under it ran the module with no host at all and read whichever import execution reached first, which for both of these modules is `deed:io.read` — the operation they share, not the clause that is the difference. Measured in deed-lang/deed#964. `Host::link` reads the whole import section and answers before an instruction runs, which is what the heading says, so that is what the page shows now. The other half is on the page too: the same host links the read-only module and hands it back ready to call. A host that refused both would be a host with no filesystem and would say nothing about the clause. The test transcript further down was five tests and named one that no longer exists. It is seven now, and the compiler's repository reads that list back out of `demo/README.md` on every commit, so this page and that one cannot drift apart quietly again.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
demo/is what this project leads with — "One clause. Two worlds." It is theone-clause page and the sentence the
capability model is sold on.
Both it and the site say:
The test under that sentence ran the module with no host at all and
asserted only that the answer began
deed:io:What it actually said
Asked it to name the operation it is named for —
what == "deed:io.save":processreads before it saves, so with no host it stops onread. A testcalled
running_read_write_without_save_names_what_it_wantednever mentionedsave, and the operation it did name is the one both modules share — theopposite of the difference the demo exists to show. The two doc comments in the
file disagreed with each other about this; the second one already said "or
deed:io.savedepending on execution order".A host that behaved the way this test does would have read the file before
noticing it could not save. That is not "before any code runs".
What it says now
Host::linkis the mechanism the prose describes. It reads the whole importsection and answers before an instruction runs:
Three tests where there were two:
a_host_without_save_refuses_read_write_and_names_savethe_same_host_links_read_only_without_restriction— the half that makes thefirst half mean something. A host that refused both would be a host with no
filesystem.
running_without_a_host_stops_at_the_first_import_either_way— the weakerguarantee, kept and renamed, asserting both modules stop at
deed:io.readsothe two shapes can be told apart.
The other listing on the page
The README prints this file's test names. It was typed, said
running 5 tests,and named a test that no longer exists. It is now read back and compared to the
tests the file declares — the same treatment the import listing on that page
has had since #783.
That ratchet found something the moment it ran: it counted itself, because
the marker it splits the source on is spelled in the source it reads. Fixed by
spelling it in two pieces, which is the sort of thing only a self-reading test
runs into.
Also
demo/README.mdsaid the host is "the runner incrates/deed-rt". That crateis
hashing,http,reachandsandbox;Host,linkandcallare allin
crates/deed-codegen.The site carries the same snippet, the same transcript and the same claim, so
it needs the matching change: deed-lang/deed-lang.github.io#44.