@shapeshift-labs/frontier-lang-compiler 0.2.149 → 0.2.151

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/README.md +315 -9
  2. package/bench/real-repo-corpus-checkout-identity.mjs +134 -0
  3. package/bench/real-repo-corpus-checkout-proof.mjs +263 -0
  4. package/bench/real-repo-corpus-command-execution.mjs +314 -0
  5. package/bench/real-repo-corpus-evidence.mjs +165 -0
  6. package/bench/real-repo-corpus-suite.mjs +273 -0
  7. package/bench/smoke.mjs +109 -7
  8. package/dist/declarations/import-adapter-core.d.ts +4 -3
  9. package/dist/declarations/import-adapter-options-native.d.ts +21 -0
  10. package/dist/declarations/js-ts-project-merge-admission-routes.d.ts +35 -0
  11. package/dist/declarations/js-ts-project-merge-commonjs-interop.d.ts +29 -0
  12. package/dist/declarations/js-ts-project-merge-confidence.d.ts +64 -0
  13. package/dist/declarations/js-ts-project-merge-declaration-emit-parity.d.ts +37 -0
  14. package/dist/declarations/js-ts-project-merge-declarations.d.ts +65 -0
  15. package/dist/declarations/js-ts-project-merge-diagnostics.d.ts +97 -0
  16. package/dist/declarations/js-ts-project-merge-global-augmentation.d.ts +30 -0
  17. package/dist/declarations/js-ts-project-merge-jsx-render-branch.d.ts +48 -0
  18. package/dist/declarations/js-ts-project-merge-proof-levels.d.ts +109 -0
  19. package/dist/declarations/js-ts-project-merge-quality-gates.d.ts +38 -0
  20. package/dist/declarations/js-ts-project-merge-semantic-equivalence-proof.d.ts +45 -0
  21. package/dist/declarations/js-ts-project-merge-tsconfig.d.ts +43 -0
  22. package/dist/declarations/js-ts-safe-merge.d.ts +47 -0
  23. package/dist/declarations/js-ts-safe-project-merge.d.ts +120 -38
  24. package/dist/declarations/native-project-compiler-assignability-oracle.d.ts +41 -0
  25. package/dist/declarations/native-project-compiler-callable-signatures.d.ts +31 -0
  26. package/dist/declarations/native-project-compiler-class-member-runtime-proof.d.ts +87 -0
  27. package/dist/declarations/native-project-compiler-composite-types.d.ts +23 -0
  28. package/dist/declarations/native-project-compiler-enum-proof.d.ts +58 -0
  29. package/dist/declarations/native-project-compiler-index-signature.d.ts +7 -0
  30. package/dist/declarations/native-project-compiler-public-api-source-binding.d.ts +8 -0
  31. package/dist/declarations/native-project-compiler-scope.d.ts +37 -0
  32. package/dist/declarations/native-project-compiler-type-reference-targets.d.ts +38 -0
  33. package/dist/declarations/native-project-css-modules.d.ts +90 -0
  34. package/dist/declarations/native-project-decorator-metadata.d.ts +126 -0
  35. package/dist/declarations/native-project-jsx-graph.d.ts +313 -0
  36. package/dist/declarations/native-project-module-declarations.d.ts +52 -0
  37. package/dist/declarations/native-project-module-resolution.d.ts +76 -1
  38. package/dist/declarations/native-project-runtime-effect-target.d.ts +29 -0
  39. package/dist/declarations/native-project-runtime-executable-effect-evidence.d.ts +107 -0
  40. package/dist/declarations/native-project-runtime-mutation-target.d.ts +33 -0
  41. package/dist/declarations/native-project-runtime-promise-chain.d.ts +30 -0
  42. package/dist/declarations/native-project-runtime-promise-combinator.d.ts +22 -0
  43. package/dist/declarations/native-project-runtime-reachability.d.ts +30 -0
  44. package/dist/declarations/native-project-runtime-resource-management.d.ts +27 -0
  45. package/dist/declarations/native-project-runtime-yield-delegation.d.ts +10 -0
  46. package/dist/declarations/native-project-scope-template-reference.d.ts +13 -0
  47. package/dist/declarations/native-project-source-evidence.d.ts +8 -0
  48. package/dist/declarations/native-project.d.ts +40 -39
  49. package/dist/declarations/semantic-edit-script.d.ts +10 -8
  50. package/dist/declarations/semantic-graph-layers.d.ts +79 -0
  51. package/dist/declarations/semantic-patch-bundle-composition.d.ts +62 -0
  52. package/dist/declarations/semantic-sidecar.d.ts +3 -2
  53. package/dist/declarations/semantic-structural-diff.d.ts +94 -0
  54. package/dist/declarations/source-preservation.d.ts +32 -1
  55. package/dist/declarations/target-adapters.d.ts +22 -2
  56. package/dist/index.d.ts +32 -0
  57. package/dist/index.js +6 -0
  58. package/dist/internal/index-impl/compileNativeSource.js +53 -5
  59. package/dist/internal/index-impl/createLightweightNativeImport.js +58 -4
  60. package/dist/internal/index-impl/createNativeImportFromSyntaxAst.js +17 -1
  61. package/dist/internal/index-impl/createNativeImportFromTypeScriptAst.js +28 -4
  62. package/dist/internal/index-impl/createNativeProjectImportResult.js +31 -27
  63. package/dist/internal/index-impl/createNativeProjectModuleResolutionFromPackageManifests.js +145 -0
  64. package/dist/internal/index-impl/createNativeSourcePreservation.js +34 -7
  65. package/dist/internal/index-impl/createSemanticImportSidecar.js +27 -1
  66. package/dist/internal/index-impl/createTypeScriptCompilerNativeImporterAdapter.js +16 -5
  67. package/dist/internal/index-impl/dynamicImportExpressionMetadata.js +80 -0
  68. package/dist/internal/index-impl/importMetaUrlDependencyMetadata.js +176 -0
  69. package/dist/internal/index-impl/importNativeSource.js +2 -3
  70. package/dist/internal/index-impl/moduleImportAttributeMetadata.js +232 -0
  71. package/dist/internal/index-impl/projectSemanticEditScriptToSource.js +8 -1
  72. package/dist/internal/index-impl/projectSymbolGraphClassStaticBlocks.js +148 -0
  73. package/dist/internal/index-impl/projectSymbolGraphCompilerAdvancedTypeMetadata.js +45 -0
  74. package/dist/internal/index-impl/projectSymbolGraphCompilerCallableSignatureEquivalence.js +107 -0
  75. package/dist/internal/index-impl/projectSymbolGraphCompilerClassPrivateAccessorRuntimeProof.js +280 -0
  76. package/dist/internal/index-impl/projectSymbolGraphCompilerClassShapeEquivalence.js +103 -0
  77. package/dist/internal/index-impl/projectSymbolGraphCompilerConditionalTypeEquivalence.js +242 -0
  78. package/dist/internal/index-impl/projectSymbolGraphCompilerDecoratorRuntimeProof.js +197 -0
  79. package/dist/internal/index-impl/projectSymbolGraphCompilerEnumEquivalence.js +188 -0
  80. package/dist/internal/index-impl/projectSymbolGraphCompilerFacts.js +244 -0
  81. package/dist/internal/index-impl/projectSymbolGraphCompilerIndexSignatureEquivalence.js +58 -0
  82. package/dist/internal/index-impl/projectSymbolGraphCompilerMetadata.js +168 -0
  83. package/dist/internal/index-impl/projectSymbolGraphCompilerTypeEquivalence.js +199 -0
  84. package/dist/internal/index-impl/projectSymbolGraphCompilerTypeEquivalenceProof.js +204 -0
  85. package/dist/internal/index-impl/projectSymbolGraphCompilerTypeReferenceTargetEquivalence.js +99 -0
  86. package/dist/internal/index-impl/projectSymbolGraphCssModuleRecords.js +264 -0
  87. package/dist/internal/index-impl/projectSymbolGraphCssModuleScanners.js +242 -0
  88. package/dist/internal/index-impl/projectSymbolGraphCssModuleUtils.js +152 -0
  89. package/dist/internal/index-impl/projectSymbolGraphCssModules.js +82 -0
  90. package/dist/internal/index-impl/projectSymbolGraphJsxComponentImports.js +170 -0
  91. package/dist/internal/index-impl/projectSymbolGraphJsxComponentProviderLookup.js +167 -0
  92. package/dist/internal/index-impl/projectSymbolGraphJsxComponentWrappers.js +150 -0
  93. package/dist/internal/index-impl/projectSymbolGraphJsxContextTargets.js +71 -0
  94. package/dist/internal/index-impl/projectSymbolGraphJsxContextValues.js +212 -0
  95. package/dist/internal/index-impl/projectSymbolGraphJsxEventHandlers.js +172 -0
  96. package/dist/internal/index-impl/projectSymbolGraphJsxHookEffects.js +124 -0
  97. package/dist/internal/index-impl/projectSymbolGraphJsxHooks.js +281 -0
  98. package/dist/internal/index-impl/projectSymbolGraphJsxMemberComponents.js +139 -0
  99. package/dist/internal/index-impl/projectSymbolGraphJsxPropFlows.js +320 -0
  100. package/dist/internal/index-impl/projectSymbolGraphJsxPropValues.js +145 -0
  101. package/dist/internal/index-impl/projectSymbolGraphJsxProviderFlows.js +133 -0
  102. package/dist/internal/index-impl/projectSymbolGraphJsxRecords.js +315 -0
  103. package/dist/internal/index-impl/projectSymbolGraphJsxRenderCollections.js +155 -0
  104. package/dist/internal/index-impl/projectSymbolGraphJsxRenderReturns.js +291 -0
  105. package/dist/internal/index-impl/projectSymbolGraphJsxRenderRisk.js +279 -0
  106. package/dist/internal/index-impl/projectSymbolGraphModuleDeclarationShapes.js +138 -0
  107. package/dist/internal/index-impl/projectSymbolGraphModuleResolution.js +89 -87
  108. package/dist/internal/index-impl/projectSymbolGraphPackageConditions.js +314 -0
  109. package/dist/internal/index-impl/projectSymbolGraphReExportImportTargets.js +43 -0
  110. package/dist/internal/index-impl/projectSymbolGraphReExports.js +55 -1
  111. package/dist/internal/index-impl/projectSymbolGraphRuntimeRegions.js +108 -0
  112. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefAliases.js +307 -0
  113. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefLexical.js +320 -0
  114. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefOwners.js +50 -0
  115. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefRecordBuilders.js +112 -0
  116. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefRecords.js +238 -0
  117. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefStructural.js +104 -0
  118. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefStructuralNormalize.js +242 -0
  119. package/dist/internal/index-impl/projectSymbolGraphScopeUseDefUseHashes.js +107 -0
  120. package/dist/internal/index-impl/projectSymbolGraphSourceMapGeneratedBoundary.js +111 -0
  121. package/dist/internal/index-impl/projectSymbolGraphSourceRecords.js +268 -0
  122. package/dist/internal/index-impl/projectSymbolGraphSourceRecordsOwnership.js +309 -0
  123. package/dist/internal/index-impl/replaySemanticEditProjection.js +53 -39
  124. package/dist/internal/index-impl/runtimeOrderEvidenceBinding.js +151 -0
  125. package/dist/internal/index-impl/runtimeOrderProofSurfaces.js +253 -0
  126. package/dist/internal/index-impl/semanticEditCallsiteArgumentMerge.js +319 -0
  127. package/dist/internal/index-impl/semanticEditExplicitSourceReplacement.js +7 -2
  128. package/dist/internal/index-impl/semanticEditProjectionRecord.js +8 -0
  129. package/dist/internal/index-impl/semanticEditReplayDiagnostics.js +7 -2
  130. package/dist/internal/index-impl/semanticEditReplayOutputBinding.js +61 -0
  131. package/dist/internal/index-impl/semanticEditReplayRerunRoute.js +27 -0
  132. package/dist/internal/index-impl/semanticEditReplaySourceReplacement.js +6 -1
  133. package/dist/internal/index-impl/semanticEditRuntimeOrderReasons.js +320 -0
  134. package/dist/internal/index-impl/semanticEditScriptClassification.js +90 -5
  135. package/dist/internal/index-impl/semanticEditScripts.js +42 -5
  136. package/dist/internal/index-impl/semanticEditTypeSyntaxReasons.js +134 -0
  137. package/dist/internal/index-impl/semanticIndexFromNativeDeclarations.js +11 -5
  138. package/dist/internal/index-impl/semanticPatchBundleComposition.js +166 -0
  139. package/dist/internal/index-impl/semanticStructuralDiffRecords.js +150 -0
  140. package/dist/internal/index-impl/sourceMapGeneratedBoundaryGate.js +185 -0
  141. package/dist/internal/index-impl/staticMemberLiteral.js +31 -0
  142. package/dist/internal/index-impl/staticOptionalMemberReference.js +22 -0
  143. package/dist/internal/index-impl/syntaxAstSourcePreservation.js +273 -0
  144. package/dist/internal/index-impl/syntaxCommonJsModuleDeclarationEntries.js +297 -0
  145. package/dist/internal/index-impl/syntaxModuleDeclarationEntries.js +56 -132
  146. package/dist/internal/index-impl/syntaxModuleEntryRecords.js +160 -0
  147. package/dist/internal/index-impl/typeScriptCompilerAdvancedTypeShapes.js +160 -0
  148. package/dist/internal/index-impl/typeScriptCompilerAssignabilityOracle.js +97 -0
  149. package/dist/internal/index-impl/typeScriptCompilerClassApi.js +238 -0
  150. package/dist/internal/index-impl/typeScriptCompilerDecoratorMetadata.js +290 -0
  151. package/dist/internal/index-impl/typeScriptCompilerEnumShape.js +279 -0
  152. package/dist/internal/index-impl/typeScriptCompilerFacts.js +294 -0
  153. package/dist/internal/index-impl/typeScriptCompilerInferenceSyntax.js +170 -0
  154. package/dist/internal/index-impl/typeScriptCompilerReferenceGraph.js +186 -0
  155. package/dist/internal/index-impl/typeScriptCompilerSymbolIdentity.js +294 -0
  156. package/dist/internal/index-impl/typeScriptCompilerTypeReferenceTargets.js +142 -0
  157. package/dist/internal/index-impl/typeScriptDeclaration.js +10 -38
  158. package/dist/internal/index-impl/typeScriptModuleDeclarationEntries.js +52 -15
  159. package/dist/internal/index-impl/typeScriptSourceFilePreservation.js +296 -0
  160. package/dist/js-ts-safe-member-class-invariants.js +247 -0
  161. package/dist/js-ts-safe-member-merge-result.js +23 -3
  162. package/dist/js-ts-safe-member-merge.js +28 -4
  163. package/dist/js-ts-safe-merge-binding-patterns.js +170 -0
  164. package/dist/js-ts-safe-merge-context.js +1 -0
  165. package/dist/js-ts-safe-merge-jsx-attribute-fallback.js +314 -0
  166. package/dist/js-ts-safe-merge-jsx-attribute-parser.js +277 -0
  167. package/dist/js-ts-safe-merge-jsx-child-expression-fallback.js +161 -0
  168. package/dist/js-ts-safe-merge-jsx-child-expression-merge.js +319 -0
  169. package/dist/js-ts-safe-merge-jsx-child-expression-parser.js +300 -0
  170. package/dist/js-ts-safe-merge-parse-declarations.js +46 -2
  171. package/dist/js-ts-safe-merge-parse-statements.js +8 -0
  172. package/dist/js-ts-safe-merge-plan.js +3 -1
  173. package/dist/js-ts-safe-merge-semantic-edit-fallback.js +49 -0
  174. package/dist/js-ts-safe-merge-source-shape-fallbacks.js +5 -1
  175. package/dist/js-ts-safe-merge-top-level-rename-fallback.js +31 -5
  176. package/dist/js-ts-safe-merge-top-level-rename-result.js +7 -2
  177. package/dist/js-ts-safe-merge-variable-declarator-fallback.js +124 -6
  178. package/dist/js-ts-safe-merge-variable-declarator-parser.js +34 -4
  179. package/dist/js-ts-safe-merge.js +136 -0
  180. package/dist/js-ts-safe-project-merge-admission-routes.js +216 -0
  181. package/dist/js-ts-safe-project-merge-admission.js +161 -0
  182. package/dist/js-ts-safe-project-merge-ambient.js +110 -0
  183. package/dist/js-ts-safe-project-merge-core.js +85 -0
  184. package/dist/js-ts-safe-project-merge-css-module-conflicts.js +60 -0
  185. package/dist/js-ts-safe-project-merge-declaration-emit-parity.js +186 -0
  186. package/dist/js-ts-safe-project-merge-declarations.js +227 -0
  187. package/dist/js-ts-safe-project-merge-diagnostics-metadata.js +42 -0
  188. package/dist/js-ts-safe-project-merge-diagnostics-ts.js +73 -0
  189. package/dist/js-ts-safe-project-merge-diagnostics.js +283 -0
  190. package/dist/js-ts-safe-project-merge-evidence-routing.js +38 -0
  191. package/dist/js-ts-safe-project-merge-files.js +70 -0
  192. package/dist/js-ts-safe-project-merge-global-augmentation-compatibility.js +99 -0
  193. package/dist/js-ts-safe-project-merge-graph-conflicts.js +90 -2
  194. package/dist/js-ts-safe-project-merge-graph-delta-commonjs-interop.js +108 -0
  195. package/dist/js-ts-safe-project-merge-graph-delta-compiler-conflicts.js +179 -0
  196. package/dist/js-ts-safe-project-merge-graph-delta-compiler-details.js +189 -0
  197. package/dist/js-ts-safe-project-merge-graph-delta-conflicts.js +51 -184
  198. package/dist/js-ts-safe-project-merge-graph-delta-identity-conflicts.js +202 -0
  199. package/dist/js-ts-safe-project-merge-graph-delta-inference-syntax.js +80 -0
  200. package/dist/js-ts-safe-project-merge-graph-delta-module-declarations.js +155 -0
  201. package/dist/js-ts-safe-project-merge-graph-limits.js +16 -1
  202. package/dist/js-ts-safe-project-merge-graph.js +37 -5
  203. package/dist/js-ts-safe-project-merge-import-removal.js +292 -0
  204. package/dist/js-ts-safe-project-merge-jsx-graph-conflict-details.js +235 -0
  205. package/dist/js-ts-safe-project-merge-jsx-graph-conflicts.js +173 -0
  206. package/dist/js-ts-safe-project-merge-jsx-prop-contracts.js +86 -0
  207. package/dist/js-ts-safe-project-merge-jsx-render-branch-proof.js +189 -0
  208. package/dist/js-ts-safe-project-merge-missing-evidence.js +310 -0
  209. package/dist/js-ts-safe-project-merge-move-rename.js +209 -0
  210. package/dist/js-ts-safe-project-merge-proof-conflicts.js +44 -0
  211. package/dist/js-ts-safe-project-merge-proof-levels.js +320 -0
  212. package/dist/js-ts-safe-project-merge-quality-gates.js +140 -0
  213. package/dist/js-ts-safe-project-merge-routing-calibration.js +125 -0
  214. package/dist/js-ts-safe-project-merge-runtime-region-conflicts.js +156 -0
  215. package/dist/js-ts-safe-project-merge-scope-use-def-conflicts.js +292 -0
  216. package/dist/js-ts-safe-project-merge-semantic-equivalence-proof.js +175 -0
  217. package/dist/js-ts-safe-project-merge-semantic-replay-proof.js +311 -0
  218. package/dist/js-ts-safe-project-merge-semantic-replay-routes.js +179 -0
  219. package/dist/js-ts-safe-project-merge-source-span-conflicts.js +310 -0
  220. package/dist/js-ts-safe-project-merge-source-span-roundtrip-proof.js +172 -0
  221. package/dist/js-ts-safe-project-merge-split-merge-admission.js +96 -0
  222. package/dist/js-ts-safe-project-merge-split-merge-records.js +320 -0
  223. package/dist/js-ts-safe-project-merge-split-merge-shapes.js +234 -0
  224. package/dist/js-ts-safe-project-merge-split-merge.js +218 -0
  225. package/dist/js-ts-safe-project-merge-summary.js +320 -0
  226. package/dist/js-ts-safe-project-merge-symbol-move-admission.js +63 -0
  227. package/dist/js-ts-safe-project-merge-symbol-move-default-admission.js +143 -0
  228. package/dist/js-ts-safe-project-merge-symbol-move-risks.js +213 -0
  229. package/dist/js-ts-safe-project-merge-symbol-move.js +316 -0
  230. package/dist/js-ts-safe-project-merge-symbol-rename-admission.js +59 -0
  231. package/dist/js-ts-safe-project-merge-symbol-rename-default-admission.js +111 -0
  232. package/dist/js-ts-safe-project-merge-symbol-rename.js +319 -0
  233. package/dist/js-ts-safe-project-merge-ts-options.js +205 -0
  234. package/dist/js-ts-safe-project-merge-ts-program.js +268 -0
  235. package/dist/js-ts-safe-project-merge-typed-property-rename-rebase-utils.js +69 -0
  236. package/dist/js-ts-safe-project-merge-typed-property-rename-rebase.js +317 -0
  237. package/dist/js-ts-safe-project-merge-unsupported-surfaces.js +319 -0
  238. package/dist/js-ts-safe-project-merge.js +171 -172
  239. package/dist/js-ts-semantic-scope-use-def-bindings.js +287 -0
  240. package/dist/js-ts-semantic-scope-use-def-scan.js +241 -0
  241. package/dist/js-ts-semantic-scope-use-def-utils.js +132 -0
  242. package/dist/js-ts-semantic-scope-use-def.js +217 -0
  243. package/dist/lightweight-dependency-effects.js +28 -4
  244. package/dist/lightweight-dependency-relations.js +13 -7
  245. package/dist/lightweight-dependency-top-level.js +63 -0
  246. package/dist/native-import-language-profiles.js +27 -1
  247. package/dist/native-js-ts-importers.js +9 -5
  248. package/dist/native-parser-ast-format-profiles.js +12 -0
  249. package/dist/native-parser-html-css-format-profiles.js +85 -0
  250. package/dist/native-region-scanner-core.js +5 -3
  251. package/dist/native-region-scanner-js-commonjs.js +155 -0
  252. package/dist/native-region-scanner-js-imports.js +51 -13
  253. package/dist/native-region-scanner-js-reexports.js +79 -0
  254. package/dist/native-region-scanner-js-ts-helpers.js +23 -0
  255. package/dist/native-source-ledger-helpers.js +1 -1
  256. package/dist/native-source-ledger.js +24 -10
  257. package/dist/native-source-maps-ecma426.js +316 -0
  258. package/dist/native-source-maps.js +36 -6
  259. package/dist/native-source-preservation-ownership.js +292 -0
  260. package/dist/native-source-preservation-scanner.js +63 -25
  261. package/dist/native-source-preservation-types.d.ts +3 -0
  262. package/dist/semantic-import-effect-occurrences.js +242 -0
  263. package/dist/semantic-import-effect-regions.js +95 -58
  264. package/dist/semantic-import-graph-layers.js +224 -0
  265. package/dist/semantic-import-runtime-conditional-evidence.js +135 -0
  266. package/dist/semantic-import-runtime-effect-target-evidence.js +145 -0
  267. package/dist/semantic-import-runtime-exit-evidence.js +32 -0
  268. package/dist/semantic-import-runtime-import-meta-evidence.js +33 -0
  269. package/dist/semantic-import-runtime-mutation-evidence.js +155 -0
  270. package/dist/semantic-import-runtime-order-evidence.js +318 -0
  271. package/dist/semantic-import-runtime-promise-chain-evidence.js +103 -0
  272. package/dist/semantic-import-runtime-promise-combinator-evidence.js +166 -0
  273. package/dist/semantic-import-runtime-reachability-evidence.js +269 -0
  274. package/dist/semantic-import-runtime-resource-management-evidence.js +293 -0
  275. package/dist/semantic-import-runtime-switch-evidence.js +304 -0
  276. package/dist/semantic-import-runtime-throw-evidence.js +44 -0
  277. package/dist/semantic-import-runtime-try-finally-evidence.js +172 -0
  278. package/dist/semantic-import-sidecar-entry.js +4 -0
  279. package/dist/semantic-import-source-preservation.js +6 -2
  280. package/package.json +1 -1
@@ -0,0 +1,311 @@
1
+ import { hashSemanticValue } from '@shapeshift-labs/frontier-lang-kernel';
2
+ import {
3
+ semanticReplayCurrentHeadCommutationProofRoute,
4
+ semanticReplayMissingSignal,
5
+ semanticReplayNextAction,
6
+ semanticReplayNextMissingEvidence
7
+ } from './js-ts-safe-project-merge-semantic-replay-routes.js';
8
+
9
+ function semanticEditReplayCleanEvidence(id, fileResults, level) {
10
+ const facts = fileResults
11
+ .map(semanticReplayFact)
12
+ .filter((fact) => fact.semanticArtifacts && fact.changedOrBlocked);
13
+ const failed = facts.filter((fact) => fact.status === 'failed');
14
+ const missing = facts.filter((fact) => fact.status === 'missing');
15
+ const stale = facts.filter((fact) => fact.sourceBindingStatus === 'stale');
16
+ const status = failed.length ? 'failed' : missing.length ? 'skipped' : facts.length ? 'passed' : 'skipped';
17
+ const boundedAdmissionRoutes = facts
18
+ .map((fact) => boundedCurrentHeadRouteForFact(fact, level))
19
+ .filter(Boolean);
20
+ const boundedAdmissionRoute = status === 'passed' && boundedAdmissionRoutes.length === facts.length
21
+ ? boundedCurrentHeadAggregateRoute(boundedAdmissionRoutes, level)
22
+ : undefined;
23
+ const missingSignal = semanticReplayMissingSignal(status, facts, failed, stale);
24
+ const nextMissingEvidence = missingSignal ? semanticReplayNextMissingEvidence({
25
+ status,
26
+ level,
27
+ failed,
28
+ missing,
29
+ stale,
30
+ missingSignal
31
+ }) : undefined;
32
+ return evidenceRecord({
33
+ id,
34
+ suffix: 'semantic_edit_replay_clean',
35
+ level,
36
+ status,
37
+ scope: 'source-files',
38
+ summary: semanticReplaySummary(status, facts, failed, missing),
39
+ metadata: {
40
+ semanticArtifactFiles: facts.length,
41
+ replayIds: uniqueStrings(facts.map((fact) => fact.replayId)),
42
+ replayStatuses: uniqueStrings(facts.map((fact) => fact.replayStatus)),
43
+ replayDiagnosticCategories: uniqueStrings(facts.flatMap((fact) => fact.diagnosticCategories)),
44
+ reasonCodes: uniqueStrings(facts.flatMap((fact) => fact.reasonCodes)),
45
+ conflictKeys: uniqueStrings(facts.map((fact) => fact.conflictKey)),
46
+ sourcePaths: uniqueStrings(facts.map((fact) => fact.sourcePath)),
47
+ outputBindingStatuses: uniqueStrings(facts.map((fact) => fact.outputBindingStatus)),
48
+ expectedOutputHashes: uniqueStrings(facts.map((fact) => fact.expectedOutputHash)),
49
+ projectionOutputHashes: uniqueStrings(facts.map((fact) => fact.projectionOutputHash)),
50
+ replayOutputHashes: uniqueStrings(facts.map((fact) => fact.replayOutputHash)),
51
+ outputBindingFailures: facts.filter((fact) => fact.outputBindingStatus === 'failed').length,
52
+ missingOutputBindings: facts.filter((fact) => fact.outputBindingStatus === 'missing').length,
53
+ sourceBindingStatuses: uniqueStrings(facts.map((fact) => fact.sourceBindingStatus)),
54
+ expectedCurrentHashes: uniqueStrings(facts.map((fact) => fact.expectedCurrentHash)),
55
+ replayCurrentHashes: uniqueStrings(facts.map((fact) => fact.replayCurrentHash)),
56
+ replaySourcePaths: uniqueStrings(facts.map((fact) => fact.replaySourcePath)),
57
+ sourceBindingFailures: facts.filter((fact) => fact.sourceBindingStatus === 'failed' || fact.sourceBindingStatus === 'stale').length,
58
+ missingSourceBindings: facts.filter((fact) => fact.sourceBindingStatus === 'missing').length,
59
+ staleReplayFiles: stale.length,
60
+ rerunRouteIds: uniqueStrings(facts.map((fact) => fact.rerunRouteId)),
61
+ proofRouteIds: uniqueStrings(facts.map((fact) => fact.proofRouteId)),
62
+ boundedAdmissionRouteIds: uniqueStrings(boundedAdmissionRoutes.map((route) => route.routeId)),
63
+ currentHeadCommutationProofs: boundedAdmissionRoutes.length,
64
+ boundedAdmissionRoute,
65
+ acceptedCleanReplays: facts.filter((fact) => fact.replayStatus === 'accepted-clean').length,
66
+ alreadyAppliedChecks: facts.filter((fact) => fact.alreadyAppliedReplayStatus === 'already-applied').length,
67
+ failedReplayFiles: failed.length,
68
+ missingReplayFiles: missing.length,
69
+ missingSignal,
70
+ nextAction: semanticReplayNextAction(nextMissingEvidence, missingSignal),
71
+ nextMissingEvidence
72
+ }
73
+ });
74
+ }
75
+
76
+ function semanticReplayFact(file) {
77
+ const artifacts = file.semanticArtifacts ?? file.result?.semanticArtifacts;
78
+ const replay = artifacts?.replay;
79
+ const alreadyAppliedReplay = artifacts?.alreadyAppliedReplay;
80
+ const outputBinding = semanticReplayOutputBinding(file, artifacts, replay);
81
+ const sourceBinding = semanticReplaySourceBinding(file, artifacts, replay);
82
+ const proofRoute = replay?.admission?.proofRoute ?? replay?.metadata?.proofRoute;
83
+ const reasonCodes = uniqueStrings([
84
+ ...(artifacts?.admission?.reasonCodes ?? []),
85
+ ...(replay?.admission?.reasonCodes ?? []),
86
+ ...(replay?.summary?.reasonCodes ?? []),
87
+ ...(replay?.diagnostics ?? []).map((diagnostic) => diagnostic.code),
88
+ ...outputBinding.reasonCodes,
89
+ ...sourceBinding.reasonCodes
90
+ ]);
91
+ const diagnosticCategories = uniqueStrings((replay?.diagnostics ?? []).map((diagnostic) => diagnostic.category));
92
+ const replayClean = replay?.status === 'accepted-clean'
93
+ && replay?.outputSourceText === (artifacts?.projection?.sourceText ?? file.outputSourceText);
94
+ const alreadyAppliedClean = alreadyAppliedReplay?.status === 'already-applied';
95
+ const failed = artifacts?.status === 'blocked'
96
+ || ['blocked', 'conflict', 'stale', 'needs-port'].includes(String(replay?.status))
97
+ || outputBinding.status === 'failed'
98
+ || sourceBinding.status === 'failed'
99
+ || sourceBinding.status === 'stale'
100
+ || (replay?.diagnostics ?? []).some((diagnostic) => diagnostic.severity === 'error');
101
+ const missing = Boolean(artifacts) && (!replay || !alreadyAppliedReplay || !replayClean || !alreadyAppliedClean || outputBinding.status === 'missing' || sourceBinding.status === 'missing') && !failed;
102
+ return {
103
+ sourcePath: file.sourcePath,
104
+ semanticArtifacts: Boolean(artifacts),
105
+ changedOrBlocked: file.status !== 'merged' || !file.baseHash || file.outputHash !== file.baseHash,
106
+ status: failed ? 'failed' : missing ? 'missing' : replayClean && alreadyAppliedClean ? 'passed' : 'missing',
107
+ replayId: replay?.id,
108
+ replayStatus: replay?.status,
109
+ alreadyAppliedReplayStatus: alreadyAppliedReplay?.status,
110
+ diagnosticCategories,
111
+ reasonCodes,
112
+ outputBindingStatus: outputBinding.status,
113
+ expectedOutputHash: outputBinding.expectedOutputHash,
114
+ projectionOutputHash: outputBinding.projectionOutputHash,
115
+ replayOutputHash: outputBinding.replayOutputHash,
116
+ sourceBindingStatus: sourceBinding.status,
117
+ expectedCurrentHash: sourceBinding.expectedCurrentHash,
118
+ replayCurrentHash: sourceBinding.replayCurrentHash,
119
+ replaySourcePath: sourceBinding.replaySourcePath,
120
+ rerunRouteId: sourceBinding.rerunRouteId,
121
+ proofRouteId: proofRoute?.routeId,
122
+ conflictKey: file.conflictKeys?.[0]
123
+ };
124
+ }
125
+
126
+ function semanticReplaySummary(status, facts, failed, missing) {
127
+ if (status === 'passed') return `Verified clean semantic edit replay evidence for ${facts.length} source file(s).`;
128
+ if (status === 'failed' && failed.some((fact) => fact.sourceBindingStatus === 'stale')) {
129
+ return `Semantic edit replay proof was stale for ${failed.filter((fact) => fact.sourceBindingStatus === 'stale').length} source file(s).`;
130
+ }
131
+ if (status === 'failed' && failed.some((fact) => fact.sourceBindingStatus === 'failed')) {
132
+ return `Semantic edit replay source binding failed for ${failed.filter((fact) => fact.sourceBindingStatus === 'failed').length} source file(s).`;
133
+ }
134
+ if (status === 'failed' && failed.some((fact) => fact.outputBindingStatus === 'failed')) {
135
+ return `Semantic edit replay output binding failed for ${failed.filter((fact) => fact.outputBindingStatus === 'failed').length} source file(s).`;
136
+ }
137
+ if (status === 'failed') return `Semantic edit replay diagnostics failed for ${failed.length} source file(s).`;
138
+ return facts.length
139
+ ? `Semantic edit artifacts are missing clean replay evidence for ${missing.length} source file(s).`
140
+ : 'No semantic edit artifacts were available for replay-clean proof evidence.';
141
+ }
142
+
143
+ function evidenceRecord(input) {
144
+ return {
145
+ id: `${input.id}_proof_${input.suffix}`,
146
+ kind: 'js-ts-project-merge-proof-evidence',
147
+ level: input.level,
148
+ status: input.status,
149
+ scope: input.scope,
150
+ claimKind: 'evidence',
151
+ evidenceOnly: true,
152
+ proofClaim: false,
153
+ autoMergeClaim: false,
154
+ semanticEquivalenceClaim: false,
155
+ summary: input.summary,
156
+ metadata: compactRecord({
157
+ ...(input.metadata ?? {}),
158
+ proofClaim: false,
159
+ autoMergeClaim: false,
160
+ semanticEquivalenceClaim: false
161
+ })
162
+ };
163
+ }
164
+
165
+ function compactRecord(record) {
166
+ return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined));
167
+ }
168
+ function uniqueStrings(values) {
169
+ return [...new Set(values.filter((value) => typeof value === 'string' && value.length > 0))];
170
+ }
171
+
172
+ function semanticReplayOutputBinding(file, artifacts, replay) {
173
+ const expectedOutputSourceText = firstString(file.outputSourceText, file.result?.outputSourceText, file.result?.mergedSourceText);
174
+ const expectedOutputHash = firstString(
175
+ file.outputHash,
176
+ file.result?.outputHash,
177
+ typeof expectedOutputSourceText === 'string' ? hashSemanticValue(expectedOutputSourceText) : undefined
178
+ );
179
+ const projectionOutputSourceText = firstString(artifacts?.projection?.sourceText);
180
+ const projectionOutputHash = firstString(
181
+ artifacts?.projection?.outputHash,
182
+ artifacts?.projection?.projectedHash,
183
+ typeof projectionOutputSourceText === 'string' ? hashSemanticValue(projectionOutputSourceText) : undefined
184
+ );
185
+ const replayOutputSourceText = firstString(replay?.outputSourceText);
186
+ const replayOutputHash = firstString(
187
+ replay?.outputHash,
188
+ typeof replayOutputSourceText === 'string' ? hashSemanticValue(replayOutputSourceText) : undefined
189
+ );
190
+ const reasonCodes = [];
191
+ if (typeof expectedOutputSourceText !== 'string' && typeof expectedOutputHash !== 'string') {
192
+ reasonCodes.push('semantic-edit-output-binding-missing');
193
+ }
194
+ if (typeof projectionOutputSourceText !== 'string' && typeof projectionOutputHash !== 'string') {
195
+ reasonCodes.push('semantic-edit-projection-output-binding-missing');
196
+ }
197
+ if (typeof replayOutputSourceText !== 'string' && typeof replayOutputHash !== 'string') {
198
+ reasonCodes.push('semantic-edit-replay-output-binding-missing');
199
+ }
200
+ if (typeof expectedOutputSourceText === 'string' && typeof projectionOutputSourceText === 'string' && expectedOutputSourceText !== projectionOutputSourceText) {
201
+ reasonCodes.push('semantic-edit-projection-output-source-mismatch');
202
+ }
203
+ if (typeof expectedOutputHash === 'string' && typeof projectionOutputHash === 'string' && expectedOutputHash !== projectionOutputHash) {
204
+ reasonCodes.push('semantic-edit-projection-output-hash-mismatch');
205
+ }
206
+ if (typeof expectedOutputSourceText === 'string' && typeof replayOutputSourceText === 'string' && expectedOutputSourceText !== replayOutputSourceText) {
207
+ reasonCodes.push('semantic-edit-replay-output-source-mismatch');
208
+ }
209
+ if (typeof expectedOutputHash === 'string' && typeof replayOutputHash === 'string' && expectedOutputHash !== replayOutputHash) {
210
+ reasonCodes.push('semantic-edit-replay-output-hash-mismatch');
211
+ }
212
+ if (typeof projectionOutputSourceText === 'string' && typeof replayOutputSourceText === 'string' && projectionOutputSourceText !== replayOutputSourceText) {
213
+ reasonCodes.push('semantic-edit-replay-projection-output-source-mismatch');
214
+ }
215
+ if (typeof projectionOutputHash === 'string' && typeof replayOutputHash === 'string' && projectionOutputHash !== replayOutputHash) {
216
+ reasonCodes.push('semantic-edit-replay-projection-output-hash-mismatch');
217
+ }
218
+ const mismatch = reasonCodes.some((code) => code.endsWith('-mismatch'));
219
+ return compactRecord({
220
+ status: mismatch ? 'failed' : reasonCodes.length ? 'missing' : 'bound',
221
+ reasonCodes: uniqueStrings(reasonCodes),
222
+ expectedOutputHash,
223
+ projectionOutputHash,
224
+ replayOutputHash
225
+ });
226
+ }
227
+
228
+ function semanticReplaySourceBinding(file, artifacts, replay) {
229
+ const expectedCurrentSourceText = firstString(
230
+ file.currentSourceText,
231
+ file.headSourceText,
232
+ file.result?.currentSourceText,
233
+ file.result?.headSourceText
234
+ );
235
+ const expectedCurrentHash = firstString(
236
+ file.currentHash,
237
+ file.headHash,
238
+ file.result?.currentHash,
239
+ file.result?.headHash,
240
+ typeof expectedCurrentSourceText === 'string' ? hashSemanticValue(expectedCurrentSourceText) : undefined
241
+ );
242
+ const replayCurrentHash = firstString(
243
+ replay?.currentHash,
244
+ replay?.metadata?.currentHash,
245
+ replay?.metadata?.observedCurrentHash,
246
+ artifacts?.replayCurrentHash
247
+ );
248
+ const replaySourcePath = firstString(replay?.sourcePath, artifacts?.projection?.sourcePath);
249
+ const reasonCodes = [];
250
+ if (typeof file.sourcePath === 'string' && typeof replaySourcePath === 'string' && file.sourcePath !== replaySourcePath) {
251
+ reasonCodes.push('semantic-edit-replay-source-path-mismatch');
252
+ }
253
+ if (typeof expectedCurrentHash === 'string') {
254
+ if (typeof replayCurrentHash !== 'string') reasonCodes.push('semantic-edit-replay-current-source-hash-missing');
255
+ else if (expectedCurrentHash !== replayCurrentHash) reasonCodes.push('semantic-edit-replay-current-source-hash-mismatch');
256
+ }
257
+ const pathMismatch = reasonCodes.includes('semantic-edit-replay-source-path-mismatch');
258
+ const hashMismatch = reasonCodes.includes('semantic-edit-replay-current-source-hash-mismatch');
259
+ const hashMissing = reasonCodes.includes('semantic-edit-replay-current-source-hash-missing');
260
+ return compactRecord({
261
+ status: pathMismatch ? 'failed' : hashMismatch ? 'stale' : hashMissing ? 'missing' : typeof expectedCurrentHash === 'string' ? 'bound' : undefined,
262
+ reasonCodes: uniqueStrings(reasonCodes),
263
+ expectedCurrentHash,
264
+ replayCurrentHash,
265
+ replaySourcePath,
266
+ rerunRouteId: hashMismatch ? 'rerun-semantic-edit-replay-current-head' : undefined
267
+ });
268
+ }
269
+
270
+ function boundedCurrentHeadRouteForFact(fact, level) {
271
+ return semanticReplayCurrentHeadCommutationProofRoute({
272
+ status: fact.replayStatus,
273
+ proofLevel: level,
274
+ sourcePath: fact.sourcePath,
275
+ replayId: fact.replayId,
276
+ outputBindingStatus: fact.outputBindingStatus,
277
+ expectedCurrentHash: fact.expectedCurrentHash,
278
+ replayCurrentHash: fact.replayCurrentHash,
279
+ expectedOutputHash: fact.expectedOutputHash,
280
+ projectionOutputHash: fact.projectionOutputHash,
281
+ replayOutputHash: fact.replayOutputHash
282
+ });
283
+ }
284
+
285
+ function boundedCurrentHeadAggregateRoute(routes, level) {
286
+ return {
287
+ routeId: 'admit-independent-semantic-edit-current-head-commutation',
288
+ routeLane: 'source-files',
289
+ routeNext: 'apply-source-bound-semantic-edit-replay',
290
+ action: 'apply',
291
+ proofKind: 'bounded-current-head-commutation',
292
+ status: 'passed',
293
+ proofLevel: level,
294
+ reasonCodes: ['semantic-edit-current-head-commutation-bound'],
295
+ sourcePaths: uniqueStrings(routes.map((route) => route.sourcePath)),
296
+ replayIds: uniqueStrings(routes.map((route) => route.replayId)),
297
+ expectedCurrentHashes: uniqueStrings(routes.map((route) => route.expectedCurrentHash)),
298
+ replayCurrentHashes: uniqueStrings(routes.map((route) => route.replayCurrentHash)),
299
+ expectedOutputHashes: uniqueStrings(routes.map((route) => route.expectedOutputHash)),
300
+ projectionOutputHashes: uniqueStrings(routes.map((route) => route.projectionOutputHash)),
301
+ replayOutputHashes: uniqueStrings(routes.map((route) => route.replayOutputHash)),
302
+ autoMergeClaim: false,
303
+ semanticEquivalenceClaim: false
304
+ };
305
+ }
306
+
307
+ function firstString(...values) {
308
+ return values.find((value) => typeof value === 'string');
309
+ }
310
+
311
+ export { semanticEditReplayCleanEvidence };
@@ -0,0 +1,179 @@
1
+ const semanticReplaySignals = Object.freeze({
2
+ missingProof: 'semantic-edit-replay-proof-not-produced',
3
+ outputMismatch: 'semantic-edit-replay-proof-output-mismatch',
4
+ staleCurrentSource: 'semantic-edit-replay-proof-stale-current-source'
5
+ });
6
+
7
+ function semanticReplayMissingSignal(status, facts, failed, stale) {
8
+ if (!facts.length || status === 'passed') return undefined;
9
+ if (stale.length) return semanticReplaySignals.staleCurrentSource;
10
+ if (failed.some((fact) => fact.outputBindingStatus === 'failed')) return semanticReplaySignals.outputMismatch;
11
+ return semanticReplaySignals.missingProof;
12
+ }
13
+
14
+ function semanticReplayNextMissingEvidence(input) {
15
+ const failedOrMissing = [...input.failed, ...input.missing];
16
+ const stale = input.stale ?? [];
17
+ if (stale.length) return staleReplayEvidenceRoute(input, stale);
18
+ const outputMismatched = failedOrMissing.filter((fact) => fact.outputBindingStatus === 'failed');
19
+ if (outputMismatched.length) return outputMismatchEvidenceRoute(input, outputMismatched);
20
+ return missingReplayEvidenceRoute(input, failedOrMissing);
21
+ }
22
+
23
+ function semanticReplayNextAction(nextMissingEvidence, missingSignal) {
24
+ if (!missingSignal) return undefined;
25
+ if (nextMissingEvidence?.action === 'rerun') {
26
+ return 'Rerun semantic edit replay against the current project head hash before admission.';
27
+ }
28
+ if (nextMissingEvidence?.action === 'reject-proof') {
29
+ return 'Reject the output-mismatched semantic edit replay proof and inspect the replay output binding before admission.';
30
+ }
31
+ return 'Produce semantic edit replay diagnostics and require accepted-clean replay plus already-applied verification before admission.';
32
+ }
33
+
34
+ function semanticReplayProofRoute(status, reasonCodes, rerunRoute, binding = {}) {
35
+ if (rerunRoute) return rerunRoute;
36
+ const outputMismatchReasons = reasonCodes.filter(isReplayOutputMismatchReasonCode);
37
+ if (status === 'blocked' && outputMismatchReasons.length) return {
38
+ routeId: 'reject-semantic-edit-replay-output-mismatch',
39
+ routeLane: 'source-files',
40
+ routeNext: 'inspect-semantic-edit-replay-output-binding',
41
+ action: 'reject-proof',
42
+ reasonCodes: uniqueStrings(outputMismatchReasons),
43
+ autoMergeClaim: false,
44
+ semanticEquivalenceClaim: false
45
+ };
46
+ return semanticReplayCurrentHeadCommutationProofRoute({
47
+ ...binding,
48
+ status,
49
+ reasonCodes
50
+ });
51
+ }
52
+
53
+ function semanticReplayCurrentHeadCommutationProofRoute(input = {}) {
54
+ const reasonCodes = uniqueStrings(input.reasonCodes ?? []);
55
+ if (input.status !== 'accepted-clean' || reasonCodes.length) return undefined;
56
+ const outputBindingStatus = input.outputBindingStatus ?? input.outputBinding?.status;
57
+ if (outputBindingStatus !== 'bound') return undefined;
58
+ const expectedCurrentHash = firstString(input.expectedCurrentHash, input.currentSourceHash);
59
+ const replayCurrentHash = firstString(input.replayCurrentHash, input.currentHash, input.observedCurrentHash);
60
+ if (!expectedCurrentHash || expectedCurrentHash !== replayCurrentHash) return undefined;
61
+ const expectedOutputHash = firstString(
62
+ input.expectedOutputHash,
63
+ input.outputBinding?.expectedOutputHash,
64
+ input.projectionOutputHash,
65
+ input.projectedHash
66
+ );
67
+ const replayOutputHash = firstString(
68
+ input.replayOutputHash,
69
+ input.outputHash,
70
+ input.outputBinding?.replayedOutputHash
71
+ );
72
+ if (!expectedOutputHash || expectedOutputHash !== replayOutputHash) return undefined;
73
+ return compactRecord({
74
+ routeId: 'admit-independent-semantic-edit-current-head-commutation',
75
+ routeLane: 'source-files',
76
+ routeNext: 'apply-source-bound-semantic-edit-replay',
77
+ action: 'apply',
78
+ proofKind: 'bounded-current-head-commutation',
79
+ status: 'passed',
80
+ proofLevel: input.proofLevel,
81
+ reasonCodes: ['semantic-edit-current-head-commutation-bound'],
82
+ sourcePath: input.sourcePath,
83
+ replayId: input.replayId,
84
+ appliedOperations: input.appliedOperations,
85
+ expectedCurrentHash,
86
+ replayCurrentHash,
87
+ expectedOutputHash,
88
+ projectionOutputHash: input.projectionOutputHash,
89
+ replayOutputHash,
90
+ outputBindingStatus,
91
+ autoMergeClaim: false,
92
+ semanticEquivalenceClaim: false
93
+ });
94
+ }
95
+
96
+ function staleReplayEvidenceRoute(input, stale) {
97
+ return {
98
+ code: input.missingSignal,
99
+ kind: 'proof-level',
100
+ scope: 'source-files',
101
+ status: 'stale',
102
+ proofLevel: input.level,
103
+ action: 'rerun',
104
+ routeId: 'rerun-semantic-edit-replay-current-head',
105
+ routeLane: 'source-files',
106
+ routeNext: 'rerun-semantic-edit-replay-on-current-head',
107
+ reasonCodes: uniqueStrings(stale.flatMap((fact) => fact.reasonCodes)),
108
+ sourceBindingStatuses: uniqueStrings(stale.map((fact) => fact.sourceBindingStatus)),
109
+ expectedCurrentHashes: uniqueStrings(stale.map((fact) => fact.expectedCurrentHash)),
110
+ replayCurrentHashes: uniqueStrings(stale.map((fact) => fact.replayCurrentHash)),
111
+ autoMergeClaim: false,
112
+ semanticEquivalenceClaim: false
113
+ };
114
+ }
115
+
116
+ function outputMismatchEvidenceRoute(input, outputMismatched) {
117
+ return {
118
+ code: input.missingSignal,
119
+ kind: 'proof-level',
120
+ scope: 'source-files',
121
+ status: 'failed',
122
+ proofLevel: input.level,
123
+ action: 'reject-proof',
124
+ routeId: 'reject-semantic-edit-replay-output-mismatch',
125
+ routeLane: 'source-files',
126
+ routeNext: 'inspect-semantic-edit-replay-output-binding',
127
+ reasonCodes: uniqueStrings(outputMismatched.flatMap((fact) => fact.reasonCodes)),
128
+ outputBindingStatuses: uniqueStrings(outputMismatched.map((fact) => fact.outputBindingStatus)),
129
+ expectedOutputHashes: uniqueStrings(outputMismatched.map((fact) => fact.expectedOutputHash)),
130
+ projectionOutputHashes: uniqueStrings(outputMismatched.map((fact) => fact.projectionOutputHash)),
131
+ replayOutputHashes: uniqueStrings(outputMismatched.map((fact) => fact.replayOutputHash)),
132
+ autoMergeClaim: false,
133
+ semanticEquivalenceClaim: false
134
+ };
135
+ }
136
+
137
+ function missingReplayEvidenceRoute(input, failedOrMissing) {
138
+ return {
139
+ code: input.missingSignal,
140
+ kind: 'proof-level',
141
+ scope: 'source-files',
142
+ status: input.status === 'failed' ? 'failed' : 'missing',
143
+ proofLevel: input.level,
144
+ action: 'review',
145
+ routeId: 'produce-semantic-edit-replay-proof',
146
+ routeLane: 'source-files',
147
+ routeNext: 'run-semantic-edit-replay-diagnostics',
148
+ reasonCodes: uniqueStrings(failedOrMissing.flatMap((fact) => fact.reasonCodes)),
149
+ outputBindingStatuses: uniqueStrings(failedOrMissing.map((fact) => fact.outputBindingStatus)),
150
+ sourceBindingStatuses: uniqueStrings(failedOrMissing.map((fact) => fact.sourceBindingStatus)),
151
+ autoMergeClaim: false,
152
+ semanticEquivalenceClaim: false
153
+ };
154
+ }
155
+
156
+ function isReplayOutputMismatchReasonCode(code) {
157
+ return code === 'semantic-edit-replay-output-source-mismatch'
158
+ || code === 'semantic-edit-replay-output-hash-mismatch'
159
+ || code === 'semantic-edit-replay-projection-output-source-mismatch'
160
+ || code === 'semantic-edit-replay-projection-output-hash-mismatch'
161
+ || code === 'semantic-edit-replay-output-mismatch';
162
+ }
163
+
164
+ function uniqueStrings(values) {
165
+ return [...new Set((values ?? []).filter((value) => typeof value === 'string' && value.length > 0))];
166
+ }
167
+ function firstString(...values) { return values.find((value) => typeof value === 'string' && value.length > 0); }
168
+ function compactRecord(value) {
169
+ return Object.fromEntries(Object.entries(value ?? {}).filter(([, entry]) => entry !== undefined && (!Array.isArray(entry) || entry.length > 0)));
170
+ }
171
+
172
+ export {
173
+ semanticReplayCurrentHeadCommutationProofRoute,
174
+ semanticReplayMissingSignal,
175
+ semanticReplayNextAction,
176
+ semanticReplayNextMissingEvidence,
177
+ semanticReplayProofRoute,
178
+ semanticReplaySignals
179
+ };