Manufacturing AI · Internal build

One design in. Sixty production files out, or none at all.

A WPC door design has to exist in every size a customer might order, in four different file formats, each named exactly the way the CNC operator expects. Done by hand it is an afternoon of exacting, error-prone work per design — and a single mistyped size reaches the router as scrapped material.

Manufacturing · CNC design automation · SheetFlow internal build

Internal build — no public deployment.

A manufacturing pipeline that runs on an operator’s machine and writes production bundles to disk. There is no hosted surface — the evidence is the source, the generated bundles and the run manifest.

orchestrator.py — 1,261 lines
Drives the run: size matrix expansion, staged delivery, bundle verification, idempotency checks and legacy artifact migration.
vector_compiler.py — 869 lines
Converts the source image into closed-contour toolpath geometry and generates the spot-UV varnish mask via HSV band segmentation.
catalog_pdf.py — 316 lines
Renders the per-size catalogue PDF that ships inside each bundle.
outputs/ — 7 production bundles
Seven completed `*_Production_Bundle.zip` archives plus `latest_run_manifest.json`, which records the naming contract and the full 15-entry size matrix in millimetres.
SheetFlow_ComplexJali_914x2134mm_Toolpath.svg
A compiled sample: 250 closed contours at 914.4 × 2133.6 mm, ready for the router.
dashboard.html — 1.4 MB
A generated single-file production gallery titled “Sheetflow WPC Production Gallery”, embedding the compiled previews inline so it opens with no server and no asset directory.
The problem

What the build had to solve.

  • Every design must ship in 15 sizes — three widths by five heights — and each size needs four different production roles.

  • CNC operators consume files by filename, so an inconsistent name is a production error rather than a cosmetic one.

  • Runs get interrupted, and a half-written bundle that looks complete is worse than an obviously missing one.

Architecture

How the work moves through it.

  1. Ingest

    A single source design image enters the pipeline with a per-design configuration describing how its varnish bands should be segmented.

    • Source image
    • Per-design config
    • Change detection
  2. Compile

    The image is vectorised into closed-contour geometry and scaled across the size matrix at one uniform factor on both axes, so proportions never drift between sizes.

    • Contour extraction
    • 15-size matrix
    • Uniform scaling
  3. Emit roles

    Each size produces four artifacts under a documented naming contract: the CNC toolpath, the print file, the spot-UV varnish mask and the catalogue page.

    • Toolpath.svg
    • Print.jpg
    • Varnish.png
    • Catalog.pdf
  4. Deliver atomically

    The bundle is staged to a partial file, verified, and only then renamed into place — so an interrupted run can never replace a good production pack with a truncated one.

    • .partial staging
    • verify_bundle()
    • Atomic rename
    • Run manifest
The build

What it is made of.

Every row was read off the source, not from a project brief. Line counts, versions and limits are the ones in the files listed above.

Language
Python — 2,446 lines across three modules
Size matrix
15 sizes: 30/32/36 in widths × 72–84 in heights, recorded in millimetres
CNC target
VCarve / ArtCAM, 6 mm tool at 3 mm cut depth
Varnish masking
Spot-UV masks via a multiband HSV segmentation engine, configured per design
Naming contract
{CleanDesignName}_{CleanSize}_{Role}{ext} — ASCII letters and digits only, no spaces in any path segment
Safety
Idempotent re-runs, `preview_only` dry-run on every destructive path, atomic staged delivery
Engineering decisions

The choices, and why they went that way.

A bundle is renamed into place only after it verifies

Production packs are overwritten on every re-run, and a run can die halfway — a lost connection, a full disk, an operator closing the terminal. Writing directly to the destination means a truncated archive silently replaces a good one, and nobody finds out until the router does. Staging to a partial file and renaming only after verification makes an interrupted run leave the previous good bundle untouched.

Verify: Bundles are written to a `.partial` path and renamed only after `verify_bundle()` passes; the seven archives in `outputs/` are all complete.

The filename is treated as a machine interface

The CNC operator finds files by name, and tooling downstream parses them. That makes the filename an interface, not a label — so it is specified as a contract with a fixed field order, a fixed separator and an ASCII-only charset, and written into the run manifest rather than living in someone’s head.

Verify: `latest_run_manifest.json` carries the naming contract explicitly: pattern, field separator, the four role suffixes, archive layout and charset.

Every destructive path has a dry run

The pipeline deletes and overwrites production output. A dry-run flag threaded through every such path means an operator can see exactly what a run would do before it does it, which is the difference between a tool people trust with a full rebuild and one they only ever run on a copy.

Verify: Destructive operations take a `preview_only` parameter throughout the orchestrator.

Unchanged designs are skipped, not recompiled

Compiling 15 sizes × 4 roles is expensive, and most runs re-process a catalogue where one design changed. Change detection means a re-run costs roughly what the change costs, which is what makes running it routinely practical.

Verify: The orchestrator gates work behind `is_new_or_changed()` and `bundle_covers()` checks.

Business outcome

What we can prove, and what we cannot.

Not publicly disclosed.

No business outcome has been measured against a stated method and confirmed with this client, so no figure is published. We would rather show you the system and let you judge it than print a number nobody verified.

Questions

About this project.

What is WPC Design Automation?
A SheetFlow internal build: a Python pipeline that takes one WPC door design image and compiles it into a 15-size production matrix, emitting a CNC toolpath, a print file, a spot-UV varnish mask and a catalogue PDF for every size, packaged as verified production bundles. It is a manufacturing tool with no public deployment.
Was WPC Design Automation built for a client?
No. It is SheetFlow’s own capability, built to demonstrate what design automation can do for WPC manufacturing. No client commissioned it and no engagement is claimed. It is published here as an example of the engineering, not as delivered client work.
What business results has WPC Design Automation produced?
Not publicly disclosed. There is no client engagement behind it and no measured production outcome has been confirmed, so no figure is claimed.