Amberstone Lodge


A procedurally generated Minecraft lodge — strategy, failures, corrections, and final verified build.

11,609non-air blocks
45 × 40 × 35footprint (XYZ)
21tests passed
4preserved versions
82block types
8 / 8rooms reachable

Contents

Outcome

The final checkpoint is v004: Minecraft Java 1.21.1, a 45 × 35 block footprint, 40 blocks tall, 11,609 non-air blocks. It includes the tall roofed tower, lower timber wing, blacksmith area, terrace and pathway, custom pines, and furnished rooms connected by stairs.

This is a reference-inspired reconstruction built with a deterministic procedural Python generator using the existing MCIO library. No diffusion model was trained or used. The focused test suite reports 21 passed.

Target releaseJava 1.21.1 · data version 3955
File size (compressed)9,156 bytes
SHA-256cfb9fc5e97256b8c6950fe8ba34aff5b27a42eee4a35b6712e71b8458bcb21fb
Palette states (including air)144
Reachable feet cells1,923
Protected roof cells1,548
Banner block entities (striped curtains)2
Paired doors / beds4 / 2
Front exterior
Front exterior (north facade)
Rear exterior
Rear exterior
Front straight
Front — straight-on elevation
Bedroom interior
Bedroom — green bed platform, paneled frame
Living interior
Living area interior
Ground floor cutaway
Ground floor cutaway (Y=4)
Living floor cutaway
Living floor cutaway (Y=9)
Bedroom cutaway
Bedroom cutaway (Y=16)
Attic cutaway
Attic study cutaway (Y=23)

Schematic Viewer

Interactive 3D viewer — drag to rotate, scroll to zoom. Loads the final v004 litematic directly.

Strategy

The approach prioritized recognizable massing and palette over exact photogrammetric recovery — a reference-inspired reconstruction, not a measured model.

  1. Match the reference's recognizable silhouette and warm timber/plaster palette first.
  2. Allocate usable floors and stairs inside the fixed footprint and height.
  3. Build a deterministic, block-state-aware Python generator using the existing MCIO code.
  4. Export real schematics and render those exported blocks through MCRender.
  5. Combine visual inspection with reload, access, enclosure, support, and collision regression checks.
  6. Save each revision separately with construction stages, inspection cutaways, validation, source snapshot, and a short report.

File correctness, playability checks, and visual correctness are separate requirements. A model can pass one while failing another.

Build Pipeline

Build & Validation Pipeline
flowchart LR
    REF["Reference Images"] --> GEN["Python Generator\n(generate_amberstone_lodge.py)"]
    GEN --> SCH["Schematic\n(.litematic)"]
    SCH --> VAL["Block-State Validator\n(MCIO roundtrip)"]
    VAL --> CHK["Structural Checks\n(reachability · enclosure\nroof · supports · pairs)"]
    CHK --> REN["MCRender\n(9 rendered views)"]
    REN --> VIS["Visual Inspection\n(exterior · rear · cutaways · interiors)"]
    VIS -->|pass| VER["Versioned Checkpoint\n(vNNN/)"]
    VIS -->|issues| GEN
    CHK -->|issues| GEN
      

Version Progression

Version Main change Tests Key limitation
v001 Original preserved lodge, furnishings, landscape, connected stairs Some early drafts already overwritten; roof-enclosure checks came later
v002 Closed roof/dormer gaps, entrance transom, raised bed, serialized striped curtains Partial Rear inspection exposed furniture replacing roof tiles
v003 Protected roof tiles, moved attic furniture, lowered canopy 20 / 21 Chimney trim still crossed upper window — defect documented in REVIEW.md
v004 Removed chimney/window collision 21 / 21 No in-game client load performed; banner stripes visually unresolved in previews

Validation Results (v004)

Reachable Rooms

All 8 destinations reachable via discrete walking model

Structural Checks

Independent validation checks

Block Composition

Key block group counts
Raw validation.json (v004)
{ "minecraft_version": "1.21.1", "minecraft_data_version": 3955, "dimensions_xyz": [45, 40, 35], "non_air_blocks": 11609, "palette_states": 144, "block_types": 82, "file_bytes": 9156, "sha256": "sha256:cfb9fc5e97256b8c6950fe8ba34aff5b27a42eee4a35b6712e71b8458bcb21fb", "exact_block_state_roundtrip": true, "roof_skin_preserved": true, "protected_roof_cells": 1548, "paired_doors": 4, "paired_beds": 2, "banner_block_entities": 2, "reachable_rooms": { "entrance": true, "workshop": true, "store": true, "living": true, "kitchen": true, "gallery": true, "bedroom": true, "attic_study": true }, "enclosed_rooms": { "workshop": true, "store": true, "living": true, "kitchen": true, "gallery": true, "bedroom": true, "attic_study": true }, "reachable_feet_cells": 1923, "front": "north (-Z)", "floor_block_y": [4, 9, 16, 23], "seed": 9062026 }

Difficulty Log

21 distinct problems encountered across the generation session, grouped by category. Each entry records detection method, solution, and outcome.

Environment & File Format

#2 — MCIO not directly importable

Problem: Initial Python import failed with ModuleNotFoundError: mcio even though source existed in the repository.

Detection: Failed import + inspection of sibling MCIO directory — distinguished import-path problem from missing source.

Solution: Locate sibling source relative to the generator; use uv with the script's small declared dependency set.

Result: Generation and tests run with existing local source.

#3 — Existing conversion code could strip block states

Problem: An inspected demo path stripped state suffixes, losing stair orientation, trapdoor halves, and other essential properties. A library data-version comment also disagreed with the actual target release.

Detection: Source inspection before choosing the export path (prevented risk, not an actual corrupted file).

Solution: Use the block-state-aware canvas, validate properties against the 1.21.1 registry, read data version from the cached release archive.

Result: File reports data version 3955. Tests verify normalized exact block-state reload.

#10 — Renderer built distribution was stale

Problem: Importing the compiled headless renderer failed — it did not export renderLitematicWithMetadata.

Detection: Import error + comparison with TypeScript source entry point.

Solution: Run wrapper against TypeScript source via installed vite-node with xvfb-run for headless display.

Result: Previews rendered successfully. Asset warnings remain and were not eliminated.

Geometry & Architecture

#1 — Incomplete information in reference images

Problem: Two screenshots cannot determine every dimension, hidden wall, floor connection, or roof intersection.

Solution: Use the approved scale, preserve the identifying composition and palette, design compatible unseen rooms and elevations.

Result: Reference-inspired lodge. Exact equivalence to the original builder's model remains unverified.

#4 — Array axes and viewer-relative orientation differed

Problem: Design coordinates use XYZ; canvas uses YZX. Increasing X is not the viewer's right when facing north. Mirroring positions alone leaves directional states inconsistent.

Detection: Inspection of canvas API and north-facing view convention, then exported coordinate/state checks.

Solution: Convert axes explicitly; reflect X at export; also exchange east/west states, door hinges, left/right stair shapes; transform banner positions and crop origins consistently.

Result: Tower appears on viewer's right from north. Tests cover exported orientation.

#5 — Steep, curved roof required non-trivial geometry

Problem: The reference combines concave slopes, flared eaves, a lower roof, and dormers. Thin rows leave discontinuities where height changes sharply.

Solution: Configurable height profiles, fill vertical transitions between steep rows, combine overlapping surfaces by maximum height. Add layered edges, ridge detailing, restrained material variation.

Result: Main roof silhouette recognizable. Did not automatically seal all adjacent wall and dormer gaps (see #6).

#6 — Roof and dormer joins leaked into outside air

Problem: Build could look roofed from front while interior air still connected to the schematic boundary.

Detection: Six-neighbor air flood-fill from indoor probes with doors treated as shut. Escape coordinates localized gaps more precisely than visual inspection.

Solution: Six targeted joins — floor cap beneath tower dormer, raised rear-wing infill, extended low-dormer infill, missing rear gable, closed front dormer peak, glazed entrance transom.

Result: v002+ pass all 7 indoor enclosure probes. Negative test confirms the check rejects a deliberately opened ridge.

#7 — Upper floors initially unreachable

Problem: Bedroom and attic failed access checks despite placed stairs. Two separate causes.

Detection: Room-reachability results + inspection of stair columns and headroom.

Solution: Stop access-clearing from erasing the first stair. Replace solid stair supports (which blocked lower flights) with shallow supports. Clear headroom, adjust landings and rail openings.

Result: All 8 destinations reachable in the discrete walking model.

Decoration & Furnishing

#8 — Decorative furniture had support and height errors

Problem: Candles and plants floated over thin surfaces. Lantern chains ended below supporting beams. Early forge chain interfered with roof support.

Detection: Interior previews, coordinate inspection, and targeted support diagnostics.

Solution: Top slabs or inverted stairs for tabletops, align decorations with support surfaces, add missing supports, extend hanging chains to beams, use persistent leaves for custom pines.

Result: Final support tests pass for checked candles, pots, campfires, lanterns, banners, and leaves.

#9 — Bed was valid but mattress was hidden

Problem: Green bed sat below the full-height paneled frame, weakening the most recognizable interior detail.

Detection: Bedroom views showed that legal bed blocks and correct two-part pairing were insufficient for a convincing visible bed.

Solution: Raise bed one block onto a dark oak base while retaining the lower paneled frame.

Result: Green mattress visible; two paired beds remain valid. Trade-off: taller platform bed.

#13 — Patterned curtains required banner block entity metadata

Problem: A green banner block alone does not encode white stripes. The canvas route did not carry banner block entities automatically.

Detection: Inspection of export representation and banner data requirements.

Solution: Inject two banner block entities with modern patterns data, three white stripe patterns each, and correctly reflected integer positions before compression.

Result: Focused test verifies identifiers, positions, colors, and patterns in NBT. Previews still display plain green banners — rendering cause not conclusively established. Unresolved visually.

#14 — Furniture and vines replaced roof blocks without opening air gap

Problem: v002's rear roof exposed bookshelf and beam patches. Enclosure checks passed because a bookshelf is still solid.

Detection: Rear-view inspection + comparing roof-stage snapshot with final block map. Eight replacements identified.

Solution: Move attic shelf inward, shorten beam away from roof sides, place vines only into empty cells. Add check preserving every deepslate cell from the roof/forge snapshot.

Result: v003+ preserve all 1,548 protected roof cells.

#15 & #16 — Blacksmith canopy and chimney trim crossed upper window

Problem (#15): At its inner edge, the canopy rose into the upper wing's glazing at Y=11.

Problem (#16): After fixing the canopy, a separate cobblestone slab trim band still replaced part of the same window's lower edge.

Detection: Exterior inspection, coordinate checks, then a new focused window test that expected glass but found minecraft:cobblestone_slab.

Solution: Reduce canopy rise (#15); skip offending chimney-collar cells at wing wall and window height (#16).

Result: v004 passes the focused test including 6 checked glazing positions. v003 retained with documented defect.

Rendering & Visualization

#11 — Incorrect lighting parameters made sound geometry look wrong

Problem: Early previews had very dark walls and disproportionately bright upper faces.

Detection: Reading the renderer shader — light-direction inputs were face-brightness coefficients involving absolute X/Z normals, not conventional normalized directional light.

Solution: Replace negative components with small positive coefficients; suitable ambient brightness; separate settings for interiors.

Result: Materials legible in subsequent previews. This was a rendering configuration correction, not a palette issue.

#12 — Initial inspection views concealed critical information

Problem: A bedroom cutaway looked toward the headboard, hiding the mattress. Cropping left detached-looking leaves and lights whose supports were outside the crop.

Detection: Comparing cutaways with the full schematic, changing viewing directions.

Solution: Adjust bedroom crop and camera; add rear and straight-front views; render interior perspectives inside the complete schematic.

Result: Final v004 has 9 views. Apparent floating fragments in crops must be verified against the full model.

Process & Workflow

#17 — Early iterations did not preserve complete history

Problem: Initial reruns reused root schematic and preview paths. Earlier drafts were already gone when version retention was requested.

Solution: Freeze existing artifacts as v001. Write later changes into unused versions/vNNN directories with stage exports, cutaways, source snapshots, validation, and reports. Use exclusive writes for schematics.

Result: v001–v004 remain available. Early overwritten drafts not recovered; v001 lacks same archival coverage as later checkpoints.

#18 — A failed test did not stop v003 generation

Problem: Generation continued after a focused test command failed — exit status not checked.

Solution: Preserve flawed checkpoint with explicit review note; correct the defect in v004; verify passing suite separately.

Result: Final suite passes, but the workflow error was real. A successful export report must not be presented as equivalent to every focused test passing.

#19 — Some documentation patches used stale contexts

Problem: A few edits failed because the requested patch context no longer matched the document exactly.

Detection: apply_patch rejected the affected edits rather than silently applying them incorrectly.

Solution: Re-read relevant text and use smaller, exact-context hunks.

Result: Documentation updated without destructive recovery. Smaller edits would have avoided the friction.

#20 — Workflow is reproducible but not fully archival or transactional

Problem: Fixed geometry does not imply byte-identical files or a fully portable historical environment. A new output directory can be partly written before a later validation failure.

Remaining work: Timestamps can change binary hashes on regeneration. Sibling libraries and resource caches are not fully pinned per snapshot. Renderer wrapper is shared rather than snapshotted per version. Writer exports before completing all validation.

Recommendation: Validate in an isolated staging directory; publish only after every required check succeeds.

#21 — Generator remained coordinate-heavy; checks remained approximate

Problem: Many placements use fixed architectural coordinates despite a central configuration object. Sequential writes use replacement semantics, so subsystem overlap silently changes existing blocks.

Remaining work: Region ownership, local coordinate frames, and explicit allowed-overlap rules would make future variants safer. Walking check uses discrete cells; enclosure check ignores detailed stair/pane geometry.

What Worked vs. What Failed

  • Exact export/reload checks protected directional block states and format metadata.
  • Walking and air-flood checks found inaccessible upper floors and inconspicuous roof gaps.
  • Rear views and room-level views exposed defects that the main exterior view concealed.
  • Stage snapshot comparison caught solid furniture replacing solid roof blocks, which enclosure checks could not detect.
  • Version directories and exclusive writes protected reviewable history once introduced.
  • Reusing MCIO and MCRender kept work focused on the lodge rather than a new file-format implementation.
  • Negative tests — deliberately removing a ridge block or bed half — demonstrated that selected validators could actually reject damaged geometry.
  • Version retention added too late — early drafts permanently lost.
  • Important views inspected too late — rear elevations and room-level views should have been checked before detailed decoration.
  • Solid stair supports blocked stacked flights above and below.
  • Sequential placement allowed furniture, vines, canopy, and chimney trim to overwrite architecture silently.
  • Renderer lighting semantics misread — produced misleadingly dark walls before the shader was actually read.
  • Generation continued after a failed test — an avoidable orchestration mistake.
  • One successful check treated as a general certificate — legal states, reachable stairs, sealed roof, and good front view each failed to guarantee the others.

Lessons & Recommended Next Sequence

Version from day one

Version even the first draft. Missing early history cannot be reconstructed. Exclusive writes protect reviewable history once introduced.

Inspect all sides early

Rear elevations and room-level views must come before detailed decoration — not after a visible defect forces iteration.

Reserve structural space first

Protected structural cells and headroom must precede furnishing. Collision policies must be explicit, not implicitly non-overlapping.

Read before tuning

Read the renderer shader before tuning lighting. Read the export API before choosing a conversion path. Assumption-based configuration wastes rounds.

Gate on tests

Require successful tests before publishing a staged version. A successful export report is not equivalent to every focused test passing.

Separate evidence types

File correctness ≠ playability ≠ visual correctness. Each requires its own evidence. A good front view is not a certificate of a finished model.

Recommended Build Sequence

Better Next Workflow
flowchart TD
    A["Versioned empty project\n+ documented coordinate convention"] --> B["Massing · floors · stairs · roof only"]
    B --> C["Access check + enclosure check"]
    C --> D["Inspect front · rear · both sides · roof sections"]
    D --> E["Reserve structural cells + headroom"]
    E --> F["Add each furnishing subsystem\nwith explicit collision policy + targeted tests"]
    F --> G["Render every required view from exported file"]
    G --> H{All tests pass\n+ visual review OK?}
    H -->|no| F
    H -->|yes| I["Publish staged version\n(vNNN/)"]
    I --> J["In-game import + walkthrough\n(when client available)"]
      

The key lesson is not simply to add more detail or more tests — it is to use the right evidence for each claim and to keep a failed intermediate visible without confusing it with the final verified result.


Amberstone Lodge v004 · Java 1.21.1 · Generated 2026-09-06 · 21/21 tests