I verified my own work. That was the bug.
On August 4, 2026, a packet I had built was rejected for visual drift and wrong token and style bindings. I recorded the root cause as it happened: closed-loop self-verification and phantom screenshot evidence. I had checked my own work, and I had cited screenshots that were not on disk.
I restarted inside 36 hours. Nothing was salvaged — five records went back to planned and three cards were retired.
The correction became a rule: Builder never verifies own work. Verification moved to a three-party protocol — a verified status now requires a second party, and a linter checks that every cited evidence file actually exists on disk. This was seven days before go-live. Shipping on schedule was the cheaper option and the wrong one.



The bottleneck was hygiene, not taste.
Before any design decision, the expensive problem was administrative. Manual cross-tagging between Wrike and Figma was consuming hours every week. Briefs lived in one place and production in another, so somebody was always reconciling the two by hand.
I moved briefs into Figma, mapped to weekly pages, with plug-ins keeping Wrike and Figma in sync. Ticket intake went from hours to minutes. That bought the team back its attention before I asked it to learn anything new.
Someone has to own the information.
A design library only works if it is obvious where a value comes from. Components bind to semantic and layout roles only; direct use of primitives is blocked structurally rather than discouraged in a document. The role layer is forced to exist before anything can consume it.
I kept that layer deliberately partial. A role gets added when a component needs one, not in advance to look complete. Upstream, an external design authority owns the source board this library reads from and may not edit — changes go through request, so there is one place where a decision lives and one path for changing it.

The system had to teach itself.
The reason is in the decision log: this team has never used a real design system. A separate manual would not have been read.
So the usage rules live inside the assets. Primitive descriptions read DO NOT use directly. Semantic descriptions read USE FOR: and then the job. The library carries its own instructions to wherever someone opens it.
Deprecation had to be reversible.
Systems get abandoned when people stop trusting what happens to their work. So the library states its own condition out loud: a Status and QC page carries the go-live card and a dated change log, and an Archive page holds retired assets together with the notes needed to restore them.
Retiring something is a decision, not a deletion. If it turns out to have been wrong, the record for reversing it is already written down.
Decisions made on counted cost.
I renamed 31 components because the old naming forced three to four clicks of pure scaffolding in the Assets panel — the cost was countable, so the decision stopped being a matter of preference. I rebound 111 consumers before deleting five spacing series. I reorganized 22 text styles while preserving their style IDs, so every existing binding survived. I matched the template tiers to measured usage rather than to what I assumed people used.
The style-ID decision is the one I would point at. Renaming without breaking links is a choice, not a default. It carried work the team had already done into the next cycle instead of asking them to rebuild it.
Production got simpler.
Go-live was August 11, 2026, delivered as a nine-slide, thirty-minute rollout built around nine healthy habits. Behind it, on a single branch: 91 recorded decisions.
The daily email build runs at 45 minutes, down from 90. Across a real production week, 27 builds were pre-assembled with 153 instance swaps and no placeholders. As read on September 6, 2026, the September workspace carried 22 sends across 34 components and 323 instances. A Braze onboarding sprint ran inside the same library: four journeys and 64 assets, 48 of them delivered in a net eight hours.
The 68 I did not convert.
Of those 323 instances, 68 were legacy. I did not bulk-convert them. I sorted them by cause: no library equivalent, a discoverability problem, an early detach, or a genuine one-off. Only the first two were mine to fix.
Converting all 68 would have been wrong on the merits, and it would have spent goodwill on cases that were never defects. A library nobody wants to open is a failed library no matter how correct it is.
I built it for people. The machine layer is there to catch what falls. The work was recognized internally with the Shirley Collins Key Award in September 2026. The system is still evolving, and its documentation is deliberately behind the build — it is not mature enough to commit yet.






