Blog ·
A ladder that is not a ladder
Cog built a treehouse village with ladders running down from every hut. They look right in every screenshot we have of it. You cannot climb a single one of them, and it took somebody trying to find out.
The build is a giant oak with three huts in the canopy and rope bridges between them — 35,252 blocks, designed from one sentence. Underneath each hut is a ladder: a two-block-wide column of rungs running down to the ground, spaced the way ladder rungs are spaced, in a wood colour a shade off the platform above them. It reads as a ladder instantly. It is in the photograph on our examples page.
It is made of minecraft:brown_wool. It is scenery. Walk up
to it and you slide off, because a wool block is a wool block whatever
shape you arrange it in.
286 blocks in the palette. None of them did anything
When we went looking for the cause it was not a bug in the build. The design was a faithful rendering of what had been asked for. The problem was the vocabulary: the shape designer had 286 blocks available to it, and we counted how many of them were functional.
None. Not a ladder, not a door, not a torch. Every one of the 286 was scenery.
Stone, planks, concrete in sixteen colours, glass, wool, terracotta, ores, every wood in the game — a complete palette for making something look like a thing, and nothing at all for making something be a thing. So when a design needed a way up, the only move available was to draw one. It drew a very good one.
This is a particular kind of failure and it is worth naming, because it is the one an AI builder is most prone to and the one that is hardest to catch. Nothing errored. Nothing was missing. The verification pass we run after every build — which counts the blocks placed against the blocks planned and reads the numbers back — passed, because every block it planned was placed exactly where it said it would be. The build was correct and unusable at the same time.
Why you cannot just add the block
The obvious fix is to put minecraft:ladder in the palette,
and that is most of the fix, but it does not work on its own — because a
ladder is not a block in the sense the rest of the palette is.
A shape program places stateless blocks: a position and a
material, nothing else. That is enough for stone. A ladder needs a
facing, and a wall behind it to hang on. Get the facing
backwards and the rungs render inside the wall. Give it no support at all
and the block pops off the instant it is placed and drops as an item —
which, once again, is not an error anybody sees.
Asking the designer to specify the facing per ladder would be the wrong answer even if it worked. The facing is not a design decision; it is a fact about what the ladder is attached to, and it can be derived. So it is: at placement time, each ladder looks at its four horizontal neighbours, finds the first solid one, and faces away from it. A ladder with nothing solid behind it is reported and skipped rather than placed, because a block that will fall off is worse than a block that never appeared.
Deciding what counts as "solid" turned out to have its own trap. Our
first version tested the block name with a pattern anchored at the start
of the string, which meant oak_fence did not match "fence" —
the word is not at the beginning of it — and a ladder could be hung on a
fence, which holds nothing. A test caught that before it shipped. It also
caught something worse: adding doors and fences to the palette made them
substitution targets, so an unstocked block called something like
oak_shingles started resolving to oak_fence on a
word match, and a wall would have quietly been built out of fencing.
Functional blocks are opt-in now — askable by name, never a fallback.
The rule we should have had from the start
If the build has a way up, a way in, or a light, use the real block for it. People try to use these.
That line is now in the designer's brief, with the treehouse named as the reason. It is not a clever rule. It is the kind of rule you only write down after somebody has stood at the bottom of a beautiful ladder and pressed W.
The treehouse in our world has real ladders on real posts now, and we checked by reading the blocks back out of the server rather than by looking at it — which is the same lesson in a different coat. A photograph is not evidence that something works. It is evidence that it looks like it works, and those are different claims.
Keep reading
The other notes
- There is no right-click event in a datapack No event, no trigger, no on_use. One statistic is the only thing that reports a click.
- We were wrong about modded worlds We said it could not join a modded world. We went and tried, and we were wrong.
- A ladder that is not a ladder 286 blocks in the palette and not one of them worked. So it drew the ladder instead.
- A datapack that installs perfectly and does nothing It loaded, enabled and reported success. Then it answered "Unknown function" for its own tick.
- The six redstone wire rules nobody reasons their way to A repeater faces its input, not its output. Six rules measured, not derived.
- Why a survival benchmark needs a fixture world Every run scored worse than the last. It was eating the forest it was being tested in.
- Digging is not mining Break a block from three steps back and a perfect run scores nothing.