docs(reference): drift sweep over all seven reference docs, and bind the version header - #345
Merged
Merged
Conversation
`docs/reference/compiler.md` is the authoritative current-behaviour record and
its first factual claim — the version header — was bound to nothing. It read
`delvec 0.1.0`, `dsl 0.8.0` and listed `dsl_version 0.2.0 … 0.8.0` while the
build is at `delvec 1.1.0` / `dsl 0.9.0` and accepts `0.9.0`. The body of the
same file documented the v0.9 surface correctly; only the header a reader
consults first was wrong, and every gate was green, because no gate related the
two.
Second instance of the same defect, found while fixing the first: the `DW0102`
catalog row restates the supported set by hand and read `{0.2.0 … 0.8.0}`.
`tools/check-dw-codes.py` was green on it and always would be — it proves a code
exists in both source and doc and is asserted by a test, never that the
BEHAVIOUR the doc ascribes to it is the behaviour the code has.
`tools/check-reference-versions.py` binds both, by EQUALITY in both directions,
to `crates/compiler/Cargo.toml`, `crates/dsl/src/envelope.rs`
(`SUPPORTED_DSL_VERSION` + `SUPPORTED_DSL_VERSIONS`, compared as an ordered
sequence) and `versions.toml`. Equality is the point: a gate that only rejects a
version NEWER than the build is exactly what let a storybook ship a stale `v1.0`
marker through the whole `v1.1` release green (#342), and stale-older is the
direction that actually happens. Demonstrated red on the pre-fix header and on
the `DW0102` row independently, green after.
Runs as a step in the existing `docs (local link check)` job, so no branch-
protection context changes (`check-required-contexts.py` still resolves 12/12).
Also corrected against the source, not from memory:
- added the missing `task #179 / dsl_version 0.9.0` landed-bullet (drops[] +
`collect.dropped_by`), semantics read off `crates/dsl/src/diagnostic.rs`
`DW0490`–`DW0493`.
- pass-order row 11 listed two-tier `DW0359` only under exit 3; it is an
`EclipseError` (hard) AND a `Diagnostic::warning` (advisory) in
`crates/compiler/src/eclipse.rs`, and the file's own convention lists two-tier
`DW0489` in both places. Its catalog row already described both tiers.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
…ections `tools.md` claims to be the inventory of the whole tool surface — every binary, script and flag. Audited bidirectionally against `tools/`, `validation/`, `crates/*/src/main.rs` (clap derives, not `--help`), `prefabs/` and `.github/workflows/`. ~150 claims checked, 6 corrected. - `.github/scripts/mecha_crosscheck.py` was ENTIRELY absent (`grep -c mecha docs/reference/tools.md` -> 0). ADR-0011's independent cross-check, invoked by the `mecha cross-check (PR only)` required job, missing from the file that claims to be the whole surface. - `tools/refimg.py`: `--chain-from` and `--style-note` undocumented; the provider parenthetical said `ideogram-v3` only while `PROVIDERS` has two keys and the same cell already named both. - `packtest` profile: the CI extra-pass list was one fixture short (`souls-timed-gate-disarm`, ci.yml 670-686). - `tools/check-reference-versions.py` row added (CLAUDE.md tooling-sync). The env-forwarding claim was FALSE and the first count of it was also wrong. `harness/src/` reads 15 `DELVEWRIGHT_*` variables; `validation/*.yaml` declares 10. The doc said all 15 were forwarded. The set difference is five, of which FOUR are real defects — `ACTOR_FLOOR`, `RETRY_ON_DEATH`, `CUTSCENE_GRACE_MS`, `ENTITY_SETTLE_TIMEOUT_MS` arrive unset in the container, so setting them on a `bot-run.sh` command line is silently dropped. The fifth, `NOTE_TEXT`, is not a defect: `playtest-note-flow.sh` runs the note-bot on the host. The first sweep named two of the four; measuring the set difference rather than spot-checking found the other two. That is a defect in `validation/compose.yaml`, not in the doc, so it is recorded here as an open finding and NOT fixed in this PR: `DELVEWRIGHT_ACTOR_FLOOR=0` cannot be used through the ladder at all today. It is the general form of the one-variable fix task #102 already applied by hand. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
`tools/check-reference-versions.py` had a red->green demonstration but no regression test, and its five regexes are the part that rots: a renamed constant must exit 2 loudly, never pass quietly. 14 tests over synthetic sources. Both directions are pinned as red — the stale-OLDER one because that is what actually happens (docs are written once, the build moves), and the ahead-of-the-build one because a gate that only rejected "newer" is exactly what let a storybook ship a v1.0 marker through the whole v1.1 release green (#342). Also pinned: same members in the wrong ORDER (the list doubles as the reading order for the additive-superset claim), the DW0102 row going stale while the header is right, that `[minecraft]`'s `version` is read rather than another table's, and that every reshaped-source path exits 2. Verified non-vacuous by mutation: stubbing the gate's `problems` list to empty turns 8 of the 14 red. 180 -> 194 tests in `tools/tests`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
`worktree-bootstrap.md` exists to stop a worker acting on a mechanism nothing implements, and #344 removed one from §1 today ($DELVEWRIGHT_CAMPAIGNS_DIR, an override no code has ever read). §2 carried a parallel one and was not looked at. It said the local config holds "validation ports, container tooling paths" and that absence makes "validation compose runs inherit wrong defaults silently". Measured: nothing in `validation/` reads `delvewright.local.toml`, no shell script reads it, no Rust crate reads it. Exactly two Python tools do, each only for its own section — `tools/i18n-translate.py` (`[i18n]`) and `tools/refimg.py` (`[refimg]`) — and the real file has exactly those two sections. Validation gets its ports from `ephemeral-port.yaml` and its pins from `versions.toml`. The consequence was a false causal story: a worker who skipped the copy and then blamed a red ladder run on it was chasing a cause that does not exist. Corrected to say what absence actually breaks (those two tools, which exit non-zero naming what to add — `i18n-translate.py` returns 2 on a missing `[i18n]`), and to name the two readers so the next reader can check rather than believe. §1's claims were re-verified rather than assumed: the five literal path-construction sites all exist, and `analyze.rs` has exactly two `prefabs_dir()` call sites, both `.unwrap()` — so "exactly two failures" is right. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
…w against the build ~88 claims checked across the three, 9 corrected. Each correction is measured; the counts and the unverifiable residue are in the PR body. Two are the exact defect class this sweep hunts — a claim a reader acts on, bound to nothing: - i18n.md promised a width diagnostic was "being added separately (engine task #110)". `DW0331` had landed 18 hours BEFORE that line was written (bf706ce, 2026-08-03 03:44 vs the line at 21:41), and the same file already cited it as an enforced gate 165 lines earlier. A translator reading the option-label section would take a hard error for advice. - skill-workflow.md §8 item 5 said ADR-0016's version line "exists on paper only" and that the skill's frontmatter "carries `name` and `description` and nothing else". It carries `version`, `requires` and `verified_with`, and `check-skill-version.py` binds all three to the CLI in both directions. Every word was false; the item is now marked closed with what the gate does and does not prove. playtest-methodology.md was asserting the very vacuity it warns about: - Rule 3 said `/new-delve` "requires all four" declarations. It requires three, and the compiler enforces those (`DW0460`/`DW0481`/`DW0480`). Nothing requires a combat TIER — `grep -n tier SKILL.md` finds it only under *Authoring pitfalls*, and `DW0477` fires on a tiered fight nobody can measure, the opposite direction. An untiered set-piece compiles green. That is the same unbound gate whose nineteen-round history the document exists to record. - The findings table's `0` cell for round 16 read as "she played and found nothing". Round 16 WAS an owner playtest — four items, all already-open findings, ledgered under r12/r15, and it opened with the rebuke rule 4 comes from. The caption now says findings are counted by the round they were FIRST reported in, and the "no owner exposure" window is corrected from 16-21 to 17-21. Also: skill-workflow gate 4b described the design-alignment images as renders of built prefabs; #334 (2026-08-07) made them reference images drawn BEFORE any prefab exists, and this doc never received the update — a reader acting on the old row does the expensive thing first. And "six stage JSONs" as the artifact of record omits the optional stage-7 `world-edits.json`, so a campaign that used `delvec edit` and committed only the six loses its landscape on rebuild. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
~230 claims checked against `crates/grammar`, 4 corrected. Every correction was
measured, not reasoned about.
- **§3 described two different test suites with one sentence.** "double-export
test over every library program at four seeds" — `tests/export.rs::cases()` is
`temple`/`castle`/`church` and nothing else, while `tests/determinism.rs`
carries all 17. The §5b staging rules and §5c zone programs are not in the
byte-comparison suite at all; what covers them is the registry round trip
(`crates/compiler/tests/grammar_prefab.rs`), which exports once and reads back
rather than twice and compares. A reader trusting that line believes the
staging rules have determinism cover they do not have.
- **§5b `store_room`'s smallest region was 5 × 5 × 3; the real one is 5 × 5 × 5.**
`crates/grammar/tests/staging.rs:2469` asserts `[5,5,5]` expands and `[5,5,4]`
does not. `MIN_LINE` is 3, but the frame puts local Z on the LARGER horizontal,
so a 3-long row is unreachable — the same shape `boulder_stair`'s `MIN_DEPTH`
already records.
- **§4's `Program::validate` list reads as exhaustive and named 9 of 11.**
`RoundingWithoutRelative` and `SplitAxisOutsideSplit` were missing
(`crates/grammar/src/ir.rs`, `pub enum ProgramError`).
- **"Two anchor names are shared across rules" — there are three.**
`anchor/landing` is declared by both `drop_shaft` and `dumbwaiter`. A zone
author composing a chute and a duct hits an `AnchorCollision` the doc told
them not to expect. Nothing enumerates the collisions; the list is prose, and
the third entry was missing until a sweep counted the stems.
`cargo test -p delvewright-grammar`: 198 tests, 197 passed, 1 ignored, 0 failed.
Not fixed, because it is a code change: `crates/grammar/src/library/store_room.rs:57`
carries the same false minimum ("Z >= 3") in its module docs, and
`tests/staging.rs:2467` comments "3 of row" beside a check of `[5,5,5]`.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
stellarfeline
added a commit
that referenced
this pull request
Aug 10, 2026
The gate added by #345 does exactly what it exists for: it caught this branch's SUPPORTED_DSL_VERSION bump leaving the compiler-reference header, its supported-version list and the DW0102 catalog row all claiming 0.9.0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
stellarfeline
added a commit
that referenced
this pull request
Aug 10, 2026
Takes main's version-header binding note (#345, tools/check-reference-versions.py) and this branch's numbers: dsl 0.10.0, and 0.10.0 in both the supported list and the DW0102 row. The new gate passes on the merged result. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
stellarfeline
added a commit
that referenced
this pull request
Aug 10, 2026
…oticed (#346) * feat(dsl): on_death is an effect root, and so is the one nobody had noticed Two effect roots, added together because they are the same lesson read from opposite ends. R7 `on_death` (DSL v0.10, spec-0031 AC3) is new surface, and it starts inside the enumeration. With it, "the purse is dropped on death" stops being an engine feature and becomes ordinary content in a general mechanism. R6 `shortcuts[].on_unlock` is not new at all. It has been a `Vec<QuestEffect>` emission lowers since spec-0016 §2, and it was in no enumeration — so every proof, every l10n pass and every diagnostic written for the general path silently did not cover it. Zero campaigns had used it, which is the only reason it never shipped as a bug. Death detection rides the existing edge and adds no second detector: `dw.deaths` (`deathCount`) is still the only thing that notices a death and `cp_respawn_check` is still the only reader. What `on_death` adds is a second ACKNOWLEDGEMENT of that one counter, because the existing `dw.death_ack` is deliberately withheld while a player is dead — which is exactly the window the beat fires in. The death POSITION is not captured. `emit::death_position_capture` is a named, empty seam ahead of the dispatch; which vanilla mechanism records it is being measured live and is not guessed here. CI now proves: every root × every campaign-wide walker, with the roots enumerated from the type and the per-root fixture from an exhaustive match, so an eighth root is a compile error rather than a green test that says nothing about it (`tests/effect_root_walkers.rs`); the death edge's shape, both sides, with and without a checkpoint (`tests/v10_on_death.rs`); and that a campaign declaring no death beat emits a byte-identical tree. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL * docs(reference): bind the version header to the 0.10.0 build The gate added by #345 does exactly what it exists for: it caught this branch's SUPPORTED_DSL_VERSION bump leaving the compiler-reference header, its supported-version list and the DW0102 catalog row all claiming 0.9.0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
What this is
A drift sweep over all seven files in
docs/reference/, hunting one defect class: a fact a reader ACTS on, bound to nothing that can contradict it. Not stale prose — for every claim the question was what would fail if this became false? When the answer was "nothing", that was the finding, even where the claim happened to be true today.No Rust behaviour is touched (
git diff --name-only main...HEAD | grep -c '\.rs$'→0). Where a doc was right and the code was wrong, it is a finding below, not a change here.Counts
Every correction cites the command that measured it, in its commit message. Nothing was asserted from memory.
The binding:
tools/check-reference-versions.pycompiler.md's first factual claim — the version header — was bound to nothing. It readdelvec 0.1.0,dsl 0.8.0,dsl_version 0.2.0 … 0.8.0while the build is atdelvec 1.1.0/dsl 0.9.0and accepts0.9.0. The body of that same file documented the v0.9 surface correctly; only the header a reader consults first to pick a stage envelope'sdsl_versionwas wrong, and every gate was green because no gate related the two.A second instance surfaced while fixing the first: the
DW0102catalog row restates the supported set by hand and had gone stale the same way.check-dw-codes.pywas green on it and always would be — it proves a code EXISTS in source and doc and is asserted by a test, never that the behaviour the doc ascribes to it is the behaviour the code has.The gate binds both by equality in both directions to
crates/compiler/Cargo.toml,crates/dsl/src/envelope.rs(SUPPORTED_DSL_VERSION+SUPPORTED_DSL_VERSIONS, as an ordered sequence) andversions.toml. Equality is the point: a gate that only rejected newer than the build is exactly what let a storybook ship av1.0marker through the wholev1.1release green (#342), and stale-older is the direction that actually happens — docs are written once, the build moves.Demonstrated red on the pre-fix header and red on the
DW0102row independently, green after. 14 regression tests; verified non-vacuous by mutation (stubbing the gate'sproblemslist empty turns 8 of 14 red). Runs as a step of the existingdocs (local link check)job, so no branch-protection change —check-required-contexts.pystill resolves 12/12.Corrections worth reading
The same phantom class, three more instances. #344 removed
$DELVEWRIGHT_CAMPAIGNS_DIRfromworktree-bootstrap.md§1 today — an override no code has ever read. §2 of the same file carried a parallel one and was not looked at: it said the local config holds "validation ports, container tooling paths" and that absence makes "validation compose runs inherit wrong defaults silently". Nothing invalidation/reads that file; no shell script and no Rust crate reads it. Exactly two Python tools do. A worker who skipped the copy and blamed a red ladder run on it was chasing a cause that does not exist.A "coming soon" for something that already ships.
i18n.mdpromised the dialogue-width diagnostic was "being added separately (engine task #110)".DW0331landed 18 hours before that line was written (bf706ce, 2026-08-03 03:44 vs the line at 21:41) — and the same file cited it as an enforced gate 165 lines earlier. A translator reading the option-label section takes a hard error for advice.skill-workflow.md§8 item 5 was false in every word. It said ADR-0016's version line "exists on paper only" and the skill frontmatter "carriesnameanddescriptionand nothing else". It carriesversion,requiresandverified_with, andcheck-skill-version.pybinds all three.playtest-methodology.mdwas asserting the exact vacuity it exists to warn about. Rule 3 claimed/new-delve"requires all four" declarations. It requires three, and the compiler enforces those (DW0460/DW0481/DW0480). Nothing requires a combat TIER —grep -n tier SKILL.mdfinds it only under Authoring pitfalls, andDW0477fires on a tiered fight nobody can measure, the opposite direction. An untiered set-piece fight compiles green. Also: the findings table's0for round 16 read as "she played and found nothing" — round 16 was an owner playtest, four items, all already-open findings, and it opened with the rebuke rule 4 comes from.tools.md's env-forwarding claim was false, and the first count of it was also wrong.harness/src/reads 15DELVEWRIGHT_*variables;validation/*.yamldeclares 10. The doc said all were forwarded. The first sweep named two exceptions; measuring the set difference rather than spot-checking found four —ACTOR_FLOOR,RETRY_ON_DEATH,CUTSCENE_GRACE_MS,ENTITY_SETTLE_TIMEOUT_MS— plusNOTE_TEXT, which is not a defect (its bot runs on the host). Also:.github/scripts/mecha_crosscheck.py, ADR-0011's cross-check and a required CI job, was entirely absent (grep -c mecha→ 0) from the file that claims to be the whole tool surface.grammar.md:store_room's documented smallest region was5 × 5 × 3;tests/staging.rs:2469asserts[5,5,5]expands and[5,5,4]does not. §4'sProgram::validatelist reads as exhaustive and named 9 of 11 variants. "Two anchor names are shared across rules" — there are three (anchor/landing,drop_shaft+dumbwaiter), so a zone author composing a chute and a duct hits anAnchorCollisionthe doc told them not to expect. And §3 described two different test suites with one sentence, crediting the staging rules with byte-comparison determinism cover they do not have.compiler.mdalso gained the missingtask #179 / dsl_version 0.9.0landed-bullet (semantics read offDW0490–DW0493), and pass-order row 11 listed two-tierDW0359only under exit 3 — it is anEclipseErrorand aDiagnostic::warning, and the file's own convention lists two-tierDW0489in both places.Findings NOT fixed
Code defects — a doc was right, or the code is wrong. Not changed here by instruction.
validation/compose.yamldrops four harness env vars (above).DELVEWRIGHT_ACTOR_FLOOR=0cannot be used through the ladder at all today. This is the general form of the one-variable fix task fix(compiler): effect producers/checkpoints nested in sequences are first-class #102 already applied by hand forRUN_TIMEOUT_MS— per the debug doctrine the instance fix isn't closed until the general form is a gate.crates/grammar/src/library/store_room.rs:57carries the same false minimum ("Z ≥ 3") its doc did, andtests/staging.rs:2467comments "3 of row" beside a check of[5,5,5].crates/dsl/src/envelope.rs'sSUPPORTED_DSL_VERSIONSdoc comment stops at v0.8 — it enumerates what each version added and never mentions 0.9, thoughis_v09below it is documented.SKILL.mdcontradicts itself about gate 4b's images. §4b (2026-08-07, feat(tools): refimg — draw the design-alignment gate's reference images #334) says reference art drawn before any prefab exists; step 9 says the design-alignment Artifact "should have been built from" post-build player-POV renders. Both cannot hold. Likeliest: step 9 predates feat(tools): refimg — draw the design-alignment gate's reference images #334.Process / unresolvable without an owner or planner statement.
skill-workflow.md§8 says "while the bell remake is running the loop for the second time". Nothing tracked in the content repo says where the bell remake stands.playtest-methodology.md's closing thesis — "the owner found nothing because everything machine-findable had already been found" — rests on a session that left no artifact; no post-round-22 owner playtest is recorded anywhere.tools.md, notskill-workflow.md). The rule has no check.i18n translation tool (pytest)actually runs all oftools/tests— it covers eight checkers. The job NAME understates its binding; renaming is the 3-step branch-protection dance, so this is a real cost, not a nit.tools.mdhas no rows forvalidation/Dockerfile.*,tools/tests/, or.github/actions/checkout-content.grammar.mdis illustrated byshow_the_metadata, a test markedignoredthat "asserts nothing" (the values are pinned elsewhere; the block itself binds to nothing).compose::declared_anchorsandcompose::SEPARATORare undocumented public surface.Where a check should exist and today there is only a sentence
Ordered by value. None written here — flagged for scheduling.
tools/check-tool-inventory.py, bidirectional. Enumeratetools/,validation/, every[[bin]]/package name, and every script path invoked from any workflowrun:block; assert each appears intools.mdand that every pathtools.mdnames exists. Red either way, with a binding count. This would have caught the missingmecha_crosscheck.pyrow automatically, and it is the only thing that makes that file's own opening claim true.DELVEWRIGHT_*read byharness/src/must be declared invalidation/compose.yaml'sbotservice or allowlisted with a reason. Closes finding 1's general form.compiler.mdare unchecked.check-dw-codes.pyis bidirectional againstcompiler.mdonly; the other six reference docs cite 42 DW codes that nothing validates. Measured: 41 resolve, andDW0364(intools.md,ci.ymlandbuild-every-campaign.py) exists on open PR feat(dsl,compiler): spec-0026 foundation — horizon library surface, per-area walk_y datum, DW0364/DW0366/DW0367 (dsl 0.9.0) #260 and nowhere on main — legitimate today, which is exactly why this check needs a PENDING concept likecheck-dw-codes.py's rather than a naive membership test.grammar.mdis referenced by no CI job at all (grep -rn "grammar.md" .github/workflows tools/→ empty).compiler.mdgets a bidirectional gate;grammar.mdgets nothing. Cheapest high-value form: assert everyProgramError/ExpandErrorvariant appears in §4 and vice versa — that would have caught the 9-of-11 list on the day it landed. The §5c zone-gate table is the model to copy: its numbers areassert_eq!ed intests/zones.rs, which is why it alone did not drift.skill-workflow.mdto the skill it describes.check-skill-version.pyholds the skill against the CLI; no check holds this doc against the skill. Its item 5 was false for two days and its gate-4b row went stale the dayrefimg.pylanded — both would have been ordinary reds.assert_eq!tests: i18n.md's "143" (CLIENT_LANGS) and "thirteen" (chrome::ALL), grammar.md's "Smallest region" cells. The numbers are restated independently of the tests that pin them, which is precisely howstore_roomdrifted while its test stayed green.Merge note
Four branches (
feat/runtime-state,feat/on-death-root,feat/lethal-volume,spike/death-and-teleport) will each add entries tocompiler.md. Every edit here was kept surgical and line-local for that reason — no section was reflowed, and no surface from those branches is documented.compiler.md's diff is 5 hunks.🤖 Generated with Claude Code
https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL