feat(dsl,compiler): spec-0026 foundation — horizon library surface, per-area walk_y datum, DW0364/DW0366/DW0367 (dsl 0.9.0) - #260
Open
stellarfeline wants to merge 4 commits into
Open
Conversation
…er-area walk_y datum, DW0364/DW0366/DW0367 (WIP: tests/docs follow) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…er-area walk_y datum, DW0364/DW0366/DW0367 (dsl 0.9.0)
Stage-1 horizon generalizes into the spec-0026 composition: string shorthands
(byte-identical for void/ocean) OR the object form {base, ...params}, all six
bases parsed and param-validated; flatland lands end-to-end (grass superflat
ambient one block under the scene walk plane, plains biome, bare);
valley/cherry-valley/summit/sky are reserved (DW0141) until their surround
slices. Placement moves to the per-area datum walk_ref_y - walk_y (DW0367),
retiring plan::OCEAN_BASE_Y; DW0364 proves every placed piece's standable
cells sit above the flood level empirically, with no waterline_y exemption —
the #149 flooded-interior class is now impossible by construction.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This was referenced Aug 4, 2026
…dation # Conflicts: # crates/compiler/src/lib.rs # crates/compiler/tests/cli.rs # crates/dsl/src/envelope.rs # crates/dsl/src/lib.rs # docs/reference/compiler.md # versions.toml
…am, not by this slice The DW0366 row claimed `summit.vista_radius`'s floor was unenforceable because the spec contradicted itself (floor 192 vs default 176). That was true when the foundation slice reported it and stopped being true on 2026-08-04: the spec-0026 amendment (PR #261, on `main` for 66 commits now) resolved both open params — `vista_radius` measured from the scene bounding box, floor 192, default 208; and `blend_width` 1..=16. Enforcement is deliberately NOT added here. Both params configure surrounds this slice does not emit, and the valley slice (task #155 W-B, PR #259, based on this branch) already carries the checks and the corrected default verbatim. Implementing them twice would put a duplicate in the dependent branch's path for no behaviour gained. The row now says what is true: the ambiguity is resolved, the enforcement is owed, and which slice owes it. No behaviour change: `dsl::validate::horizon_rules` and `horizon_defaults` are byte-identical to this branch's pre-merge state. 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 7, 2026
…he board is red (task #44) (#322) Every gate in CI built a FIXTURE. Nothing ever built a real campaign, so the product could stop compiling with the whole board green — PR #260 reached 10/10 while stopping the flagship released campaign `nobodys-cave-island` from building at all (26 x DW0364 on standable cells at the ocean line). New required status check `campaign builds (every campaign in the content repo)` builds every campaign the pinned content checkout carries, in every language its world.json declares, on every push. Campaigns are DISCOVERED, never listed, so the next content re-pin gates a new campaign with nobody remembering. A campaign that cannot build today is recorded in .github/campaign-build-exclusions.toml, which INVERTS the assertion instead of removing it: still built, must still fail, and must fail with exactly the recorded codes — an extra code is a new break that was hiding behind the exclusion, and a success is an expired exclusion. Both red. One entry today: hollow-vigil, DW0331 (task #34). Validator-only: no crate, no emission path and no prefab is touched, so player-facing output is byte-identical. 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.
spec-0026 foundation (task #155 slice W-A): horizon library surface, per-area
walk_ydatum, DW0364/DW0366/DW0367Merge gate: owner playtest batch (engine emission = player-experienceable). Do not merge on green. Machine red→green on the motivating scenario is below and admits this into the batch.
Pairs with content PR stellarfeline/delvewright-campaigns#21 (
worker/spec-0026-walk-y-backfill) —versions.tomlre-pins to that branch's SHA (a63d1a0); re-pin to contentmaintip after the pair merges.What changed (design level)
horizonaccepts the existing strings (byte-identical for"void"/"ocean") OR the object form{base, …params}(spec-0026 §1). All six bases parse with their param schemas;"cherry-valley"desugars exactly to{base:"valley", flora:"cherry", palette:"stone-petal"}(parameter row, not a base — machine-asserted). Fences: the new surface isDW0141below 0.9.0;valley/cherry-valley/summit/skyare additionally reserved at 0.9.0 (DW0141, the npcvendor/bossprecedent) until the W-B/W-C surround slices land — never silently mis-emitted.DW0320generalizes per §5: every non-void base requiresboundary.minecraft:plainsbiome, bare by design;Ambient::Flatlandbranch in the DW0322 boundary model (vacuously safe: ground everywhere, flush). The §3 seam material-dither band + acceptance criterion 4 belong to the surround-generator slices.plan::OCEAN_BASE_Y(deleted): area base y =walk_ref_y − walk_y;walk_yis required prefab metadata for every piece placed in a non-void horizon (DW0367, build/exit 3; pools additionally require entry-role agreement). Islandwalk_y=3→ base 60 — the datum change does not move the island (asserted against the real contentisland-beach-camp).waterline_yexemption — closes the DW0344 gap; DW0344 retained for waterline-declaring shore pieces (sea-mating), message rewritten to name the datum-equation term. Supersedes interim task feat(dsl,compiler): map editor L2 massing verbs — swap/insert/remove/rewire/reseed-piece (spec-0017 PR 3) #149.ratio2..=3,min_drop≥ 100, build-range bounds onplateau_y/float_y) and params foreign to the declared base.compiler::horizon: the one place horizon → physical facts (walk_ref_y, flood_level, generator-settings literals, ambient, slice status).docs/reference/compiler.mdupdated in this PR (rows DW0364/DW0366/DW0367 added; DW0141/DW0320/DW0322/DW0344 rows + the world-output/stage-1 sections updated);tools/check-dw-codes.pygreen (190 codes, all test-covered).Plug-in contract for W-B (valley/cherry surround)
Stated in
crates/compiler/src/horizon.rsmodule docs. A surround generator plugs in with three one-line seams outside its own new module:compiler::valley), consumingdelvewright_dsl::ResolvedHorizon+ the campaign seed, emitting placed prefab tiles like any other piece;horizon::base_implementedtotrue, and delete the DSL-layer reserved-base arm for it indsl::validate::horizon_rules(same PR);horizon::walk_ref_y/generator_settings/nav::Ambientarms with its ambient facts.Everything else (per-area datum, DW0364/DW0367, server-properties plumbing,
check-world-settings.shparity — which asserts derivation, not values, so it is already horizon-agnostic) is base-generic.ResolvedHorizoncarriesratio/rim_height/flora/palettewith pinned defaults;HorizonFlora/HorizonPaletteare typed enums.Machine red→green: the #149 tide-mill scenario
Permanent fixture
spec0026_horizon::flooded_interior_is_dw0364_and_corrected_datum_is_green_and_dry, plus the live demonstration:waterline_y) onhorizon: oceanwalk_y: 3)DW0364— "74 standable cell(s) … at or below the ambient flood level (y=62)"walk_y: 1, what the piece really authors)0 62 0(asserted), walk plane 63 — dryFixture verdicts (acceptance criteria 1/2/3)
{base:"ocean"}object form emits byte-identical to"ocean"(new fixture). Old-engine vs new-engine on the void hello-world:datapack/,server/,critical-path.jsonbyte-identical; onlymanifest.json(content-pin provenance) and the unshippedcreator-datapack/layout.json(version: 0.8.0→0.9.0, the standard consequence of everySUPPORTED_DSL_VERSIONbump) differ — the shipped delve image (Dockerfile.delveCOPY list) carries neither beyond the manifest pin.DW0364,DW0366(5 range + 3 foreign-param cases),DW0367by code; the feat(dsl,compiler): map editor L2 massing verbs — swap/insert/remove/rewire/reseed-piece (spec-0017 PR 3) #149-shaped fixture above is red withDW0364. (DW0365belongs to the sky slice.)island_walk_y_3_keeps_base_60— real contentisland-beach-camp(walk_y: 3) plans at[0, 60, 0], exactly the retired global datum.walk_y: 3→ base 60): old and new engines produce identical diagnostic sets on it (DW0331 ×5 / DW0465 / DW0476 — pre-existing version-adoption debt, red on origin/main too); the datum change alters nothing about it.edit_ocean_breach_strands_the_player_dw0322relied on the mis-datumed placement (walk plane under the sea) that this PR fixes — its breach is now a canonical beach, correctly green. The stranding fixture now uses a genuinely lipped tileset (walk_y: 0, walk plane two over the sea) and still proves DW0322 fires.-D warningsclean;check-dw-codes/check-doc-dupes/check-versions/check-world-settingsgreen.Content pairing & adoption notes
walk_yacross all 36 GitHub-main prefabs (keep 1, cave 2, island 3, hello-room/hero 1–2), verified empirically from the.nbtgeometry (standable-cell histogram + socket-floor probe), and regenerating the keep/cave tilesets from the updated generators reproduces the backfilled files byte-identically. All five generators now emitwalk_y.walk_yadoption when it lands: shore pieces 3, plinth pieces 11 (the tk generator in this PR already derives them from its door list) — same-milestone adoption round per the version-adoption discipline.f5766f7) predated.Ambiguities → reported, not invented
vista_radiusvs its own default: spec saysDW0366onvista_radius < view-distance×16, but summit ships view-distance 12 (§6) → floor 192 > the default 176. Contradiction left unenforced (summit is reserved anyway); needs a ruling in the summit slice.blend_widthrange: none stated; unvalidated (criterion 4's no-material-wall assertion is the real gate, W-B).backdrop/placementparams: deliberately not onHorizonSpecyet — the schema rejects the fields rather than freezing a wire shape before the sky slice picks one (§4 states no wire syntax).cave-shoreauthors an ankle-deep beach (walks flush at its own waterline); under its declaredwalk_y: 2its walk plane lands dry at 63 but its authored pond would sit one block above the world sea. No tracked ocean campaign binds it; documented incave-tileset.md.waterline_y) is untouched.🤖 Generated with Claude Code
Addendum 2026-08-06 — merged
main(66 commits) into this branchThe branch sat while
mainmoved 66 commits; six files conflicted. Resolved bymerge (no rebase, no force-push — PR #259 is based on this branch). Everything
below is either conflict resolution or an adaptation forced by what
mainlanded meanwhile. No player-facing behaviour of this slice changed:
dsl::validate::horizon_rules,horizon_defaults,compiler::horizon,compiler::plan's datum and DW0364/DW0366/DW0367 are byte-identical to370a45b.The two dangerous conflicts
crates/dsl/src/envelope.rs—mainhad independently takendsl 0.9.0.Both sides bumped
SUPPORTED_DSL_VERSIONto0.9.0and both addedis_v09,for different features:
mainfor task #179's declared drops (stage 5), thisbranch for the spec-0026 horizon library (stage 1). Resolved as one version
carrying both surfaces — the established precedent (v0.8 carries spec-0025
and spec-0016 §1), and correct because the fences are per stage: raising
queststo 0.9.0 opens drops and stillDW0141s the horizon object form, andvice versa.
SUPPORTED_DSL_VERSIONSand theordinalarm were identical onboth sides and auto-merged; only the doc contract needed writing, and it now
names both halves and the per-stage consequence.
versions.toml— the content pin.mainhad advanced[content].shato87a8ade(island storybook marker), and contentmainhas since moved to885fd5d. This branch's pin (a63d1a0) was a content-branch commit sitting on4992b4f, four commits behind — reinstating it would have rolled back thestorybook marker, the v1.0.0 engine re-pin and both release fixes. Taking
main's pin was equally impossible: contentmaincarrieswalk_yon zeroof its 36 prefabs, and this engine's DW0367 hard-errors (exit 3) on any piece
placed in a non-void horizon without it.
Resolved by bringing the paired content branch forward instead: content
worker/spec-0026-walk-y-backfill(PR #21) now merges contentmain885fd5d,and the pin is that merge,
5a23d90. The merge result is exactly contentmainplus 36 one-line additions — the same shape as the original backfill,re-derived over
main's regenerated island prefabs (which changed geometry —island-beach-camp21×8×17 → 21×15×44 — and switched to 1-space indent). Theisland values were re-derived, not copied: each regenerated file still declares
waterline_y: 2, and the island convention iswalk_y = waterline_y + 1 = 3.5a23d90is a strict descendant of both87a8adeand885fd5d, so nothing isrolled back. Still a branch sha, still re-pinned to content
mainthe momentcontent #21 merges.
Semantic collisions the conflict markers never flagged
crates/compiler/src/render_plan.rs(new onmain, PR feat(render): first-class panorama emission + Chunky adoption (task #29) #295) matched theold
Horizonenum shape and stopped compiling against this branch'sHorizon::Name/Horizon::Spec. Rewritten ontohorizon::base_of, exhaustiveon
HorizonBase.flatlanddeliberately emits nohorizonkey: therender side's
Horizonis an externally-tagged enum that knows onlyocean,so a
{"kind":"flatland"}invented here would be an unparseable plan ratherthan a better picture. The wire shape belongs to spec-0026 §6's render work,
which lands with the surround slices. Ocean and void are byte-identical.
mainamended spec-0026 itself (PR docs(specs): spec-0026 amendment — vista_radius definition + blend_width range #261, 2026-08-04), resolving the twoambiguities this PR had reported rather than invented —
vista_radiusmeasured from the scene bounding box, floor 192, default 208 (the old 176
sat below its own floor);
blend_width1..=16. The DW0366 doc row's claimthat the spec "contradicts its own default" was therefore false and is
corrected. Enforcement is deliberately not added here: both params
configure surrounds this slice does not emit, and PR feat(dsl,compiler): valley + cherry-valley horizon — surround generator, biome layer, tree layer (spec-0026 W-B, task #155) #259 (based on this
branch) already implements both verbatim. Implementing them twice only put a
duplicate in the dependent branch's path — it was written, then backed out for
exactly that reason, and the row now says who owes the check.
main's(
compiler::pool/DW0498), row 7 + the new 7b are this branch's (walk_ydatum,
DW0364). Thewaterline_ybullet keeps this branch's generalwalk_y − 1statement andmain's concrete island fact, which agree(
walk_y 3 → waterline 2). TheDW0141row ismain's fuller pre-0.8enumeration plus a pre-0.9 clause naming both v0.9 surfaces.
crates/compiler/tests/cli.rsasserteddelvec 0.1.0;mainmadeDELVEC_VERSIONderive fromCARGO_PKG_VERSION(PR fix(compiler): DELVEC_VERSION derives from the crate manifest, not a hand-typed copy #293) and the crate is1.0.0. Took
main's assertion — the branch's literal is stale, not a designdisagreement.
Verification
cargo fmt+clippy -D warningsclean.including
island_walk_y_3_keeps_base_60— the datum survivesmain's islandregen — and the feat(dsl,compiler): map editor L2 massing verbs — swap/insert/remove/rewire/reseed-piece (spec-0017 PR 3) #149 red→green pair.
check-versions/check-world-settings/check-dw-codes(210 codes, alltest-covered, 1 allowlisted) /
check-doc-dupes(68 files) /check-required-contexts(10 ci.yml jobs ↔ 10 required contexts) /check-harness-dsl-version(0.9.0 in the allowlist) /check-skill-version/check-storybook-version(1 campaign, 1 allowlisted) /check-shell-pipe-shortcircuit(15 scripts) /check-compose-isolation(4services) — all green. No job renamed, so
.github/required-status-checks.txtis untouched.
Effect on PR #259
mainalone conflicts with #259 in 8 files. Against this updated branch itconflicts in 3:
crates/compiler/src/main.rs(main's DW0498 advisorychanged
read_structuresfrom&mut planto&plan),docs/reference/tools.md(
maindeletedcheck-worker-override.pyand added five checker rows), anddocs/reference/compiler.md(5 blocks — four are #259's task-#178 wave-countdowncontent vs
main's container-adoption/drops content, plus theDW0141row,which conflicts against
mainregardless). Exactly one block is attributableto this PR: the
DW0366doc row, whose resolution is to take #259's side, since#259 enforces what that row describes.