Skip to content

docs(reference): drift sweep over all seven reference docs, and bind the version header - #345

Merged
stellarfeline merged 6 commits into
mainfrom
docs/reference-drift-sweep
Aug 9, 2026
Merged

docs(reference): drift sweep over all seven reference docs, and bind the version header#345
stellarfeline merged 6 commits into
mainfrom
docs/reference-drift-sweep

Conversation

@stellarfeline

Copy link
Copy Markdown
Owner

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

Files examined 7 of 7
Claims checked ~530 (compiler.md ~120 · tools.md ~150 · grammar.md ~230 · i18n 28 · playtest ~30 · skill-workflow ~30 · worktree-bootstrap 6)
Claims corrected 23
Claims unverifiable (reason stated) 13
Findings recorded, not fixed 11
New binding 1 gate + 14 tests

Every correction cites the command that measured it, in its commit message. Nothing was asserted from memory.

The binding: tools/check-reference-versions.py

compiler.md's first factual claim — the version header — was bound to nothing. It read delvec 0.1.0, dsl 0.8.0, 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 that same file documented the v0.9 surface correctly; only the header a reader consults first to pick a stage envelope's dsl_version was wrong, and every gate was green because no gate related the two.

A second instance surfaced while fixing the first: the DW0102 catalog row restates the supported set by hand and had gone stale the same way. check-dw-codes.py was 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) and versions.toml. Equality is the point: a gate that only rejected newer than the build is exactly what let a storybook ship a v1.0 marker through the whole v1.1 release 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 DW0102 row independently, green after. 14 regression tests; verified non-vacuous by mutation (stubbing the gate's problems list empty turns 8 of 14 red). Runs as a step of the existing docs (local link check) job, so no branch-protection changecheck-required-contexts.py still resolves 12/12.

Corrections worth reading

The same phantom class, three more instances. #344 removed $DELVEWRIGHT_CAMPAIGNS_DIR from worktree-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 in validation/ 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.md promised the dialogue-width diagnostic was "being added separately (engine task #110)". DW0331 landed 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 "carries name and description and nothing else". It carries version, requires and verified_with, and check-skill-version.py binds all three.

playtest-methodology.md was 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 TIERgrep -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 fight compiles green. Also: the findings table's 0 for 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 15 DELVEWRIGHT_* variables; validation/*.yaml declares 10. The doc said all were forwarded. The first sweep named two exceptions; measuring the set difference rather than spot-checking found fourACTOR_FLOOR, RETRY_ON_DEATH, CUTSCENE_GRACE_MS, ENTITY_SETTLE_TIMEOUT_MS — plus NOTE_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 was 5 × 5 × 3; tests/staging.rs:2469 asserts [5,5,5] expands and [5,5,4] does not. §4's Program::validate list 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 an AnchorCollision the 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.md also gained the missing task #179 / dsl_version 0.9.0 landed-bullet (semantics read off DW0490DW0493), and pass-order row 11 listed two-tier DW0359 only under exit 3 — it is an EclipseError and a Diagnostic::warning, and the file's own convention lists two-tier DW0489 in both places.

Findings NOT fixed

Code defects — a doc was right, or the code is wrong. Not changed here by instruction.

  1. validation/compose.yaml drops four harness env vars (above). DELVEWRIGHT_ACTOR_FLOOR=0 cannot 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 for RUN_TIMEOUT_MS — per the debug doctrine the instance fix isn't closed until the general form is a gate.
  2. crates/grammar/src/library/store_room.rs:57 carries the same false minimum ("Z ≥ 3") its doc did, and tests/staging.rs:2467 comments "3 of row" beside a check of [5,5,5].
  3. crates/dsl/src/envelope.rs's SUPPORTED_DSL_VERSIONS doc comment stops at v0.8 — it enumerates what each version added and never mentions 0.9, though is_v09 below it is documented.
  4. SKILL.md contradicts 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.

  1. 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.
  2. 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.
  3. CLAUDE.md's tooling-sync rule was violated by feat(tools): refimg — draw the design-alignment gate's reference images #334 (updated the skill and tools.md, not skill-workflow.md). The rule has no check.
  4. The CI job i18n translation tool (pytest) actually runs all of tools/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.
  5. tools.md has no rows for validation/Dockerfile.*, tools/tests/, or .github/actions/checkout-content.
  6. §6 of grammar.md is illustrated by show_the_metadata, a test marked ignored that "asserts nothing" (the values are pinned elsewhere; the block itself binds to nothing).
  7. compose::declared_anchors and compose::SEPARATOR are undocumented public surface.

Where a check should exist and today there is only a sentence

Ordered by value. None written here — flagged for scheduling.

  1. tools/check-tool-inventory.py, bidirectional. Enumerate tools/, validation/, every [[bin]]/package name, and every script path invoked from any workflow run: block; assert each appears in tools.md and that every path tools.md names exists. Red either way, with a binding count. This would have caught the missing mecha_crosscheck.py row automatically, and it is the only thing that makes that file's own opening claim true.
  2. An env-forwarding gate. Every DELVEWRIGHT_* read by harness/src/ must be declared in validation/compose.yaml's bot service or allowlisted with a reason. Closes finding 1's general form.
  3. DW codes outside compiler.md are unchecked. check-dw-codes.py is bidirectional against compiler.md only; the other six reference docs cite 42 DW codes that nothing validates. Measured: 41 resolve, and DW0364 (in tools.md, ci.yml and build-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 like check-dw-codes.py's rather than a naive membership test.
  4. grammar.md is referenced by no CI job at all (grep -rn "grammar.md" .github/workflows tools/ → empty). compiler.md gets a bidirectional gate; grammar.md gets nothing. Cheapest high-value form: assert every ProgramError/ExpandError variant 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 are assert_eq!ed in tests/zones.rs, which is why it alone did not drift.
  5. Nothing binds skill-workflow.md to the skill it describes. check-skill-version.py holds 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 day refimg.py landed — both would have been ordinary reds.
  6. Doc integers beside constants that already have 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 how store_room drifted 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 to compiler.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

stellarfeline and others added 6 commits August 9, 2026 19:32
`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
stellarfeline merged commit 5e9138f into main Aug 9, 2026
12 checks passed
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant