Skip to main content
    Sashiko Stencil

    Product development log · September 2026

    A stitch is
    not a hole.

    From a convincing illustration to a printable stencil that still feels like the original. A chronological record of the problems we uncovered, the decisions we made, and the evidence that changed our direction.

    Start with the image
    Our starting point: a cactus drawing with curved paddles, spines and interior lines
    The starting promise: keep the character of this drawing.

    5 mmminimum slot centerline

    2 mmminimum material gap

    184 mmsquare plate

    1.5 / 1.75regular / wide slots, mm

    Applies to the source-linked cactus experiments in iterations 07–14. Earlier debugger snapshots have no verified image registration, so they are not overlaid. Historical experiments stay historical.

    A practical starting point

    Make your first sashiko stencil.

    Sashiko Stencil Workshop turns an image into a stitch plan and a digital stencil for 3D printing. Work through Artwork, Mask, Stitch, Check, and Export in order.

    1. Choose and crop your artwork

      Open the workshop and choose an image or a starting shape. A clear subject with distinct lines or flat colors is easiest to review. Crop away unwanted background before continuing. Edit crop returns to the original image during this workshop session; applying a new crop resets the mask edits and generated result.

    2. Confirm the mask

      The mask selects the area you want to work with. For flat artwork, choose the relevant colors; disconnected marks of the same color can belong to one selection. Use object selection or follow drawing lines when appropriate, then brush areas in or out. Check holes and small details before accepting the selection.

    3. Plan your stitches

      Choose whether to follow the original drawing or replace its selected area with a pattern fill. Set the physical size and review the generated stitches. A fill is a new pattern inside the artwork, so it will not preserve every original line. Read any warnings about missing details or continuity.

    4. Check the stencil

      Review the actual openings, material between them, and fit on your printer. Changing the physical size can change which details survive. A geometry check evaluates the digital model; it does not prove how a particular printer, filament, or marking pen will perform.

    5. Save, print, and test

      Review the visibility and current purchase options, then download the STL and editable design when unlocked. The STL is for a slicer or printing service; the editable design lets you reopen the project. Test your print and removable marker on a scrap of the same fabric before transferring the full design. No physical stencil is shipped.

    Sign-in and purchase requirements appear in the workshop. Public sharing requires permission to share your artwork. For pricing and marking-tool questions, read the download FAQ.

    Open the workshop

    The development log below explains how we arrived at the current approach. Historical experiments are labeled and are not all current workshop defaults.

    00a · Before the spacing experiments

    First, what did we detect?

    Before blaming stitch placement for a missing spine, we need to see whether that spine survived image processing. This is a replay of the actual cactus input, followed by archived snapshots of the Workshop extractor before iteration 10. The later ink-fit revision is shown separately below. These are processing stages, not new historical iterations or hand-redrawn approximations.

    Original imageThe preserved color pixels feed both branches.

    Selection → maskWhich pixels are included? A filled area, not stitch holes.

    Line detection → pathsWhere did the artist draw? Curves, branches and line weights.

    Mask + paths + physical settings → stitch planThe Workshop combines these; the experiments below isolate path placement.

    1. A1Decode and preserve the source

      Original green cactus padded with white to a square, without changing its proportions
      416 × 399 px → 448 × 448 px fixture

      The upload path fits large images within 2,048 pixels per side and keeps an original-color copy. This small cactus needs no downsize. The hero fixture adds white padding for a square plate; it does not stretch the cactus. Pixels are not millimeters yet.

    2. A2Separate the plate from the artwork

      A completely included square plate mask, because the cactus PNG is opaque
      Opaque input · full rectangular initial plate mask

      The initial plate mask uses transparency when present; otherwise it includes the whole image. Cream means included, blue means excluded in these mask views. This square is not the cactus selection or a compiled stencil. A stitch-guide plate is defined later in millimeters.

    3. A3Make the automatic drawing selection

      Workshop brightness-threshold mask includes the dark outline and most of the green cactus fill
      57,521 included pixels · brightness ≤ 128

      Drawing mode deliberately uses the deterministic threshold generator: include opaque pixels whose weighted brightness is at most 128. On this image it selects the fill as well as the outlines. It has no understanding of a cactus, a spine, or the importance of a small mark.

    4. A4Review the selection, not the stitches

      The separate color-mask fixture used to generate the cactus demo
      58,767 included pixels · existing demo fixture

      In the Workshop, the user can choose regions, brush pixels in or out, inspect cleanup warnings, then confirm the mask. For reproducibility, the existing cactus demo instead uses its fixed rule: alpha above 128 and every RGB channel below 220. This is not a recorded brush edit or an AI segmentation result.

    Pixels where the Workshop's automatic drawing mask and the demo mask disagree, highlighted in pink
    1,246 pixels differ between the two masks.Pink highlights the disagreement; muted blue is shared selection. This comparison is a provenance check, not a score of which mask is correct. We should not present the demo as proof of the entire upload flow.
    What changes for photos, brush edits and mask confirmation?

    Object/photo mode tries available segmentation providers instead of forcing the drawing threshold. The configured cloud path uses foreground detection and selectable object proposals; point prompts refine selection. Failures can fall back to other providers and then basic contrast selection. None of those remote model outputs is claimed or pictured in this cactus replay.

    Add/erase brushes change a copy of the binary mask. Confirmation extracts drawing features from the original colors, separately from the selected mask. The working image then goes through contrast, optional blur, brightness threshold/inversion, mask exclusion and configured line-thickness processing. A fresh cut mask is derived from that processed image. Those raster-preprocessing controls do not rerun line detection on the altered black-and-white image.

    The images above stop at selection. The offline cactus experiments bypass that browser-canvas preprocessing and reuse the original-color paths. The final 123-slot experiment also checks its rectangular plate and slot clearances, not the uploaded image’s pixel mask. End-to-end validation of edited masks remains a separate requirement.

    Decision
    Keep selection and line information separate. A good silhouette alone cannot preserve the drawing’s interior marks.
    Validation
    Replayed the real threshold generator and compared it with the existing fixture: 1,246 differing pixels, explicitly exposed above.
    Tradeoff
    The current demo and Workshop do not share identical mask preparation. Mask quality is not established by a successful downstream stencil compile.
    Next question
    Is the information we care about still present when the original colors become paths?

    00b · Follow the original ink

    A silhouette is not the drawing.

    We return to the preserved original—not the binary selection above. The following outputs are captured inside extractDrawingFeatures. Keeping them visible lets us distinguish a detection failure from a later decision to omit a perfectly well-detected mark.

    1. B1Sample brightness at a bounded resolution

      The cactus as a 320-pixel grayscale analysis image
      320 × 320 analysis pixels

      Sample the original at cell centers, with a maximum side of 320 pixels. Convert RGB to brightness using 0.2126 R + 0.7152 G + 0.0722 B. Transparent pixels and near-white values of 240 or more are ignored. The one-pixel analysis border stays empty.

    2. B2Identify non-white support

      All non-white analysis pixels form a filled cactus support mask
      30,286 non-white analysis pixels

      This temporary support includes the green fill and dark marks. It defines the brightness histogram for line detection; it is not the user’s editable selection mask. Treating this silhouette as the whole drawing would already lose the central rib and interior dashes.

    3. B3Separate dark ink from lighter fill

      The isolated dark cactus outline, spines, central rib and internal marks, with the green fill removed
      Measured split: 87 / 255 · 11,849 ink pixels

      Choose an Otsu threshold from the non-white brightness histogram. Unlike the fixed mask threshold of 128, this split is calculated from the image. For this cactus, the dark outline and marks survive while the lighter fill is removed. A solid monochrome logo takes a boundary fallback instead; this image takes the line branch.

    4. B4Measure ink width before thinning

      Distance-to-ink-edge field, with brighter cream pixels deeper inside thick original strokes
      Blue → cream: increasing distance inside the ink

      Estimate the distance from each ink pixel to its edge. Later, each path receives a median width estimate from this field, resisting unusually thick intersections. This stores evidence for regular and wide slots; it does not yet cut any holes or decide their printable width.

    5. B5Thin strokes to their centerlines

      A one-pixel cactus skeleton retains the rib, short branches and paddle curves
      11,849 ink pixels → 1,862 skeleton pixels

      Iterative Zhang–Suen thinning removes edge pixels under connectivity rules, up to 160 rounds. A thick drawn line becomes one centerline, not two outline paths. Sampling and thinning can still move a curve or lose tiny input features; fewer pixels is not itself a likeness score.

    6. B6Trace endpoints and junctions

      Raw colored skeleton routes terminate at cactus branch junctions
      96 raw routes · colors distinguish neighboring routes

      Walk connected skeleton edges between endpoints and junctions, then trace remaining loops. Avoid redundant diagonal links when a direct pixel connection exists. The short spine branches are visible here, before any minimum stitch length is enforced.

    7. B7Join the most continuous directions

      Joined colored routes follow the cactus outline continuously while retaining short side branches
      96 raw routes → 59 joined routes

      At a shared junction, pair the most nearly opposite incoming directions. This follows the likely continuation of a drawn stroke; it is not a merge of neighboring stitch slots. Unpaired branches remain separate routes. Colors identify routes, not thread recommendations.

    8. B8Smooth, simplify and retain line evidence

      Simplified cactus paths with short details in blue and long paths in cream
      59 paths · 322 points · no capacity truncation

      Smooth interior points with a 1:2:1 average, then simplify at 0.0012 normalized tolerance. Drop paths at or below 0.004 normalized length; cap output at 256 paths and 16,000 points. Blue marks the 50 paths tagged as short detail—not a semantic count of cactus spines. The original width estimate stays attached to each path.

    Decision
    Preserve original-color centerlines and their width evidence instead of generating everything from a filled mask.
    Validation
    The real extractor produces 59 paths from this PNG, including the visible short branches. Replaying it exactly reproduces the cached source routes used by the existing experiments.
    Tradeoff
    This confirms source continuity, not perfect tracing. The 320-pixel analysis, smoothing, simplification and small-path cutoff can all affect likeness before packing starts.
    Next question
    Once those paths have real-world dimensions, can full-size slots represent them without colliding?

    00c · Where image processing meets fabrication

    Give the paths a physical size.

    A normalized path has no printable stitch length yet. Convert it to millimeters, apply the chosen interpretation, and only then measure which marks can become slots. The two outputs below establish the input and crowded test case used later in this log—not a new production default.

    1. C1Map, filter and place source paths

      The detected cactus paths mapped into a 184-millimeter square plate at the experiment's 1.10-times scale
      59 routes · 184 mm square · 1.10× artwork · 0°

      Multiply normalized coordinates by the physical width and height. At detail level 0.8, this route stage keeps short-detail paths at least 0.88 mm long; that is an input-path filter, not a printable slot minimum. This experiment then enlarges and recenters the artwork. Interior fill is off so we can measure fidelity to the actual drawing.

    2. C2Try full-size slots, then expose conflicts

      The crowded cactus candidate layout with colliding slots highlighted in red
      167 slots · 127 red · 130 conflicting pairs

      The original diagnostic planner separates sharp turns into runs, accepts source lengths from 2 mm, and proposes 5 mm slots along their tangents. Short accepted marks are extended, never printed at 2 mm. Clearance uses the entire rounded 1.5 or 1.75 mm opening and a 2 mm material gap. Red means this placement fails that gap check; the compiler rejects it.

    The Workshop can also repeat a chosen pattern inside the selected area instead of following detected lines. Its planner combines the artwork mask, interpretation, line-weight setting, acceptance threshold and manual edits. These experiments deliberately compare drawing-led placement policies on identical source paths; they are not every possible Workshop interpretation in sequence.

    Traceability and how to reproduce these images

    Generated with node scripts/generate-image-process-examples.mjs. It calls deterministicMaskGenerator, captures optional snapshots inside shared/drawing.ts, and checks that the resulting physical paths match cactus-source-routes.json. It also verifies the crowded layout against the existing likeness experiment.

    Source SHA-256: 280e3e33f2c83d545a8940f58fde62b165796a74e4358cfee698c93898e4d54a. Assets and counts are generated offline; opening this page does not run segmentation, change Workshop settings or regenerate the hero. The trace is opt-in and does not alter the extractor’s result.

    Decision
    Measure what survives at each boundary: pixels → selected area → ink → paths → full-size slots → compiled openings.
    Validation
    The reproduced crowded control has 127 red slots. The short branches exist in the source paths, so their later disappearance cannot all be blamed on mask detection.
    Tradeoff
    A detected feature is not guaranteed a slot. Tight junctions create competing claims on the same material, and resolving them can destroy the likeness.
    Next question
    The chronological iterations below explain how we changed those decisions, including the failed spine-less result and the branch-preserving candidate that replaced it.

    Now the development history has a visible starting point. We know what the image-processing stage supplied; the following iterations document what we tried to do with it.

    01 · Establish the product constraints

    Start with the material.

    A convincing stitch illustration is not automatically a printable stencil. A stencil is a connected plate with holes removed. Those holes need room between them, including their rounded ends.

    Original green cactus drawing with a dark outline, central rib and short decorative marks
    The original cactus. Its outline, central rib and small marks ask different things of a stencil. Both the silhouette and short distinctive marks contribute to its character.
    Minimum slot centerline
    5 mm
    Regular / wide openings
    1.5 / 1.75 mm
    Material between openings
    At least 2 mm
    Material outside the design
    6 mm border
    5 mm centerline2 mm solid gap
    A 5 mm centerline with 1.5 mm rounded caps produces a 6.5 mm overall opening. The caps count when measuring clearance.

    These are our product constraints, not universal limits for every printer. We removed print-time estimates from the experience: layer settings, speed, material and the slicer determine the actual print.

    Decision
    Make physical dimensions part of planning, not a check added after drawing the preview.
    Validation
    Measure rounded opening boundaries in millimeters. Screen zoom changes presentation, never the physical output.
    Tradeoff
    The original illustration contains marks that do not meet the new minimum length. A faithful-looking SVG can no longer stand in for a printable plan.
    Next question
    Can we recover short details without showing slots below 5 mm?

    02 · Recover detail without breaking the length rule

    Keeping detail created a new problem.

    The first 5 mm minimum simply rejected shorter marks. It respected the length rule, but the cactus lost small details and its recognizable rhythm. We added Stitch Acceptance Extension: accept source marks as short as 2 mm and extend them to 5 mm, rather than drawing unprintably short slots.

    Strict 5 mm cutoff64 stitches
    Accept source marks from 2 mm136 stitches / 104 red

    Historical candidate set, replayed from the retained legacy data. Red means a slot is involved in a clearance conflict, not that its length is too short.

    We first exposed the lost marks through 0.5 mm histogram buckets, then a continuous acceptance chart. The slider made the tradeoff visible. But extending a mark around its center also moved its ends closer to neighboring openings.

    Decision
    Let users accept detected marks down to 2 mm and extend them to 5 mm. Make the threshold and recovered marks visible.
    Validation
    64 retained marks became 136 in the historical candidate set, but 104 now had clearance conflicts.
    Tradeoff
    Length compliance recovered the detail, but extending slot ends consumed the material between neighboring stitches.
    Next question
    Can scale, orientation or local movement create enough space for those recovered marks?
    Line weights, masks and preview consistency

    Source-image thickness became a separate signal: bold source lines could produce wider slots while keeping the same 5 mm minimum length. Scalloped edges were tried as a visual identifier, then removed because they made the openings look lumpy. Smooth 1.5 mm regular and 1.75 mm wide slots became the rule.

    Acceptance and mask correction also had to remain distinct. Acceptance recovers detected short marks; brushing a mask restores areas detection missed. Neither operation proves the resulting openings are printable.

    We found that the hero, debugger and compiled preview were not always showing the same geometry. The hero was connected to a single planned-and-compiled result, rather than separately styled stitch and stencil illustrations. This later experiments in this log remain separate from that compiled hero asset; they are not silently shipped as defaults.

    03 · Search before discarding detail

    Move the stitches. Measure the consequences.

    We tested overall artwork scale, alternating stitch angles, whole-artwork rotation and bounded local movement. The important distinction: artwork scale spreads slot centers apart; it does not stretch the slots themselves.

    Scale + artwork rotation

    Expand positions and tilt the whole cactus to test corner-to-corner fit. A rigid rotation preserves pairwise gaps; it only changes the footprint.

    Zigzag allowance

    Rotate individual slots around their centers. This can separate aligned ends, but can also create new conflicts with nearby contours.

    Local adjustment

    Move small conflict neighborhoods within a bounded distance. Initially clear stitches are pinned; introducing a new conflicting pair is rejected.

    Manual editing

    Select, move, rotate, erase or lasso slots with undo. Manual edits remain separate from automatic search so a comparison cannot quietly overwrite them.

    The original fixed-zigzag search evaluated 110,898 combinations of scale, angle, phase and artwork rotation. That was exhaustive on one finite model, not a continuous global optimum. We kept it off the main UI thread in a browser worker. WebGPU or WebAssembly alone would not fix an inadequate objective or missing contour information.

    Decision
    Test artwork placement and bounded stitch movement while holding slot length and width fixed. Keep manual edits reversible.
    Validation
    The finite grid evaluated 110,898 combinations. Rotating the whole artwork changed bed fit, not pairwise clearance; moving individual slots could create new conflicts.
    Tradeoff
    Searching more settings did not tell us which neighboring marks belonged to the same source contour, or which details mattered most.
    Next question
    Could similar conflicting slots be combined without damaging the drawing’s rhythm?

    04 · Reject a misleading improvement

    Fewer red marks was the wrong victory.

    Early merging reduced conflict counts by lengthening replacement stitches or thinning entire runs. The score improved while the drawing got worse: the baseline broke into isolated dashes, and endpoints pulled away from the cactus trunk.

    Crowded baselineLower conflict count, worse rhythm
    Minimal regression example, not a historical cactus screenshot. Clearing conflicts by thinning the baseline changes the design.

    We tightened merging: preserve slot length, average a pair’s undirected angle, pin endpoints of longer runs, allow at most one removal per run and reject a pitch increase above 50%. If those constraints cannot fit, leave the conflict visible.

    That fixed destructive cleanup, but it did not solve the underlying crowding. In the legacy-data workflow comparison, two orders finished at 91 red stitches with five removals. Adjusting before merging reached 87 red stitches with seven removals. Scale was 1× and zigzag was 0°, so two supposedly active stages were doing no spacing work.

    Decision
    Stop using aggressive pair deletion as the repair strategy. Constrain merging to preserve length, endpoints and rhythm.
    Validation
    Conservative legacy workflows still ended at 91 or 87 red stitches. Fewer removals protected the drawing, but did not solve its crowding.
    Tradeoff
    We accepted visible conflicts rather than hiding them by destroying the pattern. Cleanup after dashing was the wrong place to solve distribution.
    Next question
    What if we planned stitch counts and positions on the original paths before creating the slots?

    05 · Change the planning model

    Go back to the paths, not the dashes.

    The turning point was retaining detected contour and run IDs from the original cactus. We could now count and space slots along a source path, split at substantial corners, and avoid treating nearby marks on different contours as one run.

    Source-linked candidates167 stitches / 146 red
    Contour-first spacing114 stitches / 0 red

    New source-linked dataset: 167 starting candidates. This is not the historical 136-stitch dataset above, so the two baselines are not directly comparable.

    Contour spacing uses the shared production slot packer. It solves the count and spacing of fixed-length slots along each run, checking their actual rounded boundaries. It does not repeatedly delete pairs until the red disappears.

    Our first ordering still let short decorative marks occupy space needed by defining long contours. Reserving longer contours first raised the best result from 94 to 114 slots and reduced omitted multi-slot runs from three to zero. It traded away more short details, which we report rather than hide.

    Decision
    Keep source route/run identities and solve spacing on those paths. Reserve the longer contours before short marks.
    Validation
    The source-linked experiment reached 114 slots and zero conflicts, with every multi-slot source run represented.
    Tradeoff
    Longer-first was an assumption about importance, not an understanding of the drawing. It omitted 32 short runs.
    Next question
    Is the operation order responsible for the missing detail, or is the new success metric still incomplete?

    06 · Validate the order, then inspect what the score missed

    The first zero-conflict workflow.

    Accept short marks → place the artwork → space along contours → test zigzag → local adjustment. This historical experiment compared operation order. Placement before spacing gave the contour solver more room, but its score did not yet measure missing branch or bend coverage.

    Place then space: 1.10× scale, 0° artwork rotation, 0° zigzag. 60 complete layouts tested independently.

    1. Accept / extend167 stitches / 146 red
    2. Scale + rotate167 stitches / 127 red
    3. Space on contours114 stitches / 0 red
    4. Test zigzag114 stitches / 0 red
    5. Local adjustment114 stitches / 0 red
    Measured results on the same source-linked cactus
    WorkflowSlotsRedLong runs omittedShort runs omitted
    Place then space1140032
    Space then place1060032
    Adjust before zigzag1140032

    Each order tests 60 complete layouts: scale 1×, 1.05× or 1.10×; artwork rotation 0°, 20°, 40° or 60°; and zigzag 0°, ±15° or ±30° with both nonzero phases. Acceptance starts at 2 mm and the local movement limit is 1 mm. Every stage must fit the 184 mm plate.

    The best result on this grid needed no zigzag or local movement after contour spacing. Place-then-space and adjust-before-zigzag tied. We prefer place-then-space as the simpler starting explanation, not because the search proved it uniquely optimal.

    Decision
    Use placement before contour spacing as the starting workflow. Do not force zigzag or local movement when they add no benefit.
    Validation
    Three independently tested orders reached zero conflicts. Two tied at 114 slots; the third retained 106. All omitted 32 short runs.
    Tradeoff
    The visual review exposed the failure: the cactus had lost its spines. A run counted as represented even when most of its curve was missing.
    Next question
    Change the objective: can we preserve attached branches and bend coverage while keeping zero conflicts?

    This was a printability milestone, not the finished design. The missing spines are the problem the next iteration addresses.

    07 · Respond to the missing-spine failure

    Keep what makes it recognizable.

    The preceding iteration produced zero red conflicts, but the cactus had lost its spines. We traced the loss to the placement priority, not simply to missing image detection: the source data still contained the attached branches. We therefore kept the physical rules and changed what the planner rewarded. Zero red is now a constraint, not the measure of likeness.

    The following attempts hold the artwork placement, 5 mm slot length, 1.5/1.75 mm widths, 2 mm clearance and 184 mm plate fixed. Each starts from the same detected paths. This is a sequence of revised planning policies, not four cleanup filters applied to the previous output.

    1. 07a

      First, give the short paths priority.

      07a · Measured output94 slots · 0 red
      Attached branches
      31 / 32
      Source coverage
      50.0%
      Largest uncovered stretch
      131.7 mm
      Decision
      Reverse the reservation order. If long contours are crowding out the spines, let short paths claim their space first.
      Validation
      31 of 32 attached branches returned, but source coverage fell from 75% to 50%. The largest uncovered stretch grew from 22.9 to 131.7 mm.
      Tradeoff
      We recovered the small features by hollowing out the main contours. This was not an acceptable fix.
      Next question
      Can individual slot placements preserve more of each contour than solving a whole run as one batch?
    2. 07b

      Then, place one slot at a time along the paths.

      07b · Measured output112 slots · 0 red
      Attached branches
      1 / 32
      Source coverage
      76.9%
      Largest uncovered stretch
      10.0 mm
      Decision
      Evaluate fixed-length tangent slots at many positions. Prefer the slot that covers the most currently uncovered source path, rejecting physical conflicts.
      Validation
      Coverage reached 76.9% and the worst uncovered stretch fell to 10.0 mm, with zero conflicts. But only 1 of 32 branches survived.
      Tradeoff
      Individual placement improved continuity. Total covered length still rewarded long contours at the expense of distinctive short features.
      Next question
      Can an explicit reservation weight protect those attached branches?
    3. 07c

      Reserve the branches, then inspect the curves.

      07c · Measured output122 slots · 0 red
      Attached branches
      31 / 32
      Source coverage
      73.9%
      Largest uncovered stretch
      27.3 mm
      Decision
      Give newly covered branch length 4× weight and bend coverage 2× weight, with a bonus for first representing a source run.
      Validation
      31 branches returned in 122 conflict-free slots, but the largest uncovered stretch grew to 27.3 mm. Bend coverage was 76.0%.
      Tradeoff
      Strong branch priority fixed most spines but weakened continuity elsewhere. Maximizing branch count was another incomplete objective.
      Next question
      Which weighting keeps most branches while also protecting the rounded parts of the drawing?
    4. 07d

      Balance branch character with curve coverage.

      07d · Measured output123 slots · 0 red
      Attached branches
      29 / 32
      Source coverage
      75.6%
      Largest uncovered stretch
      16.9 mm
      Decision
      Compare 21 branch/bend weight settings. Select the 3× / 3× candidate as a balanced direction for visual review, not a global optimum.
      Validation
      123 slots retain 29 of 32 branches, 86.1% bend coverage and a 16.9 mm worst uncovered stretch. There are zero conflicts at the same 184 mm size.
      Tradeoff
      We gave up two branches compared with the strongest branch reservation, gaining substantially better curve coverage and a smaller worst gap.
      Next question
      Does that tradeoff survive compilation and different drawings, rather than only looking better on this cactus?

    Validation: compile the candidates, then widen the test.

    Five placement policies, three drawings, two plate sizes: 30 layouts compiled into actual STL geometry, without repairing away their slots. A separate 21-setting weighting sweep on the cactus tested how much priority to give branches and bends. The crowded control had 127 red stitches / 130 conflicting pairs, and correctly failed compilation.

    029 / 32branch-like paths retained

    58 86%coverage at detected bends

    22.916.9 mmlargest uncovered path stretch

    The mixed branch-and-curve candidate has 123 slots on the same 184 × 184 mm plate, with zero conflicts. All centerlines remain 5 mm; regular/bold widths remain 1.5/1.75 mm. It still omits 3 short runs. This is a better candidate for visual review, not a finished or universally optimal reconstruction.

    Cactus from the original PNG: Branches + curve coverage, 184 mm square. Gray traces show detected paths; purple marks show uncovered source samples when enabled.

    Original sourceOriginal pixels

    Detection is rerun from the original PNG and checked against the source routes. All policies use the same 1.10× artwork placement.

    Previous approach114 slots · 0 red
    Attached branches
    0 / 32
    Source coverage
    75.0%
    Largest uncovered stretch
    22.9 mm
    Branches + curve coverage123 slots · 0 red
    Attached branches
    29 / 32
    Source coverage
    75.6%
    Largest uncovered stretch
    16.9 mm
    Cactus from the original PNG · all five policies at 184 mm · all have zero conflicts
    PlacementSlotsBranchesCoverageBend coverageWorst gapSTL check
    Longest paths first1140/3275.0%57.7%22.9 mmPassed
    Shortest paths first9431/3250.0%44.3%131.7 mmPassed
    Place by uncovered length1121/3276.9%74.2%10.0 mmPassed
    Strong branch reservation12231/3273.9%76.0%27.3 mmPassed
    Branches + curve coverage12329/3275.6%86.1%16.9 mmPassed

    Selected compile: 123 distinct openings, 1 connected material component, watertight mesh, 2.006 mm smallest analytical gap. An STL check is not a physical print test. No printer or marking-tool test was performed.

    The same mixed weights improved the leaf’s coverage from 70% to 81%, retaining all 16 attached twigs. They improved the dragonfly’s coverage from 61% to 81% and retained both antenna-like branches, but its worst gap barely changed: 23.0 to 23.4 mm. Its small head loop is also poorly represented in the visual comparison. This is not a universal win. Small closed contours need protection of their own; branch counts do not catch that failure.

    Increasing the whole cactus to a 220 mm plate improved the mixed result to 30/32 branches and a 13 mm worst gap. The larger plate did not recover every feature, and a greedy algorithm can make different, sometimes worse, choices with more space. Size alone is not a reliable fix.

    What we would build onDetect connected paths and short branches → place the artwork → reserve branch and bend coverage → place fixed-length slots along the remaining paths → review the largest uncovered stretches → compile and verify. The next solver should improve continuity without sacrificing these protected features. Do not put destructive merging back at the end.

    Exact measurements, scoring and limitations

    Coverage samples each eligible corner-split source run at intervals no larger than 0.5 mm. A sample is covered when a slot belonging to that same run has a centerline within 2 mm. This deliberately allows normal stitch gaps. It measures detected path coverage, not the percentage of the original image or a recognition confidence. Purple display traces are simplified within 0.05 mm; measurements use the full samples.

    A branch-like run is 2 to under 8.75 mm long and ends within 2 mm of a longer run, at the reference placement. These labels and the eligible source set remain consistent in the larger-plate experiment. We do not label “cactus spines” by coordinates or object name. Detection errors and smaller unaccepted paths are outside this score.

    Bend samples turn more than 20° across a 5 mm path neighborhood. “n/a” means the fixture has no bends that meet this threshold, not that its curves were all preserved. The worst gap is the longest consecutive uncovered arc, joining the start and end for closed runs. It is not the minimum material wall.

    The candidate positions are tangent-aligned, fixed 5 mm centerlines spaced at 0.5 mm candidate intervals along each run. Candidates outside the 6 mm plate border or within 2 mm of another slot are disallowed. The greedy score is new covered length × branch weight × bend weight, plus a 2 mm-equivalent bonus for first representing a run. No slot is lengthened beyond 5 mm, merged, zigzagged or moved off its path center.

    The sweep tested branch weights 1, 1.5, 2, 2.5, 3, 4, 6 and bend weights 1, 2, 3. The shown mixed candidate uses 3 and 3. Those weights were selected on the cactus, then reused unchanged on the two controlled drawings. They are experimental choices, not a global optimum or a validated universal preset.

    The selected layout’s maximum slot-to-source deviation, including the extension of short marks, is 1.41 mm. The samples do not detect every kind of visual distortion. Curved slot geometry, spatial balance, detector robustness and a human likeness review still need separate evaluation.

    Every displayed stencil was compiled from the measured slots with no geometry repairs. The runner checks slot count against opening count, connectivity and watertightness. Reproduce with node scripts/run-likeness-experiments.mjs; the weighting sweep is node scripts/sweep-likeness-weights.mjs. Both run offline; this page only reads their recorded results.

    These experiments have not changed the hero, Workshop defaults, or the existing debugger optimizer. A printable mesh does not establish bed compatibility, slicer behavior, physical strength or recognizable likeness.

    08 · Validate the branch-preserving candidate

    The spines are back. The work is not finished.

    We addressed the missing-spine failure by giving attached branches and bends explicit value during placement, not by loosening the printing rules. The resulting 123-slot candidate retains 29 of 32 branch-like paths. This became the experimental direction carried forward into the next iteration, not a new Workshop default.

    What the new experiments verified

    All 30 new layout cases passed the production compiler, preserving their opening counts in connected, watertight plates. Clearance and border checks ran on the actual slots. The intentionally crowded control was rejected.

    Before calling it finished

    Review omitted details and stitch rhythm with a person. The detector still needs validation on more real drawings. The two extra fixtures isolate placement, not detection. Then test the physical print and marking tool.

    Decision
    Carry branch-and-curve-aware placement forward as the candidate to improve, not a finished universal preset.
    Validation
    The cactus recovered 29 attached branches with zero conflicts; its 123 measured slots compiled into 123 openings in one connected, watertight plate.
    Tradeoff
    Three short runs remain omitted, the worst uncovered stretch is 16.9 mm, and the dragonfly exposed a separate failure on small closed loops. No physical print test has run.
    Next question
    Replan the longest gaps without sacrificing recovered branches, protect small closed contours, then validate on more real drawings and a physical print before rollout.
    Implementation and verification notes

    Source routes come from the original PNG through extractDrawingFeatures and drawingRoutes. The debugger keeps contour IDs; the separate historical acceptance illustrations retain their legacy candidates. The longer-contour-first reservation option is currently used by this debugger experiment; existing Workshop callers keep their default route ordering.

    Independent workflow searches run in a browser worker with progress and cancellation. Results are immutable snapshots, and later steps consume the previous output. The page itself loads precomputed geometry, so reading this case study does not start a search.

    Regression tests cover rounded-cap clearance, fixed 5 mm lengths, endpoint preservation, contour identity, oversized-artwork rejection and independently optimized workflow outputs. The new experiment tests additionally check branch classification, missing-path measurement, compiled opening counts and the comparison controls. The report was checked in desktop and mobile browsers.

    Examples are reproducible with scripts/generate-process-examples.mjs. Measurements shown here are a September 10, 2026 snapshot, not a live print guarantee or a continuous global optimum.

    Explore the debugger

    Iteration 08: the branch-preserving candidate.

    Original cactus reference for iteration 08
    Original · compare spines and paddle curves
    Iteration 08 stitch candidate123 slots · 0 red
    Attached branches
    29 / 32
    Source coverage
    75.6%
    Largest uncovered stretch
    16.9 mm

    29 of 32 attached branches retained. The same 123 slots become 123 compiled openings. Digital geometry validated; physical print testing and full planner production rollout remained pending at this point.

    The next visual review found a different problem: some recovered details pointed horizontally or vertically even when the source was tilted. The following iteration addresses that loss of character.

    09 · Preserve direction, not just presence

    The details returned. Their angles did not.

    The preceding candidate brought back 29 branches, but visual review exposed another loss of character: tilted marks were becoming horizontal or vertical. A nearby slot had counted as coverage even when it pointed the wrong way. We traced this to C2—choosing the slot direction—not to the stencil extrusion.

    The old planner sampled a 0.0002 mm span of the detected path. On a pixel-derived staircase, that often sees just one flat step. In the 123-slot candidate, 22 axis-aligned slots had a surrounding source direction tilted by 3–20°. The slope still existed in the detected paths; our direction calculation was ignoring it.

    Original image detailThe source mark has a slight tilt.
    Previous direction0.0° · one local flat step
    Fitted direction7.6° · the whole short mark

    Enlarged view of one real cactus mark. Blue dashes show the detected path. The comparison keeps the slot center and 5 mm length fixed; only its angle changes. The fitted axis follows the overall mark rather than one raster step.

    Decision
    Fit direction over a stitch-sized path neighborhood. Use the entire run for shorter marks, and never fit across a split corner or branch junction.
    Validation
    The short-mark regression failed at 0° in both planners. The shared fit returns 7.6°; truly horizontal and vertical lines remain unchanged.
    Tradeoff
    A fitted direction is an estimate of the detected path, not a recovery of information already lost during image sampling or thinning.
    Next question
    Can we apply those directions while preserving the required material between slots?

    Changing the angle is not a final cleanup step.

    Rotating the old slots at their existing centers introduced 3 conflicting pairs. That version is deliberately not offered as a printable stencil. Instead, we fit candidate directions first and rerun placement with exactly the same branch/bend weights and physical constraints.

    Previous: local step direction123 slots · 0 red
    Attached branches
    29 / 32
    Source coverage
    75.6%
    Mean angle error*
    3.18°
    New: fit direction, then pack124 slots · 0 red
    Attached branches
    29 / 32
    Source coverage
    76.7%
    Mean angle error*
    0.00°
    Decision
    Use the fitted angle before candidate scoring and clearance checks, then compile those exact accepted slots. Do not rotate a supposedly finished stencil.
    Validation
    123 → 124 slots, 29/32 branches retained, zero conflicting pairs. Coverage rises from 75.6% to 76.7%; all 124 slots compile into distinct openings in a connected, watertight plate.
    Tradeoff
    The 16.9 mm worst uncovered stretch and three missing short runs remain. Better angles did not solve every continuity problem.
    Next question
    Keep angle fidelity in the report alongside coverage, branch retention and physical clearance; test other drawings without changing the weights.
    Same weights and physical rules · six fitted layouts compiled
    Source / plateSlots, before → afterBranchesMean angle error*ConflictsSTL
    cactus · 184 mm12312429/323.18° → 0.00°0Passed
    cactus · 220 mm14314330/322.48° → 0.00°0Passed
    leaf · 184 mm10110116/160.31° → 0.00°0Passed
    leaf · 220 mm12212216/160.27° → 0.00°0Passed
    dragonfly · 184 mm83832/20.83° → 0.00°0Passed
    dragonfly · 220 mm1051052/21.10° → 0.00°0Passed

    *Angle error compares a slot with the fitted direction of its own detected path neighborhood, treating 0° and 180° as the same axis. Near-zero error verifies that the intended fit is used; it is not independent proof of original-image likeness. Ambiguous fits are excluded and counted separately. These six layouts have no unmeasured slots. The leaf and dragonfly are vector controls, not extra image-detection tests. The 220 mm cases need a larger bed than the default 184 mm profile.

    Implementation, scope and validation limits

    The shared direction fitter integrates the source path over arc length and finds its principal axis. Adding extra vertices along the same segment cannot bias the angle. It preserves the original arc-position center, respects the existing corner splits and falls back conservatively when no reliable principal direction exists. Minimum lengths, widths, plate border and clearances are unchanged.

    The Workshop drawing packer, debugger source candidates and experimental coverage planner now share this calculation. The hero and built-in library assets were regenerated through the production planner: 86 slots and a connected, watertight stencil. That production route/mask policy is still different from the 124-slot branch-weighted experiment. The full experimental policy has not been silently promoted to a Workshop default. Historical acceptance illustrations and earlier process snapshots are not rewritten as new results.

    Reproduce the new comparison with node scripts/run-angle-experiments.mjs. It reads the frozen prior results, holds their artwork placement fixed, changes direction estimation before repacking, and runs the actual stencil compiler. Tests cover the formerly flattened cactus mark, rotation/reversal invariance, vertex-density independence, corner boundaries, exact slot lengths, clearance and compiled geometry. No physical print or original-pixel angle ground-truth study has run.

    Iteration 09: directions restored to the detected paths.

    Original cactus reference for iteration 09
    Original · compare the angles of the small interior marks
    Iteration 09 stitch candidate124 slots · 0 red
    Attached branches
    29 / 32
    Source coverage
    76.7%
    Mean angle error*
    0.00°

    29 of 32 attached branches retained. 124 measured slots become 124 compiled openings. Direction fitting is shared with the Workshop; physical print testing and the full experimental planner’s production rollout remain pending.

    Subsequent review found that some detected paths were already wrong. The next iteration checks the original ink rather than scoring the planner against its own fitted paths.

    10 · Our reference was already wrong

    Measure the ink before we lose the angle.

    Reviewing iteration 09 against the original image exposed a flaw in our validation: a stitch could perfectly match the detected path while still pointing the wrong way. Eight of 21 isolated interior marks differed from their original ink by more than 5°. The earlier “zero angle error” measured agreement with our own path fitter, not the image.

    Original ink-15.5° · original-resolution ink estimate
    Previous stitch0.0° · actual planned slot
    Pixel-fitted stitch-13.1° · actual planned slot
    Decision
    Fit compact, elongated, isolated marks directly from their unthinned ink. Keep the skeleton for connected curves and branches; do not flatten every component into a straight line.
    Validation
    Mean original-ink angle error: 4.76° → 1.27°. All 21 matched marks are now within 5°, and the slot lengths, widths and required clearances are unchanged.
    Tradeoff
    These are original-pixel orientation estimates, not human annotations. The test covers isolated marks; attached spines and curved strokes need separate continuity checks.
    Next question
    The angles improved, but the outline was still broken. Where were the longer paths disappearing?

    Controlled diagnosis: removing simplification alone left eight failures. Native-resolution skeletonization reduced them to two. Fitting the unthinned ink at the existing 320-pixel analysis resolution removed all eight. Three synthetic raster controls at −17°, 13° and 37° also stay within 3° of their planted directions; these are not additional real-world upload samples.

    11 · Preserve the sequence, not just the count

    A local conflict should not erase a whole curve.

    The production packer placed short details first, then tried equally spaced batches on each longer run. One collision could reject the entire batch. A 54 mm source route received no stitches, while a 90 mm route received only one. Mask clipping was not the culprit: all 86 packed hero slots survived it.

    We now retain source junctions and solve an ordered sequence of placements along each run. Already-placed branches create local forbidden intervals; the parent curve can use the spans between them. The score penalizes long interruptions and excess spacing. Every selected pair—including distant folds of the same curve—must pass the unchanged capsule-clearance check.

    Previous production stitches86 slots · 48.0% source coverage
    Branch-like runs retained
    31/32
    Largest uncovered stretch
    80.8 mm
    Smallest material gap
    2.08 mm
    Iteration 11 ordered stitch plan106 slots · 67.2% source coverage
    Branch-like runs retained
    31/32
    Largest uncovered stretch
    36.8 mm
    Smallest material gap
    2.02 mm

    The original overlay is aligned at the same physical scale. Preview strokes use the actual opening widths so the remaining gaps stay visible.

    Same 184 mm plate, artwork placement and physical settings throughout
    ChangeSlotsInk angle errorCoverageLargest gapConflicts
    Before: skeleton angles + batch packing864.76°48.0%80.8 mm0
    10 · Fit short ink marks; old packing861.27°48.0%80.8 mm0
    11 · Fit ink + ordered source packing1061.27°67.2%36.8 mm0
    Decision
    Replace whole-run batch rejection with bounded ordered packing. Keep positions on the detected paths, keep short-mark acceptance explicit, and preserve the source direction instead of merging or zigzagging slots.
    Validation
    86 → 106 slots; coverage 48.0% → 67.2%; 31/32 branch-like runs retained. All 106 openings compile into a connected, watertight stencil with zero conflicts.
    Tradeoff
    This is a bounded, order-dependent search, not a global optimum. Three eligible runs remain unrepresented and the worst uncovered stretch is still 36.8 mm. Better does not mean every curve is restored.
    Next question
    Test junction arrangements and real raster drawings more broadly. Investigate remaining gaps before adding more geometry-changing repairs.
    What is shared, what is measured, and what remains open?

    The Workshop uses the same ink extractor and ordered drawing packer that generate the hero and built-in Library assets. The iteration-11 views below use that iteration's production geometry, not the earlier 124-slot experiment, which used 1.10× artwork placement and a different packing policy.

    Coverage measures proximity to detected source routes within 2 mm; it is not an image-recognition score. The angle reference comes from separate connected-component measurements on the original 448-pixel image. Display size never changes physical dimensions.

    Five millimeters still means slot centerline length. Rounded caps make a minimum opening 6.5 mm long at regular width or 6.75 mm at wide width. The hero retains its 5.5 mm preferred stitch setting; shorter accepted marks extend to 5 mm. No material-gap, border or width limits were relaxed.

    Regenerate this report with node scripts/run-source-fidelity-experiments.mjs. Earlier cases stay archived. Physical printing, broader real-image validation, and globally coordinated branch placement remain open.

    Iteration 11: ordered placement, before joint repair.

    Original cactus reference for iteration 11
    Original · inspect the missing upper-right outline
    Iteration 11 ordered stitch plan106 slots · 67.2% source coverage
    Branch-like runs retained
    31/32
    Largest uncovered stretch
    36.8 mm
    Smallest material gap
    2.02 mm

    106 planned slots become 106 distinct stencil openings. Pixel-based short-mark fitting and ordered packing were shared with the Workshop, hero and built-in Library at this point. The next iteration revisits the gaps that remain.

    12 · The details and the outline need the same space

    Make room at the junction, not by losing the detail.

    Iteration 11 retained the spines, but its longest outline interruption was still 36.8 mm. Inspection located it on the outside of the upper-right arm. This was not 36.8 mm of completely empty fabric: the spine stitches cross that region, but they do not follow its curved outline.

    We sampled 69 additional outline positions. With the surrounding stitches frozen, none could accept another 5 mm slot with the required 2 mm material gap. That demonstrated a failure of this arrangement—not proof that the drawing was physically impossible.

    11 · Details first36.8 mm outline interruption in this arm
    12c · Joint placement + bend guard13.9 mm outline interruption in this arm

    Same physical scale. The dotted line is the detected outline; blue slots have changed placement. Outline interruption counts only stitches assigned to that source run. Proximity to any stitch—including spines—is a separate diagnostic: 8.0 7.5 mm for the worst uncovered stretch in this arm.

    Three proposals. One additional safeguard.

    12a · Outward shift only111 slots · 36.8 mm worst outline interruption

    Moving details outward alone added slots, but the worst interruption stayed at 36.8 mm. More slots was not the answer.

    12b · Joint placement, no bend guard111 slots · 22.8 mm worst outline interruption

    Joint shifts shortened the gaps, but bend coverage fell from 57.0% to 53.7%. This candidate was rejected.

    12c · Joint placement + bend guard110 slots · 22.8 mm worst outline interruption

    Reject proposals that reduce bend coverage. One fewer slot preserves the previous bend coverage while retaining the shorter interruptions.

    Same 184 × 184 mm plate, original image mask and printing constraints
    IterationSlotsWorst outline interruptionSource coverageBend coverageDetails retained
    11 · Details first10636.8 mm67.2%57.0%52/52
    12a · Outward shift only11136.8 mm71.7%60.3%52/52
    12b · Joint placement, no bend guard11122.8 mm71.6%53.7%52/52
    12c · Joint placement + bend guard11022.8 mm70.7%57.0%52/52
    Decision
    Reconsider a small connected group: propose an outline slot, search bounded translations of the blocking details, and repack the parent curve. Keep each detail's identity, length and angle. Never accept a local improvement that reduces that parent's coverage or bend coverage, worsens its largest gap, violates the mask, or breaks the physical clearance.
    Validation
    The upper-right interruption falls from 36.8 to 13.9 mm; the largest per-run interruption is 22.8 mm. All 52 previously retained short runs survive, including 31/32 branch-like runs. 9 details move by at most 1.8 mm; angle and length changes are zero. All 110 distinct openings compile into one watertight plate. Iteration 13 reveals why these per-run measurements missed the broken left elbow.
    Tradeoff
    Positions can change: the cap is 2 mm from each original center, with at most 1 mm across the detail's direction. This is a bounded, order-dependent local search, not a global optimum. Source and bend coverage are geometric proxies, not a recognition score.
    Next question
    Review the left elbow against the original. A spine can survive while the curve supporting it disappears; iteration 13 corrects that blind spot.
    How is the local search bounded and validated?

    At most 12 long runs are considered, ranked by interruption. Each gets up to three passes, with a shared budget of 320 proposed positions. Only attached short runs with one existing stitch may move. Their alternatives are sampled every 0.5 mm: up to 2 mm outward and ±1 mm sideways, within an overall 2 mm displacement cap. The search keeps up to eight local combinations.

    All proposals use the real selected image mask, full physical slots and capsule edge-to-edge clearances. The pass runs before manual edits; the same short-stitch acceptance rules still apply afterward. Slot lengths, 1.5/1.75 mm widths, 2 mm material gaps and the 6 mm border are unchanged.

    Planning took about 294 ms in the offline Node run, including joint search. This is a development-machine measurement, not a browser performance guarantee. Tests cover the real cactus and a generic parent-and-branches fixture rotated to 0°, 35° and 90°.

    Regenerate the measured figures with node scripts/run-junction-experiments.mjs. Earlier iterations remain archived; the rejected unguarded result is a frozen snapshot.

    Compilation agreed. That did not establish likeness.

    110 planned slots become 110 distinct stencil openings. Identical stitch/stencil views established geometry consistency, not likeness to the original. This archived result’s 22.8 mm statistic measured separate runs; the next iteration discovers a 28.5 mm interruption across the left elbow.

    13 · A retained detail can still be disconnected

    The spine survived. The elbow did not.

    Reviewing iteration 12 against the original exposed another false victory. Its “31 retained branches” counted surviving slots, not whether their supporting outline still existed. The left elbow’s source curve was present; placement had left its spine floating.

    The “22.8 mm worst interruption” also hid a measurement boundary. The elbow was split into two processing runs. Joining that measurement across the original contour revealed a 28.5 mm interruption in the same, unchanged geometry. We corrected the measurement before claiming a placement improvement.

    Look at the outer bend and the downward spine. The source curve was detected, but its stitching stopped before the turn and resumed well after it.

    Original · the referenceSame crop, scale and position in all three views
    Before · the retained spine floats28.5 mm left-arm interruption · 110 total slots
    After · whole-contour placement5.0 mm left-arm interruption · 112 total slots

    Blue solid slots: added or repositioned. Thin dashed red slots: previous positions. Dashed red curves: unresolved source interruptions. Red circles: retained details without nearby outline support. These are diagnostic marks, not stencil openings.

    Preserve the relationship, not just the mark.

    Measure continuity on the complete source contour, across packing splits. Match both source identity and direction: a nearby perpendicular spine does not replace an outline stitch. At extraction-recorded junctions, check for supporting stitches on the connected paths. Check individual bend regions rather than only a whole-image average.

    Same original, 184 × 184 mm plate and physical constraints
    Measured checkBeforeAfter
    Left-arm contour interruption28.5 mm5.0 mm
    Retained details lacking parent support32
    Longest interruption anywhere28.5 mm27.4 mm — unresolved
    Physical conflicts00
    Decision
    Search the complete parent contour together with its attached details. Reserve a candidate in the missing region, then repack the remaining contour around it. Preserve every previously accepted short detail’s length and angle; bound its translation to 2 mm. Reject clearance conflicts, reduced contour/bend coverage and newly unsupported attachments.
    Validation
    The left-arm interruption falls from 28.5 to 5.0 mm. Two additional slots restore support around the elbow. All 52 previously retained short runs survive. 112 planned slots compile into 112 distinct openings in one connected, watertight plate.
    Tradeoff
    This remains a bounded local search, not a global optimum or recognition model. Preserving a branch count alone was insufficient; preserving its supporting relationships is a stronger but still incomplete test.
    Next question
    The upper/inner left paddle remains interrupted by 27.4 mm. Review that region next, broaden the image fixtures and physically test the print. Do not label the entire drawing resolved.
    What triggers a warning, and what is not proven?

    Source paths are sampled approximately every 0.5 mm. Coverage requires the same source contour, a centerline within 2 mm and direction within 45°. These are visual tolerances, separate from the 2 mm solid-material requirement.

    An interruption longer than one nominal repeat (9.25 mm here) is flagged. A retained detail without parent support within that distance is flagged. At a bend, less than half the sampled turning region represented triggers a local warning. These provisional thresholds need calibration on broader drawings; they are not validated perception thresholds.

    Relationships use junction evidence from extraction, not guessed object labels or cactus coordinates. Legacy drawings without junction evidence still get contour checks, but not inferred attachment checks. Intentional manual erasures and excluded regions can also produce warnings.

    The search does not move the artwork, enlarge the plate, shorten slots below 5 mm or relax 1.5/1.75 mm widths and 2 mm clearance. It keeps a bounded candidate budget. Measured offline planning took 810 ms on the development machine; this is not a mobile performance guarantee.

    This 112-slot iteration and its one-sided support metrics are archived. The following iteration tests both sides of each attachment and repairs neighboring contours together.

    Compilation preserves this plan. Likeness still needs review.

    Original cactus for final likeness review
    Original image · keep this as the reference
    Archived Workshop stitch plan · 112 slots

    112 planned slots become 112 distinct stencil openings. This was the shared plan at iteration 13. The 27.4 mm remaining source interruption is not fixed, and physical print validation remains pending.

    Continue to regional repair and other uploaded objects →

    14 · Make the repair follow the source, not the object

    A connected detail needs a continuous shape.

    Iteration 13 fixed the elbow, but the next original-image review exposed three more breaks: the left arm’s upper curve, the center crown and the right arm’s cap. The existing checks detected these gaps. The placement pass could still finish without repairing them.

    A small regression test revealed why: a clear 21 mm gap was skipped because there was no attached detail to move. Another test showed that one nearby outline stitch could qualify a branch as supported even when the outline did not continue on its other side.

    Follow the top edge as it turns down the inside of the arm. The repair restores the curved shoulder; a shorter break remains below it.

    Original imageThe curve we must preserve
    Before · one-parent repair27 mm longest interruption in this view
    After · regional repair14 mm longest interruption in this view

    Blue: new or moved slots. Dashed red: missing original contour. Red circles: attachments without the required outline support. These overlays are diagnostics, not printable holes.

    Four checks, applied to source geometry.

    Follow each continuous contour

    Measure gaps in source order across processing splits. A nearby spine or unrelated stroke cannot stand in for the missing outline.

    Check a complete turn

    Measure the change in direction across a stitch-scale window, including gentle curves that never trigger a sharp-corner check.

    Support both sides of a branch

    Follow the parent before and after the source attachment. A genuine endpoint needs one side; a branch midway along a contour needs both.

    Preserve source connections

    Check the paths meeting at extraction-recorded junctions. Do not invent connections between unrelated lines merely because they are close.

    Decision
    Repair the worst region, then measure again. Insert into a clear source interval, or reposition a bounded group of neighboring stitches together. Retain every existing slot, its length and its source identity. Short details retain their angles and stay within 2 mm of their original accepted centers.
    Validation
    112 → 120 slots; 27.4 → 13.9 mm worst interruption; 15 → 6 unsupported attachments using the same stronger check. Both versions have zero measured conflicts and one connected, watertight compiled plate.
    Tradeoff
    This is a bounded regional search, not a global optimum or a recognition model. A clear spacing check is not proof of likeness. Existing represented turns and supported junctions are protected; a repair cannot create a new long interruption elsewhere.
    Next question
    Test the same mechanism through automatic masking and extraction on different uploaded shapes, then retain unresolved regions as evidence—not exceptions to hide.

    The old support count was 2 under the one-sided rule. Rechecking that same 112-slot image finds 15 under the two-sided rule. The comparison above recalculates both versions; it does not compare unlike metrics.

    Different objects. The same upload pipeline.

    These synthetic pixel uploads exercise rounded outlines, sharp corners, closed loops and branches. They use automatic masks, freshly extracted paths and image-specific line-weight thresholds. No cactus coordinates, labels or masks enter their repair.

    Original synthetic leaf upload
    Original pixel upload · leaf
    58 slots → 58 openings0 conflicts · 4 mm worst interruption · 1 weak turns

    The flower exposed an endpoint blind spot: insisting on a full preferred-length interval before considering the existing acceptance setting left a 16 mm stem interruption. At true open endpoints, accepted shorter source intervals can now become exactly 5 mm slots, only where the complete slot fits the mask. That reduces this interruption to about 9.5 mm; the remaining warning stays visible.

    All three uploads compile to distinct openings in one connected, watertight plate. They still have flagged turns. These are synthetic regression fixtures, not a broad benchmark of photos, scans or human recognizability. Extraction errors cannot be recovered by placement alone.

    Validation, budgets and remaining limits

    Regression cases cover missing intervals, neighboring long-contour collisions, broad turns, one-sided attachments, rotation, translation, changed source IDs, excluded masks and manual edits. The leaf, house and flower tests start from pixels and finish with actual compiled geometry.

    The search attempts at most 480 candidate seeds, 120 repair states per seed and five moved slots per region. It skips inputs above 400 slots, 2,000 source points or 6,000 mm of source paths. Those are responsiveness limits—not proof that a layout cannot fit. Source diagnostics still report unresolved regions, or explicitly report when they cannot be evaluated.

    Minimum slot centerline length remains 5 mm, fine/bold widths 1.5/1.75 mm, material clearance at least 2 mm, border 6 mm. Long stitches move along their source runs; the plate and artwork are not scaled or rotated. Physical print validation remains pending.

    Recorded development-machine planning time: 1684 ms for the cactus. This is not a mobile responsiveness guarantee. Reproduce with node scripts/run-regional-experiments.mjs.

    One shared plan, with the remaining breaks visible.

    Original cactus for current likeness review
    Original image
    Shared Workshop / Hero / Library plan · 120 slots

    120 slots become 120 distinct stencil openings. The worst remaining source interruption is 14 mm. The result still needs likeness review, and physical print validation remains pending.

    Sashiko StencilInk fitting, ordered packing and regional continuity repair are shared. Remaining detail gaps and physical print validation stay open.