{
 "kind": "runtime-capture-fixtures",
 "pr": "https://git.cafe/pingdotgg/t3code/pull/29466",
 "before": "c8a601c0dfa5c7626e51e06d727076f6b840a005",
 "after": "9544eafae3",
 "expectedEncoding": "null means Option.none; UUID means Option.some(UUID). Expectations are inferred from source, not observed runtime results.",
 "fixtures": [
  {
   "id": "F01",
   "name": "Typed variant, nested objects and plugin array",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "/** @param {import('expo/config').ConfigContext} context */\nmodule.exports = ({ config }) => ({\n  ...config,\n  ios: { ...config.ios, infoPlist: { ...config?.ios.infoPlist, CFBundleDisplayName: \"Dev\" } },\n  plugins: [...config.plugins, \"expo-dev-client\"],\n});"
   },
   "expectedBefore": null,
   "expectedAfter": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "minimum": true,
   "reason": "Combined reproduction from the added test; both changed rules must accept it."
  },
  {
   "id": "F02",
   "name": "First keyed object spread only",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = ({ config }) => ({ ...config, ios: { ...config.ios, bundleIdentifier: \"dev.example\" } });"
   },
   "expectedBefore": null,
   "expectedAfter": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "minimum": true,
   "reason": "Isolates CONFIG_PART_AT plus keyed PART_OPENER, with no type import."
  },
  {
   "id": "F03",
   "name": "First array spread only",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = ({ config }) => ({ ...config, plugins: [...config.plugins, \"expo-dev-client\"] });"
   },
   "expectedBefore": null,
   "expectedAfter": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "minimum": true,
   "reason": "Isolates the array PART_OPENER alternative."
  },
  {
   "id": "F04",
   "name": "Quoted key, optional deep path and filler",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = ({ config }) => ({ ...config, \"ios\": { ... /* keep */ (config?.ios.infoPlist), name: \"Dev\" } });"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": false,
   "reason": "Covers quoted keyed opener, optional chaining, repeated property segments and pre-operand filler; no new result beyond F02."
  },
  {
   "id": "F05",
   "name": "One-line JSDoc type only",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "/** @param {import('expo/config').ConfigContext} context */\nmodule.exports = ({ config }) => ({ ...config, name: \"Dev\" });"
   },
   "expectedBefore": null,
   "expectedAfter": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "minimum": true,
   "reason": "Isolates the type-import exception without config-part spreads."
  },
  {
   "id": "F06",
   "name": "Multi-line JSDoc type only",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "/**\n * Variant config.\n * @param {import('expo/config').ConfigContext} context\n */\nmodule.exports = ({ config }) => ({ ...config, name: \"Dev\" });"
   },
   "expectedBefore": null,
   "expectedAfter": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "minimum": true,
   "reason": "A comment block over multiple lines must take the same narrow exception."
  },
  {
   "id": "F07",
   "name": "Line-comment type only",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "// Types: import('expo/config').ExpoConfig\nmodule.exports = ({ config }) => ({ ...config, name: \"Dev\" });"
   },
   "expectedBefore": null,
   "expectedAfter": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "minimum": true,
   "reason": "Separates the line-comment shape that the existing new test combines with F06."
  },
  {
   "id": "F08",
   "name": "TypeScript type, double quote and whitespace",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.ts": "type Context = import ( \"expo/config\" ) . ConfigContext;\nexport default ({ config }: Context) => ({ ...config, name: \"Dev\" });"
   },
   "expectedBefore": null,
   "expectedAfter": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "minimum": false,
   "reason": "The exemption is text-based, applies outside comments, matches either quote and permits whitespace."
  },
  {
   "id": "F09",
   "name": "Top-level config part may replace extra",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}, \"preview\": {\"extra\": {\"eas\": {\"projectId\": \"54d70eaf-b0a3-477a-a9cd-2cf81a5c84c9\"}}}}}",
    "app.config.js": "module.exports = ({ config }) => ({ ...config, ...config.preview });"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": true,
   "reason": "CONFIG_PART_AT matches but PART_OPENER must reject a top-level spread."
  },
  {
   "id": "F10",
   "name": "Config method call is not a part",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = ({ config }) => ({ ...config, ios: { ...config.variant(\"dev\") } });"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": true,
   "reason": "HOLDER_END must reject a call even in an otherwise accepted keyed position."
  },
  {
   "id": "F11",
   "name": "Part spread later in keyed object",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = ({ config }) => ({ ...config, ios: { name: \"Dev\", ...config.ios } });"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": true,
   "reason": "The new rule accepts only the first item of the keyed object; safe but unsupported forms remain conservative."
  },
  {
   "id": "F12",
   "name": "Part spread later in array",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = ({ config }) => ({ ...config, plugins: [\"expo-dev-client\", ...config.plugins] });"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": false,
   "reason": "The array opener also requires the first item; equivalent conservative branch to F11."
  },
  {
   "id": "F13",
   "name": "Bracket part is unsupported",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = ({ config }) => ({ ...config, ios: { ...config[\"ios\"] } });"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": false,
   "reason": "CONFIG_PART_AT supports dotted and optional-dotted parts; bracketed non-holder parts remain unknown."
  },
  {
   "id": "F14",
   "name": "Only config-part spread, no whole-config spread",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = ({ config }) => ({ ios: { ...config.ios } });"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": true,
   "reason": "An accepted part must not increment the whole-config spread count; end-of-scan remains unclear."
  },
  {
   "id": "F15",
   "name": "Protected holder replaced with another part",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = ({ config }) => ({ ...config, extra: { ...config.preview } });"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": false,
   "reason": "keepsStaticExtra must still reject a part in extra; opening a keyed object alone is insufficient."
  },
  {
   "id": "F16",
   "name": "Other dynamic import remains unknown",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = async ({ config }) => { await import('./app.local.js'); return { ...config }; };"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": true,
   "reason": "The changed REPLACES_HOLDER must retain its dynamic-import rejection outside the exact Expo type exception."
  },
  {
   "id": "F17",
   "name": "Expo import without capitalized member remains unknown",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = async ({ config }) => { await import('expo/config'); return { ...config }; };"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": true,
   "reason": "Same module path without .Uppercase is outside the exception; captures the negative lookahead boundary."
  },
  {
   "id": "F18",
   "name": "Template line looks like a comment but assigns extra",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}, \"preview\": {\"extra\": {\"eas\": {\"projectId\": \"54d70eaf-b0a3-477a-a9cd-2cf81a5c84c9\"}}}}}",
    "app.config.js": "module.exports = ({ config }) => {\n  const banner = `\n/* ${(config.extra = config.preview.extra)} */`;\n  return { ...config, name: banner };\n};"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": true,
   "reason": "Assignment detection must inspect the full source; never strip comment-looking lines in templates."
  },
  {
   "id": "F19",
   "name": "Static JSON success control",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}"
   },
   "expectedBefore": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "expectedAfter": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "minimum": true,
   "reason": "No dynamic config; unchanged baseline for finding the workspace project."
  },
  {
   "id": "F20",
   "name": "Whole-config inheritance success control",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = ({ config }) => ({ ...config, name: \"Mobile\" });"
   },
   "expectedBefore": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "expectedAfter": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "minimum": false,
   "reason": "Existing accepted inheritance path remains accepted."
  },
  {
   "id": "F21",
   "name": "Literal ID is read without executing config",
   "files": {
    "app.config.ts": "import { writeFileSync } from \"node:fs\";\nwriteFileSync(\"__MARKER_ABSOLUTE_PATH__\", \"executed\");\nexport default { extra: { eas: { projectId: \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\" } } };"
   },
   "expectedBefore": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "expectedAfter": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "minimum": true,
   "reason": "Capture marker absent on both revisions; driver substitutes an absolute marker path but never executes this config."
  },
  {
   "id": "F22",
   "name": "Existing extra/eas preservation",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "module.exports = ({ config }) => ({ ...config, extra: { ...config?.[\"extra\"], eas: { ...config.extra?.eas, build: { experimental: true } } } });"
   },
   "expectedBefore": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "expectedAfter": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "minimum": false,
   "reason": "New part handling must not regress existing holder paths or optional/bracket syntax."
  },
  {
   "id": "F23",
   "name": "Changed app plus disagreeing second app",
   "files": {
    "apps/mobile/app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "apps/mobile/app.config.js": "module.exports = ({ config }) => ({ ...config, ios: { ...config.ios } });",
    "packages/kiosk/app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"54d70eaf-b0a3-477a-a9cd-2cf81a5c84c9\"}}}}"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": false,
   "reason": "Successful local inference must not override monorepo ambiguity."
  },
  {
   "id": "F24",
   "name": "Changed app plus agreeing second app",
   "files": {
    "apps/mobile/app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "apps/mobile/app.config.js": "module.exports = ({ config }) => ({ ...config, ios: { ...config.ios } });",
    "packages/kiosk/app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}"
   },
   "expectedBefore": null,
   "expectedAfter": "d763fcb8-d37c-41ea-a773-b54a0ab4a454",
   "minimum": false,
   "reason": "Workspace aggregation: one changed inherited app plus an unchanged peer with the same UUID."
  },
  {
   "id": "F25",
   "name": "Stale project ID comment remains ambiguous",
   "files": {
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}}}",
    "app.config.js": "// projectId: \"54d70eaf-b0a3-477a-a9cd-2cf81a5c84c9\"\n/** @param {import('expo/config').ConfigContext} context */\nmodule.exports = ({ config }) => ({ ...config, name: \"Dev\" });"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": false,
   "reason": "Narrow type exception must not discard projectId mentions in comments."
  },
  {
   "id": "F26",
   "name": "Expo wrapper around config.preview (new head regression row)",
   "files": {
    "app.config.js": "module.exports = ({ config }) =>\n  process.env.APP_VARIANT === \"preview\" ? { expo: { ...config.preview } } : { ...config };",
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}, \"preview\": {\"extra\": {\"eas\": {\"projectId\": \"54d70eaf-b0a3-477a-a9cd-2cf81a5c84c9\"}}}}}"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": true,
   "reason": "Exact config shape from the added head test; a differently named keyed wrapper must not preserve inheritance."
  },
  {
   "id": "F27",
   "name": "Part spread into an expo entry with a matching name (round-3 finding)",
   "files": {
    "app.config.js": "module.exports = ({ config }) => ({ ...config, expo: { ...config.preview.expo } });",
    "app.json": "{\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}, \"preview\": {\"expo\": {\"extra\": {\"eas\": {\"projectId\": \"54d70eaf-b0a3-477a-a9cd-2cf81a5c84c9\"}}}}}}"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": true,
   "reason": "Expo reads a returned expo entry as the whole config; 861368fd51 returned A here."
  },
  {
   "id": "F28",
   "name": "Part spread into a computed key (round-3 finding)",
   "files": {
    "app.config.js": "module.exports = ({ config }) => ({ ...config, [[...config.keys]]: config.preview });",
    "app.json": "{\"expo\": {\"keys\": [\"extra\"], \"extra\": {\"eas\": {\"projectId\": \"d763fcb8-d37c-41ea-a773-b54a0ab4a454\"}}, \"preview\": {\"eas\": {\"projectId\": \"54d70eaf-b0a3-477a-a9cd-2cf81a5c84c9\"}}}}"
   },
   "expectedBefore": null,
   "expectedAfter": null,
   "minimum": true,
   "reason": "An array opener inside a computed key can name extra; 861368fd51 returned A here."
  }
 ],
 "matrixAfter": "186a21795461af21b514ec2b2375d0ce7975cda9"
}