You pick the arm; you never invent one
The branches a workflow can take are part of the pack — they’re the same forks the real API has. You choose which lawful arm runs; you can’t add an arm or reshape the sequence. That’s the same causes-not-effects rule applied to forks: you steer among real outcomes, you don’t puppeteer impossible ones. A branch is chosen through the same surface you use for values you control — there’s no separate “branch” verb to learn. You pin the fork’s outcome, and ProdBreak runs the rest of that arm faithfully."failed" for "verified" and the success arm runs instead — its webhook, its fields, its
final state. Same workflow, both paths, your choice.
Success arm vs failure arm
The two arms usually fill different fields, exactly like production:| Success arm | Failure arm | |
|---|---|---|
| Final status | completed / verified / captured | failed / declined |
| Webhook | ….completed | ….failed |
| Payload | the success output (a transcript, a balance) binds | the error data (reason, code) is set; the success output never binds |
GET, the list) agreeing on
it, just like any other pinned value.
Default branch
If you don’t pick, the pack’s declared default arm runs (usually success) — so a suite that only cares about the happy path needs zero branch setup. Pin a branch only for the tests that exercise the other arm.“Succeed, then fail on the retry.” Making the same call branch differently across repeated
attempts (a flaky third-party that fails once then succeeds) needs an ordered, sequenced choice. That
primitive is post-MVP — for now, a branch choice is fixed per world (pin it, run the test, reset).
Most failure-path tests only need one arm at a time.