Repository navigation
refactor: one file per guarantee under laws/ and proofs/ - #64
Merged
Merged
Conversation
SPEC.md, a 5.5k-line LAWS.bend and a 6.5k-line PROOF.bend had to be read side by side, matched up by ID tags. Each guarantee is now laws/<Name>.bend, its prose on top and its quantified laws under it, proved by proofs/<Name>.bend. LAWS.bend and PROOF.bend only import them. Definitions the laws share are under laws/defs/, lemmas several proofs use under proofs/lemmas/, each named for what it holds. Requirement IDs are gone: a file's name is its guarantee's. A law two guarantees rest on sits in the one that states it, or in a file of its own named for what it says (PhraseTableLookup, InterimStatusIs1xx, SplitAtCharacter, ...). The laws SPEC.md never inventoried (URL parsing, framing, credentials, the cookie jar, caching, CORS) each get a file named after the law, and LAWS.bend's header says they promise nothing beyond their equality. Each section's intro heads the first file of that family; the table itself is kept as docs/SPEC.md. The trust boundary moves onto the code: the server's effects and sequencing on src/server.bend, the client's sequencing on src/client.bend and client.follow, bend-kit's wire, dns and bytes on src/wire.bend, the errno reporting on wire.fail, the form body on form.body, the packed reader on src/packed.bend, and the entities table on src/entities.bend (written by tools/entities.py). This needs a bolt that reads law and proof files by what LAWS.bend and PROOF.bend import, and no longer runs `trace`; bolt.bend drops `trace`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 203 one-law files the converter named after their law (B64F, AskClenExact, FreshNoStoreAny, ...) now say what the law states: 160 are renamed (Base64EncodesF, RequestBodyOfContentLengthKept, NoStoreNeverFresh, ...) with their proofs; the 43 whose names already read as behaviors stay. Imports and cites follow. The entities table's trust comment no longer claims a differential test against html.unescape, which does not exist: it says tools/entities.py generates the table from WHATWG's entities.json and checks each entry's code points, and that no test compares html_unescape with Python's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2 of 3 tasks
bolt v1.22.0 reads law and proof files by what LAWS.bend and PROOF.bend import, which this layout needs. Rules changed since the old pin, so some noqa comments no longer silence anything (S005); they are removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ngngardner
marked this pull request as ready for review
November 1, 2026 03:39
ngngardner
enabled auto-merge (squash)
November 1, 2026 03:39
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.
Summary
laws/<Name>.bend(its prose, then its quantified laws), proved byproofs/<Name>.bend.LAWS.bendandPROOF.bendonly import them. That's 270 law files, 2 shared definition files and 7 lemma files, replacing the 5.5k-line LAWS.bend and 6.5k-line PROOF.bend.PhraseTableLookup,InterimStatusIs1xx,LocationResolvedBySort,LocationSplitsAtQuery,SplitAtCharacter,CutAtFirstEquals). The guarantees that rest on them say so with analso rests on:line.Base64EncodesF,NoStoreNeverFresh,UrlPathIsAbsolute, ...), with no prose.LAWS.bend's header says they promise nothing beyond their equality.LAWS.bend, which also names the first file of each family.laws/BadRequestAnswers400.bendfor the server).laws/QuoteOutputIsFramed.bend.src/,main.bend,bench/and the README are now law paths.docs/SPEC.md.# Trusted, not proved:comments on the code:recv) and HTTP-TRUST-2 (server sequencing) go on thesrc/server.bendheader.src/wire.bendheader.client.follow, and HTTP-TRUST-5 (client sequencing) on thesrc/client.bendheader.wire.failinsrc/wirespec.bend.src/entities.bendheader, whichtools/entities.pynow writes. It says the table is generated from WHATWG's entities.json. It drops SPEC.md's claim of a differential test againsthtml.unescape, since no such test exists in the tree, CI or history.form.body, and HTTP-TRUST-9 on thesrc/packed.bendheader.def trace().Depends on
Emerging-Patterns/bolt#257. The pinned bolt reads law files by name only and still runs
trace. This PR stays a draft until that release lands and the pin is bumped here.Test plan
bend PROOF.bend→ALL PROOFS CHECKS005stale# noqainbench/main.bend, which main also shows under that bolt (4 errors, 1007 warnings there: main also has a C011 fordef trace()).nix flake check🤖 Generated with Claude Code