Roadmap: small steps to the final project
Each step is one pull request: small, reviewable, with its tests, conformance cases and docs. Each milestone ends with green gates and, where it produces something sewable, a machine checkpoint (MC) on the reference Brother PE800 with photos and measurements filed through the sew-out report form (machine testing).
Step ids are stable (M3.4); PR titles start with them. Status lives in ROADMAP.md at the repository
root and is updated in the same PR that completes a step.
Legend: ✅ done in the bootstrap commit · 🧪 spike (answers a question; may produce a decision instead of code) · 🧵 machine checkpoint · 👤 owner action
M0 — Foundations and guardrails
Goal: a repository where the rules are enforced before the first line of engine code.
| Step | Deliverable | Done when |
|---|---|---|
| M0.1 ✅ | Workspace, crates skeleton, licences, toolchain pin, lints, rustfmt/clippy/deny/typos configs | cargo build and cargo test pass |
| M0.2 ✅ | cargo xtask gates: ci, layers, docs --check, shots --check, cleanroom, unsafe-audit, filesize, wasm, conformance --check, compat discover/contract | cargo xtask ci passes locally |
| M0.3 ✅ | Workflows: ci.yml, docs.yml, compat.yml (discovery), nightly.yml; templates; Dependabot | First PR runs green on GitHub |
| M0.4 ✅ | mdBook site, design docs, ADRs, this roadmap, machine-testing protocol | mdbook build and the docs check pass |
| M0.5 👤 (partly ✅) | Create the GitHub repository, push, enable Pages (from the gh-pages branch) and branch protection with required checks ci and docs; replace OWNER in CODEOWNERS and Cargo.toml and add a contact to CODE_OF_CONDUCT.md; create the labels golden-change, docs:refresh-shots, upstream-canary, upstream-prerelease, sewout, sewout:pass, sewout:tune, sewout:bug, good first issue | A test PR cannot merge while a check is red |
| M0.6 ✅ 🧪 | VectorCraft “hello” plug-in: an identity live effect built in CI for wasm32-unknown-unknown, a Level A contract test against the pinned stable vectorcraft-plugins (v0.6.0, now v0.7.0), release and main, and the fuel it spends per byte of output | The contract test is green in compat.yml on every track (2026-10-08), and the budget is recorded in the integration doc: 512 instructions a byte read and 822 written (2026-10-17) |
| M0.7 ✅ 🧪 | Geometry spike (ADR-0005 criteria) | ADR-0005 accepted with the engine’s own geometry, and the golden files made as WebAssembly in CI (2026-10-17) |
| M0.8 ✅ 🧪 | Headless VectorCraft window in CI (Xvfb + Mesa) taking ui.screenshot twice with identical pixels; one xa11y test that drives the same window through its accessibility tree (AT-SPI on Linux) | Decision recorded in the docs pipeline page, for both (2026-10-17). Screenshots match above the status bar, whose frame timings change. xa11y chooses menu rows by AT-SPI’s press and by clicks at the tree’s places |
| M0.9 ✅ | Movable into VectorCraft (ADR-0011): packages prefixed, manifests inheriting only what VectorCraft defines, tooling scoped to its folder and packages, cargo xtask compat join [--nested], and a daily move job | move green against VectorCraft’s latest release and main |
| M0.10 ✅ | Clean room, tightened: no document describes Ink/Stitch’s code; Ink/Stitch is named only for file compatibility and in the independence notices; cargo xtask cleanroom scans documents too | cleanroom green over the whole repository |
M1 — Stitch plan, PES/DST writers, first sew-out
Goal: sew a machine file StitchCraft wrote. No SVG yet: test sheets are generated in code.
| Step | Deliverable | Done when |
|---|---|---|
| M1.1 ✅ | stitchcraft-core: Budget and the diagnostics model (Mm, Point, math and SplitMix64 with frozen reference values are already in the bootstrap) | unit tests; budget exhaustion is a diagnostic |
| M1.2 ✅ | stitchcraft-plan: Stitch, StitchKind, ColorBlock, StitchPlan; invariant checker (REQ-PLAN-001 to 003, 005 to 007) | each invariant has a violating and a passing case |
| M1.3 ✅ | Machine profiles + brother-200x200 (since replaced by the PE800’s, ADR 0013); hoop and comfort diagnostics SC-E0701/SC-W0702 with rotate hint | REQ-PRF-001, REQ-PRF-002 active |
| M1.4 ✅ | Quantization (absolute, round-half-even); PEC stitch encoder with spec vectors | REQ-FMT-002 partial; encoder unit tests |
| M1.5 ✅ | PES v1 writer: header, PEC header, palette indices, thumbnails | golden files (REQ-FMT-001) |
| M1.6 ✅ | Brother PEC palette table + CIEDE2000 nearest colour | REQ-THREAD-001 spot checks |
| M1.7 ✅ | DST writer (header, ternary records, jump splitting, commands) | golden files; REQ-FMT-007 |
| M1.8 ✅ | stitch testsheet <TS-xx> --profile … -o file (and --list), stitch profiles, stitch explain; the CLI moves to clap (stitch inspect needs the readers: M2.1) | trycmd examples in the docs |
| M1.9 ✅ | Conformance runner v1: requirements × cases matrix, L0 + L1 goldens, job summary | report visible on PRs |
| M1.10 ✅ | Docs: profile, format, test-sheet, diagnostics and command-line reference generated; tutorial “Your first sew-out” with real output | docs check green |
| MC-1 🧵 | Sew TS-01 (orientation, scale), TS-02 (colour changes, stops, jumps with and without trims), TS-10A/B/C (a frame filling each of the PE800’s 3 hoops) from PES v1; same TS-01 from DST if the machine reads DST | Sew-out report filed; profile values confirmed or changed; PES v6 decision made |
M2 — Readers, preview renderer, fuzzing
| Step | Deliverable | Done when |
|---|---|---|
| M2.1 ✅ | PES/PEC reader (bounded, typed errors); stitch inspect file (counts, bounds, colours, stitch lengths, profile check) | empty files REQ-FMT-004; every truncation and byte flip handled |
| M2.2 ✅ | DST reader (trims inferred from cancelling jump runs) | same |
| M2.3 ✅ | Command round trip for every writer/reader pair; machine-equivalence oracle; fresh-seed nightly | REQ-FMT-002, REQ-FMT-003 active |
| M2.4 ✅ | pyembroidery oracle (pinned by hash) as a conformance case in the gates job | REQ-FMT-005 active |
| M2.5 ✅ | cargo-fuzz targets for both readers; nightly job with persisted corpus | REQ-FMT-006; 1 h fuzzing clean |
| M2.6 ✅ | stitchcraft-render: realistic and simple styles from the quantized plan | REQ-RND-001; golden PNG files |
| M2.7 ✅ | stitch preview, stitch convert; the stitch shot generator behind cargo xtask shots; the docs-refresh.yml label workflow | first generated docs images, byte-compared on every PR |
| M2.8 ✅ | Coverage ratchet and mutation-testing baseline; public-API snapshots | thresholds recorded |
M3 — Running stitch family and plan assembly
| Step | Deliverable | Done when |
|---|---|---|
| M3.1 ✅ | Parameter registry (params!, ParamSet, validation, generated reference + JSON Schema) | REQ-PRM-001, REQ-PRM-002; docs --check covers params |
| M3.2 ✅ | Diagnostics registry, stitch explain, generated diagnostics index | every registered code has a page and a case |
| M3.3 ✅ | Design model; SVG adapter v1: paths, groups, transforms, viewBox units, colours, visibility (no inkstitch:* yet) | REQ-SVG-001, REQ-SVG-002 (fuzzed path data) |
| M3.4 ✅ | Running stitch: corners, even spacing, patterns, tolerance; stitch lengths measured straight | REQ-RUN-001..003 |
| M3.5 ✅ | Repeats, bean stitch, random length | REQ-RUN-004, REQ-RUN-005, REQ-RUN-007 |
| M3.6 ✅ | Manual stitch | REQ-RUN-006, REQ-RUN-008 |
| M3.7 ✅ | Lock stitches: every shape, its size and its place at either end of the stitching | REQ-LCK-002, REQ-LCK-004 |
| M3.8 ✅ | Plan assembly: order, collapse, tie-off/jump/trim/tie-in (where ties says), stops, colour changes, the origin and stop position; stitchcraft_engine::plan sends each element to its generator | REQ-ASM-001..003, REQ-ASM-005, REQ-LCK-001, REQ-GEN-002 |
| M3.9 ✅ | Finalize: split, merge, hoop, colour limits, the plan check; stitch plan in.svg -o out.pes --preview out.png --report out.json | REQ-FIN-001..003; the strokes plan case, SVG to machine file |
| M3.10 ✅ | stitch bug-report bundle; stitch plan writes one for a failed plan check or a panic | a bundle reproduces its plan byte for byte (REQ-CLI-001, REQ-CLI-002) |
| MC-2 🧵 | TS-03 (running/bean lengths, the shortest stitch), TS-04 (lock holding test), TS-02B (TS-02 with element-driven trims); kit: stitch testsheet for each | report filed; min-stitch and lock defaults confirmed (REQ-LCK-003) |
M4 — Satin column
| Step | Deliverable | Done when |
|---|---|---|
| M4.1 ✅ | Satin shape: rails and rungs told apart as Ink/Stitch tells them, diagnostics SC-E0201, SC-W0202, SC-W0203, SC-W0205, SC-W0207 | REQ-SAT-005 |
| M4.2 ✅ | Correspondence and stitch placement as in Ink/Stitch (rails turned, sections at the rungs or the nodes), SC-W0210. Satin columns are sewn | REQ-SAT-002 |
| M4.3 ✅ | Pull and push compensation (symmetric/asymmetric), random width and spacing, SC-W0211 | REQ-SAT-001, REQ-SAT-006 to REQ-SAT-008 |
| M4.4 ✅ | Short stitches on curves | REQ-SAT-009, a case set on tight curves |
| M4.5 ✅ | Split stitches (simple, staggered, random) | REQ-SAT-003 |
| M4.6 ✅ | Underlays: centre walk, contour, zigzag | REQ-SAT-004, REQ-SAT-010 to REQ-SAT-012 |
| M4.7 ✅ | Start/end nearest point; generators see their neighbours (ADR 0014) | REQ-GEN-003, REQ-SAT-013, REQ-SAT-014 |
| M4.8 ✅ | A stroke’s width and join, and Ink/Stitch’s design settings, read from SVG as Ink/Stitch reads them. A satin column drawn as one path and too narrow to stitch across is sewn as a stroke, SC-W0212 | REQ-SVG-004, REQ-SVG-005, REQ-SAT-015 |
| M4.9 ✅ | Single-path satin. Its centre line is offset by half the stroke’s width to each side, with the stroke’s join, into 2 rails, as shapely offsets it, with rungs beside its corners and at its nodes, as Ink/Stitch places them | REQ-SAT-016, REQ-SAT-017 |
| MC-3 🧵 | TS-05 (width ladder 1 to 10 mm × 3 densities), TS-06 (underlay comparison); kit: stitch testsheet for each, sewable from M4.6 | report filed; satin defaults tuned |
M5 — Tatami fill
| Step | Deliverable | Done when |
|---|---|---|
| M5.1 ✅ | A fill’s region as the drawing shows it under its fill rule, in parts with holes, its subpaths cut exactly where they meet. Parts too small to sew are left out with SC-W0303, as Ink/Stitch leaves them out. Small fills (SC-W0304), the fill rule (SC-I0306) and fills in parts (SC-W0307) are pointed out | REQ-FILL-001, REQ-FILL-002 |
| M5.2 ✅ | Rows as Ink/Stitch lays them, at the angle and a whole number of row spacings from the origin, graded towards the end spacing. They are cut where they meet the outline, as GEOS cuts them | REQ-FILL-TAT-002, REQ-FILL-TAT-010 |
| M5.3 ✅ | Needle points as Ink/Stitch places them, on the stagger grid from the origin, with skip_last and random stitch length. A fill’s longest stitch defaults to 4 mm, so a parameter can have a default for each family | REQ-FILL-TAT-003 |
| M5.4 ✅ | Routing as Ink/Stitch routes. Every segment sewn once, back and forth, from the needle to the next element, with running stitches along the outline between. Parts sewn one at a time, nearest the needle first, each ending nearest the next. A part too thin for any row sewn round its outline, SC-W0305. fill_method registered. Fills are sewn | REQ-FILL-TAT-001, REQ-FILL-TAT-008 |
| M5.5 ✅ | Travel under the rows (underpath), off the rows already sewn: the cheapest way along 3 gratings of lines, smoothed and kept inside the part. Where no line leads, along rings and rows (DEV-FILL-007) | REQ-FILL-TAT-005 |
| M5.6 ✅ | Underlay as Ink/Stitch sews it: before its top rows each part sews a layer for each angle, each from the point nearest the needle back to it. fill_underlay and its settings registered, with a list of angles as a kind of parameter. A layer too thin for a row is sewn round the outline, SC-I0308 | REQ-FILL-TAT-011 |
| M5.7 ✅ | The underlay on the part shrunk by fill_underlay_inset_mm, and the top rows on the part grown by expand_mm. A part is buffered as GEOS buffers a polygon, and checked against shapely. Pieces a shrinking cuts a part into sewn one after another (DEV-FILL-008), and a part a shrinking wears away said, SC-W0309, SC-W0310. A needle inside the part starts at the nearest node of the lines under the rows | REQ-FILL-TAT-012 |
| M5.8 ✅ | Pull compensation at the rows’ ends, holes and parts kept (DEV-FILL-009), and below 0 read as 0, SC-W0312; gap-fill rows from the grid, inside the region (DEV-FILL-010). The pull compensation settings are shared with satins | REQ-FILL-TAT-006, REQ-FILL-TAT-007 |
| M5.9 ✅ | Coverage metric (stitchcraft_testkit::metrics), at least 98 % from the machine’s shortest stitch to 0.4 mm; the hoop’s whole field plans, its instructions guarded by cargo xtask perf | REQ-FILL-TAT-004, REQ-FILL-TAT-009 |
| MC-4 🧵 | TS-07 (fill + outline registration), TS-08 (density ladder, angles), TS-09 (underlay, travel); kit: stitch testsheet for each, sewable from M5.9 | report filed; fill defaults and pull compensation tuned |
M6 — VectorCraft plug-in (ABI v1) and export from .vectorcraft
M6.1 to M6.7 made the plug-ins with ABI v1 as VectorCraft 0.7 to 0.13 had it. M6.8 to M6.12 use the plug-in features VectorCraft added from 0.14 (RFC), and come before M13.7, whose Auto effect uses them.
| Step | Deliverable | Done when |
|---|---|---|
| M6.1 ✅ | stitchcraft-vectorcraft: read .vectorcraft files of formats 1 to 4, plain or compressed: layers, groups, paths and compound paths, paints as threads, and StitchCraft’s effect records, which say how an object sews. VectorCraft keeps paths in document coordinates, with no transforms to apply. What isn’t stitched is named (SC-W0807, SC-W0808, SC-I0809). Caps: 64 MiB of JSON and the JSON reader’s depth | REQ-VC-001, REQ-VC-004, REQ-VC-005; fuzzed (read_vectorcraft) |
| M6.2 ✅ | The plug-in crate, with manifests generated per family and the ABI shim (abi.rs, whose unsafe is audited). One module per family, whose live effect shows the object’s stitches, or says why it shows none (SC-I0810) | REQ-VC-002 (manifests valid, ≤ 64 params), and the module’s size with the engine recorded (ADR-0005) |
| M6.3 ✅ | Live-effect previews with budget-aware levels: exact, a fill’s rows, and the outline, picked by preview_level or by what the budget affords, the engine’s work priced in instructions measured in VectorCraft’s host | REQ-VC-003 per level, within 5 s / fuel |
| M6.4 ✅ | Tools as VectorCraft’s own commands, checked in its source. Make Compound Path joins a satin column’s 2 paths and adds rungs. Expand Appearance bakes a preview, and Graphic Styles are presets. A group’s StitchCraft effects sew the paths inside it, as VectorCraft draws them. The tools filter is left for later: making a line into a satin column took 51 to 162 million instructions in VectorCraft’s host against about 52 million, and a filter cannot give the objects it draws effects | REQ-VC-006, REQ-VC-007 |
| M6.5 ✅ | stitch export design.vectorcraft, another name for stitch plan, which reads a VectorCraft document as it reads an SVG file. The commands are written in names. stitch:ignore leaves an object or a layer out, and stitch:start and stitch:end mark where a shape starts and ends, never stitched and named until M8 applies such hints | REQ-VC-008, REQ-VC-009; the end-to-end case vectorcraft-patch |
| M6.6 ✅ | The compatibility gate, complete. Level A and Level B run on all four tracks. In Level B, VectorCraft’s own command line makes documents with the plug-ins’ effects, and StitchCraft sews what it saved. An issue per track, a bot PR adopting each new release that passes, and the supported-versions page generated from the record that PR writes | first scheduled run green |
| M6.7 ✅ | UI screenshots pipeline on M0.8’s window probe (cargo xtask compat window), each picture cropped to its menu or dialog; tutorial “A patch in VectorCraft”; xa11y drives VectorCraft to each screen and checks the plug-in’s controls | shots-ui job green |
| M6.8 ✅ | Live effects read their object’s stroke, which VectorCraft gives them from 0.14 with its fills. A stroke or a satin effect follows the topmost stroke that paints, as stitch export does: its width, and from 0.15 its join, cap and miter limit. A satin column drawn as one path and a zigzag stroke show their stitches as wide as their stroke. Without a stroke the effect leaves such an object as it is (SC-I0810). It does so too when it is applied to one of the object’s fills or strokes, which stitch export doesn’t use. Making the rails of a centre line that bends costs many units of the engine’s work. The auto level shows its outline then, and the exact level its stitches. Before M13.7, whose Auto effect chooses a line’s stitches by its width | REQ-VC-010 |
| M6.9 ✅ | VectorCraft exporters for StitchCraft’s machine formats, PES and DST, in File › Export › Export As (VectorCraft 0.14’s exporter plug-ins). An exporter plans the document it is given for the machine profile as stitch export plans a .vectorcraft file. It returns the machine file, with what the plan says as the export’s warnings, and writes nothing when that holds an error. A parameter digitizes the shapes without settings automatically, as --auto does | REQ-VC-011; the Level B case export, in which VectorCraft’s command line exports a document to PES and DST, and the files and the warnings are stitch export’s. A fill of the reference hoop’s whole field exports within an export’s budget in VectorCraft’s host. The test sheets are M6.12’s, which draws them into a document |
| M6.10 ✅ | The plug-ins’ dialogs as the parameter registry describes the parameters, with VectorCraft 0.14’s richer schemas: each one’s label, unit, help and help page, the registry’s groups as sections, and each shown only for the methods it applies to (visibleWhen) | REQ-VC-012; the manifests valid against VectorCraft’s rules, each help page a heading of the book, and shots-ui’s pictures of the dialogs labelled and grouped |
| M6.11 ✅ | A document’s design settings kept with it, as data VectorCraft 0.16 keeps with a document for a filter. Ink/Stitch keeps 3 with a file, collapse_len_mm, min_stitch_len_mm and min_satin_stroke_width_mm, which a VectorCraft document couldn’t set. The machine profile is kept too, though Ink/Stitch has no such profile and its hoop is the page. The Design Settings filter sets them, and the exporters and stitch export plan with them, for the machine kept unless --profile or the export’s dialog names another. What doesn’t read keeps its default (SC-W0812), and a VectorCraft before 0.16, which would drop them, is told so (SC-E0813). A live effect isn’t given the document’s data, and its previews keep the defaults and the reference machine | REQ-VC-013; the Level B case settings, in which a shortest stitch kept changes the PES file, the exports are stitch export’s, and a hoop kept that can’t hold the design stops its export |
| M6.12 ✅ | The tools as filters, which set up objects with their effects (VectorCraft 0.15). Stroke to Satin, once Convert Line to Satin, makes each selected line into a satin column drawn with its rails and rungs, with the satin effect, which sews as the line did. It is a heavy filter, which VectorCraft adds in 0.17: its 18 to 233 million instructions fit a heavy filter’s 1 G. Test Sheet draws stitch testsheet’s sheets drawn as designs into the document, each object with its effect, from 0.16 | REQ-VC-014 and REQ-VC-015. VectorCraft 0.17.0 is pinned, and the Level B cases stroke-to-satin, in which the columns sew as the lines did, and testsheets, in which each sheet sews as its design moved and exports within an export’s budget |
| MC-5 🧵 | TS-12 (a design authored in VectorCraft) and TS-10 again through the full workflow | report filed |
M7 — More stitch types I
One step for each stitch type, with its requirements, cases and docs (playbook). M7.6 to M7.9 come after M13.
| Step | Deliverable | Done when |
|---|---|---|
| M7.1 ✅ | A family of stitch types can declare a key again with a kind and range of its own (parameter registry, rule 7). Ink/Stitch’s zigzag_spacing_mm is a list of lengths for a zigzag stroke and one length for a satin column, and a meander fill reads it as a length that is 0 by default. An element reads the key as its family declares it. The reference pages, the JSON Schema, the plug-ins’ dialogs and the contract check give each family its own | REQ-PRM-005 |
| M7.2 ✅ | Zigzag stroke, sewn as Ink/Stitch sews it. Its angle is a new kind of setting, an angle kept within its range rather than turned by whole turns | REQ-RUN-009 to REQ-RUN-012, and the type listed for MC-6 |
| M7.3 ✅ | E-stitch, sewn as Ink/Stitch sews it. Every satin method warns where stitches lean more than 45° from square to their column (SC-W0208) and where a top stitch is longer than 12 mm (SC-W0209) | REQ-SAT-020 to REQ-SAT-023, and the type listed for MC-6 |
| M7.4 ✅ | S-stitch, sewn as Ink/Stitch sews it | REQ-SAT-024 and REQ-SAT-025, and the type listed for MC-6 |
| M7.5 ✅ | Zigzag satin, sewn as Ink/Stitch sews it | REQ-SAT-026 to REQ-SAT-028, and the type listed for MC-6 |
| M7.6 | The offsetter meets the third criterion of ADR-0005 before contour fill relies on it: 300 insets of a region 150 mm across, of 1,000 points, in under 200 ms. At M0.7 they took 218 to 448 ms, against GEOS’s 104 to 149 ms | cargo xtask perf guards the criterion |
| M7.7 | Contour fill, with its three strategies, as Ink/Stitch sews them | its requirements active and the type listed for MC-6 |
| M7.8 | Meander fill with generated tiles. A node’s meander fill may meet a zigzag_spacing_mm only its zigzag stroke can read, which Ink/Stitch sews as the fill’s default. The step chooses whether StitchCraft does too (rule 7) | same |
| M7.9 | Circular fill | same |
| MC-6 🧵 | TS-11 (a sampler of the new types); kit: stitch testsheet | report filed; the new types’ defaults confirmed |
M13 — Image to embroidery
Goal: a picture traced in VectorCraft sews well from one command, with no settings on its shapes (design). M13 comes after M7.5 and before M7.6 (decided on 2026-10-19). The steps that make every traced shape sew better with the generators StitchCraft has come first, and the steps that make new kinds of shape into stitches follow.
| Step | Deliverable | Done when |
|---|---|---|
| M13.1 ✅ | Automatic elements. --auto on stitch plan and stitch export lets StitchCraft choose the stitches of the shapes that have no settings. A stroke no wider than min_satin_stroke_width_mm sews as a running stitch. Up to the widest satin column, 7 mm, it sews as a satin column as wide as the stroke, its round or square caps included, and a wider one fills the area it paints, as does a line a satin column cannot follow. Areas are tatami fills. SC-I0901 counts the shapes digitized | its requirements active, a traced line sews as wide as VectorCraft draws it, and --auto doesn’t add an error of its own |
| M13.2 ✅ | Neighbours. Each shape reaches under the shapes it touches that sew after it, specks merge into the shape around them, and the background is left out, each said by a diagnostic | the coverage of the edges that the test pictures’ shapes share, measured and recorded |
| M13.3 ✅ | Sewing order. Paint order where shapes overlap, columns and lines after the fills they border, then the fewest colour changes and the nearest element next. --sort-colours orders a design’s elements with settings by the same rules | the test pictures sew with fewer colour changes and jumps than in paint order |
| M13.4 ✅ | Centre lines from a constrained Delaunay triangulation. A shape narrower than min_satin_stroke_width_mm everywhere sews as a running stitch along its centre line, tripled from 0.5 mm, as an automatic stroke that narrow is | its requirements active |
| M13.5 | Columns from shapes. A shape no wider than the widest satin column sews as satin columns between its own outlines, joined where its strips meet and closed round its rings, with an underlay by width, which an automatic stroke’s column gets too | same |
| M13.6 | Shapes in parts. A shape’s broad parts are filled, and its narrow parts sew as columns and lines that overlap the fill | same; TS-13 drawn |
| M13.7 | VectorCraft. The Auto effect previews each path’s stitches, and its dialog sets the rules’ settings, registered then. stitch palette writes a profile’s threads for Image Trace’s Document Library palette. Tutorial “From a picture to a machine file”, and a Level B case in which VectorCraft traces a picture | shots-ui and the compatibility gate green with the new case |
| MC-8 🧵 | TS-13 (test pictures digitized automatically, beside the same shapes sewn in paint order); kit: stitch testsheet | report filed; the rules’ values confirmed or changed |
| M13.8 | Automatic digitizing by default for VectorCraft documents | the end-to-end cases expect it |
| M13.9 🧪 | stitch plan picture.png: VectorCraft’s command line traces the picture, or StitchCraft reads and traces it itself | decision recorded in the design |
M8 — Ink/Stitch interoperability
SVG adapter v2:
- every
inkstitch:*attribute in the compatibility contract - the command symbols not read yet, such as start and end points (
REQ-GEN-001). The origin and stop position commands go into the design settings. Since M3 the adapter applies trim, stop and the ignore commands, and it never stitches commands, connectors or helper paths (REQ-SVG-003). - clones (
<use>) - clip paths, as Ink/Stitch applies them: strokes and fills cut to the clip paths of the element and of
the groups around it, with the region code from M5.1. Until then the adapter sews the whole shape, and
SC-W0802says so. - custom locks drawn as SVG paths, which the adapter reads for the engine. Until then they sew the half
stitch, with
SC-W0503. stitch import-inkstitch file.svg -o file.vectorcraft- L3 differential conformance against a pinned Ink/Stitch with the deviations ledger
Ink/Stitch’s font
library is part of that corpus: hundreds of real Ink/Stitch files, mostly satin, downloaded at a pinned
commit by cargo xtask corpus and never committed, using only fonts whose licence allows it (OFL, CC0,
CC-BY, CC-BY-SA; 132 of the 142 fonts on 2026-10-08).
M14 — Lettering
Goal: names, monograms and words sewn in embroidery fonts, set as Ink/Stitch’s lettering sets them
(review). M14 comes after M8, whose SVG adapter reads the files that Ink/Stitch’s
fonts are made of. Fonts come from a repository of their own, as VectorCraft’s do. They are StitchCraft’s
own fonts, Ink/Stitch’s fonts whose licence allows it (OFL, CC0, CC-BY, CC-BY-SA, each with its licence
file and an ASSETS.md row, never NC, GPL or unclear terms), and the fonts a user has installed for
Ink/Stitch, read in their own format.
| Step | Deliverable | Done when |
|---|---|---|
| M14.1 🧪 | The font repository, the licences it takes, and a reader for a font in Ink/Stitch’s format, from Ink/Stitch’s public documentation of it | ADR-0001 amended for fonts; one font read, its glyphs sewn |
| M14.2 | stitch lettering sets text in a font. Its glyphs are placed by the font’s advances and kerning, with the spacing of letters, words and lines and the alignment the user sets. The scale stays within the heights the font sews at, and a warning names the font’s range outside them | its requirements active |
| M14.3 | Lettering along a path. The colours of a multicolour font sorted, a trim after each letter, word or line as chosen, and lines sewn back and forth | same |
| M14.4 | Lettering in VectorCraft: a text object sews in the embroidery font its StitchCraft setting names, read from the document’s text. The step chooses how the setting is given, as an effect or a name. A preview of the font in VectorCraft waits for a live effect to be given more than its object’s geometry and paints (RFC, P6) | a Level B case |
| MC-9 🧵 | TS-14 (3 fonts at the least and the greatest heights they sew at); kit: stitch testsheet | report filed |
| M14.5 | Text in pictures: the traced shapes inside an area marked stitch:text are replaced by lettering of the marker’s text, as tall as the traced letters (design) | its requirements active |
| M14.6 🧪 | Text in pictures found and read without a marker | decision recorded in the design |
M10 — More stitch types II
Guided fill, linear gradient fill, ripple stitch, tartan fill, cross stitch; auto-run and auto-satin routing tools; per-layer ordering (underlay now, top later). VectorCraft’s tools filter, with Convert Line to Satin, is M6.12.
M11 — Formats II
EXP, JEF, VP3, XXX, U01 writers and readers with goldens and oracle checks; thread catalogues (Madeira, Isacord, Robison-Anton, …) with sourced tables; PES v6 thread lists if not done in M1.
M12 — 1.0
Performance pass and budgets; docs completeness audit (every reference page has examples and images);
translations (UI Fluent catalogues, docs gettext); release automation (release-plz, signed binaries,
checksums); 24 h fuzz soak; MC-7 🧵 full regression set on the machine.
After 1.0
Appliqué workflow, design splitting for small hoops, print worksheets, and an in-tree VectorCraft crate if
wanted. stitch import design.pes -o design.vectorcraft opens a machine file in VectorCraft, its stitches
written as manual stitches by the same document writer as M8’s stitch import-inkstitch.
M9 (VectorCraft plug-in features, upstream)
M9 comes last, after 1.0 and the work after it, and nothing before it waits on ArtCraft. Its id stays M9, as
every step id does. VectorCraft adopted most of the RFC into ABI v1 in
0.14.0 to 0.17.0, and M6.8 to M6.12 use what it adopted. Overlay previews (P3) are in
review already, as storytold/vectorcraft#3807. M9
proposes the rest, one PR for each, with tests, following VectorCraft’s AGENTS.md: heavy live effects (P4)
and the objects beside a live effect’s object (P6). The plug-ins then show every stitch of a large fill, and
start and end their previews at the markers.