- insertMarker keyed on "starts with ---", so a legacy file opening with a
horizontal rule got a `# gstack:` line rendered as a heading that the
parser then never read back (the conversion question re-asked every run).
It keys on parsed front matter.
- A closing front-matter fence with trailing spaces (`--- `) made a valid
spec file `unknown`; the closer is any whole `---` line.
- `~~~` fences hid nothing, so a `## ` inside one was a section boundary and
a splice corrupted the fence; both fence kinds are tracked and only the
same kind closes an opener.
- convertLegacy silently kept the first of two `## Layout` bodies (and one
of `## Color` / `## Colors`); it refuses with DESIGN_MD_CONVERT_REFUSED and
the bin leaves the file and writes no backup.
- needsQuotes covers 0x / 0o / .inf / .nan (YAML 1.2 numerics that changed
type on round-trip); emitYamlBlock throws on an object inside an array
instead of writing "[object Object]".
- The design binary coerces the model's extraction JSON at the parse
boundary (null names, missing arrays) so the paid call's result survives.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>