Lessons — docade-glyph
L-101 — The collision constraint works, and it works because it was declared
reversed came back a warning triangle; rejected came back a raised open hand. Completely distinct, which is what docade's manifest demands — "they share a glyph today and mean opposite things."
That did not happen by luck. The constraint reached the model twice: once in the style sheet's collisions: table, which lib/pipeline/compile.mjs serialises whole into every compile for this lane, and once in the piece's own manifest brief text. The declared version is the one that scales — the brief text only exists on rejected, so a piece drawn before its counterpart would have had nothing to avoid.
Generalisable: a family constraint belongs in the style contract, not in the piece that happens to notice it.
L-102 — One fill is achievable; ONE TREATMENT is not, and that is the harder half
Every piece satisfied the tinting contract: exactly one distinct fill, no gradients, no background shape. The structural half of the contract held on the first try.
The family half failed. Across six pieces the model mixed solid silhouette (favorite, rejected, pet-walk) with uniform-stroke outline (ios-share, reversed, token). Each is a defensible drawing alone. Together they read as two icon sets shuffled — which is the exact failure docs/16 and docs/corpus/craft/collection-coherence.md describe, arriving in a lane whose entire requirement is that 65 marks read as one hand.
positive: said "uniform stroke weight throughout" and "one dominant closed form". That is two different treatments described in one paragraph, and the model picked per piece. Naming a property is not choosing between two of them.
L-103 — "Simplify hard" does not survive contact with a complex subject
favorite (a star) and ios-share (a square and an arrow) are clean at 24px. token (a coin with concentric rings and an interior star) and pet-walk (a dog plus a thin leash line) are mush at 24px — the exact size they ship at.
The prompt asked for simplification in the abstract. The pieces that failed are the ones where the SUBJECT carries inherent detail, and an abstract instruction loses to a concrete noun every time. What is needed is a stated ceiling — a maximum number of enclosed shapes and a minimum feature size — not an adjective.
Note both failures are also the two canary subjects chosen because they were expected to be hardest. The canary did its job on the first render.
L-104 — The 2048 viewBox is real, and QA already says so
Every piece came back viewBox 2048x2048 != spec 24x24, flagged automatically by mechanical QA on all six. recraft-v41-svg draws at 85× the delivered size and downscales, and that is the mechanism behind L-103: detail that is comfortable in a 2048px coordinate space is sub-pixel at 24.
This was written into style.yaml as a known risk before the render, from the bake-off file contents. It is now measured rather than predicted.