IDENTITY-001VERIFIED PASSname, slug, version, ios.bundleIdentifier and ios.buildNumber all present and non-empty.
Evidence: app.jsonThese five rows come from an archived Claude Code audit of a real Expo repository using pack v0.1.1. The app name is withheld. The complete run covered 28 checks: 11 passed, 2 failed and 15 remained unresolved.
The included pack is v0.3.2 with 31 checks. This is evidence of an earlier run, not current cross-agent certification. A repository finding does not establish App Store Connect state or final-device behavior.
IDENTITY-001VERIFIED PASSname, slug, version, ios.bundleIdentifier and ios.buildNumber all present and non-empty.
Evidence: app.jsonPERMISSION-002VERIFIED PASSCamera string names menu-allergen scanning; photo-library string names menu-photo analysis — concrete benefits.
Evidence: app.jsonCOMPAT-002VERIFIED FAILpatchedDependencies pins react-native@0.79.2, but 0.81.5 is installed; one dependency is a different SDK major from the rest.
Evidence: package.jsonPERMISSION-003UNRESOLVEDSeveral permission-capable dependencies have no committed usage string; the native build may inject defaults.
Evidence: app.json, package.jsonARTIFACT-001UNRESOLVEDNo .ipa or .app supplied, so DTPlatformName cannot be verified. Provide the exact submission artifact.
Evidence: —A separate example shows how the internal test checker handles a deliberately flawed fixture. Below is the complete, unedited output of Verto's deterministic internal QA checker (scripts/internal-preflight.mjs) run against the fixture at fixtures/expo-preflight-sample. It regenerates on every build, so what you read here is always what the alpha currently produces.
What this is and is not. This is the report format — the three status classes, the evidence column, the bounded verdict — produced by the internal checker Verto uses to test the pack against a deliberately broken example app. It is not the pack's own output, and it covers fewer items: the shipped pack asks your agent for 31 checks and 30 failure rules in one table. Treat this page as the shape of the document you get, not its length.
The decision is never a customer-facing ship-or-not certainty. It is one of critical risks, unresolved checks, or no deterministic blockers, and every result is separated into what the tool verified automatically, what a developer confirmed, and what still needs confirmation. That separation is the point: it keeps a developer's word distinct from proof, and it refuses to guess about anything it cannot see — like the state of your App Store Connect account.
1 deterministic blocker must be resolved before submission.
Checks the tool proved from your project and build.
External steps you confirmed. Your word, kept separate from what the tool verified.
Nobody has confirmed these yet. The report will not guess.
fixtures/expo-preflight-sample/app.json expo.ios.infoPlist.NSContactsUsageDescriptionTrailmark uses your contacts so you can invite friends to a shared hike.fixtures/expo-preflight-sample/package.json dependenciesreact-native-purchases(absent)Internal dogfood build. Repository findings are real; checks requiring App Store Connect are explicitly marked needs-input when no export is supplied.
Download raw JSONA sample report is only worth anything if you can check it. Everything the report reads is committed in this repository:
fixtures/expo-preflight-sample/README.md — names the fixture's origin and lists every intentional mutation in a table mapped to the check that catches it.fixtures/expo-preflight-sample/app.jsonfixtures/expo-preflight-sample/package.jsonfixtures/expo-preflight-sample/store.config.jsonfixtures/expo-preflight-sample/checklist.jsonscripts/internal-preflight.mjs — the checker itself, with the version-pairing table and Apple limits written as constants you can read.It is synthetic. "Trailmark" is a fictional hiking app. No file was taken from a real, client, or third-party app, and nothing proprietary is in it. The shape of the config follows the public Expo documentation defaults; the failure categories are drawn from publicly documented App Review causes. The fixture ships a store config and a filled-in submission checklist but no built .ipa, so the sample legitimately shows every verification class.
They read your committed files and, when supplied, your final build's Info.plist. They do not talk to App Store Connect, use any network, or run on device. Where the answer is not deterministically inferable — a subscription's attachment state, a reviewer step, an Expo SDK outside the pinned pairing table — the report marks it needs confirmation instead of guessing. A preflight that cries wolf gets ignored, and an ignored check is worse than no check.
The same fixture bytes produce the same findings in the same order on every run. The report embeds a sha256:f972d384ac20f30d hash of its inputs so a report can always be tied back to the exact files that produced it.