# What 3D Printing Taught Me About Working with AI

> From awkward test prints to the H41 shaving station and print-ready, my open-source agent skill: lessons in physical feedback, traceable releases, and working with AI.

By Yuwei Liang · 2026-10-04

![Article cover](https://yuweiliang.com/api/blog/assets/6a3547b1-deda-4e52-b386-8823a1172601)

On one test print of a razor stand, the magnets did exactly what I wanted. They held the blade firmly.

But if I placed the blade a little too far back, I could barely get hold of it to lift it out.

The checks covered the magnet cavities, the gap to the blade, and the pause needed to insert the magnets during printing. They hadn't covered whether I could still grab the blade after placing it imperfectly.

That small failure captures a lot of what I've learned from my `3d-modeling` project: working with AI requires building a reliable way to find out whether the result works.

## An everyday object has a surprisingly large brief

The workspace contains several objects for everyday use: a razor stand, a cradle for a dish-soap bottle, a freezer label, and a planter. I've worked with AI agents on geometry, build scripts, checks, renders, and the tools for reviewing each iteration.

The razor stand became a particularly demanding project because its requirements kept becoming more specific as I used the prints.

## Molly saw a telephone

One early physical prototype had a blocky shape, with the brush holder rising above a row of supports. Molly teased me:

> “This looks like a landline phone. It's so ugly!”

![Early physical prototype · The blocky version that prompted Molly's telephone comment. Original photograph, before the sculptural exploration.](https://yuweiliang.com/api/blog/assets/c21d6acd-69a2-47b0-83a2-97088b255e14)

I accepted the critique and started exploring a more sculptural direction: softer transitions, flowing supports, and a form that felt considered as a whole. That exploration led to the version I have today.

Her comment expanded the brief. Alongside holding the parts and giving me room to use them, the station needed a shape I wanted to keep in my bathroom. AI concept images helped me explore possible directions; actual CAD and printed prototypes helped me find out which ones could work.

An early design held an assembled safety razor. The brief later changed to holding its disassembled parts so their surfaces could be exposed for drying: top cap, baseplate, blade, and handle, with a separate place for the brush.

That changed the whole layout. Each part needed a support, an insertion path, and room for my fingers. The blade needed particular care because I would be handling it more often, including with wet hands.



### One brief, several shapes.

![01 · CAD render · Station layout. Separate supports made each function visible.](https://yuweiliang.com/api/blog/assets/11735050-99e2-4203-8a96-78de579b0abb)

01 · CAD render · Station layout. Separate supports made each function visible.

![02 · AI concept · A softer direction. A visual target, not built geometry.](https://yuweiliang.com/api/blog/assets/f50d3163-0af7-4c2a-972c-c197cb85ecd0)

02 · AI concept · A softer direction. A visual target, not built geometry.

![03 · CAD render · Sculpted 06. The geometry moved toward that direction.](https://yuweiliang.com/api/blog/assets/518c2352-3dcf-4442-9371-18fb72902bd1)

03 · CAD render · Sculpted 06. The geometry moved toward that direction.

![04 · CAD render · H40. Later work on access, supports, and transitions.](https://yuweiliang.com/api/blog/assets/15280c98-345b-4142-82bd-ee0c9b9d7ade)

04 · CAD render · H40. Later work on access, supports, and transitions.



The magnetic sample exposed a gap in that brief. A blade could sit securely and still be difficult to retrieve. In a review of the sample's geometry, moving it back just a few millimeters almost eliminated the clearance beneath its front edge.

The next revision kept the magnets and added an open pickup area and a rear shoulder. I tested that sample and liked the way it worked, while still wanting a rounder opening. That was useful progress on one part of the stand; the rest of the design still needed its own tests.



### Make room to pick it up.

![Before revision](https://yuweiliang.com/api/blog/assets/9b044c08-acbe-4007-ad1b-a39c362a2431)

![After revision](https://yuweiliang.com/api/blog/assets/6db6be28-1161-4cb3-8b3f-6a290c9a7a7c)

H22 → H23 · Same-camera CAD renders. The magnets stayed; the front opening and rear shoulder changed. Positive feedback on the printed sample was a local improvement, not whole-stand acceptance.



## I had to test movements, too

As the stand developed, checking the final resting position became insufficient. I also needed to understand what happened while putting a part down or picking it up.

One later pair of samples made this clear. The baseplate's shallow stop was too easy to slide over and difficult to push against when trying to tilt the part up. In the neighboring cap support, the baseplate was easier to pick up. Meanwhile, the cap opening was wide enough for the cap to fall into the cavity on its side.

The geometry checks had passed within their stated scope. My hands found behaviors those checks hadn't established.

![Physical print · H16. Real objects on the bathroom shelf gave me feedback that geometry checks could not.](https://yuweiliang.com/api/blog/assets/f68b6278-807c-4d8c-9f95-505cd2453c47)

The same issue appeared in a simpler object: a cradle for a Dawn dish-soap bottle that sat on an existing wave-shaped platform. A compact version used a circular, 70 mm base. Its geometry checks passed, but the printed holder rocked sideways.

The next version widened the base to 96 × 70 mm, retaining complete mating profiles on both sides while keeping the already-tested bottle cavity. I printed it and confirmed it was usable.



### The base changed. The tested cavity stayed.

![V06 · 70 mm circular base. CAD render; the printed holder rocked sideways.](https://yuweiliang.com/api/blog/assets/116e773f-ec52-47a3-aa81-8fb82cfd8f8b)

V06 · 70 mm circular base. CAD render; the printed holder rocked sideways.

![V07 · 96 × 70 mm base. CAD render; printed and confirmed usable on October 2.](https://yuweiliang.com/api/blog/assets/d3a9d19e-314c-4673-958b-9da8560b8021)

V07 · 96 × 70 mm base. CAD render; printed and confirmed usable on October 2.



Those iterations taught me to ask more concrete questions. Can the part arrive at its intended position without careful aiming? Can it land somewhere unintended? What happens when I press on it? Can I remove it using the movement that comes naturally?

Each question gives the agent something specific to investigate and gives the printed sample a reason to exist.



### Turn the model around.

#### Razor stand · H40

![Razor stand · H40](https://yuweiliang.com/api/blog/assets/6a3547b1-deda-4e52-b386-8823a1172601)

Earlier H40 geometry with a reduced display mesh, before the printed H41 milestone. Shading is not print texture or physical validation.

[3D display model (GLB)](https://yuweiliang.com/api/blog/assets/e202d06b-98dd-455f-af98-1c258428e50b)

#### Bottle cradle · V06

![Bottle cradle · V06](https://yuweiliang.com/api/blog/assets/116e773f-ec52-47a3-aa81-8fb82cfd8f8b)

Actual unreduced geometry. Historical version: the printed holder rocked sideways.

[3D display model (GLB)](https://yuweiliang.com/api/blog/assets/a12b44c7-7567-4405-b4f4-578a2d17c329)

#### Bottle cradle · V07

![Bottle cradle · V07](https://yuweiliang.com/api/blog/assets/d3a9d19e-314c-4673-958b-9da8560b8021)

Actual unreduced geometry. Printed and confirmed usable; no quantified load or durability test.

[3D display model (GLB)](https://yuweiliang.com/api/blog/assets/2a41ad8b-b341-4e45-aed1-6bd23877383f)



## Feedback needed a place to live

Discussing a 3D object through text creates another kind of error. “This edge” can refer to several edges. A precise coordinate helps only if we're looking at the same version.

We built a shared browser inspection tool where I could rotate the actual model, point to a location, and leave a comment. It also supported reference images and comparisons between versions. Later, a Houdini connector let me send geometry into the same review workspace.

The initial annotation workflow used generated HTML files and manual copying of feedback into the conversation. It had a serious weakness: old builds were rotated away. An annotation could survive in the conversation after the geometry it referred to had disappeared.

The tool evolved to save comments directly and preserve the corresponding mesh. That made it possible to return to the actual object I had reviewed, including when it came from uncommitted work.

![Tool screenshot · The shared inspection bench: actual geometry, version comparisons, and comments attached to the model being reviewed.](https://yuweiliang.com/api/blog/assets/afaa624d-aa9c-4d2e-b3c6-ab455c29342f)

This mattered because the design decisions were often in the feedback. Which opening felt awkward? Which version had the shape I preferred? What had a revision actually addressed?

Once those observations had a durable home, I spent less effort reconstructing the discussion and could give more precise instructions for the next change.

## The verification tools also needed scrutiny

The project produced plenty of automated checks. It also produced reasons to distrust a green report until I understood what it measured.

Some probes used coordinates for an earlier position of a feature. After the feature moved, they measured a different surface. In another case, some checks read a saved mesh while others rebuilt from source, so one report described two different versions of the object.

A separately modeled test coupon drifted from the main design as that design changed. Printing it would have tested an older construction.

These became practical rules in the workspace: derive probe positions from the geometry's placement logic, reject stale inputs, and cut test pieces from the actual model being evaluated.

I also started distinguishing three kinds of evidence in the records. Geometry checks establish particular properties of the model. Slicing establishes what the printer is being asked to make. Physical testing establishes what happened with a printed object in my hands.

That distinction helps me decide what to do next. The bottle cradle has a confirmed usable print. The razor stand has now reached a printed H41 baseline, with whole-object feedback alongside the earlier local tests. Keeping those states explicit prevents an improvement to one region from turning into a claim about the whole object.

## H41: from test pieces to a whole station

By October 4, I had printed the complete H41 shaving station and used it with the brush, disassembled razor, and blade storage in place. The whole station worked well overall. Seeing the parts together on my workbench felt different from looking at another promising render: the project had become an object I could use.

![Physical print · H41. My whole shaving station on the workbench, with the brush, razor parts, and blade storage in place. Original photograph; the accessories are display props.](https://yuweiliang.com/api/blog/assets/dfdb37ce-c206-43f9-9beb-b901e9e8f520)

The H41 checkpoint also reached the Etsy stage. I put together product photos, clearly labeled AI illustrations, fitting diagrams, and listing materials, and published the listing. The release preserves that source checkpoint alongside the print files.

The print package includes the whole station, optional liners, and a two-magnet test coupon. The two embedded magnets are inserted at a checked pause in the print. That delivery detail matters just as much as the shape: someone following the file needs to know what to do at the printer.

There is still a specific refinement to make. The H41 foot pockets are too small for my 12.63 mm silicone pads, and the right-front pocket is uneven. An H42 coupon tests revised seats; its geometry and slicing have been checked, but its physical fit has not. The working H41 baseline and that next experiment have separate records.

That is what finishing this iteration means to me: a usable whole object, a reproducible handoff, and an honest account of the remaining work. The earlier H40 model on this page remains an interactive view of the design before this printed milestone.

## I turned the workflow into print-ready

The checks and release habits were useful enough to pull into a separate open-source project: **[print-ready](https://github.com/yuwei-liang/print-ready)**, a local Python CLI and an agent skill for preparing traceable 3D-print deliveries.

It gives the agent a concrete sequence to follow:

- **Check** a Bambu 3MF against the expected plates, dimensions, and settings supplied by the project.
- **Freeze** the reviewed files into a release with recorded hashes.
- **Verify** that those frozen files still match the recorded bytes.
- **Record** geometry, slicing, and physical results against the artifact that was actually tested.

H41 and the H42 fit coupon both went through the project's pinned print-ready dependency. Later feedback lives beside the frozen release, so a new observation does not silently rewrite the files I printed.

The skill is the part I want other people working with agents to try. It teaches the agent to use your measurements, derive fit tests from the relevant geometry, preserve the reviewed files, and leave missing physical evidence marked as untested. The core CLI works without a particular CAD application; you keep your existing modeling tools and project files.

To get started, install the Python package in your project environment:

```sh
pip install 'git+https://github.com/yuwei-liang/print-ready.git@v0.1.0'
print-ready --help
```

Then install the separate **[print-ready agent skill](https://github.com/yuwei-liang/print-ready/tree/main/skills/print-ready)** with your agent's skill installer, or copy that folder into its skills directory. The [README and synthetic demo](https://github.com/yuwei-liang/print-ready#try-without-private-models) provide a way to explore the workflow without any of my private models.

A successful audit or matching hash is evidence about its particular check. Physical fit and strength still need their own tests. That boundary is part of why I built print-ready: I want the next agent to carry forward what we know, along with what we still need to find out.

## What I now ask of an AI-assisted iteration

AI has let me work across modeling, rendering, scripting, and tool building within the same project. It has also made it easy to produce another revision before understanding the last one.

The most useful iterations have a specific question behind them, a model I can inspect, and a test that can expose the suspected failure. When the result comes back, I want the feedback attached to the version that produced it.

I still need to supply the measurements, try the physical object, and judge how it feels. The agent can help turn those observations into geometry and repeatable checks.

That's the workflow I'm carrying into my other projects. Before asking for the next revision, I want to be able to say what we're trying to learn—and what result would make us change direction.
