Skip to main content
doctor runs the checks a publish runs — the ones on your own files and the ones Tappify answers — so a failure lands on your machine rather than on a release.
It prints one line per check and closes with a count. A line marked ✗ is an error and the command exits non-zero; a line marked ! is a warning, which is printed and does not stop a release. --fix names each edit it made and makes only three kinds: it adds the scopes your contributions require, rewrites src/tappify.d.ts, and adds the $schema line. It never edits a component, a schema or your listing. A scope owners read a reason for is added with a placeholder justification, and scopes.justification_placeholder then holds the release until you have written the real sentence.

What stops a release

Generate and check types with the registry reachable: offline, the generator leaves the host event payloads out, and types.stale compares the file byte for byte, so a correct file written online reads as stale under --offline and --fix rewrites it without those payload types.

What it warns about

--skip-build leaves the accessibility pass out, and Tappify’s own note that it cannot run the pass without a browser comes back as an a11y warning in its place.

The checks Tappify answers

doctor sends your manifest, along with the expose list your last build produced, and folds the answers into the same checklist. A rule that runs in both places is reported once. What only Tappify can answer is this, and every one of them stops a release except storage.pii, which is a warning: Every one of them is on Review and what gets checked, with what a reviewer looks for alongside. --offline leaves that half out and reads the registry it last cached. publish runs doctor itself before it uploads, without your build, lint, tests and accessibility pass — it has just run your build — and --skip-doctor leaves even that out; the second line of the publish output says which happened. One check belongs to publish alone: it asks <base url>/tappify/health for a 200 within three seconds, on every base url your manifest declares, and stops there if one does not answer. See Deploy your server.