{"version":3,"sources":["../src/errors.ts","../src/uuid-v5.ts","../src/guid.ts","../src/evidence/material-cook.ts"],"names":["entry","key","fields"],"mappings":"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","file":"material-cook.mjs","sourcesContent":["// errors.ts — PackError class (feat-20260513-guid-asset-package-system w15)\n//\n// Structured surface: .code / .expected / .hint / .detail, plus optional typed .cause\n// Structurally parallel to AssetError / RhiError / RemoteError\n// (charter proposition 5 consistent abstraction).\n//\n// .detail is narrowed per .code via PackErrorDetail discriminated union\n// (requirements §6.2 AC-07; plan-strategy §D-5).\n\nimport type { PackErrorCode, PackErrorDetail } from '@forgeax/engine-types';\nimport type { PackAuthoringError } from './pack-authoring.js';\n\n/**\n * Structured error for the engine-pack disk scanner fail-fast chain.\n *\n * AI users consume via exhaustive switch on .code — no default case needed:\n * ```ts\n * switch (err.code) {\n *   case 'pack-guid-collision':\n *     console.error(err.detail.paths);\n *     break;\n *   case 'pack-cyclic-reference':\n *     console.error(err.detail.cycle);\n *     break;\n *   // ...all 8 cases\n * }\n * ```\n */\nexport class PackError extends Error {\n  readonly code: PackErrorCode;\n  readonly expected: string;\n  readonly hint: string;\n  readonly detail: PackErrorDetail;\n  override readonly cause?: PackAuthoringError;\n\n  constructor(args: {\n    code: PackErrorCode;\n    expected: string;\n    hint: string;\n    detail: PackErrorDetail;\n    cause?: PackAuthoringError;\n  }) {\n    super(`[PackError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);\n    this.name = 'PackError';\n    this.code = args.code;\n    this.expected = args.expected;\n    this.hint = args.hint;\n    this.detail = args.detail;\n    if (args.cause !== undefined) this.cause = args.cause;\n  }\n}\n","import { sha1 } from '@noble/hashes/legacy.js';\n\n/** Internal UUIDv5 kernel; each caller owns its namespace and name validation. */\nexport function uuidV5(namespace: Uint8Array, name: string): Uint8Array {\n  const nameBytes = new TextEncoder().encode(name);\n  const input = new Uint8Array(namespace.byteLength + nameBytes.byteLength);\n  input.set(namespace, 0);\n  input.set(nameBytes, namespace.byteLength);\n  const result = sha1(input).slice(0, 16);\n  // RFC 4122: UUID version 5, RFC variant.\n  result[6] = ((result[6] ?? 0) & 0x0f) | 0x50;\n  result[8] = ((result[8] ?? 0) & 0x3f) | 0x80;\n  return result;\n}\n","import { uuidv7obj } from 'uuidv7';\nimport { PackError } from './errors.js';\nimport { uuidV5 } from './uuid-v5.js';\n\n/**\n * 16-byte UUID branded ABI. Prevents assignment from plain Uint8Array or string.\n * Brand field mirrors the declaration in @forgeax/engine-types for cross-package\n * structural compatibility (both use __guidBrand: 'AssetGuid').\n */\nexport type AssetGuid = Uint8Array & { readonly __guidBrand: 'AssetGuid' };\n\n/** Pack-level identity. It is intentionally not assignable to AssetGuid. */\nexport type PackageId = Uint8Array & { readonly __packageIdBrand: 'PackageId' };\n\n/** Minimal Result alias for this module (structurally compatible with ScanResult). */\nexport type GuidResult<T, E> =\n  | { readonly ok: true; readonly value: T }\n  | { readonly ok: false; readonly error: E };\n\nfunction brand(bytes: Uint8Array): AssetGuid {\n  return bytes as AssetGuid;\n}\n\nconst HEX_BYTE = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n\nfunction bytesToDashForm(bytes: Uint8Array): string {\n  const h = HEX_BYTE;\n  // biome-ignore lint/style/noNonNullAssertion: length guaranteed 16\n  return `${h[bytes[0]!]}${h[bytes[1]!]}${h[bytes[2]!]}${h[bytes[3]!]}-${h[bytes[4]!]}${h[bytes[5]!]}-${h[bytes[6]!]}${h[bytes[7]!]}-${h[bytes[8]!]}${h[bytes[9]!]}-${h[bytes[10]!]}${h[bytes[11]!]}${h[bytes[12]!]}${h[bytes[13]!]}${h[bytes[14]!]}${h[bytes[15]!]}`;\n}\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/** Stable author-owned output identity. Paths and payloads are not identity inputs. */\nexport const PACK_SOURCE_KEY_RE = /^[a-z0-9][a-z0-9._-]*(\\/[a-z0-9][a-z0-9._-]*)*$/;\n\nexport function isValidPackSourceKey(value: unknown): value is string {\n  return typeof value === 'string' && PACK_SOURCE_KEY_RE.test(value);\n}\n\nexport function isValidAssetGuidString(value: unknown): value is string {\n  return typeof value === 'string' && UUID_RE.test(value);\n}\n\nfunction dashFormToBytes(dashForm: string): Uint8Array {\n  const hex = dashForm.replace(/-/g, '');\n  const bytes = new Uint8Array(16);\n  for (let i = 0; i < 16; i++) {\n    bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n  }\n  return bytes;\n}\n\nfunction randomUuidBytes(): Uint8Array {\n  const uuid = uuidv7obj();\n  const bytes = new Uint8Array(16);\n  bytes.set(uuid.bytes);\n  return bytes;\n}\n\nfunction packageId(value: Uint8Array): PackageId {\n  return value as PackageId;\n}\n\n/** Utilities for the pack-level UUID identity. */\nexport const PackageId = {\n  parse(dashForm: string): GuidResult<PackageId, PackError> {\n    const parsed = AssetGuid.parse(dashForm);\n    return parsed.ok ? { ok: true, value: packageId(parsed.value) } : parsed;\n  },\n  format(value: PackageId): string {\n    return bytesToDashForm(value);\n  },\n  random(): PackageId {\n    return packageId(randomUuidBytes());\n  },\n} as const;\n\nfunction derivedGuid(namespace: PackageId, sourceKey: string): AssetGuid {\n  if (!(namespace instanceof Uint8Array) || namespace.byteLength !== 16) {\n    throw new TypeError('AssetGuid.derive requires a 16-byte PackageId');\n  }\n  if (!isValidPackSourceKey(sourceKey)) {\n    const error = new TypeError(\n      `AssetGuid.derive received invalid sourceKey ${JSON.stringify(sourceKey)}`,\n    ) as TypeError & { readonly code?: string };\n    Object.defineProperty(error, 'code', { value: 'pack-source-key-invalid' });\n    throw error;\n  }\n  return brand(uuidV5(namespace, sourceKey));\n}\n\n/**\n * Utilities for the AssetGuid branded 16-byte UUID type.\n * Declare the type via `import type { AssetGuid } from '@forgeax/engine-pack/guid'`\n * or `import type { AssetGuid } from '@forgeax/engine-types'`.\n */\nexport const AssetGuid = {\n  /**\n   * Parse a 36-char RFC 4122 dash-form UUID string into an AssetGuid.\n   * Returns Ok(AssetGuid) on success or Err(PackError) with code 'pack-guid-malformed' on failure.\n   * Never throws for expected failures (requirements §4.2 / §14 / charter proposition 4).\n   */\n  parse(dashForm: string): GuidResult<AssetGuid, PackError> {\n    if (!isValidAssetGuidString(dashForm)) {\n      return {\n        ok: false,\n        error: new PackError({\n          code: 'pack-guid-malformed',\n          expected: '36-char RFC 4122 dash-form UUID',\n          hint: 'use AssetGuid.random() or a UUIDv7 generator; all GUID fields must be 36-char RFC 4122 dash-form',\n          detail: {\n            raw: dashForm,\n            reason: 'expected 36-char RFC 4122 dash-form UUID',\n          },\n        }),\n      };\n    }\n    return { ok: true, value: brand(dashFormToBytes(dashForm)) };\n  },\n\n  /**\n   * Format an AssetGuid as a 36-char RFC 4122 lowercase dash-form string.\n   */\n  format(guid: AssetGuid): string {\n    return bytesToDashForm(guid);\n  },\n\n  /**\n   * Test byte-by-byte equality between two AssetGuids.\n   */\n  equals(a: AssetGuid, b: AssetGuid): boolean {\n    for (let i = 0; i < 16; i++) {\n      if (a[i] !== b[i]) return false;\n    }\n    return true;\n  },\n\n  /**\n   * Mint a new time-ordered UUIDv7 as an AssetGuid.\n   * Works in both Node.js and browser environments.\n   */\n  random(): AssetGuid {\n    return brand(randomUuidBytes());\n  },\n\n  /** Derive the stable UUIDv5 projection for one Pack subject and sourceKey. */\n  derive(namespace: PackageId, sourceKey: string): AssetGuid {\n    return derivedGuid(namespace, sourceKey);\n  },\n} as const;\n","import type {\n  MaterialAsset,\n  MaterialParameter,\n  MaterialPass,\n  MaterialProgramAbi,\n  MaterialProgramAddress,\n  MaterialSurfaceDeclaration,\n  MaterialTextureReference,\n  MaterialTextureValue,\n  MaterialValue,\n  Result,\n} from '@forgeax/engine-types';\nimport {\n  deriveStandardLayerPlan,\n  err,\n  isMaterialProgramAbi,\n  isMaterialSurfaceDeclaration,\n  isMaterialTextureParameterType,\n  MATERIAL_TEXTURE_SLOTS,\n  ok,\n} from '@forgeax/engine-types';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { AssetGuid } from '../guid.js';\n\nexport interface MaterialCookRefs {\n  readonly parent: readonly string[];\n  readonly textures: readonly string[];\n  readonly samplers: readonly string[];\n  readonly modules: readonly string[];\n}\n\nexport interface MaterialCookArtifact {\n  readonly mediaType: string;\n  readonly path: string;\n  readonly digest: string;\n  readonly bytes: Uint8Array;\n}\n\n/** Domain-owned inputs used to compile and select a material program. */\nexport interface MaterialCookRasterContext {\n  readonly backend: 'webgpu' | 'webgl2' | 'wgpu-native';\n  readonly capability: 'storage-buffer' | 'storage-buffer-atmosphere' | 'uniform-fallback';\n  readonly pipeline: 'forward' | 'deferred';\n  /** Absent is the ordinary material ABI; enabled by the receiving renderer. */\n  readonly visibleSurface?: true;\n  readonly geometry: 'mesh' | 'skinned' | 'sprite' | 'sprite-instances' | 'terrain';\n  readonly pass: 'forward' | 'shadow' | 'depth';\n  readonly profile: 'forgeax-material-wgsl-v1';\n  readonly toolchain: 'naga-oil';\n  readonly instrumentation: 'none' | 'validation';\n}\n\n/** The same authored Surface evaluated at a ray hit or Card capture, without a submission address ABI. */\nexport interface MaterialCookRayContext {\n  readonly backend: 'webgpu' | 'wgpu-native';\n  readonly capability: 'storage-buffer';\n  readonly pipeline: 'ray';\n  readonly geometry: 'mesh';\n  readonly pass: 'ray-hit' | 'card-capture';\n  readonly profile: 'forgeax-material-ray-v1';\n  readonly toolchain: 'naga-oil';\n  readonly instrumentation: 'none';\n}\n\nexport type MaterialCookProgramContext = MaterialCookRasterContext | MaterialCookRayContext;\n\n/** Programs are derived artifacts, never independently authored assets. */\nexport interface MaterialCookProgram {\n  readonly specializationKey: string;\n  readonly artifact: MaterialCookArtifact;\n  readonly selections: readonly {\n    readonly pass: string;\n    readonly context: MaterialCookProgramContext;\n    /** Renderer submission address selected by this publication. */\n    readonly address?: MaterialProgramAddress;\n    /** Actual entry point paired with the selected address. */\n    readonly entry?: string;\n    /** Producer-reflected ABI facts for the selected artifact/entry. */\n    readonly abi?: MaterialProgramAbi;\n  }[];\n}\n\nexport interface MaterialCookWasmProvenance {\n  readonly sourceContentKey: string;\n  readonly artifactSha256: string;\n  readonly glueSha256: string;\n}\n\nexport interface MaterialCookIdentity {\n  readonly materialContractDigest: string;\n  readonly sourceRevision: string;\n  readonly sourceClosureDigest: string;\n  readonly layoutIdentity: string;\n  readonly programIdentity: string;\n  readonly pipelineIdentity: string;\n  readonly materialPublicationIdentity: string;\n  readonly cookIdentity: string;\n  readonly compilerFingerprint: string;\n  readonly wasm: MaterialCookWasmProvenance;\n  readonly artifactDigest: string;\n  readonly valueGeneration: number;\n  readonly dependencyGeneration: number;\n  readonly cookGeneration: number;\n}\n\nexport type MaterialCookIdentityInput = Omit<MaterialCookIdentity, 'cookIdentity'>;\n\nexport interface MaterialCookReceipt {\n  readonly schemaVersion: 'material-cook/4';\n  readonly sourceClosure: readonly string[];\n  readonly profile: string;\n  readonly compilerVersion: string;\n  readonly identity: MaterialCookIdentity;\n  readonly derivedInterface: {\n    readonly layoutIdentity: string;\n    /** Build-time Standard physical lowering identity, when the root is Standard. */\n    readonly layerPlanIdentity?: string;\n  };\n}\n\nexport interface MaterialParameterContract {\n  readonly parameters: readonly MaterialParameter[];\n  readonly values: Readonly<Record<string, MaterialValue | null>>;\n}\n\nexport interface CookedMaterialRecord {\n  readonly schemaVersion: 'material-cook/4';\n  readonly guid: string;\n  readonly authored?: MaterialAsset;\n  readonly materialGuid?: string;\n  readonly publicationGeneration?: number;\n  readonly specializationKey?: string;\n  readonly programs: readonly MaterialCookProgram[];\n  /** Digest of the complete program/Pass/context manifest. */\n  readonly artifactDigest?: string;\n  readonly sourceClosure?: readonly string[];\n  readonly parameterContract?: MaterialParameterContract;\n  readonly resolved: {\n    readonly passes: readonly MaterialPass[];\n    readonly parameters: readonly MaterialParameter[];\n    readonly values: Readonly<Record<string, MaterialValue | null>>;\n    readonly surface?: MaterialSurfaceDeclaration;\n  };\n  readonly refs: MaterialCookRefs;\n  readonly receipt: MaterialCookReceipt;\n}\n\nexport interface MaterialCookRecordError {\n  readonly code: 'material-cook-record-invalid';\n  readonly expected: string;\n  readonly hint: string;\n  readonly detail: {\n    readonly field: string;\n    readonly actual?: unknown;\n    readonly action: string;\n  };\n}\n\nexport interface MaterialCookIdentityExpectation {\n  readonly layoutIdentity?: string;\n  readonly artifactDigest?: string;\n  readonly inputDigest?: string;\n}\n\nconst STANDARD_ROOT_MODULES = new Set([\n  'forgeax::default-standard-pbr',\n  'forgeax::pbr-skin',\n  'forgeax_material::standard',\n  'forgeax_material::terrain',\n  'forgeax_material::pbr-skin',\n]);\n\n/** Shared ownership predicate for the built-in Standard material root. */\nexport function isStandardRootModule(module: string): boolean {\n  return STANDARD_ROOT_MODULES.has(module);\n}\n\nexport function isStandardMaterialRecord(record: Pick<CookedMaterialRecord, 'resolved'>): boolean {\n  return record.resolved.passes.some((pass) => isStandardRootModule(pass.program.module));\n}\n\n/**\n * Recompute the Standard layer identity from the admitted resolved root.\n * Material admission and runtime loading share this owner so a stale receipt\n * cannot select a different physical layer plan after cooking.\n */\nexport function materialLayerPlanIdentity(\n  record: Pick<CookedMaterialRecord, 'resolved'>,\n): string | undefined {\n  if (!isStandardMaterialRecord(record)) {\n    return undefined;\n  }\n  return deriveStandardLayerPlan(record.resolved.parameters, record.resolved.passes).identity;\n}\n\nfunction unique(values: readonly string[]): readonly string[] {\n  return [...new Set(values)].sort();\n}\n\nfunction guidText(value: string | Uint8Array): string {\n  return typeof value === 'string' ? value : AssetGuid.format(value as AssetGuid);\n}\n\nfunction cookGuidText(value: MaterialTextureReference): string | undefined {\n  return typeof value === 'number' ? undefined : guidText(value);\n}\n\nfunction textureValues(\n  values: Readonly<Record<string, MaterialValue | null>> | undefined,\n  textureFields: ReadonlySet<string>,\n): readonly MaterialTextureValue[] {\n  return Object.entries(values ?? {}).flatMap(([name, value]) => {\n    if (value === null) return [];\n    if (typeof value === 'string') {\n      return textureFields.has(name) ? [{ texture: value }] : [];\n    }\n    return value !== null &&\n      typeof value === 'object' &&\n      !Array.isArray(value) &&\n      'texture' in value\n      ? [value as MaterialTextureValue]\n      : [];\n  });\n}\n\nexport function collectMaterialCookRefs(material: Partial<MaterialAsset>): MaterialCookRefs {\n  const textureFields =\n    material.parameters === undefined\n      ? new Set<string>(MATERIAL_TEXTURE_SLOTS)\n      : new Set(\n          material.parameters\n            .filter((parameter) => isMaterialTextureParameterType(parameter.type))\n            .map((parameter) => parameter.name),\n        );\n  const textures = textureValues(material.values, textureFields);\n  return {\n    parent: material.parent ? [guidText(material.parent)] : [],\n    textures: unique(\n      textures.flatMap((value) => {\n        const guid = cookGuidText(value.texture);\n        return guid === undefined ? [] : [guid];\n      }),\n    ),\n    samplers: unique(\n      textures.flatMap((value) => {\n        if (value.sampler === undefined) return [];\n        const guid = cookGuidText(value.sampler);\n        return guid === undefined ? [] : [guid];\n      }),\n    ),\n    modules: unique([\n      ...(material.passes ?? []).map((pass) => pass.program.module),\n      ...(material.surface === undefined ? [] : [material.surface.module]),\n    ]),\n  };\n}\n\nexport function createMaterialArtifactDigest(bytes: Uint8Array): string {\n  return `sha256:${bytesToHex(sha256(bytes))}`;\n}\n\nfunction jsonValue(value: unknown): unknown {\n  if (value instanceof Uint8Array) return [...value];\n  if (Array.isArray(value)) return value.map(jsonValue);\n  if (value !== null && typeof value === 'object') {\n    return Object.fromEntries(\n      Object.entries(value)\n        .filter(([, entry]) => entry !== undefined)\n        .sort(([a], [b]) => a.localeCompare(b))\n        .map(([key, entry]) => [key, jsonValue(entry)]),\n    );\n  }\n  return value;\n}\n\nexport function createMaterialCookIdentity(input: MaterialCookIdentityInput): MaterialCookIdentity {\n  const cookIdentity = createMaterialArtifactDigest(\n    new TextEncoder().encode(\n      JSON.stringify(\n        jsonValue({\n          materialContractDigest: input.materialContractDigest,\n          sourceRevision: input.sourceRevision,\n          sourceClosureDigest: input.sourceClosureDigest,\n          layoutIdentity: input.layoutIdentity,\n          programIdentity: input.programIdentity,\n          pipelineIdentity: input.pipelineIdentity,\n          compilerFingerprint: input.compilerFingerprint,\n          wasm: input.wasm,\n          artifactDigest: input.artifactDigest,\n        }),\n      ),\n    ),\n  );\n  return { ...input, cookIdentity };\n}\n\nexport function serializeCookedMaterialRecord(record: CookedMaterialRecord): string {\n  return JSON.stringify(jsonValue(record));\n}\n\nexport function serializeMaterialCookReceipt(receipt: MaterialCookReceipt): string {\n  return JSON.stringify(jsonValue({ ...receipt, sourceClosure: unique(receipt.sourceClosure) }));\n}\n\nfunction invalid(field: string, actual?: unknown): Result<never, MaterialCookRecordError> {\n  return err({\n    code: 'material-cook-record-invalid',\n    expected: 'a complete material-cook/4 record with layered identity and provenance',\n    hint: 're-cook the material and publish its record, artifact, references, and receipt together',\n    detail: {\n      field,\n      ...(actual === undefined ? {} : { actual }),\n      action: 'inspect the named field and recook the material generation',\n    },\n  });\n}\n\nfunction normalizeArtifactBytes(value: unknown): Uint8Array | undefined {\n  if (Array.isArray(value)) {\n    return value.every((byte) => Number.isInteger(byte) && byte >= 0 && byte <= 255)\n      ? Uint8Array.from(value)\n      : undefined;\n  }\n  if (!ArrayBuffer.isView(value)) return undefined;\n  const view = value as ArrayBufferView;\n  return new Uint8Array(view.buffer, view.byteOffset, view.byteLength).slice();\n}\n\nconst IDENTITY_FIELDS = [\n  'materialContractDigest',\n  'sourceRevision',\n  'sourceClosureDigest',\n  'layoutIdentity',\n  'programIdentity',\n  'pipelineIdentity',\n  'materialPublicationIdentity',\n  'cookIdentity',\n  'compilerFingerprint',\n  'artifactDigest',\n] as const;\n\nfunction isGeneration(value: unknown): value is number {\n  return typeof value === 'number' && Number.isSafeInteger(value) && value >= 1;\n}\n\nfunction validateIdentity(value: unknown): Result<MaterialCookIdentity, MaterialCookRecordError> {\n  if (value === null || typeof value !== 'object') return invalid('receipt.identity', value);\n  const candidate = value as Record<string, unknown>;\n  for (const field of IDENTITY_FIELDS) {\n    if (typeof candidate[field] !== 'string' || candidate[field].length === 0) {\n      return invalid(`receipt.identity.${field}`, candidate[field]);\n    }\n  }\n  if (candidate.wasm === null || typeof candidate.wasm !== 'object') {\n    return invalid('receipt.identity.wasm', candidate.wasm);\n  }\n  const wasm = candidate.wasm as Record<string, unknown>;\n  for (const field of ['sourceContentKey', 'artifactSha256', 'glueSha256']) {\n    if (typeof wasm[field] !== 'string' || wasm[field].length === 0) {\n      return invalid(`receipt.identity.wasm.${field}`, wasm[field]);\n    }\n  }\n  for (const field of ['valueGeneration', 'dependencyGeneration', 'cookGeneration']) {\n    if (!isGeneration(candidate[field]))\n      return invalid(`receipt.identity.${field}`, candidate[field]);\n  }\n  return ok({\n    ...candidate,\n    wasm: wasm as unknown as MaterialCookWasmProvenance,\n  } as MaterialCookIdentity);\n}\n\nexport function validateMaterialCookReceipt(\n  value: unknown,\n  expected: MaterialCookIdentityExpectation = {},\n): Result<MaterialCookReceipt, MaterialCookRecordError> {\n  if (value === null || typeof value !== 'object') return invalid('receipt');\n  const candidate = value as Record<string, unknown>;\n  if (candidate.schemaVersion !== 'material-cook/4')\n    return invalid('receipt.schemaVersion', candidate.schemaVersion);\n  const identityResult = validateIdentity(candidate.identity);\n  if (!identityResult.ok) return identityResult;\n  const identity = identityResult.value;\n  if (candidate.derivedInterface === null || typeof candidate.derivedInterface !== 'object') {\n    return invalid('receipt.derivedInterface', candidate.derivedInterface);\n  }\n  const derivedInterface = candidate.derivedInterface as Record<string, unknown>;\n  if (derivedInterface.layoutIdentity !== identity.layoutIdentity) {\n    return invalid('receipt.derivedInterface.layoutIdentity', derivedInterface.layoutIdentity);\n  }\n  if (\n    derivedInterface.layerPlanIdentity !== undefined &&\n    (typeof derivedInterface.layerPlanIdentity !== 'string' ||\n      derivedInterface.layerPlanIdentity.length === 0)\n  ) {\n    return invalid(\n      'receipt.derivedInterface.layerPlanIdentity',\n      derivedInterface.layerPlanIdentity,\n    );\n  }\n  for (const field of ['sourceClosure', 'profile', 'compilerVersion']) {\n    const fieldValue = candidate[field];\n    if (\n      (field === 'sourceClosure' && !Array.isArray(fieldValue)) ||\n      (field !== 'sourceClosure' && typeof fieldValue !== 'string')\n    ) {\n      return invalid(`receipt.${field}`, fieldValue);\n    }\n  }\n  const sourceClosure = candidate.sourceClosure;\n  if (Array.isArray(sourceClosure) && sourceClosure.some((path) => typeof path !== 'string')) {\n    return invalid('receipt.sourceClosure', sourceClosure);\n  }\n  if (\n    expected.layoutIdentity !== undefined &&\n    identity.layoutIdentity !== expected.layoutIdentity\n  ) {\n    return invalid('receipt.identity.layoutIdentity', identity.layoutIdentity);\n  }\n  if (\n    expected.artifactDigest !== undefined &&\n    identity.artifactDigest !== expected.artifactDigest\n  ) {\n    return invalid('receipt.identity.artifactDigest', identity.artifactDigest);\n  }\n  if (expected.inputDigest !== undefined && identity.cookIdentity !== expected.inputDigest) {\n    return invalid('receipt.identity.cookIdentity', identity.cookIdentity);\n  }\n  return ok({\n    schemaVersion: 'material-cook/4',\n    sourceClosure: candidate.sourceClosure as string[],\n    profile: candidate.profile as string,\n    compilerVersion: candidate.compilerVersion as string,\n    identity,\n    derivedInterface: {\n      layoutIdentity: derivedInterface.layoutIdentity as string,\n      ...(derivedInterface.layerPlanIdentity === undefined\n        ? {}\n        : { layerPlanIdentity: derivedInterface.layerPlanIdentity as string }),\n    },\n  });\n}\n\nexport function validateCookedMaterialRecord(\n  value: unknown,\n): Result<CookedMaterialRecord, MaterialCookRecordError> {\n  if (value === null || typeof value !== 'object') return invalid('record');\n  const candidate = value as Record<string, unknown>;\n  if (candidate.schemaVersion !== 'material-cook/4')\n    return invalid('schemaVersion', candidate.schemaVersion);\n  if (typeof candidate.guid !== 'string' || !candidate.guid) return invalid('guid');\n  if (candidate.materialGuid !== undefined && typeof candidate.materialGuid !== 'string')\n    return invalid('materialGuid');\n  if (\n    candidate.publicationGeneration !== undefined &&\n    !isGeneration(candidate.publicationGeneration)\n  )\n    return invalid('publicationGeneration', candidate.publicationGeneration);\n  if (candidate.specializationKey !== undefined && typeof candidate.specializationKey !== 'string')\n    return invalid('specializationKey');\n  if ('artifact' in candidate || 'variants' in candidate || 'variantContext' in candidate)\n    return invalid('programs', 'legacy single-artifact publication');\n  if (candidate.artifactDigest !== undefined && typeof candidate.artifactDigest !== 'string')\n    return invalid('artifactDigest');\n  if (\n    candidate.sourceClosure !== undefined &&\n    (!Array.isArray(candidate.sourceClosure) ||\n      candidate.sourceClosure.some((path) => typeof path !== 'string'))\n  )\n    return invalid('sourceClosure');\n  if (candidate.parameterContract !== undefined) {\n    if (candidate.parameterContract === null || typeof candidate.parameterContract !== 'object')\n      return invalid('parameterContract');\n    const parameterContract = candidate.parameterContract as Record<string, unknown>;\n    if (!Array.isArray(parameterContract.parameters))\n      return invalid('parameterContract.parameters');\n    if (\n      parameterContract.values === null ||\n      typeof parameterContract.values !== 'object' ||\n      Array.isArray(parameterContract.values)\n    )\n      return invalid('parameterContract.values');\n  }\n  if (candidate.resolved === null || typeof candidate.resolved !== 'object')\n    return invalid('resolved');\n  if (candidate.refs === null || typeof candidate.refs !== 'object') return invalid('refs');\n  if (candidate.receipt === null || typeof candidate.receipt !== 'object')\n    return invalid('receipt');\n  const resolved = candidate.resolved as Record<string, unknown>;\n  if (!Array.isArray(resolved.passes)) return invalid('resolved.passes', resolved.passes);\n  if (!Array.isArray(resolved.parameters))\n    return invalid('resolved.parameters', resolved.parameters);\n  if (\n    resolved.values === null ||\n    typeof resolved.values !== 'object' ||\n    Array.isArray(resolved.values)\n  )\n    return invalid('resolved.values', resolved.values);\n  if (resolved.surface !== undefined && !isMaterialSurfaceDeclaration(resolved.surface))\n    return invalid('resolved.surface', resolved.surface);\n  const passes = resolved.passes as MaterialPass[];\n  const passNames = new Set<string>();\n  for (const [index, pass] of passes.entries()) {\n    if (\n      pass === null ||\n      typeof pass !== 'object' ||\n      typeof pass.name !== 'string' ||\n      !pass.name ||\n      passNames.has(pass.name) ||\n      pass.program === null ||\n      typeof pass.program !== 'object' ||\n      typeof pass.program.module !== 'string'\n    )\n      return invalid(`resolved.passes[${index}]`);\n    passNames.add(pass.name);\n  }\n  if (!Array.isArray(candidate.programs) || candidate.programs.length === 0)\n    return invalid('programs');\n  const programs: MaterialCookProgram[] = [];\n  const programKeys = new Set<string>();\n  const selections = new Set<string>();\n  const submissionSelections = new Map<string, Set<MaterialProgramAddress>>();\n  let modernPublication = false;\n  let legacySelectionField: string | undefined;\n  const selectedPasses = new Set<string>();\n  for (const [index, entry] of candidate.programs.entries()) {\n    const field = `programs[${index}]`;\n    if (entry === null || typeof entry !== 'object') return invalid(field);\n    const program = entry as Record<string, unknown>;\n    if (\n      typeof program.specializationKey !== 'string' ||\n      !program.specializationKey ||\n      programKeys.has(program.specializationKey)\n    )\n      return invalid(`${field}.specializationKey`);\n    programKeys.add(program.specializationKey);\n    if (program.artifact === null || typeof program.artifact !== 'object')\n      return invalid(`${field}.artifact`);\n    const artifact = program.artifact as Record<string, unknown>;\n    const bytes = normalizeArtifactBytes(artifact.bytes);\n    if (\n      artifact.mediaType !== 'text/wgsl' ||\n      typeof artifact.path !== 'string' ||\n      !artifact.path ||\n      typeof artifact.digest !== 'string' ||\n      !artifact.digest ||\n      bytes === undefined\n    )\n      return invalid(`${field}.artifact`);\n    if (!Array.isArray(program.selections) || program.selections.length === 0)\n      return invalid(`${field}.selections`);\n    const programSelections: MaterialCookProgram['selections'][number][] = [];\n    for (const [selectionIndex, rawSelection] of program.selections.entries()) {\n      const selectionField = `${field}.selections[${selectionIndex}]`;\n      if (rawSelection === null || typeof rawSelection !== 'object') return invalid(selectionField);\n      const selection = rawSelection as Record<string, unknown>;\n      if (typeof selection.pass !== 'string' || !passNames.has(selection.pass))\n        return invalid(selectionField);\n      const context = validateMaterialCookProgramContext(selection.context);\n      if (!context.ok)\n        return invalid(\n          `${selectionField}.${context.error.detail.field}`,\n          context.error.detail.actual,\n        );\n      if (context.value.pipeline === 'ray') {\n        if (selection.address !== undefined || selection.abi !== undefined)\n          return invalid(\n            selectionField,\n            'Surface derivatives have no raster submission address or ABI',\n          );\n        const entry = context.value.pass === 'ray-hit' ? 'cs_surface' : 'vs_card';\n        if (selection.entry !== entry)\n          return invalid(\n            `${selectionField}.entry`,\n            `${context.value.pass} Surface entry must be ${entry}`,\n          );\n        const key = JSON.stringify([selection.pass, materialProgramContextKey(context.value)]);\n        if (selections.has(key)) return invalid(selectionField, 'ambiguous Pass/context selection');\n        selections.add(key);\n        programSelections.push({\n          pass: selection.pass,\n          context: context.value,\n          entry,\n        });\n        continue;\n      }\n      const address = selection.address === undefined ? 'direct' : selection.address;\n      if (address !== 'direct' && address !== 'scene-index')\n        return invalid(`${selectionField}.address`, selection.address);\n      const hasAddressFacts =\n        selection.address !== undefined ||\n        selection.entry !== undefined ||\n        selection.abi !== undefined;\n      modernPublication ||= hasAddressFacts;\n      if (!hasAddressFacts) legacySelectionField ??= selectionField;\n      const rawEntry = selection.entry;\n      const entry = typeof rawEntry === 'string' ? rawEntry : undefined;\n      if (hasAddressFacts && selection.address === undefined)\n        return invalid(\n          `${selectionField}.address`,\n          'modern ABI selections require an explicit address',\n        );\n      if (hasAddressFacts && (entry === undefined || entry.length === 0))\n        return invalid(`${selectionField}.entry`, rawEntry);\n      if (hasAddressFacts && !isMaterialProgramAbi(selection.abi))\n        return invalid(`${selectionField}.abi`, selection.abi);\n      if (hasAddressFacts) {\n        const abi = selection.abi as MaterialProgramAbi;\n        const expectedEntry = address === 'direct' ? abi.directEntry : abi.sceneIndexEntry;\n        if (entry !== expectedEntry)\n          return invalid(`${selectionField}.entry`, 'entry does not match published ABI');\n        if (abi.sceneIndexEntry !== undefined) {\n          const submissionKey = JSON.stringify([\n            selection.pass,\n            materialProgramContextKey(context.value),\n            abi.vertexInputs.some((input) => input.semantic === 'color'),\n          ]);\n          const addresses =\n            submissionSelections.get(submissionKey) ?? new Set<MaterialProgramAddress>();\n          addresses.add(address);\n          submissionSelections.set(submissionKey, addresses);\n        }\n      }\n      const key = JSON.stringify([\n        selection.pass,\n        materialProgramContextKey(context.value),\n        address,\n        hasAddressFacts &&\n          (selection.abi as MaterialProgramAbi).vertexInputs.some(\n            (input) => input.semantic === 'color',\n          ),\n      ]);\n      if (selections.has(key)) return invalid(selectionField, 'ambiguous Pass/context selection');\n      selections.add(key);\n      selectedPasses.add(selection.pass);\n      programSelections.push({\n        pass: selection.pass,\n        context: context.value,\n        ...(selection.address === undefined ? {} : { address }),\n        ...(entry === undefined ? {} : { entry }),\n        ...(selection.abi === undefined ? {} : { abi: selection.abi as MaterialProgramAbi }),\n      });\n    }\n    programs.push({\n      specializationKey: program.specializationKey,\n      artifact: { mediaType: 'text/wgsl', path: artifact.path, digest: artifact.digest, bytes },\n      selections: programSelections,\n    });\n  }\n  if (modernPublication && legacySelectionField !== undefined) {\n    return invalid(\n      legacySelectionField,\n      'modern material publications require address, entry, and ABI facts on every selection',\n    );\n  }\n  for (const [selectionKey, addresses] of submissionSelections) {\n    if (addresses.size !== 2) {\n      return invalid('programs.selections', `incomplete submission address pair: ${selectionKey}`);\n    }\n  }\n  if ([...passNames].some((pass) => !selectedPasses.has(pass)))\n    return invalid('programs.selections', 'unpublished Pass');\n  const manifestDigest = createMaterialProgramSetDigest(programs, passes);\n  const receiptResult = validateMaterialCookReceipt(candidate.receipt, {\n    artifactDigest: manifestDigest,\n  });\n  if (!receiptResult.ok) return receiptResult;\n  let expectedLayerPlanIdentity: string | undefined;\n  try {\n    expectedLayerPlanIdentity = materialLayerPlanIdentity({\n      resolved: resolved as unknown as CookedMaterialRecord['resolved'],\n    });\n  } catch (error) {\n    return invalid('resolved.layerPlanIdentity', error instanceof Error ? error.message : error);\n  }\n  if (\n    expectedLayerPlanIdentity !== undefined &&\n    receiptResult.value.derivedInterface.layerPlanIdentity !== expectedLayerPlanIdentity\n  ) {\n    return invalid(\n      'receipt.derivedInterface.layerPlanIdentity',\n      receiptResult.value.derivedInterface.layerPlanIdentity,\n    );\n  }\n  if (candidate.artifactDigest !== undefined && candidate.artifactDigest !== manifestDigest)\n    return invalid('artifactDigest', candidate.artifactDigest);\n  if (\n    candidate.publicationGeneration !== undefined &&\n    receiptResult.value.identity.cookGeneration !== candidate.publicationGeneration\n  )\n    return invalid('receipt.identity.cookGeneration', receiptResult.value.identity.cookGeneration);\n  return ok({\n    ...candidate,\n    programs,\n    receipt: receiptResult.value,\n  } as unknown as CookedMaterialRecord);\n}\n\nexport function projectCookedMaterialRecord(\n  record: CookedMaterialRecord,\n): Omit<CookedMaterialRecord, 'guid' | 'authored'> {\n  return {\n    resolved: record.resolved,\n    refs: record.refs,\n    programs: record.programs,\n    receipt: record.receipt,\n    schemaVersion: record.schemaVersion,\n  };\n}\n\n/** Canonical context key shared by publication validation and runtime selection. */\nexport function materialProgramContextKey(context: MaterialCookProgramContext): string {\n  return JSON.stringify(jsonValue(context));\n}\n\n/** One pass-domain projection for both the cooker and runtime selector. */\nexport function materialProgramContextForPass(\n  context: MaterialCookRasterContext,\n  lightMode: string,\n): MaterialCookRasterContext {\n  const pass = /shadow/i.test(lightMode)\n    ? 'shadow'\n    : /depth/i.test(lightMode)\n      ? 'depth'\n      : 'forward';\n  const { visibleSurface, ...base } = context;\n  return {\n    ...base,\n    pipeline: /deferred|gbuffer/i.test(lightMode) ? 'deferred' : context.pipeline,\n    pass,\n    ...(pass === 'forward' && visibleSurface === true ? { visibleSurface: true } : {}),\n  };\n}\n\nexport function validateMaterialCookProgramContext(\n  value: unknown,\n): Result<MaterialCookProgramContext, MaterialCookRecordError> {\n  if (value === null || typeof value !== 'object' || Array.isArray(value))\n    return invalid('context', value);\n  const context = value as Record<string, unknown>;\n  if (context.pipeline === 'ray') {\n    const fields = {\n      backend: ['webgpu', 'wgpu-native'],\n      capability: ['storage-buffer'],\n      pipeline: ['ray'],\n      geometry: ['mesh'],\n      pass: ['ray-hit', 'card-capture'],\n      profile: ['forgeax-material-ray-v1'],\n      toolchain: ['naga-oil'],\n      instrumentation: ['none'],\n    };\n    for (const field of Object.keys(context))\n      if (!(field in fields)) return invalid(`context.${field}`, context[field]);\n    for (const [field, allowed] of Object.entries(fields))\n      if (!allowed.includes(context[field] as string))\n        return invalid(`context.${field}`, context[field]);\n    return ok({ ...context } as unknown as MaterialCookRayContext);\n  }\n  const fields = {\n    backend: ['webgpu', 'webgl2', 'wgpu-native'],\n    capability: ['storage-buffer', 'storage-buffer-atmosphere', 'uniform-fallback'],\n    pipeline: ['forward', 'deferred'],\n    geometry: ['mesh', 'skinned', 'sprite', 'sprite-instances', 'terrain'],\n    pass: ['forward', 'shadow', 'depth'],\n    profile: ['forgeax-material-wgsl-v1'],\n    toolchain: ['naga-oil'],\n    instrumentation: ['none', 'validation'],\n  };\n  for (const field of Object.keys(context)) {\n    if (field === 'visibleSurface') {\n      if (context[field] !== true) return invalid(`context.${field}`, context[field]);\n    } else if (!(field in fields)) return invalid(`context.${field}`, context[field]);\n  }\n  for (const [field, allowed] of Object.entries(fields)) {\n    if (!allowed.includes(context[field] as string))\n      return invalid(`context.${field}`, context[field]);\n  }\n  return ok({ ...context } as unknown as MaterialCookProgramContext);\n}\n\n/** Covers every selection and artifact while excluding transport copies of the bytes. */\nexport function createMaterialProgramSetDigest(\n  programs: readonly MaterialCookProgram[],\n  passes: readonly MaterialPass[],\n): string {\n  const manifest = {\n    passes,\n    programs: programs\n      .map((program) => ({\n        specializationKey: program.specializationKey,\n        artifact: {\n          path: program.artifact.path,\n          mediaType: program.artifact.mediaType,\n          digest: program.artifact.digest,\n        },\n        selections: [...program.selections].sort((a, b) =>\n          JSON.stringify(jsonValue(a)).localeCompare(JSON.stringify(jsonValue(b))),\n        ),\n      }))\n      .sort((a, b) => a.specializationKey.localeCompare(b.specializationKey)),\n  };\n  return createMaterialArtifactDigest(\n    new TextEncoder().encode(JSON.stringify(jsonValue(manifest))),\n  );\n}\n"]}