Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.

StepDeliverableDone when
M0.1 ✅Workspace, crates skeleton, licences, toolchain pin, lints, rustfmt/clippy/deny/typos configscargo 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/contractcargo xtask ci passes locally
M0.3 ✅Workflows: ci.yml, docs.yml, compat.yml (discovery), nightly.yml; templates; DependabotFirst PR runs green on GitHub
M0.4 ✅mdBook site, design docs, ADRs, this roadmap, machine-testing protocolmdbook 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 issueA 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 outputThe 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 jobmove 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 toocleanroom 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.

StepDeliverableDone 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 hintREQ-PRF-001, REQ-PRF-002 active
M1.4 ✅Quantization (absolute, round-half-even); PEC stitch encoder with spec vectorsREQ-FMT-002 partial; encoder unit tests
M1.5 ✅PES v1 writer: header, PEC header, palette indices, thumbnailsgolden files (REQ-FMT-001)
M1.6 ✅Brother PEC palette table + CIEDE2000 nearest colourREQ-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 summaryreport visible on PRs
M1.10 ✅Docs: profile, format, test-sheet, diagnostics and command-line reference generated; tutorial “Your first sew-out” with real outputdocs 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 DSTSew-out report filed; profile values confirmed or changed; PES v6 decision made

M2 — Readers, preview renderer, fuzzing

StepDeliverableDone 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 nightlyREQ-FMT-002, REQ-FMT-003 active
M2.4 ✅pyembroidery oracle (pinned by hash) as a conformance case in the gates jobREQ-FMT-005 active
M2.5 ✅cargo-fuzz targets for both readers; nightly job with persisted corpusREQ-FMT-006; 1 h fuzzing clean
M2.6 ✅stitchcraft-render: realistic and simple styles from the quantized planREQ-RND-001; golden PNG files
M2.7 ✅stitch preview, stitch convert; the stitch shot generator behind cargo xtask shots; the docs-refresh.yml label workflowfirst generated docs images, byte-compared on every PR
M2.8 ✅Coverage ratchet and mutation-testing baseline; public-API snapshotsthresholds recorded

M3 — Running stitch family and plan assembly

StepDeliverableDone 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 indexevery 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 straightREQ-RUN-001..003
M3.5 ✅Repeats, bean stitch, random lengthREQ-RUN-004, REQ-RUN-005, REQ-RUN-007
M3.6 ✅Manual stitchREQ-RUN-006, REQ-RUN-008
M3.7 ✅Lock stitches: every shape, its size and its place at either end of the stitchingREQ-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 generatorREQ-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.jsonREQ-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 panica 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 eachreport filed; min-stitch and lock defaults confirmed (REQ-LCK-003)

M4 — Satin column

StepDeliverableDone 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-W0207REQ-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 sewnREQ-SAT-002
M4.3 ✅Pull and push compensation (symmetric/asymmetric), random width and spacing, SC-W0211REQ-SAT-001, REQ-SAT-006 to REQ-SAT-008
M4.4 ✅Short stitches on curvesREQ-SAT-009, a case set on tight curves
M4.5 ✅Split stitches (simple, staggered, random)REQ-SAT-003
M4.6 ✅Underlays: centre walk, contour, zigzagREQ-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-W0212REQ-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 themREQ-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.6report filed; satin defaults tuned

M5 — Tatami fill

StepDeliverableDone 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 outREQ-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 themREQ-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 familyREQ-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 sewnREQ-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-I0308REQ-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 rowsREQ-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 satinsREQ-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 perfREQ-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.9report 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.

StepDeliverableDone 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 depthREQ-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 hostREQ-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 effectsREQ-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 hintsREQ-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 writesfirst 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 controlsshots-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 widthREQ-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 doesREQ-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 machineREQ-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.16REQ-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 workflowreport 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.

StepDeliverableDone 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 ownREQ-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 turnsREQ-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 itREQ-SAT-024 and REQ-SAT-025, and the type listed for MC-6
M7.5 ✅Zigzag satin, sewn as Ink/Stitch sews itREQ-SAT-026 to REQ-SAT-028, and the type listed for MC-6
M7.6The 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 mscargo xtask perf guards the criterion
M7.7Contour fill, with its three strategies, as Ink/Stitch sews themits requirements active and the type listed for MC-6
M7.8Meander 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.9Circular fillsame
MC-6 🧵TS-11 (a sampler of the new types); kit: stitch testsheetreport 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.

StepDeliverableDone 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 digitizedits 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 diagnosticthe 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 rulesthe 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 isits requirements active
M13.5Columns 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 toosame
M13.6Shapes in parts. A shape’s broad parts are filled, and its narrow parts sew as columns and lines that overlap the fillsame; TS-13 drawn
M13.7VectorCraft. 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 pictureshots-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 testsheetreport filed; the rules’ values confirmed or changed
M13.8Automatic digitizing by default for VectorCraft documentsthe 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 itselfdecision 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-W0802 says 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.

StepDeliverableDone 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 itADR-0001 amended for fonts; one font read, its glyphs sewn
M14.2stitch 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 themits requirements active
M14.3Lettering 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 forthsame
M14.4Lettering 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 testsheetreport filed
M14.5Text 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 markerdecision 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.