Three parts printed complete · none has been loaded · the newest one's floor was read by hand as attached
The wall was going to save material by not touching the layer below. It climbed, flew, came back down and welded only where it landed. Printed at 200 mm and again at 100 mm, it did not hold. What replaced it is dull by comparison and it works: a ring of vertical posts that only ever go up, tied together by horizontal bridges.
It is a bucket in SHAPE. It does not hold liquid. On the part that printed, the wall has 16 gaps in it, each 18.07 mm from post to post, and the floor is a lattice of crossed ribs. Water goes straight through both. Nothing on this page is a vessel and nothing here has been tested for carrying anything.
The first two are finished and neither has been loaded. The 100 mm by 40 mm version
with 16 posts ran to completion on 2026-08-05. The 320 mm by 300 mm version with 56 posts ran
to completion on 2026-08-06 at 13:03, in 8.09 hours, and both are in his hands. The big one
stood on the sixth attempt: five runs were cancelled between 2026-08-05 23:43 and 2026-08-06
04:35, four of them inside the first layer. The cause was not in the design. The printer's Z
zero sits about 0.15 mm higher than it reports, so a first layer commanded at 0.1 mm was
landing about 0.3 mm off the plate, and the run that worked began with
SET_GCODE_OFFSET Z=-0.150 and still reported that offset when it finished. That
0.15 mm was measured by printing a ladder of test cells at stepped heights, after a paper
feeler gauge had given an answer twice too large and three rounds of widening the first layer,
from 2 mm to 5 mm, had changed nothing, because width cannot close a gap. Its
file is 1251 layers and 200.88 cm3 of commanded filament. One part standing is not a
validated design, and section 9 is the list of what it still does not settle.
Corrected 2026-08-06. An earlier version of this page said the big part had been cancelled three times, never past its first layer, and had not printed. Both counts were wrong. The printer's own job history lists five cancels, and one of them ran 49 minutes and laid 5.76 metres of filament, which is past the first layer and into the second. Every figure about those runs on this page is now read from that history rather than from anyone's recollection of the night.
The newest floor was simulated, printed, and then read by hand as attached. Section 8 is a later design, 339.5 mm across on 16 posts. Its floor was measured on 2026-08-08 to be welded to the wall along 0 percent of the border, and that failure is MEASURED: a simulation over the emitted file and Oleg's read of the printed part say the same thing. The replacement passes the same gate at 93 percent, printed to completion on 2026-08-08 in 518 minutes on its first run, and he read the finished part as attached, with the 16 panels even and the spans taut. So that one loop is closed: a simulation, a plate, and a person holding it, all agreeing. What his hands did not do is measure the 93 percent joint by joint, and this part has not been loaded either.
Every figure below is drawn by a script that parses the emitted gcode, so a figure and the file agree or the figure does not exist. Where a number came off a PART or off the machine while it printed, the text says so. Where it is arithmetic rather than either, the text says that too.
"The way you printed bucket now did not work, the layers of wall math is very complex and you was not hitting adhesion with all this z up and down movements" Oleg, at the machine, 2026-08-05, after the second failed run
The idea was a sinusoid in Z laid into the wall. Each lap climbs away from the lap below, flies over a gap, drops back and welds down onto a flat landing, then climbs again. One lap gains a whole wave height instead of one layer height, so the same wall costs a fraction of the material. The openings between the laps are the saving, made visible.
Measured off the emitted 200 mm file, the arithmetic that mattered was sitting in its own header. Each wave is 23.6 mm long and 4.7 mm of that is welded. The other 18.9 mm is in the air. So the wall touches down along about a fifth of its length, and every touchdown is a fresh weld onto a surface the nozzle had already left and let cool. Parsing the emitted points rather than the header finds 317 separate landings in that one part. The 100 mm file, which was the second attempt, reads 4.9 mm welded against 19.7 mm airborne and 150 landings.
None of that was hidden. It was written in the file and nobody counted it. When a wall's material saving comes from not touching the layer below, the saving is paid for in adhesion events. Several hundred independent welds, each onto a cooled surface, each able to fail on its own, is a different kind of part from a wall that is continuously welded to itself. Count them before printing, and if the count is in the hundreds, the design is buying material with adhesion.
What the failure does not say is which weld failed or why. There is no per-weld measurement here, only two runs that came off the plate and the words of the man holding them.
The replacement removes the mechanism rather than tuning it. The wall becomes 16 single-wall posts standing on a 100 mm circle, each drawn as a plain closed loop, with the gaps between them crossed by a horizontal bridge every 10 layers. A post never descends and never re-welds: Z in the whole body moves in one direction, one 0.24 mm step per layer.
Both halves of that were proven on the plate the same night, on the tower coupon, before any bucket was generated.
The bucket's own bridges are 18.07 mm seam to seam of which 15.65 mm is unsupported air, measured on the chord by the generator rather than assumed, and inside the 16.8 mm that held. 16.8 mm is a lower bound: it held, and nothing says 17 does not.
The crossings are the reason nothing lifts. Every post puts its seam at the same angular offset from its own outward radial, so the chord between two neighbouring seams is the same shape for every pair, and the generator scans that offset at a quarter of a degree to find the band where the chord leaves one post immediately and reaches the next from outside. On this geometry the band is 20.75 degrees wide, centred on the seam pointing at the inside of the bucket. Inside that band there is nothing under the nozzle to plough through, so the crossing is flat at the layer's own Z and the file contains no lift, no drop and no descent anywhere. All 3248 crossings in the printed file were re-checked against every post before it was written.
The coupon produced one result that reads like a footnote and is not. Six towers printing in rotation gave every layer 4.50 seconds to freeze before the head came back, and they stood. The same geometry printed as a single tower gave 0.57 seconds, and it came off the plate as a coiled rope rather than a column. Removing the neighbours had removed the cooling with them.
A ring cannot have a short layer, because the head has to walk the whole circle before it returns to any one post. On the printed bucket that is 370 mm of extrusion per post layer, 7.40 seconds of extruding and 13.18 seconds including the gap crossings, both read off the emitted path. The property is bought by the shape rather than by a setting somebody has to remember, which is the part worth copying.
16 posts of 8.2 mm on a 100 mm circle, 40 mm tall, 167 layers of 0.24 mm, one commanded speed of 50 mm/s for every move in the file including the first layer. It ran to completion on the K2 on 2026-08-05.
The truncation check landed almost on prediction, and that is how the run is known
to have finished. A machine's complete flag cannot tell a finished file
from a stopped one. Filament delivered can. The file's own commanded total is 5826.16 mm and
the K2 adds about 20 mm of start purge it was never told about, so the prediction stated
before the run was about 5846 mm. The machine reported 5846.2 mm, inside 0.02
percent. The run took 2322 s, or 38.7 minutes, against a 37.8 minute motion-only estimate.
"otherwise look like perfect piece" Oleg, holding the finished part. With one defect: "Base need to be way stronger"
He was right and the reason is on the record. The base is the one parameter that had been moved off its proven setting: it ran 2 cross-latch floor layers because he had said "couple" that evening, against his own earlier instruction, "for the bucket. floor 5 layers. walls single layer. strict". The part settled which of the two sentences to believe.
The obvious fix is to raise the floor from 2 layers to 5 and change nothing else. The gate refuses that file, and the refusal names the mechanism:
"FAIL OVERHANG: 23% of layer Z0.58 has no material within one bead (0.82mm) of it on layer Z0.34" validate.py, re-run against that exact file while this page was being written. It goes on to say that fraction of the layer is being extruded onto nothing.
Cross-latch layers are perpendicular to each other, so a rib touches the layer below only where the two rasters actually cross, once every pitch, and flies over the rest. At 5.0 mm pitch a rib crosses every 5.0 mm and flies 4.18 mm between crossings. Stacking a sparse lattice higher does not build a floor. It builds more ribs joined at points.
So the pitch had to come down with the count. At 2.5 mm each rib crosses every 2.5 mm and flies 1.68 mm, and the same five layers pass the gate at 2 percent unsupported rather than 23. Both figures are the gate's own output on the same geometry with only the pitch changed.
The same one change buys three things, all of them read off the layer ladder rather than measured on a part.
Whether 1.06 mm of lattice floor is what he meant by "way stronger" is not settled by any of that. It is settled by the next part he picks up.
The counterintuitive result, and the one that cost the most to learn. A lattice has holes in it, so it must use less material than the wall it replaces. On this part, at these posts, that is false.
16 posts of 8.2 mm carry 371.0 mm of path per layer. A solid single-bead wall on the same 100 mm circle carries 311.6 mm. The ring is 1.19 times heavier, and the reason is that each post carries its own complete circumference: sixteen small perimeters beat one large one. The printed file's own header agrees, reporting 370 mm of extrusion per post layer.
But the ratio falls with post diameter, and it crosses back under the wall well before the printable floor. At 2.46 mm the same ring of 16 is 0.26 times the wall. The crossover for 16 posts on this circle is at 7.02 mm, so 8.2 mm was simply the wrong end of the range, chosen for strength off the hand-break test rather than for material.
Measured off the emitted files, with the same 5 layer floor on both: the 18 post 2.46 mm version is 7.80 cm3 against 16.44 cm3 for the 16 post 8.2 mm one, which is 53 percent less. Both figures are the file's own final E value times the cross-section of 1.75 mm filament, which is the generator's own definition of the material figure rather than a second model of it.
"Success keep same, go for max size bucket now." Oleg, holding the printed thin-post ring
The coupling that makes this not free: a thinner post subtracts less from the chord between two seams, so the unsupported bridge span GROWS as material falls. 16 posts of 2.46 mm give 17.65 mm of air, past the 16.8 mm that has actually held; 18 posts bring it to 15.51 mm. Every step toward less material lengthens the span, and the span is the only quantity here with a physical result behind it.
Against a solid single-bead wall of the same size, three things move, and only the first is arithmetic anybody can check.
"the net and the outer wall line do not have sufficient connection points. i think you need to add hilpers in empty spaces to connect it properly" Oleg, off the printed floor, 2026-08-08. He also asked for a physical simulation of how well the bottom is attached to the walls. That simulation is the rest of this section.
This is a later and larger design than anything above: 339.5 mm across, 16 posts, a floor of three latch layers at 0.56 mm. The simulation is now a gate. Every extruded floor move in the emitted file becomes a flat capsule at the width its own filament pays for, and two beads count as WELDED only where those capsules overlap by at least 0.05 mm. A commanded edge-to-edge butt does not count, because beads land narrower than they are commanded.
Run against the earlier file, nothing in the floor was welded to the border anywhere.
The net had been floating inside the wall line, and the filename claimed otherwise. That name advertises six boundary rings. The layer it emitted carries 12 border beads against 22565 in the net, because a branch handed the empty first-layer ring list to every floor layer; the generator now carries that retraction in the function that had the bug. The same layer after the fix carries 7302.
What replaced the missing rings is one boundary ring lapping wall and rim by a fifth of a bead, plus a stitch comb: a square wave laying a radial stroke every 0.66 mm between that ring and the edge of the net, lapping both. Rings weld along laps that run parallel to the border, so one failed lap frees the floor as a disc. A stroke crosses the band the short way instead, so pulling the net off the wall means breaking a stroke every 0.66 mm. Every interface sits at a pitch of 0.8 times the bead width, the same law as the only floor layer that has ever welded itself to the plate. Oleg asked for a Hilbert curve; a band one to six beads wide has no room for recursion, so what shipped is its first order, which is a square wave.
out/bucket_towers_k2plus_pla_d339.5_h304.8_n16t6.48_w287.5os3.175_b20_bb5x5_m1.8-3.6-7.2_f3x4r6_x18_j2.gcode geometry: 16 posts r_t 2.83 on 339.5mm, r_poly 169.05, raster disc r_h 165.28; weld margin 0.05mm, border run limit 4mm (= --floor-pitch: the border must not be weaker than the lattice welds to itself) layer 1 z0.1 gap 0.25: 29416 beads (median 3.94mm), border welded 22%, longest unwelded run 72.0mm (REPORTED, not judged: plate-weld layer), components 1, piled spots 37 + 7 in the seam corridor (worst 2.7 bead-heights: the entry/exit plumbing, one strip per layer by design) -> PASS layer 2 z0.66 gap 0.56: 23923 beads (median 0.82mm), border welded 0%, longest unwelded run 1241.5mm, components 1, piled spots 0 + 3 in the seam corridor (worst 2.9 bead-heights: the entry/exit plumbing, one strip per layer by design) -> FAIL ATTACH: 1241.5mm of border has no fill welded to it (limit 4) layer 3 z1.22 gap 0.56: 23923 beads (median 0.82mm), border welded 0%, longest unwelded run 1241.5mm, components 1, piled spots 0 + 3 in the seam corridor (worst 2.9 bead-heights: the entry/exit plumbing, one strip per layer by design) -> FAIL ATTACH: 1241.5mm of border has no fill welded to it (limit 4) FAIL: bottom-to-wall attachment, 1/3 floor layers clean
the gate on the file that printed. layer 1 is the plate weld and is reported rather than judged, which is why its 22 percent is not a failure.
out/bucket_towers_k2plus_pla_d339.5_h304.8_n16t6.48_w287.5os3.175_b20_bb5x5_m1.8-3.6-7.2_f3x4r1c_x18_j2.gcode geometry: 16 posts r_t 2.83 on 339.5mm, r_poly 169.05, raster disc r_h 165.28; weld margin 0.05mm, border run limit 4mm (= --floor-pitch: the border must not be weaker than the lattice welds to itself) layer 1 z0.1 gap 0.25: 29416 beads (median 3.94mm), border welded 22%, longest unwelded run 72.0mm (REPORTED, not judged: plate-weld layer), components 1, piled spots 37 + 7 in the seam corridor (worst 2.7 bead-heights: the entry/exit plumbing, one strip per layer by design) -> PASS layer 2 z0.66 gap 0.56: 31214 beads (median 0.82mm), border welded 93%, longest unwelded run 3.0mm, components 1, piled spots 0 + 7 in the seam corridor (worst 3.2 bead-heights: the entry/exit plumbing, one strip per layer by design) -> PASS layer 3 z1.22 gap 0.56: 31214 beads (median 0.82mm), border welded 93%, longest unwelded run 3.0mm, components 1, piled spots 0 + 7 in the seam corridor (worst 3.2 bead-heights: the entry/exit plumbing, one strip per layer by design) -> PASS PASS: bottom-to-wall attachment, 3/3 floor layers clean
the same gate, same command, on the file with the ring and the stitch.
The failure is MEASURED. Two independent things agree on it: the gate reading the emitted file, and Oleg reading the printed floor in his hands.
The fix is GATED, PRINTED and READ. It passes this gate on all three floor layers, and the path gate this project already had passes it too. A part carrying it printed to completion on 2026-08-08, on its first run, in 518 minutes: the machine delivered 83604.5 mm of filament against the 83564.7 mm the file commands, and the 39.8 mm excess is the start purge it was never told about. By the same test as section 4, that is a finished file rather than a stopped one.
"Perfect bucket" Oleg, holding it, 2026-08-08, with a photo. He read the 16 panels as even, the spans as taut and the floor as attached.
What that read is, and what it is not. It is a person judging a part, which is the only thing on this page that has ever closed a loop, and it agrees with the simulation that condemned the old floor and passed this one. It is not a per-joint measurement: nobody counted which welds took, so 93 percent remains the model's number and the part is evidence that the model was not wrong in the direction that would have mattered. Two things this still does not touch: the bamboo has not been pushed the full height of a post, and nothing here has been loaded.
93 percent is also not 100. The gate judges the longest unwelded run against the lattice pitch of 4 mm, on the argument that the border must not be weaker than the net is to itself, and the worst run left is 3.0 mm.
Everything is small dependency-free Python in the public crackle repository. The generators write gcode directly, with no slicer and no STL. Every figure on this page is drawn from the emitted files by a script and never by hand: the figures above section 8 by a script in the site repository, and the two floor panels in section 8 by one that sits beside the gate that judged them, so the picture and the verdict cannot disagree.
The exact commands behind the files measured above. Each was re-run into a scratch directory while this page was written, and the first three came back byte for byte identical to the file already on disk; the wave file matched apart from the line in which it records its own arguments.
The part that actually printed and is measured in section 4 ran a 2 layer floor at 5 mm pitch, which is the setting section 5 is about replacing. Its filename cannot be regenerated exactly today, because the naming code changed after it was written, and that is worth saying out loud rather than quietly presenting a command that emits a differently named file.