dánwòdánwò

Matrix and lint

Faults

The fault vocabulary danwo matrix plans from.

The faults danwo matrix plans: each provider call of the clean run × its provider's catalogue, and each webhook delivery × the webhook faults. Ids in paths read as :id; #n marks the n-th matching call. Customise with the config's matrix.

label forms

grammar

How fault labels read, for danwo matrix --faults, MCP inject_fault and danwo.inject.

MemberDescription
status <code> on <METHOD> <host><path> e.g. status 500 on POST api.stripe.com/v1/checkout/sessions
reset | reset-after | delay <ms>ms | slow-then-retry <ms>ms on <METHOD> <host><path>
refusal | empty-completion | truncated | content-filter | malformed-tool-call | stream-cut on <METHOD> <model API host><path> e.g. refusal on POST api.openai.com/v1/chat/completions
card_declined on POST checkout.stripe.com/checkout/:id/complete (the hosted Checkout page's Pay button)
duplicate | forged | delay <ms>ms | stale <seconds>s on [<service> ]webhook <topic> e.g. duplicate on webhook checkout.session.completed
reorder [<service> ]webhooks <first>, <second> e.g. reorder webhooks payment_intent.created, payment_intent.succeeded
append #<n> to fault the n-th matching call or delivery instead of the next one

defaultOutboundFaults

function

defaultOutboundFaults(call: OutboundCall): readonly OutboundFault[]

danwo matrix's default fault catalogue: each call gets its provider's faults by host (Stripe, Resend, S3 and Tigris, Auth0, Google, Microsoft, Slack, GitHub, Twilio, Flutterwave, Paystack, Bachs, Clerk, Composio, Nylas, Nango, Unipile, Pusher, Novu, Tiptap and the model APIs, with error bodies their SDKs parse), and any other routed host (an outside endpoint such as MiniStack) gets plain HTTP failures.

DEFAULT_WEBHOOK_FAULTS

value

readonly WebhookFault[]

Webhook faults when the config names none: a repeat, a late one, a forgery, an old one.

POST api.stripe.com/v1/checkout/sessions

outbound

status 500 · status 429 · reset · reset-after

Stripe call.

GET api.stripe.com/v1/customers/cus_a1

outbound

status 500 · status 429 · reset

Stripe call.

POST api.resend.com/emails

outbound

status 429 · status 500 · delay 10000ms · reset · reset-after

Resend call.

PUT t3.storage.dev/media/a.png

outbound

status 500 · status 503 · reset · reset-after

S3 and Tigris call.

GET t3.storage.dev/media/a.png

outbound

status 500 · status 503 · reset

S3 and Tigris call.

POST oauth2.googleapis.com/token

outbound

status 500 · status 503 · status 400 · delay 10000ms · reset · reset-after

Google call.

GET gmail.googleapis.com/gmail/v1/users/me/history

outbound

status 429 · status 403 · status 500 · status 503 · delay 10000ms · reset · status 404

Google call.

POST login.microsoftonline.com/common/oauth2/v2.0/token

outbound

status 500 · status 503 · status 400 · delay 10000ms · reset · reset-after

Microsoft call.

GET graph.microsoft.com/v1.0/me/messages

outbound

status 429 · status 503 · status 504 · delay 10000ms · reset

Microsoft call.

POST slack.com/api/chat.postMessage

outbound

status 429 · status 500 · status 503 · status 200 · delay 10000ms · reset · reset-after

Slack call.

POST api.github.com/repos/acme/app/issues/:id/comments

outbound

status 403 · status 429 · status 502 · status 503 · delay 10000ms · reset · reset-after · status 422

GitHub call.

POST api.example.test/v1/orders

outbound

status 500 · reset · reset-after

any other host call.

webhook checkout.session.completed

webhook

duplicate · delay 600000ms · forged · stale 3600s

A webhook from a sender that names no service, as Stripe's; each delivery of the clean run gets these.

slack webhook events:A0APP

webhook

duplicate · delay 600000ms · forged · stale 3600s

A webhook from the slack service; each delivery of the clean run gets these.

On this page

Run it on every pull request

A GitHub check and one comment per pull request, with the flight records attached.

Set up CI