{
  "artifact": {
    "name": "internal-preflight-alpha",
    "version": "0.1.0",
    "checkCount": 7,
    "status": "internal-alpha",
    "disclaimer": "Internal dogfood build. Repository findings are real; checks requiring App Store Connect are explicitly marked needs-input when no export is supplied."
  },
  "generatedAt": "2026-07-21T07:57:41.401Z",
  "target": {
    "label": "Trailmark",
    "path": "fixtures/expo-preflight-sample",
    "synthetic": true,
    "files": [
      "fixtures/expo-preflight-sample/app.json",
      "fixtures/expo-preflight-sample/package.json",
      "fixtures/expo-preflight-sample/store.config.json",
      "fixtures/expo-preflight-sample/checklist.json"
    ],
    "sha256Prefix": "f972d384ac20f30d",
    "explainedIn": "fixtures/expo-preflight-sample/README.md"
  },
  "verdict": {
    "decision": "CRITICAL-RISKS",
    "blockers": 1,
    "warnings": 0,
    "needsInput": 2,
    "summary": "1 deterministic blocker must be resolved before submission."
  },
  "verification": {
    "automaticallyVerified": {
      "count": 3,
      "checks": [
        "config-identity",
        "package-compat",
        "store-metadata"
      ]
    },
    "developerConfirmed": {
      "count": 8,
      "items": [
        "privacyLinksLive",
        "reviewerAccessTested",
        "backendLive",
        "reviewNotesComplete",
        "ipadLayoutTested",
        "accountDeletionTested",
        "iapAttached",
        "purchaseRestoreTested"
      ]
    },
    "needsConfirmation": {
      "count": 2,
      "items": [
        {
          "check": "subscription-wiring",
          "title": "Purchase SDK found but App Store subscription attachment cannot be verified"
        },
        {
          "check": "ios-artifact",
          "title": "iOS build artifact was not supplied"
        }
      ]
    }
  },
  "artifactInspection": {
    "inspected": false,
    "supplied": false
  },
  "checks": [
    {
      "id": "config-identity",
      "title": "iOS app identity",
      "status": "pass",
      "blockers": 0,
      "warnings": 0,
      "needsInput": 0
    },
    {
      "id": "purpose-strings",
      "title": "iOS permission explanations",
      "status": "fail",
      "blockers": 1,
      "warnings": 0,
      "needsInput": 0
    },
    {
      "id": "package-compat",
      "title": "Expo package compatibility",
      "status": "pass",
      "blockers": 0,
      "warnings": 0,
      "needsInput": 0
    },
    {
      "id": "store-metadata",
      "title": "App Store listing metadata",
      "status": "pass",
      "blockers": 0,
      "warnings": 0,
      "needsInput": 0
    },
    {
      "id": "subscription-wiring",
      "title": "Subscription submission wiring",
      "status": "needs-input",
      "blockers": 0,
      "warnings": 0,
      "needsInput": 1
    },
    {
      "id": "ios-artifact",
      "title": "iOS build artifact (final Info.plist)",
      "status": "needs-input",
      "blockers": 0,
      "warnings": 0,
      "needsInput": 1
    },
    {
      "id": "submission-checklist",
      "title": "Developer-confirmed submission checklist",
      "status": "pass",
      "blockers": 0,
      "warnings": 0,
      "needsInput": 0
    }
  ],
  "findings": [
    {
      "id": "purpose-strings-01",
      "check": "purpose-strings",
      "severity": "blocker",
      "title": "NSContactsUsageDescription has no matching package or plugin",
      "evidence": {
        "file": "fixtures/expo-preflight-sample/app.json",
        "field": "expo.ios.infoPlist.NSContactsUsageDescription",
        "actual": "Trailmark uses your contacts so you can invite friends to a shared hike."
      },
      "fix": "Delete the key if unused, or confirm the project actually includes one of: expo-contacts.",
      "guideline": "App Store Review Guideline 2.3"
    },
    {
      "id": "subscription-wiring-02",
      "check": "subscription-wiring",
      "severity": "needs-input",
      "title": "Purchase SDK found but App Store subscription attachment cannot be verified",
      "evidence": {
        "file": "fixtures/expo-preflight-sample/package.json",
        "field": "dependencies",
        "actual": "react-native-purchases"
      },
      "fix": "A repository cannot prove App Store Connect attachment state. Verify the products on the submitted version, or pass the internal attachment manifest explicitly.",
      "guideline": null
    },
    {
      "id": "ios-artifact-03",
      "check": "ios-artifact",
      "severity": "needs-input",
      "title": "iOS build artifact was not supplied",
      "evidence": {
        "file": "(none)",
        "field": "--ios-artifact",
        "actual": "(absent)"
      },
      "fix": "Pass --ios-artifact <path> pointing at the built .app directory or .ipa so the final Info.plist can be verified. Repository config alone does not prove what shipped.",
      "guideline": null
    }
  ]
}
