Skip to content
ExamsLibraryFor agentsConnect your agent

break and ship

intermediate·8 min·Markdown for agents

What this lesson teaches

Run break to feed one component the realistic worst case and stop with a report, and ship to sweep the whole app before launch, fix in order, and say what still needs a phone or a person.

  1. 1break
  2. 2ship
  3. 3review, break or ship?

Two verbs test against reality instead of taste. break asks what one component does with real data. ship asks what the whole app does in its first hour.

break

Reach for it when a component renders data it didn't write: names, emails, counts, labels from an API. Especially before you trust a list.

app — claude
~/app❯
Mapped 7 values · built the worst-case fixture
#SeverityWhat happens
1Brokena 32-char name pushes the ••• menu off-screen
2Ugly"1 members": hard-coded plural
3Fragile1,284 rows all render at once
Toggle at ?data=worst · say fix all or fix 1, 3
break: what broke and how badly, worst first, then the toggle to see it yourself. It stops there.
Terminal
$ /design-engineering break components/MemberRow.tsx

Its posture is unusual: adversary, then judge. It builds the worst case, shows you, and stops. It never fixes until you name which breaks to fix.

  1. Map

    Every value the component renders, with its source and its real limit from the schema, the API type or the form's maxLength. No limit anywhere is written down as "unbounded", which is already a finding.
  2. Build the worst case

    One shaped like your demo data, every value plausible or at the real limit, failures spread across the first rows the way real data does. Plus Empty, One, and 1,000 rows if the list isn't paginated.
  3. Wire a toggle

    A dev-only switch (Demo, Worst case, Empty, One, 1,000) that swaps the data at the data boundary, never by editing the markup. The choice lives in the address: ?data=worst.
  4. Break it

    At the real width, at 320px, at the widest layout, at 200% zoom, and right-to-left if you ship it. It says which breaks it saw and which it inferred from CSS.
  5. Report and stop

    Then waits.

What comes back:

SectionHolds
What broke#, Severity, Field, Worst-case value, What happens, Fix with file and line. Worst first.
Decisions for youbreaks with more than one right answer: wrap or truncate? paginate or virtualize?
What held upthe cases already handled, so you trust the test

Severity has three levels: Broken (unreadable, unreachable or wrong data), Ugly (readable but visibly off), Fragile (fine until one realistic step more).

Then fix some· for your agent
fix 1, 3

After a fix, it flips through every state again, including the happy-path demo, so a worst-case fix can't quietly break the normal case. The fixture stays as a regression test; only the toggle goes, when you ask.

Taste problems aren't break's job. "It's ugly with normal data" is review or polish.

ship

Reach for it last: launch week, on an app whose design is settled. It fixes defects, not taste.

app — claude
~/app❯
Recon done · 9 lanes · 14 findings vetted
Ship: 2 blockers fixed, build passes
SeverityFindingStatus
Blockericon button with no nameFixed
Blockerconsole.log(session.token)Fixed
Should fix100vh app shellFixed
Needs a device: the keyboard over the composer on Android.
ship: a verdict first, what it fixed, then what still needs a real device.
Terminal
$ /design-engineering ship

Its posture is fix. It sweeps the whole app, not one change, across nine : accessibility, performance, mobile, forms, states, motion, theme, content and leftovers, and marketing (only if marketing pages exist).

It comes in sizes:

InvocationDoes
shiprecon, every lane, vet, fix, build, report
ship auditthe same sweep, no edits; every row stays Open
ship quickblockers only, every lane, fixed. The hour before a demo.
ship mobile (or any lane)recon plus that lane; lanes combine, and compose with audit
ship app/checkouteverything, scoped to one path

How it works. Recon first: the stack, the root layout and head, which routes are product and which are marketing, every data view, existing tokens, where each dev tool mounts. Then each lane against its owner node. Then it vets: re-reads every cited line itself and drops anything by-design, duplicated or misattributed. A finding not confirmed at its file and line is never shown.

Then it ranks with the severity tree and fixes in order: accessibility blockers, leaks, the production baseline (one change that clears dozens), per-file fixes, polish. Then it runs your typecheck, build and tests.

What comes back:

  1. Verdict, first line. Ship, or Not yet with each open blocker in one line. A leaked secret's "rotate it now" sits above even that.
  2. One table per lane with findings: Severity, Before, After, Why, Status (Fixed or Open, with the reason). A clean lane is one line: "Performance: clean."
  3. Needs a device. The exact thing to look for: "open the drawer on an iPhone; the padding clears the home indicator."
  4. Needs a human. Unapplied fixes, each with why, the change it would make, and the owner.
  5. Verification. The commands it ran and their output, verbatim, failures included.
"Already in good shape, small diff" is a valid and good result.

review, break or ship?

You haveVerb
one change to judgereview
one component and real-world databreak
the whole app, and a launch dateship

Quick check

It's the hour before a demo. You want only the things that would embarrass you fixed, across the whole app. Which invocation?

What this lesson builds on and leads to, across every course.

  • Break it, then ship it
  • Verbs that fix
  • Verbs that judge