Repository navigation
feat: places meet seamlessly on living ground, and a place is drawn while the engine says where a body goes (spec-0127, spec-0128) - #1246
Merged
Conversation
…are sized and composed, and what a program sets A new section records, with each rule marked cited, measured or authored, how a plot is planned with what it holds: setbacks and coverage from two public zoning records, the narrow trade plot, the farmstead's plans and the house's position against the yard, a precinct as a sequence, a close, a bailey and a camp as a wall round a strip round structures, a quay's parts, the game's own template footprints read from the pinned jar, and the programming method of summing areas then grossing per project. The cut-and-size section is rewritten so the plot rule stands alone: the bigger-box-per-building reading is recorded as the wrong one, and the fixed trade figures are replaced by per-part bands. Measured: 36 plains house templates in minecraft_server.1.21.11.jar (sha256 f83b8e09…), footprints read from each template's size tag; houses 7x7 to 13x11, trade sites 9x8 to 15x7. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A plot is one box holding one or more related structures and the ground they share, in any theme; its parts are declared on the layout-graph node at the cut (nodes[].holds[]: a structure or ground, its use in the author's words, its play space in cells, walked or seen, a structure's height), the box is confirmed able to hold them, the piece's contract binds each part (part on a space or an out-of-walk region) and the build confirms it built, walked and within a quarter of its cells, a threshold frame is drawn per part and read blind, and the outline inside the plot is free. Nothing in the surface names a building type; a plot of one structure and no ground is legitimate. Two diagnostics written DW-new until allocated. The spec reads today's checks against an L-shaped structure in an open box and finds them admitting it, with the threshold frame as the one gap. The spec index gains the row; docs/demo-levels.md gains The Lane of Holdings. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…123 amended to agree references/placement.md replaces its one-box-per-building bullet and its room-for-rooms bullet with the plot rule: cut one box per plot or connector, plan the plot's parts before its box and size the box from them, build free inside; the fixed 12 x 12 and 14 x 14 figures and the identities[] binding of a trade building's box are removed. spec-0123, Proposed on this branch, is amended in place at its title, section 1, section 2, section 4, its pages list and its first acceptance criterion so that no two authorities hold the cut; its style and trade sections stand unchanged. Measured: grep -c over placement.md for "12 × 12", "14 × 14", "one box per building" and "yard is its own" is 0 of 1 file; "per plot or connector" is 1. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… never the real world's The research section is rebuilt on the ruling that the game's village houses are a lower bound, that recognised builders and build teams are the primary source for size, style and composition, and that real-world lot planning says only which parts belong together and how they are arranged. The community's rules of scale are cited (the body, ceilings and room heights, rooms by purpose, the footprint in wool, depth and the garden), 58 documented community builds are measured by their stated bounding boxes and grouped, the real-world records are kept as arrangement only with every figure left behind, and the plot rule's bands, its size test and every worked example in the spec, the guide and spec-0123 are rebased on the community's middle half. Measured: 58 GrabCraft listings read for width x depth x height. Dwellings n=25, bounding footprint q1 143 / median 208 / q3 322 cells, estimated play space (w-3)(d-3) 80 / 130 / 221, ridge median 16. Inns and shops n=11: 202 / 342 / 440 bounding, 124 / 240 / 323 play, ridge 13. Barns and stables n=6: 160 / 266 / 385, play 92 / 176 / 272. Chapels n=5: 285 / 300 / 612, play 192 / 198 / 465. Sheds and a well n=3: 36 / 36 / 68. Street pieces n=4: 7 to 10 wide with verges. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The spec and its index row move from Proposed to Approved; nothing else changes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The layout graph's node gains `holds[]`: parts `{id, kind, use, cells,
height?, reached?}`, `kind` a mechanism (`structure` | `ground`), never a
use. Part ids are `part/<kebab>` (DW0110) and unique within a node (DW0111);
`cells: 0`, a blank `use` and `height` on a ground part are DW0100.
DW1073 (validation, site plan): a plot under a `clearance` lid, parts whose
cells sum past the box's play space, a structure's `height` past its `open`
courses — each shape named with its numbers. Validation prints
`plot program: P plot(s) over N node(s), K part(s) — S structure(s), G
ground(s), R seen; cells declared C of A play space`, or `0 plot(s) over N
node(s)` on a graph declaring none.
The grammar's contract gains `part` on a space and an out-of-walk region,
fenced at program version 1.13.0 (PART_SINCE), spelled `part/<kebab>`; the
export writes it into the piece's contract metadata.
DW1074 (detail, compiler::plot, one judge): unbuilt, undeclared, not walked,
out of size (outside 3/4..5/4 of the declared cells). Shapes 1, 2 and 4 read
the metadata in detail::check (every verb's validation, detail --check and
build included); `delvec detail` judges all four over the expansion and its
own flood (grammar::contract::walked_cells) and prints `parts: B of K
bound, W of R walked`; the build judges the walk again over each plot
piece's shipped templates. `delvec detail` hands the node's parts into the
expansion (ExpandOptions::parts, plot::handed_parts).
The build writes validation/plot-program.json beside the census (coverage,
programmed share, remainder; per part declared and built cells, ridge,
roofed share, setbacks, gaps, bound regions with an enclosed clearance) and
prints `plot program: P plot(s), K part(s) built B of K; coverage min–max %,
remainder min–max %`. The render plan draws one threshold shot per part per
crossing of each detailed plot; the index line gains `, Q part(s)`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…— with its probes spec-0125 §11. The site-plan point's node/exit declares holds[] of three parts: part/court (ground, walked, 52 cells), part/well-house (structure, height 3, 1 cell) and part/bed (ground, reached: false, 3 cells). The yard the generator writes gains a stone well-house against the far hall's wall (walls of two courses round one cell of floor, a door in its south wall, a lamp in its west wall, a spruce roof) and a bed of poppies on grass along its open west edge; its contract names `part/court` on the court's four boxes, `part/well-house` on the well-house's room and `part/bed` on the bed's out-of-walk region, with a walk edge through the well-house door and an out-of-walk region over its roof. The seat moves off the well-house's cells to [3, 5, 2]. Departure, declared: the court is the generator's yard, not a program `programs/exit.json`. The yard carries the cellar hatch, the trough and the gantry ladder other specs' elements and probes stand on; re-authoring it as a program would move every one of them. So the parts are bound by the generator's contract, the two probes that break a binding swap the court's piece for a probe-only variant (gallery-yard-well-unnamed, gallery-yard-court-undeclared), and `detail --check` over a program plot is proven by the crates/delvec tests instead. Probes (8), each refused with its code through check-gallery-coverage's own runner: a-plot-under-a-lid (DW1073, on the annex: a lid on the court closes the gantry ladder's seam first), a-plot-smaller-than-its-parts (DW1073), a-part-taller-than-the-sky (DW1073), a-part-nobody-built (DW1074), a-part-the-plan-does-not-declare (DW1074), a-part-built-half-size (DW1074, the bed doubled: the court doubled is too large for its box first), a-kind-the-schema-cannot-spell (DW0100), a-height-on-the-ground (DW0100). `delvec detail` refuses a plot its box cannot hold (DW1073) before judging the piece, through the plan check's own function. Measured on the site-plan point (local build): validation `plot program: 1 plot(s) over 10 node(s), 3 part(s) — 1 structure(s), 2 ground(s), 1 seen; cells declared 56 of 64 play space`; build `plot program: 1 plot(s), 3 part(s) built 3 of 3; coverage 2–2 %, remainder 13–13 %`; `threshold shots: 26 over 10 place(s), 18 door(s), 5 open side(s), 3 part(s)`; the ledger lists court 52/52, well-house 1/1 (ridge 3, clearance 2), bed 3/3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ference carry the plot scripts/handout.py writes *What this plot holds* for a place whose node declares holds[] (spec-0125 §6.1): the ruling's sentence, one row per part (id, kind, use, cells and share of the play space, height where declared, walked or seen), the binding sentence and the four placement lines of place-craft.md §8.5; *The frame* gains the sky-open sentence; a neighbour plot's parts are stated by use; the binding counts gain `parts`. references/detail.md states `part` on a contract space and out-of-walk region and the four shapes, naming place-craft.md §8; references/visual- review.md gains the fourth blind line, the holding, and `holding misses H`; SKILL.md step 2 plans the plot before its box and step 12 names the part frames. The DW codes stay off the skill pages until the pin carries them (check-skill-page rule 17). docs/reference: compiler.md (nodes[].holds[], the validation and detail lines, ExpandOptions::parts, validation/plot-program.json, the threshold part case and its count), the catalog rows (dsl/siteplan.md DW1073, the new delvec/compiler/plot.md DW1074), grammar.md §2d (`part`, version 1.13.0, the ledger rows), tools.md (the handout's section). Tests: dsl v13_layout_graph (holds accepted and counted, zero line; DW0100 kind/cells/height/unknown key; DW0110, DW0111; fmt's canonical order) and v14_site_plan (DW1073 three shapes and the fitting plot) — 50 and 77 pass; grammar_contract (part accepted and exported, fenced at 1.12.0, spelled part/<kebab>, refused on an edge) — 3 pass; compiler::plot unit tests (the four shapes over a three-part plot, the tolerance at both ends) — 5 pass; place_reads and detail_verb gain the gallery ledger, the part frames, the perturbation, the handed parts and the verb's refusals; test_handout gains the plot section and its absence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The plan's `threshold_shots` object gains `parts` beside the line's `Q part(s)`; place_reads caught the object without it (7 of 8 passed, this one red). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`nodes[].holds[]` changes what a layout graph says. Set through the version sites tools/lib/version_sites.py names: by hand crates/dsl/Cargo.toml (the authority), Cargo.toml [workspace.dependencies], versions.toml dsl_crate_version and dsl_crate_req; cargo update -p delvewright-dsl for Cargo.lock and the prefab generator's Cargo.lock; tools/ci/check-reference-versions.py --write (5 bound claims); delvec fmt over every tracked document stating 0.67.0 outside the decision records: 349 examined, 349 rewritten, 0 unparseable. version_sites.py verify exits 0: 349 of 350 dsl_version statements equal 0.69.0, the one other in OLDER_DOCUMENTS. The grammar program document's version moves to 1.13.0 (PART_SINCE) in the engine commit; it was not among the numbers handed to this round, and is flagged to the planner. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
check-grammar-ir-compat holds one FencedConstruct refusal per ledger row, under a guard that reads the field: `part` on a space and `part` on an out-of-walk region are each refused below 1.13.0 on their own. The checker reds before (2 rows, 0 refusals reading `part`) and is green after (28 above the floor with a fence ir.rs refuses on). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The row's status names the content branch it is built on, demo/the-lane-of-holdings, not at the content pin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
grammar::version every_fence_opens_exactly_at_its_own_version holds one row per ledger version above 1.0.0; 1.13.0 had none (the remote full run: 1320 passed, this 1 failed). 4 of 4 grammar::version tests pass with the row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It had split the table, leaving the `no_body_majority_ack` row detached (tools/tests/test_mdtable.py, the one red of 1774 in tools/tests). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The remote full run (cargo test --workspace --no-fail-fast at 53b93cf) reddened four tests beside the fence table fixed before: - module_list (2): the compiler module doc names `plot`, in declaration order, after `plan`. - detail_verb detail_check_binds_a_plots_part_and_refuses_each_shape: the blockout exit's room claims 64 columns, not 48; the plot fixture declares 64. `delvec detail` names the piece `prefab/<id>` in DW1074, as the bindings check does. - starter_program the_starter_passes_the_check_unedited_on_every_place_of_the_ gallery_site_plans: the court is now a plot, and an unedited starter names no part. For a plot the test now holds the starter to exactly one refusal per declared part, DW1074 unbuilt, and no other error, and counts the plots it judged so. This is a loosening of what the test asserts for a plot (it no longer demands --check green there), declared in those words: a plot's parts are its author's to build, and no starter can name them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1.13.0 is a door or gate kept as decoration (spec-0124), held on that change's branch as DECORATIVE_SINCE. PART_SINCE moves to 1.14.0; 1.13.0 stands in the ledger reserved for DECORATIVE_SINCE, deleted by the change that defines it. LATEST_PROGRAM_VERSION is 1.14.0. grammar.md's ledger and fence table, the detail reference and the fence test follow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t asks --check green again The allocation carries the plot's parts, read by compiler::plot::handed_parts: the handout states them from it, `delvec detail` binds the expansion against them, and the starter lays each one, so the three read one derivation. The starter keeps the columns beside every opening, ladder, landing, gate and open side as the room, and lays each walked part as a space of exactly its declared cells, run by run across the rest of the play space, with a walk edge between every two walked spaces that touch; a part seen and never entered is a solid mass under a no-body region taken from the far end, only where the walked floor stays one piece. The program is written at 1.14.0. The starter test's plot branch (one DW1074 unbuilt per part expected) is reverted: a plot's starter passes `detail --check` unedited, as every other place's does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ion 5 over a two-box plan The starter lays the handed parts by the open floor of the play space: the columns beside every opening, pillar, ladder, alcove and gate stay the room, so every edge the room declares keeps its cells; a walked part takes the next run of its declared cells, a part seen and never entered is an out-of-walk region over the floor no edge reaches, taken from the far end only where the walked floor stays one piece and never inside an open side. An open side's run is one way out per walked space standing inside it. The gallery court (64 cells of play space, 56 declared over three parts, three open sides) passes `detail --check` from the starter unedited: `node/exit: parts: 3 of 3 bound, 2 of 2 walked`. Criterion 5's test moves to a two-box plan: atmosphere-threshold's node/far made a plot of a walked court (60), a walked house (30) and a seen bed (8), the starter run on its allocation. The green check binds 3 of 3, walks 2 of 2 and raises no DW1074 over the seen bed no flood reaches; then one edit each raises DW1074 unbuilt (the house's `part` dropped), undeclared (the node's holds[] removed), not walked (the bed declared walked) and out of size (the court declared at 120). The 7-box blockout test that bound one part is deleted. The handout fixture is re-recorded: the yard's allocation carries its three parts. The starter test takes back no program a refusing starter never wrote. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…(spec-0125 criterion 13) The second perturbation of criterion 13, measured and restored; no tree change. Instrument: delvec 1.15.0 dev build of 87e90f4 (force-rebuilt), the site-plan point materialised by tools/ci/gallery_domain.py and built by `delvec build` over the pieces tools/ci/gallery-prefabs.py writes. Perturbation, in gallery/prefab-generator/src/main.rs, restored from a scratch copy: WELL_ROOF_Y from YARD_FLOOR + 2 to YARD_FLOOR + 3. The roof then stands in the yard's top course, so the same edit drops the `well-roof` out-of-walk box (it would sit outside the piece) and declares `up` in the yard's shown_faces (otherwise DW0885 refuses the roof's top face standing in open air). validation/plot-program.json, part/well-house: ridge 3 -> 4, clearance 2 -> 3; built 1, roofed share 1.0 unchanged; those two lines are the whole diff (sha256 c02d4936be367ade… -> 160dcedd6ef84db2…). The build's lines are unchanged: `plot program: 1 plot(s), 3 part(s) built 3 of 3; coverage 2–2 %, remainder 13–13 %`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…plicit choice A box's `sides` key absent now reads as open: no wall is stood on that side and the ground meets across the seam. `wall` stays available as an explicit declaration. A box with no `sides` is seamless all round. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…arches only A contact carries no stair, so the remedy DW1064 named was unreachable for a flight between two seamless places. compiler.md states the open default and the stair exemption. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every box in a committed site-plan fixture, gallery overlay and probe that left a side undeclared now states `wall` there, so each keeps the bytes it derived under the old default. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he reach graph judges its falls The one-floor clause of contract-well-formed is gone. What it kept is judged by the reach graph over the space's real cells: contract- reachability walks every standable cell from the way in (unchanged), and now also refuses a fall-in pocket inside a space spanning more than two levels (fall_in_pockets: World::trapped_places back to where a body came into the space). Look build for Doune as one plot; unproven. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…without the ladder it reds Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…are the other three walls The gym bay declares its walls, so the metrics gym measures the rooms it measured. blockout asserts a box with no sides derives the open-all-round map. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… never a leak (DW0836) Claim 2 read every open cell of a shared wall outside the seams openings as an unallocated way. Between two seamless places (a flight and the street it lands on) the cells above a stair opening are open because no wall stands there by declaration; the open-side runs of both places now join the allowed set. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A portal frame on a side that stands no wall is a lintel floating over open ground; the derivation skips it where either place declares the side open. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…im-2 reading Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… re-measured without the default barrel Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…y kind Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… pages name the new surfaces spec-0128 §10 and criteria 15–23: the handed ground, the opening refusal, the handed way, no default container, `verge_life(at=…)`, the top-course lamp, `--check` running the commit's battery (lifting spec-0127 §5's three proofs), the wave bound over a removed program, the declared-out-of-walk finding, the working-copy id, `cutaway=<y>`, `frames --program`, and the proof on the town; criterion 22's `--at node/` camera recorded as debt. `place-craft.md` §10.8: what a reference row is when the community has no build of the trade or a page cannot be read. `tools.md` names the allocation's `way` and full ground states. A test for `frames --campaign --program`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the commit does; tests write programs canonical; the starter's claim stated against the widened check The first remote run of the workspace at f9a7fca (`--no-fail-fast`) had three targets red, each a consequence of this branch: - `detail_check_agrees`: the commit printed the judge's binding (it names DW1063) before its write and `--check` only after its scratch marker. Both now print it from one site before anything is written. - `detail_verb` (3 tests): the tests wrote programs with `to_string_pretty`, which `detail` now refuses (DW0773); they write `to_canonical_string`. - `starter_program`: the bare starter's programs on the gallery's site plans pass everything up to the commit's write, and the commit's battery, which `--check` now runs, names whole-map verdicts an empty place cannot answer (DW0821 a vista, DW0986 a crossing, DW1054, DW0426 a pressable a station names) on 12 of 17 places. The test asserted before exactly that pre-write pass and a DW0885-free battery; it asserts the same in the check's new words. The handout, detail.md, SKILL.md, the starter's docstring, tools.md and spec-0128 criterion 1 say so, declared there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The floor role the first draft edited lies in no cell the drawn world holds (a region scan of both worlds found no gold either way). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The wall and floor roles lie in cells the frame voids; the ceiling shows in the drawn world (a region scan finds gold in 4 chunks with --program). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…o ladder in its steps The starter stood a pillar, a landing and a ladder under every opening two or more courses over the walk plane (`Place.approach`), and the pillar and ladder overwrote whatever the drawing put there. Under a flight or a ramp that is the drawn way up, so the town's ten flights and twenty climbing road legs each carried a ladder set into a stair tread, and the pillar ate the top steps so the last rise was a full block with no stair. `Model.climbs_to(edge)` says the drawing carries a body up to that opening itself: the starter then stands no pillar, landing or ladder and the seam is the plain walk the engine proves. A drawing that writes into those cells without saying so is refused with the cells, never overwritten; a drawing that leaves them empty keeps the ladder. tools/tests/test_starter.py: 7 passed (the new test_a_drawn_way_up_to_a_raised_opening_stands_no_ladder among them); test_town.py + test_handout.py: 65 passed. pytest 9.1.1, local macOS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A flower pot on a bottom slab and a cart bed of two top slabs over the street are blocks the server keeps, and each shows half a course of air under itself, so a player reads it as floating. `compiler::resting` judges the load world `DW1002` judges, from the pinned jar's outlines: a block is a candidate when half a course or more of air stands between its outline and the outline under it and the gap comes from a half-height surface (it is a top slab or top trapdoor, or it stands on a surface that stops at half a course); a block whose `canSurvive` rule reads no neighbour below hangs and is none. A candidate group is held by a non-candidate it touches across a side face, or by a ceiling mass over it; what is left is reported per piece. A warning, never a refusal: the engine states what it measured, and the binding line prints on every build. `attached::judge_over` takes the load world laid once, so the two judgements share it. cargo test -p delvec --lib resting: 3 passed; clippy -D warnings clean; check-dw-codes.py: 486 source codes documented, all covered. Local macOS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…verge cart rests on its own ends `town.flight` and `town.ramp` draw the way up to the opening above, so where the starter would stand a ladder under it they say so (`climbs_itself` -> `Model.climbs_to`); without it the starter's new refusal would stop them, and before it the ladder overwrote their steps. The verge's and the lane's cart was two top slabs over the street (with a bale on one): half a course of air under boards, which reads as floating (`DW1076`). `town.handcart` draws it as two upside-down stairs back to back, each standing on its own end, the load on the first; the lane draws one only where both cells are clear. The stretch digest moves for the cart (`EXPECTED_DIGESTS["stretch"]`), the other four hold. test_town.py + test_starter.py + test_handout.py: 74 passed, pytest 9.1.1, local macOS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s is refused, never declared out of walk A lighthouse's gallery walk ran between the rail and the lantern room's glass, and at each diagonal the rail post and the glass touched at their edges: the reach graph (rightly) took the walk no further, the rest of the gallery was claimed out of walk, and a player saw a gap to squeeze through that a body is too wide for. The reach model is right here (a survey seeded on the west walk reaches the door and nothing past the first corner), so the defect is readability, and the starter is what claimed the floor `unwalked` on the author's behalf. `Plot.pinches`: an unreached standable cell of the play space diagonally beside a reached one at the same course, a block a body cannot stand in on each of the two cells between them, is refused with the cells and both blocks; the repair opens the corner or widens the walk. Across the town's 95 places the census finds the class in one, the lighthouse (10 such cell pairs over 6 cells); regenerating every starter-drawn place on this revision writes the same bytes. tools/tests/test_starter.py: 8 passed, pytest 9.1.1, local macOS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the room Beside an open side the starter claims the ring cell as the room (no corner post marks an open place's edge). Under a seam whose plane the neighbour owns, the cell straight out from the opening's end column is that ring cell, so once a flight climbs to its raised opening itself (no landing to be the opening's space) the room stood on both sides of the opening and `exterior_faces` gave the way no side: `delvec detail --all` refused all 30 of the town's flights and climbing road legs with `DW0844`. A cell straight out from any opening, beyond its plane, is now left to the neighbour. Regenerating every starter-drawn place of the town on this revision moves those 30 programs and no other; `detail --check node/flight-1` passes its place gates and binds. tools/tests/test_starter.py + test_town.py + test_handout.py: 75 passed (the raised-opening test asserts the cell; with `before_opening` forced false the cell is the room again, so the assertion reds). pytest 9.1.1, local macOS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hands, a front carried to the corner - pave_way paves the handed clear columns (`clear=`), verge only outside them; kennel at three wide, kerb at five: a way of any width has paving (lane-5's four clear of five laid verge, kerb, kennel, kerb, verge). - way_verge builds the frame verge_life furnishes, for a stretch, a lane, a ramp or a flight; each returns it. A column's thing stands at its own course (a ramp's landing), never on a step. - lane's things stand on the verge outside the clear way, never on cols[-1]; `edge` picks a side, `clear` where no way is declared. - verge_life takes `sides`, a `hedge` kind and a cart with no load. - street_front carries the front over a yard run shorter than the wall is tall instead of a one-cell pier with coping; the columns it hands back are recorded (Model.unpart) and the starter's part sizes name every column named for a part and left out, with why. Digests: stretch, market, rail and flight unchanged; lane re-measured. tools/tests/test_town.py: 46 passed (pytest 9.1.1, local venv). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ool and cost; whether the notice covers scenery - Six numbered steps: start (starter.py), measure the palette (block-appearance.py) before drawing, draw (the generator), look alone (grammar expand + render piece), look in place (frames --campaign), check (detail --check). Steps 1-4 are the edit loop; 5 and 6 run when they are clean. "Run it as often as you like" and "check after every edit" are gone. - Measured costs stated per step (16 GB Apple M2 Pro, delvec 1.15.0 at c965e9f, 95-place town): generator about 1.5 s, expand about 2.5 s / 0.4 GB, render about 2 s / 0.4 GB, frames about 3 min / 11 GB, check 12 to 13 min peaking at 18.8 GB. - The orbit bearing turns clockwise seen from above (0 south, 90 west, 180 north, 270 east); a face=up picture has south at its top, west at its right; a camera stands in a place's frame with --camera … --frame <place>. - The containers paragraph reads quests.containers.decoration_notice and the place's loot-filled owed names: whether scenery is covered here, and whether it would mix with a container that matters (DW1024). - The generator path is the campaign's own design/generator/**/<stem>.py where one exists. tools/tests/test_handout.py: 27 passed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`frames --campaign --camera x,y,z,yaw,pitch[,fov] --frame <place>` reads x,y,z in the place's piece-local frame (`delvec allocation`'s world_min is the origin) and prints the world position it resolved to, so an author stands a camera at a cell of a place or on a neighbour's way with no world arithmetic. A place with no box is refused before anything is drawn. The --camera and --orbit help state every cardinal and the turn's direction. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he skill - place-craft §10: rule 2 names the one verge mechanism and the handed clear way; rule 4 says a yard wall at least as long as it is tall, a shorter run the front carried to the corner; rule 5 leaves the street edge to rule 4; rule 13 (new): a trade whose goods have no block shows itself by what it works with, with the display-without-giving gap and its vanilla primitives. - town.md mirrors them line for line and maps any way's verge to way_verge / verge_life; detail.md and the starter's docstring state the edit loop as the steps of seconds and the check as minutes. - tools.md, compiler.md: frames --frame, the orbit's turn, every yaw; the town helpers, the starter's part sizes, the handout's steps. - spec-0128 §11 and criteria 24-30, checked against this branch. - test_starter: part sizes name the columns left out (red on the base). - frames test: the plain run is told apart by the --frame line itself. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat/fresh-gaps-2 claims, from base c965e9f: - every way returns a verge frame (way_verge); pave_way(clear=); clear_cols; - lane furniture stands on the verge; - a yard wall at least as long as it is tall, else the front is carried to the corner; - starter part-size lines name left-out columns (Model.unpart); - the handout reads the decoration notice, states camera conventions and costs, and the six-step order; - frames --campaign --camera ... --frame <place>; - spec-0128 section 11 and criteria 24-30. First of two entries; no conflicts (a fast textual merge onto an unchanged base). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…branch feat/town-notes claims, from base c965e9f: - a drawing that climbs to a raised opening says so with Model.climbs_to(edge); the starter then stands no pillar, landing or ladder, and an unsaid write into the ladder approach is refused with the cells; - a ring cell straight out from an opening is never claimed the room; - Plot.pinches: floor joined to reached floor only through a blocked corner is refused; - DW1076 (compiler::resting): a block that reads as floating is warned; - town.handcart: a verge cart's bed is two upside-down stairs resting on its ends; - town.flight and town.ramp declare climbs_to. Conflicts and resolutions: - town.py imports: the union (OPP for handcart; is_full, leaves for fresh-gaps-2's way_verge and hedge). - town.verge_life: fresh-gaps-2's signature (cart_load optional, sides, hedge) and docstring, the cart described as town.handcart; the cart is drawn by handcart at the verge course fresh-gaps-2 computes. handcart keeps fresh-gaps-2's load rule: a hay bale is laid along the way, any other load is set as given, None draws none. - town.lane: fresh-gaps-2's verge_life-based lane; its carts become handcarts through verge_life, so notes' claim holds without a second cart drawing. - town.ramp: fresh-gaps-2's None return and clear_cols, with notes' climbs_itself. town.flight auto-merged: clear_cols and the returned frame, with climbs_itself. - docs/reference/tools.md: three rows (starter, town, handout) merged word-wise against the base; both sides' additions kept, no conflict left between them. - tools/tests/test_starter.py: both sides' new tests kept. - tools/tests/test_town.py: EXPECTED_DIGESTS re-measured on the merged helpers: stretch 0738cf0fee822b4a (notes' value: fresh-gaps-2 did not move this case), lane f187118b3fddf836 (both moved it). Cross-check: the lane's cells drawn by fresh-gaps-2's helpers and by the merged helpers are 208 cells on the same keys, differing in exactly 2 cells, the cart's two top slabs become the handcart's two top stairs. - notes' test_a_drawn_way_up_says_it_climbs... called flight and ramp without a clear width, which fresh-gaps-2 now requires where the plan declares no way; the test states clear=3 (the cross-feature pair, tested). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
crates/delvec/tests/module_list.rs (the_module_list_is_in_declaration_order) was red on feat/town-notes @ 92bb8d6 and on this integration: the doc bullet for `resting` stood after `attached` while `pub mod resting;` is declared after `respawn`. The bullet moves to follow `respawn`. Direction: test-only; the red could only turn a proof red, never let anything ship. Found by the integration's no-fail-fast `cargo test --workspace` on the remote build machine: 378 test binaries, 5200 passed, 1 failed (this one), 12 ignored. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sign lines The signs feature (a9d0981) added sign.hall.back.0, sign.hall.back.1 and sign.hall.front.0 to gallery/l10n/zh-cn.json, but the ocean-horizon overlay carries its own zh-cn.json, which replaces the gallery's and lacked them: its build refused with three DW0180 (sidecar missing a translation), so check-whole-map-render.py reported "ocean (ocean-horizon): delvec build exited 1". Reproduced on the base: the same materialised ocean-horizon source and the same gallery pieces, built by delvec release-built at feat/town-merge c965e9f and at this branch, refuse with the same 3 DW0180 each, so the defect is the town branch's, not either merged side's. The three keys are copied from the gallery's sidecar into both `content` and `source` of the overlay's, in canonical (sorted, 2-space) form. Direction: a build that refuses; it could only turn a proof red, never let anything ship. After: check-whole-map-render.py, release-built delvec at this tree, local: 3 horizon bases, 3 points, 3 builds exercised, 3 of 3 panoramas framed, 24 stated cameras judged over 3 camera records, 0 findings (was 2 builds, 1 finding). The other overlay sidecars (site-plan, site-plan-solid) are their own campaigns' subsets and are judged by their own builds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, --stage-anyway) Brings origin/main @ 1f068cd into feat/town-merge @ d06b9e5. What main claims (three commits the town branch lacked): - 0ef8230 perf(reach) (#1239): one reach graph memo per world, and World::body_flood flies only the launches the envelope says can add a cell; its set is still the closure of World::body_edges under the confinement, output byte-identical, gallery binding diff empty. - 73e6334 docs(constitution): a direction is explored and looked at first; spec, gallery element and demo level are owed at merge. - 1f068cd fix(staging): --stage-anyway overrides every refusal of the staging gate and names each one. What the town branch claims on this file: World::body_route names a leak's route (DW0838) as the fewest moves of the reach graph, ties in cell order, over exactly the moves body_flood's closure holds (spec-0127 "each leak names its route"); the town branch did it by routing body_flood and body_route through one breadth-first confined_closure over body_edges. The conflict, crates/delvec/src/compiler/nav/world/reach.rs: main rewrote body_flood's body (envelope-pruned launches); the town branch had replaced the same body with a call to confined_closure. Resolution: body_flood takes main's body verbatim (its pruning, and the speed #1239 measured, kept for every flood); body_route keeps the town branch's breadth-first confined_closure over every edge of body_edges, byte-identical to the town tip's, because main's pruned walk skips launches that cannot add a cell and so cannot promise a fewest-move route. The two walks are held to one set by a new assertion in reach::agreement (next commit). confined_closure and body_route's doc comments say which walk is which. Auto-merged without conflict: docs/reference/delvec/compiler/nav.md (main's body_flood paragraph and the town branch's edits touch different lines) and docs/reference/tools.md (main's staging-gate row, the town branch's detail/grammar rows). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019qiQFhKtTpTbYnn9NZBbSd
World::body_route walks every edge of body_edges breadth-first to name a fewest-move route; World::body_flood skips launches the envelope says cannot add a cell. The agreement test now asks the route's walk, run to the end, the same generated parkour cases and asserts it equals DW0838's flood. blockout.md's DW0838 row says which walk the route is named over. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019qiQFhKtTpTbYnn9NZBbSd
Both specs' Status is Accepted. Every criterion was re-checked against the town branch with main @ 1f068cd merged in: every test a criterion names exists in the merged tree (49 names across the two specs, 0 missing). Debts paid since the specs were written, each now naming its test: - spec-0127 criterion 2: the crown clearance over a slope, a_crown_stands_three_or_more_over_every_column_it_covers_on_a_slope; - spec-0127 criterion 5: open -> absent perturbation, an_undeclared_side_owes_no_clear_width_and_has_no_front (open sides 5 -> 4, threshold shots 26 -> 25); - spec-0127 criterion 6: dw1064_admits_a_stair_across_a_side_declared_open. Debts that stand: spec-0127 criterion 3 (no test of Site::fixed_top on an open side) and spec-0128 criterion 22 (the --at node/<place> camera is passed but not asserted). spec-0128 criterion 13's test count is the tree's, 48. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019qiQFhKtTpTbYnn9NZBbSd
check-numbered-doc-index refused the index rows that still read Proposed. Correction to the previous commit's body: the criteria of the two specs name 64 tests, not 49; all 64 exist in the merged tree (the two holders.json keys criterion 8 of spec-0127 says are absent are absent). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019qiQFhKtTpTbYnn9NZBbSd
…onstitution) chore(sync): main into the town branch (reach perf, --stage-anyway, constitution)
…ce, tests two at a time) Merges origin/main @ 9c50a20 (#1244's perf change) into the town branch @ 51c0d67. One textual conflict, in crates/delvec/src/compiler/light.rs, DarkSurvey::survey: both sides made the same code change (read the dense LightField per cell instead of copying LightModel::flood's map) and wrote different comments for it. The merged comment carries both claims: the map is the field's lit cells copied out, it is huge for a site plan reaching the horizon, and a cell it does not hold reads 0. The town branch adds no nested cargo build that would need common::nested_cargo / build_toolchain. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019qiQFhKtTpTbYnn9NZBbSd
`tools/tests/test_town.py` imports the creator plugin's `scripts/starter.py` and `scripts/town.py` at module level. It was not listed in `conftest.WHOLE_TREE`, so it fell to the narrow `tool-tests` job by default, whose declared reach is the tools and the engine readers, and that job's reach guard failed the run during collection: reach guard: outside the reach during collection: ['open .claude/skills/.../scripts/starter.py', 'open .claude/skills/.../scripts/town.py'] The placement was wrong, not the reach: `tool-tests` is declared as the job that tests tools under `tools/`, and tests of the plugin run under `tool-tests-tree`, where `test_starter.py` (the sibling testing the same script) already sits. The file joins it there; the group's `why` names both readers. Measured on the remote, `DW_CI_REACH_GROUP=tool-tests python3 -m pytest -q tools/tests` (pytest 9.1.1): red before (1084 passed, 2 skipped, guard names the two reads), see the commit's round report for the green counts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019qiQFhKtTpTbYnn9NZBbSd
No file changes; the measurements of 52600d7 (merge of main @ 9c50a20 into feat/town-merge @ 51c0d67, plus the reach-guard fix), taken on the remote build machine (Linux, 16 CPU) with CI's commands. - reach guard, `DW_CI_REACH_GROUP=tool-tests python3 -m pytest -q tools/tests` (pytest 9.1.1): before the fix (d0cdee0) 1084 passed, 2 skipped, guard red naming `scripts/starter.py` and `scripts/town.py` during collection; after, exit 0, 1036 passed, 2 skipped, 29451 reads judged against 19 globs. `tool-tests-tree`: exit 0, 809 passed, 2 skipped. - `bash tools/ci/fmt-workspaces.sh --check`: 2 workspaces swept, 0 not clean. `cargo clippy --locked --workspace --all-targets -- -D warnings`: exit 0. - `python3 tools/ci/cargo-test-concurrent.py --jobs 2 --locked`: exit 0, 375 run of 375 listed, 0 failed; 5201 passed, 0 failed, 12 ignored. - `gallery-baseline.py --compare 51c0d67`: GREEN; 10 builds each side, 10502 emitted paths each, 0 added / 0 removed / 0 changed, 0 recorded values moved; warning rows 271 against the ledger's 271. Coverage 1222 bound + 17 refusal-proven of 1239, 0 unaccounted. - content demo/town-4 @ 7fb8a92, `delvec --prefabs prefabs build campaigns/foot-of-the-mountain` with release builds of the town tip and of this tree: both exit 0, 267 files each, tree digest 75bd382cb430... on both, `diff -rq` empty, every DW line identical; DW1076: 1 warning (blockout/node/castle, 439 outlined, 438 held, 1 floating). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019qiQFhKtTpTbYnn9NZBbSd
…ts run in the tree group chore(sync): main into the town branch (CI speedup), and the town tests run in the tree group
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.
The engine work that built a whole town of seamless places, and the authoring surface that lets a fresh agent build a place at the same level from the skill alone. Both specs are Accepted.
spec-0127: places meet seamlessly on living ground
open: no wall stands, and the paving meets across the seam.fill.strata[]: seeded surface rules (height band, steepness, noise patch, area) and trees on anopenfill.delvec detail --checkruns the commit battery for the checked place on a scratch copy, so a leak, an edge crack or a face in open air is reported at the place, not at the commit.spec-0128: a place is drawn, and the engine says where a body goes
starter.pyis the one place generator:Modelcells and named parts, from which the program is derived; generators import it, never copy it.delvec grammar surveyanswers what the piece's own gates would say of a drawing (standable, reached, floor joins), from the gates' own functions;delvec grammar blockslists every admitted and refused block.stretch,lane,way_verge,pave_way,verge_life,street_front,handcart,climbs_to,Plot.pinches), the handout's step order with each step's tool and measured cost, andframes --campaign --frame <place>.Proof
cargo test --workspace --no-fail-fast5201 passed, 0 failed; clippy and fmt clean; pytest 1844 passed; coverage 1337 units, 1318 bound, 19 refusal-proven, 0 in neither state; gallery views 225/225; gallery bot stages all passed; warnings ledger 271 = 271.detail --alland a wholebuildboth exit 0: 749 s / 15.7 GB and 616 s / 14.9 GB max RSS on a 16-CPU Linux machine; DW1076 = 1, intended.detail --check.Recorded debts: spec-0127 criterion 3 (no test of
Site::fixed_topon an open side) and spec-0128 criterion 22 (the--at node/<place>camera's position is not asserted).🤖 Generated with Claude Code