agentskeptic 0.1.1

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 (661) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +342 -0
  3. package/dist/actionableFailure.d.ts +53 -0
  4. package/dist/actionableFailure.d.ts.map +1 -0
  5. package/dist/actionableFailure.js +424 -0
  6. package/dist/actionableFailure.js.map +1 -0
  7. package/dist/actionableFailure.partitionExhaustive.test.d.ts +2 -0
  8. package/dist/actionableFailure.partitionExhaustive.test.d.ts.map +1 -0
  9. package/dist/actionableFailure.partitionExhaustive.test.js +20 -0
  10. package/dist/actionableFailure.partitionExhaustive.test.js.map +1 -0
  11. package/dist/actionableFailure.remediationExhaustive.test.d.ts +2 -0
  12. package/dist/actionableFailure.remediationExhaustive.test.d.ts.map +1 -0
  13. package/dist/actionableFailure.remediationExhaustive.test.js +297 -0
  14. package/dist/actionableFailure.remediationExhaustive.test.js.map +1 -0
  15. package/dist/actionableFailure.test.d.ts +2 -0
  16. package/dist/actionableFailure.test.d.ts.map +1 -0
  17. package/dist/actionableFailure.test.js +211 -0
  18. package/dist/actionableFailure.test.js.map +1 -0
  19. package/dist/agentRunBundle.d.ts +24 -0
  20. package/dist/agentRunBundle.d.ts.map +1 -0
  21. package/dist/agentRunBundle.js +114 -0
  22. package/dist/agentRunBundle.js.map +1 -0
  23. package/dist/agentRunBundle.rollback.test.d.ts +2 -0
  24. package/dist/agentRunBundle.rollback.test.d.ts.map +1 -0
  25. package/dist/agentRunBundle.rollback.test.js +65 -0
  26. package/dist/agentRunBundle.rollback.test.js.map +1 -0
  27. package/dist/agentRunBundle.test.d.ts +2 -0
  28. package/dist/agentRunBundle.test.d.ts.map +1 -0
  29. package/dist/agentRunBundle.test.js +126 -0
  30. package/dist/agentRunBundle.test.js.map +1 -0
  31. package/dist/agentRunRecord.d.ts +82 -0
  32. package/dist/agentRunRecord.d.ts.map +1 -0
  33. package/dist/agentRunRecord.js +51 -0
  34. package/dist/agentRunRecord.js.map +1 -0
  35. package/dist/agentRunRecord.test.d.ts +2 -0
  36. package/dist/agentRunRecord.test.d.ts.map +1 -0
  37. package/dist/agentRunRecord.test.js +49 -0
  38. package/dist/agentRunRecord.test.js.map +1 -0
  39. package/dist/aggregate.d.ts +3 -0
  40. package/dist/aggregate.d.ts.map +1 -0
  41. package/dist/aggregate.js +36 -0
  42. package/dist/aggregate.js.map +1 -0
  43. package/dist/assurance/assurancePathArgs.d.ts +10 -0
  44. package/dist/assurance/assurancePathArgs.d.ts.map +1 -0
  45. package/dist/assurance/assurancePathArgs.js +54 -0
  46. package/dist/assurance/assurancePathArgs.js.map +1 -0
  47. package/dist/assurance/checkStale.d.ts +14 -0
  48. package/dist/assurance/checkStale.d.ts.map +1 -0
  49. package/dist/assurance/checkStale.js +48 -0
  50. package/dist/assurance/checkStale.js.map +1 -0
  51. package/dist/assurance/findRepoRoot.d.ts +6 -0
  52. package/dist/assurance/findRepoRoot.d.ts.map +1 -0
  53. package/dist/assurance/findRepoRoot.js +27 -0
  54. package/dist/assurance/findRepoRoot.js.map +1 -0
  55. package/dist/assurance/runAssurance.d.ts +24 -0
  56. package/dist/assurance/runAssurance.d.ts.map +1 -0
  57. package/dist/assurance/runAssurance.js +105 -0
  58. package/dist/assurance/runAssurance.js.map +1 -0
  59. package/dist/bundleSignatureCodes.d.ts +13 -0
  60. package/dist/bundleSignatureCodes.d.ts.map +1 -0
  61. package/dist/bundleSignatureCodes.js +12 -0
  62. package/dist/bundleSignatureCodes.js.map +1 -0
  63. package/dist/canonicalParams.d.ts +3 -0
  64. package/dist/canonicalParams.d.ts.map +1 -0
  65. package/dist/canonicalParams.js +16 -0
  66. package/dist/canonicalParams.js.map +1 -0
  67. package/dist/ciLock.d.ts +52 -0
  68. package/dist/ciLock.d.ts.map +1 -0
  69. package/dist/ciLock.js +117 -0
  70. package/dist/ciLock.js.map +1 -0
  71. package/dist/ciLockWorkflow.d.ts +4 -0
  72. package/dist/ciLockWorkflow.d.ts.map +1 -0
  73. package/dist/ciLockWorkflow.js +278 -0
  74. package/dist/ciLockWorkflow.js.map +1 -0
  75. package/dist/cli.d.ts +3 -0
  76. package/dist/cli.d.ts.map +1 -0
  77. package/dist/cli.failureExplanationInvariant.test.d.ts +2 -0
  78. package/dist/cli.failureExplanationInvariant.test.d.ts.map +1 -0
  79. package/dist/cli.failureExplanationInvariant.test.js +40 -0
  80. package/dist/cli.failureExplanationInvariant.test.js.map +1 -0
  81. package/dist/cli.js +998 -0
  82. package/dist/cli.js.map +1 -0
  83. package/dist/cliArgv.d.ts +40 -0
  84. package/dist/cliArgv.d.ts.map +1 -0
  85. package/dist/cliArgv.js +149 -0
  86. package/dist/cliArgv.js.map +1 -0
  87. package/dist/cliOperationalCodes.d.ts +65 -0
  88. package/dist/cliOperationalCodes.d.ts.map +1 -0
  89. package/dist/cliOperationalCodes.js +64 -0
  90. package/dist/cliOperationalCodes.js.map +1 -0
  91. package/dist/commercial/licensePreflight.d.ts +7 -0
  92. package/dist/commercial/licensePreflight.d.ts.map +1 -0
  93. package/dist/commercial/licensePreflight.js +95 -0
  94. package/dist/commercial/licensePreflight.js.map +1 -0
  95. package/dist/commercial/licensePreflight.test.d.ts +2 -0
  96. package/dist/commercial/licensePreflight.test.d.ts.map +1 -0
  97. package/dist/commercial/licensePreflight.test.js +123 -0
  98. package/dist/commercial/licensePreflight.test.js.map +1 -0
  99. package/dist/compare.acceptance.test.d.ts +2 -0
  100. package/dist/compare.acceptance.test.d.ts.map +1 -0
  101. package/dist/compare.acceptance.test.js +80 -0
  102. package/dist/compare.acceptance.test.js.map +1 -0
  103. package/dist/correctnessDefinition.d.ts +23 -0
  104. package/dist/correctnessDefinition.d.ts.map +1 -0
  105. package/dist/correctnessDefinition.docParity.test.d.ts +2 -0
  106. package/dist/correctnessDefinition.docParity.test.d.ts.map +1 -0
  107. package/dist/correctnessDefinition.docParity.test.js +22 -0
  108. package/dist/correctnessDefinition.docParity.test.js.map +1 -0
  109. package/dist/correctnessDefinition.js +283 -0
  110. package/dist/correctnessDefinition.js.map +1 -0
  111. package/dist/correctnessDefinitionTemplates.d.ts +70 -0
  112. package/dist/correctnessDefinitionTemplates.d.ts.map +1 -0
  113. package/dist/correctnessDefinitionTemplates.js +121 -0
  114. package/dist/correctnessDefinitionTemplates.js.map +1 -0
  115. package/dist/debug-ui/app.css +188 -0
  116. package/dist/debug-ui/app.js +245 -0
  117. package/dist/debug-ui/index.html +79 -0
  118. package/dist/debugCorpus.d.ts +68 -0
  119. package/dist/debugCorpus.d.ts.map +1 -0
  120. package/dist/debugCorpus.js +544 -0
  121. package/dist/debugCorpus.js.map +1 -0
  122. package/dist/debugCorpus.test.d.ts +2 -0
  123. package/dist/debugCorpus.test.d.ts.map +1 -0
  124. package/dist/debugCorpus.test.js +159 -0
  125. package/dist/debugCorpus.test.js.map +1 -0
  126. package/dist/debugFocus.d.ts +16 -0
  127. package/dist/debugFocus.d.ts.map +1 -0
  128. package/dist/debugFocus.js +51 -0
  129. package/dist/debugFocus.js.map +1 -0
  130. package/dist/debugFocus.test.d.ts +2 -0
  131. package/dist/debugFocus.test.d.ts.map +1 -0
  132. package/dist/debugFocus.test.js +43 -0
  133. package/dist/debugFocus.test.js.map +1 -0
  134. package/dist/debugPanels.d.ts +13 -0
  135. package/dist/debugPanels.d.ts.map +1 -0
  136. package/dist/debugPanels.js +113 -0
  137. package/dist/debugPanels.js.map +1 -0
  138. package/dist/debugPanels.test.d.ts +2 -0
  139. package/dist/debugPanels.test.d.ts.map +1 -0
  140. package/dist/debugPanels.test.js +204 -0
  141. package/dist/debugPanels.test.js.map +1 -0
  142. package/dist/debugPatterns.d.ts +47 -0
  143. package/dist/debugPatterns.d.ts.map +1 -0
  144. package/dist/debugPatterns.js +113 -0
  145. package/dist/debugPatterns.js.map +1 -0
  146. package/dist/debugPatterns.test.d.ts +2 -0
  147. package/dist/debugPatterns.test.d.ts.map +1 -0
  148. package/dist/debugPatterns.test.js +48 -0
  149. package/dist/debugPatterns.test.js.map +1 -0
  150. package/dist/debugRunFilters.d.ts +31 -0
  151. package/dist/debugRunFilters.d.ts.map +1 -0
  152. package/dist/debugRunFilters.js +118 -0
  153. package/dist/debugRunFilters.js.map +1 -0
  154. package/dist/debugRunFilters.test.d.ts +2 -0
  155. package/dist/debugRunFilters.test.d.ts.map +1 -0
  156. package/dist/debugRunFilters.test.js +78 -0
  157. package/dist/debugRunFilters.test.js.map +1 -0
  158. package/dist/debugRunIndex.d.ts +27 -0
  159. package/dist/debugRunIndex.d.ts.map +1 -0
  160. package/dist/debugRunIndex.js +58 -0
  161. package/dist/debugRunIndex.js.map +1 -0
  162. package/dist/debugServer.d.ts +19 -0
  163. package/dist/debugServer.d.ts.map +1 -0
  164. package/dist/debugServer.js +315 -0
  165. package/dist/debugServer.js.map +1 -0
  166. package/dist/debugServer.test.d.ts +2 -0
  167. package/dist/debugServer.test.d.ts.map +1 -0
  168. package/dist/debugServer.test.js +207 -0
  169. package/dist/debugServer.test.js.map +1 -0
  170. package/dist/discovery-payload-v1.json +75 -0
  171. package/dist/distributionFooter.d.ts +3 -0
  172. package/dist/distributionFooter.d.ts.map +1 -0
  173. package/dist/distributionFooter.js +3 -0
  174. package/dist/distributionFooter.js.map +1 -0
  175. package/dist/documentationCopyConsistency.test.d.ts +2 -0
  176. package/dist/documentationCopyConsistency.test.d.ts.map +1 -0
  177. package/dist/documentationCopyConsistency.test.js +94 -0
  178. package/dist/documentationCopyConsistency.test.js.map +1 -0
  179. package/dist/enforceCli.d.ts +4 -0
  180. package/dist/enforceCli.d.ts.map +1 -0
  181. package/dist/enforceCli.js +93 -0
  182. package/dist/enforceCli.js.map +1 -0
  183. package/dist/eventSequenceIntegrity.d.ts +7 -0
  184. package/dist/eventSequenceIntegrity.d.ts.map +1 -0
  185. package/dist/eventSequenceIntegrity.js +47 -0
  186. package/dist/eventSequenceIntegrity.js.map +1 -0
  187. package/dist/eventSequenceIntegrity.test.d.ts +2 -0
  188. package/dist/eventSequenceIntegrity.test.d.ts.map +1 -0
  189. package/dist/eventSequenceIntegrity.test.js +65 -0
  190. package/dist/eventSequenceIntegrity.test.js.map +1 -0
  191. package/dist/executionPathFindings.d.ts +15 -0
  192. package/dist/executionPathFindings.d.ts.map +1 -0
  193. package/dist/executionPathFindings.js +299 -0
  194. package/dist/executionPathFindings.js.map +1 -0
  195. package/dist/executionPathFindings.requirements.test.d.ts +2 -0
  196. package/dist/executionPathFindings.requirements.test.d.ts.map +1 -0
  197. package/dist/executionPathFindings.requirements.test.js +332 -0
  198. package/dist/executionPathFindings.requirements.test.js.map +1 -0
  199. package/dist/executionTrace.d.ts +13 -0
  200. package/dist/executionTrace.d.ts.map +1 -0
  201. package/dist/executionTrace.js +272 -0
  202. package/dist/executionTrace.js.map +1 -0
  203. package/dist/executionTrace.test.d.ts +2 -0
  204. package/dist/executionTrace.test.d.ts.map +1 -0
  205. package/dist/executionTrace.test.js +200 -0
  206. package/dist/executionTrace.test.js.map +1 -0
  207. package/dist/failureAnalysis.d.ts +8 -0
  208. package/dist/failureAnalysis.d.ts.map +1 -0
  209. package/dist/failureAnalysis.js +337 -0
  210. package/dist/failureAnalysis.js.map +1 -0
  211. package/dist/failureAnalysis.test.d.ts +2 -0
  212. package/dist/failureAnalysis.test.d.ts.map +1 -0
  213. package/dist/failureAnalysis.test.js +196 -0
  214. package/dist/failureAnalysis.test.js.map +1 -0
  215. package/dist/failureCatalog.d.ts +26 -0
  216. package/dist/failureCatalog.d.ts.map +1 -0
  217. package/dist/failureCatalog.js +51 -0
  218. package/dist/failureCatalog.js.map +1 -0
  219. package/dist/failureCatalog.test.d.ts +2 -0
  220. package/dist/failureCatalog.test.d.ts.map +1 -0
  221. package/dist/failureCatalog.test.js +25 -0
  222. package/dist/failureCatalog.test.js.map +1 -0
  223. package/dist/failureExplanation.d.ts +52 -0
  224. package/dist/failureExplanation.d.ts.map +1 -0
  225. package/dist/failureExplanation.failureAnalysisMock.test.d.ts +2 -0
  226. package/dist/failureExplanation.failureAnalysisMock.test.d.ts.map +1 -0
  227. package/dist/failureExplanation.failureAnalysisMock.test.js +200 -0
  228. package/dist/failureExplanation.failureAnalysisMock.test.js.map +1 -0
  229. package/dist/failureExplanation.golden.test.d.ts +2 -0
  230. package/dist/failureExplanation.golden.test.d.ts.map +1 -0
  231. package/dist/failureExplanation.golden.test.js +530 -0
  232. package/dist/failureExplanation.golden.test.js.map +1 -0
  233. package/dist/failureExplanation.js +389 -0
  234. package/dist/failureExplanation.js.map +1 -0
  235. package/dist/failureExplanationDocumentationParity.test.d.ts +2 -0
  236. package/dist/failureExplanationDocumentationParity.test.d.ts.map +1 -0
  237. package/dist/failureExplanationDocumentationParity.test.js +56 -0
  238. package/dist/failureExplanationDocumentationParity.test.js.map +1 -0
  239. package/dist/failureOriginCatalog.d.ts +30 -0
  240. package/dist/failureOriginCatalog.d.ts.map +1 -0
  241. package/dist/failureOriginCatalog.js +106 -0
  242. package/dist/failureOriginCatalog.js.map +1 -0
  243. package/dist/failureOriginCatalog.test.d.ts +2 -0
  244. package/dist/failureOriginCatalog.test.d.ts.map +1 -0
  245. package/dist/failureOriginCatalog.test.js +17 -0
  246. package/dist/failureOriginCatalog.test.js.map +1 -0
  247. package/dist/failureOriginSchemaEnum.test.d.ts +2 -0
  248. package/dist/failureOriginSchemaEnum.test.d.ts.map +1 -0
  249. package/dist/failureOriginSchemaEnum.test.js +21 -0
  250. package/dist/failureOriginSchemaEnum.test.js.map +1 -0
  251. package/dist/failureOriginSchemaParity.test.d.ts +2 -0
  252. package/dist/failureOriginSchemaParity.test.d.ts.map +1 -0
  253. package/dist/failureOriginSchemaParity.test.js +33 -0
  254. package/dist/failureOriginSchemaParity.test.js.map +1 -0
  255. package/dist/failureOriginTypes.d.ts +4 -0
  256. package/dist/failureOriginTypes.d.ts.map +1 -0
  257. package/dist/failureOriginTypes.generated.d.ts +4 -0
  258. package/dist/failureOriginTypes.generated.d.ts.map +1 -0
  259. package/dist/failureOriginTypes.generated.js +10 -0
  260. package/dist/failureOriginTypes.generated.js.map +1 -0
  261. package/dist/failureOriginTypes.js +3 -0
  262. package/dist/failureOriginTypes.js.map +1 -0
  263. package/dist/generated/commercialBuildFlags.d.ts +4 -0
  264. package/dist/generated/commercialBuildFlags.d.ts.map +1 -0
  265. package/dist/generated/commercialBuildFlags.js +5 -0
  266. package/dist/generated/commercialBuildFlags.js.map +1 -0
  267. package/dist/index.d.ts +50 -0
  268. package/dist/index.d.ts.map +1 -0
  269. package/dist/index.js +34 -0
  270. package/dist/index.js.map +1 -0
  271. package/dist/jsonPointer.d.ts +3 -0
  272. package/dist/jsonPointer.d.ts.map +1 -0
  273. package/dist/jsonPointer.js +28 -0
  274. package/dist/jsonPointer.js.map +1 -0
  275. package/dist/jsonStableStringify.d.ts +3 -0
  276. package/dist/jsonStableStringify.d.ts.map +1 -0
  277. package/dist/jsonStableStringify.js +3 -0
  278. package/dist/jsonStableStringify.js.map +1 -0
  279. package/dist/loadEvents.d.ts +3 -0
  280. package/dist/loadEvents.d.ts.map +1 -0
  281. package/dist/loadEvents.eventFileAggregateCounts.test.d.ts +2 -0
  282. package/dist/loadEvents.eventFileAggregateCounts.test.d.ts.map +1 -0
  283. package/dist/loadEvents.eventFileAggregateCounts.test.js +18 -0
  284. package/dist/loadEvents.eventFileAggregateCounts.test.js.map +1 -0
  285. package/dist/loadEvents.js +85 -0
  286. package/dist/loadEvents.js.map +1 -0
  287. package/dist/multiEffectRollup.d.ts +43 -0
  288. package/dist/multiEffectRollup.d.ts.map +1 -0
  289. package/dist/multiEffectRollup.js +164 -0
  290. package/dist/multiEffectRollup.js.map +1 -0
  291. package/dist/multiEffectRollup.test.d.ts +2 -0
  292. package/dist/multiEffectRollup.test.d.ts.map +1 -0
  293. package/dist/multiEffectRollup.test.js +128 -0
  294. package/dist/multiEffectRollup.test.js.map +1 -0
  295. package/dist/noStepsMessage.d.ts +7 -0
  296. package/dist/noStepsMessage.d.ts.map +1 -0
  297. package/dist/noStepsMessage.js +12 -0
  298. package/dist/noStepsMessage.js.map +1 -0
  299. package/dist/noStepsMessage.test.d.ts +2 -0
  300. package/dist/noStepsMessage.test.d.ts.map +1 -0
  301. package/dist/noStepsMessage.test.js +15 -0
  302. package/dist/noStepsMessage.test.js.map +1 -0
  303. package/dist/operationalDisposition.d.ts +498 -0
  304. package/dist/operationalDisposition.d.ts.map +1 -0
  305. package/dist/operationalDisposition.js +490 -0
  306. package/dist/operationalDisposition.js.map +1 -0
  307. package/dist/operationalDispositionDerivation.test.d.ts +2 -0
  308. package/dist/operationalDispositionDerivation.test.d.ts.map +1 -0
  309. package/dist/operationalDispositionDerivation.test.js +19 -0
  310. package/dist/operationalDispositionDerivation.test.js.map +1 -0
  311. package/dist/operationalFailureDiagnosis.d.ts +3 -0
  312. package/dist/operationalFailureDiagnosis.d.ts.map +1 -0
  313. package/dist/operationalFailureDiagnosis.js +25 -0
  314. package/dist/operationalFailureDiagnosis.js.map +1 -0
  315. package/dist/pipeline.d.ts +38 -0
  316. package/dist/pipeline.d.ts.map +1 -0
  317. package/dist/pipeline.js +457 -0
  318. package/dist/pipeline.js.map +1 -0
  319. package/dist/planLogicalSteps.d.ts +16 -0
  320. package/dist/planLogicalSteps.d.ts.map +1 -0
  321. package/dist/planLogicalSteps.js +51 -0
  322. package/dist/planLogicalSteps.js.map +1 -0
  323. package/dist/planLogicalSteps.test.d.ts +2 -0
  324. package/dist/planLogicalSteps.test.d.ts.map +1 -0
  325. package/dist/planLogicalSteps.test.js +88 -0
  326. package/dist/planLogicalSteps.test.js.map +1 -0
  327. package/dist/planTransition.d.ts +88 -0
  328. package/dist/planTransition.d.ts.map +1 -0
  329. package/dist/planTransition.js +490 -0
  330. package/dist/planTransition.js.map +1 -0
  331. package/dist/planTransition.test.d.ts +2 -0
  332. package/dist/planTransition.test.d.ts.map +1 -0
  333. package/dist/planTransition.test.js +956 -0
  334. package/dist/planTransition.test.js.map +1 -0
  335. package/dist/planTransitionConstants.d.ts +3 -0
  336. package/dist/planTransitionConstants.d.ts.map +1 -0
  337. package/dist/planTransitionConstants.js +3 -0
  338. package/dist/planTransitionConstants.js.map +1 -0
  339. package/dist/planTransitionPathHarvest.d.ts +24 -0
  340. package/dist/planTransitionPathHarvest.d.ts.map +1 -0
  341. package/dist/planTransitionPathHarvest.js +273 -0
  342. package/dist/planTransitionPathHarvest.js.map +1 -0
  343. package/dist/planTransitionPathHarvest.test.d.ts +2 -0
  344. package/dist/planTransitionPathHarvest.test.d.ts.map +1 -0
  345. package/dist/planTransitionPathHarvest.test.js +232 -0
  346. package/dist/planTransitionPathHarvest.test.js.map +1 -0
  347. package/dist/prepareWorkflowEvents.d.ts +6 -0
  348. package/dist/prepareWorkflowEvents.d.ts.map +1 -0
  349. package/dist/prepareWorkflowEvents.js +8 -0
  350. package/dist/prepareWorkflowEvents.js.map +1 -0
  351. package/dist/publicDistribution.generated.d.ts +3 -0
  352. package/dist/publicDistribution.generated.d.ts.map +1 -0
  353. package/dist/publicDistribution.generated.js +9 -0
  354. package/dist/publicDistribution.generated.js.map +1 -0
  355. package/dist/quickVerify/atomicWrite.d.ts +6 -0
  356. package/dist/quickVerify/atomicWrite.d.ts.map +1 -0
  357. package/dist/quickVerify/atomicWrite.js +33 -0
  358. package/dist/quickVerify/atomicWrite.js.map +1 -0
  359. package/dist/quickVerify/buildQuickContractEventsNdjson.d.ts +14 -0
  360. package/dist/quickVerify/buildQuickContractEventsNdjson.d.ts.map +1 -0
  361. package/dist/quickVerify/buildQuickContractEventsNdjson.js +28 -0
  362. package/dist/quickVerify/buildQuickContractEventsNdjson.js.map +1 -0
  363. package/dist/quickVerify/canonicalJson.d.ts +5 -0
  364. package/dist/quickVerify/canonicalJson.d.ts.map +1 -0
  365. package/dist/quickVerify/canonicalJson.js +23 -0
  366. package/dist/quickVerify/canonicalJson.js.map +1 -0
  367. package/dist/quickVerify/decomposeUnits.d.ts +15 -0
  368. package/dist/quickVerify/decomposeUnits.d.ts.map +1 -0
  369. package/dist/quickVerify/decomposeUnits.js +50 -0
  370. package/dist/quickVerify/decomposeUnits.js.map +1 -0
  371. package/dist/quickVerify/exportTool.d.ts +6 -0
  372. package/dist/quickVerify/exportTool.d.ts.map +1 -0
  373. package/dist/quickVerify/exportTool.js +20 -0
  374. package/dist/quickVerify/exportTool.js.map +1 -0
  375. package/dist/quickVerify/forbiddenMutatingSql.d.ts +4 -0
  376. package/dist/quickVerify/forbiddenMutatingSql.d.ts.map +1 -0
  377. package/dist/quickVerify/forbiddenMutatingSql.js +6 -0
  378. package/dist/quickVerify/forbiddenMutatingSql.js.map +1 -0
  379. package/dist/quickVerify/formatQuickVerifyHumanReport.d.ts +17 -0
  380. package/dist/quickVerify/formatQuickVerifyHumanReport.d.ts.map +1 -0
  381. package/dist/quickVerify/formatQuickVerifyHumanReport.js +65 -0
  382. package/dist/quickVerify/formatQuickVerifyHumanReport.js.map +1 -0
  383. package/dist/quickVerify/formatQuickVerifyHumanReport.test.d.ts +2 -0
  384. package/dist/quickVerify/formatQuickVerifyHumanReport.test.d.ts.map +1 -0
  385. package/dist/quickVerify/formatQuickVerifyHumanReport.test.js +41 -0
  386. package/dist/quickVerify/formatQuickVerifyHumanReport.test.js.map +1 -0
  387. package/dist/quickVerify/ingest.d.ts +34 -0
  388. package/dist/quickVerify/ingest.d.ts.map +1 -0
  389. package/dist/quickVerify/ingest.js +327 -0
  390. package/dist/quickVerify/ingest.js.map +1 -0
  391. package/dist/quickVerify/noMutatingSqlInSources.test.d.ts +2 -0
  392. package/dist/quickVerify/noMutatingSqlInSources.test.d.ts.map +1 -0
  393. package/dist/quickVerify/noMutatingSqlInSources.test.js +34 -0
  394. package/dist/quickVerify/noMutatingSqlInSources.test.js.map +1 -0
  395. package/dist/quickVerify/postgresCatalog.d.ts +19 -0
  396. package/dist/quickVerify/postgresCatalog.d.ts.map +1 -0
  397. package/dist/quickVerify/postgresCatalog.js +107 -0
  398. package/dist/quickVerify/postgresCatalog.js.map +1 -0
  399. package/dist/quickVerify/quickVerifyHumanCopy.d.ts +9 -0
  400. package/dist/quickVerify/quickVerifyHumanCopy.d.ts.map +1 -0
  401. package/dist/quickVerify/quickVerifyHumanCopy.js +24 -0
  402. package/dist/quickVerify/quickVerifyHumanCopy.js.map +1 -0
  403. package/dist/quickVerify/quickVerifyProductTruth.d.ts +16 -0
  404. package/dist/quickVerify/quickVerifyProductTruth.d.ts.map +1 -0
  405. package/dist/quickVerify/quickVerifyProductTruth.js +19 -0
  406. package/dist/quickVerify/quickVerifyProductTruth.js.map +1 -0
  407. package/dist/quickVerify/quickVerifyScope.d.ts +12 -0
  408. package/dist/quickVerify/quickVerifyScope.d.ts.map +1 -0
  409. package/dist/quickVerify/quickVerifyScope.js +16 -0
  410. package/dist/quickVerify/quickVerifyScope.js.map +1 -0
  411. package/dist/quickVerify/relationalPlan.d.ts +10 -0
  412. package/dist/quickVerify/relationalPlan.d.ts.map +1 -0
  413. package/dist/quickVerify/relationalPlan.js +37 -0
  414. package/dist/quickVerify/relationalPlan.js.map +1 -0
  415. package/dist/quickVerify/rowUnit.d.ts +15 -0
  416. package/dist/quickVerify/rowUnit.d.ts.map +1 -0
  417. package/dist/quickVerify/rowUnit.js +132 -0
  418. package/dist/quickVerify/rowUnit.js.map +1 -0
  419. package/dist/quickVerify/runQuickVerify.d.ts +65 -0
  420. package/dist/quickVerify/runQuickVerify.d.ts.map +1 -0
  421. package/dist/quickVerify/runQuickVerify.js +320 -0
  422. package/dist/quickVerify/runQuickVerify.js.map +1 -0
  423. package/dist/quickVerify/schemaCatalogTypes.d.ts +22 -0
  424. package/dist/quickVerify/schemaCatalogTypes.d.ts.map +1 -0
  425. package/dist/quickVerify/schemaCatalogTypes.js +2 -0
  426. package/dist/quickVerify/schemaCatalogTypes.js.map +1 -0
  427. package/dist/quickVerify/sqliteCatalog.d.ts +13 -0
  428. package/dist/quickVerify/sqliteCatalog.d.ts.map +1 -0
  429. package/dist/quickVerify/sqliteCatalog.js +48 -0
  430. package/dist/quickVerify/sqliteCatalog.js.map +1 -0
  431. package/dist/quickVerify/tableScoring.d.ts +24 -0
  432. package/dist/quickVerify/tableScoring.d.ts.map +1 -0
  433. package/dist/quickVerify/tableScoring.js +156 -0
  434. package/dist/quickVerify/tableScoring.js.map +1 -0
  435. package/dist/quickVerify/thresholds.d.ts +11 -0
  436. package/dist/quickVerify/thresholds.d.ts.map +1 -0
  437. package/dist/quickVerify/thresholds.js +11 -0
  438. package/dist/quickVerify/thresholds.js.map +1 -0
  439. package/dist/quickVerify/verifyExecution.d.ts +15 -0
  440. package/dist/quickVerify/verifyExecution.d.ts.map +1 -0
  441. package/dist/quickVerify/verifyExecution.js +153 -0
  442. package/dist/quickVerify/verifyExecution.js.map +1 -0
  443. package/dist/reconciler.d.ts +25 -0
  444. package/dist/reconciler.d.ts.map +1 -0
  445. package/dist/reconciler.js +266 -0
  446. package/dist/reconciler.js.map +1 -0
  447. package/dist/reconciliationPresentation.d.ts +83 -0
  448. package/dist/reconciliationPresentation.d.ts.map +1 -0
  449. package/dist/reconciliationPresentation.js +195 -0
  450. package/dist/reconciliationPresentation.js.map +1 -0
  451. package/dist/registryValidation.d.ts +48 -0
  452. package/dist/registryValidation.d.ts.map +1 -0
  453. package/dist/registryValidation.js +254 -0
  454. package/dist/registryValidation.js.map +1 -0
  455. package/dist/registryValidation.test.d.ts +2 -0
  456. package/dist/registryValidation.test.d.ts.map +1 -0
  457. package/dist/registryValidation.test.js +186 -0
  458. package/dist/registryValidation.test.js.map +1 -0
  459. package/dist/relationalInvariant.d.ts +28 -0
  460. package/dist/relationalInvariant.d.ts.map +1 -0
  461. package/dist/relationalInvariant.existsSql.test.d.ts +2 -0
  462. package/dist/relationalInvariant.existsSql.test.d.ts.map +1 -0
  463. package/dist/relationalInvariant.existsSql.test.js +12 -0
  464. package/dist/relationalInvariant.existsSql.test.js.map +1 -0
  465. package/dist/relationalInvariant.js +347 -0
  466. package/dist/relationalInvariant.js.map +1 -0
  467. package/dist/relationalInvariant.test.d.ts +2 -0
  468. package/dist/relationalInvariant.test.d.ts.map +1 -0
  469. package/dist/relationalInvariant.test.js +32 -0
  470. package/dist/relationalInvariant.test.js.map +1 -0
  471. package/dist/remediationConsumptionGuard.test.d.ts +2 -0
  472. package/dist/remediationConsumptionGuard.test.d.ts.map +1 -0
  473. package/dist/remediationConsumptionGuard.test.js +80 -0
  474. package/dist/remediationConsumptionGuard.test.js.map +1 -0
  475. package/dist/remediationWireSurfaceGuard.test.d.ts +2 -0
  476. package/dist/remediationWireSurfaceGuard.test.d.ts.map +1 -0
  477. package/dist/remediationWireSurfaceGuard.test.js +39 -0
  478. package/dist/remediationWireSurfaceGuard.test.js.map +1 -0
  479. package/dist/resolveExpectation.d.ts +28 -0
  480. package/dist/resolveExpectation.d.ts.map +1 -0
  481. package/dist/resolveExpectation.js +654 -0
  482. package/dist/resolveExpectation.js.map +1 -0
  483. package/dist/resolveExpectation.test.d.ts +2 -0
  484. package/dist/resolveExpectation.test.d.ts.map +1 -0
  485. package/dist/resolveExpectation.test.js +434 -0
  486. package/dist/resolveExpectation.test.js.map +1 -0
  487. package/dist/resolveFailureCodes.d.ts +2 -0
  488. package/dist/resolveFailureCodes.d.ts.map +1 -0
  489. package/dist/resolveFailureCodes.js +7 -0
  490. package/dist/resolveFailureCodes.js.map +1 -0
  491. package/dist/runComparison.d.ts +168 -0
  492. package/dist/runComparison.d.ts.map +1 -0
  493. package/dist/runComparison.js +675 -0
  494. package/dist/runComparison.js.map +1 -0
  495. package/dist/runComparison.test.d.ts +2 -0
  496. package/dist/runComparison.test.d.ts.map +1 -0
  497. package/dist/runComparison.test.js +507 -0
  498. package/dist/runComparison.test.js.map +1 -0
  499. package/dist/runLevelDriftMessages.d.ts +4 -0
  500. package/dist/runLevelDriftMessages.d.ts.map +1 -0
  501. package/dist/runLevelDriftMessages.js +4 -0
  502. package/dist/runLevelDriftMessages.js.map +1 -0
  503. package/dist/schema-validation.test.d.ts +2 -0
  504. package/dist/schema-validation.test.d.ts.map +1 -0
  505. package/dist/schema-validation.test.js +531 -0
  506. package/dist/schema-validation.test.js.map +1 -0
  507. package/dist/schemaLoad.d.ts +5 -0
  508. package/dist/schemaLoad.d.ts.map +1 -0
  509. package/dist/schemaLoad.js +152 -0
  510. package/dist/schemaLoad.js.map +1 -0
  511. package/dist/shareReport/postPublicVerificationReport.d.ts +26 -0
  512. package/dist/shareReport/postPublicVerificationReport.d.ts.map +1 -0
  513. package/dist/shareReport/postPublicVerificationReport.js +38 -0
  514. package/dist/shareReport/postPublicVerificationReport.js.map +1 -0
  515. package/dist/slice6.compare.ac.test.d.ts +2 -0
  516. package/dist/slice6.compare.ac.test.d.ts.map +1 -0
  517. package/dist/slice6.compare.ac.test.js +81 -0
  518. package/dist/slice6.compare.ac.test.js.map +1 -0
  519. package/dist/sqlConnector.d.ts +15 -0
  520. package/dist/sqlConnector.d.ts.map +1 -0
  521. package/dist/sqlConnector.js +36 -0
  522. package/dist/sqlConnector.js.map +1 -0
  523. package/dist/sqlReadBackend.d.ts +19 -0
  524. package/dist/sqlReadBackend.d.ts.map +1 -0
  525. package/dist/sqlReadBackend.js +67 -0
  526. package/dist/sqlReadBackend.js.map +1 -0
  527. package/dist/standardVerifyWorkflowCli.d.ts +24 -0
  528. package/dist/standardVerifyWorkflowCli.d.ts.map +1 -0
  529. package/dist/standardVerifyWorkflowCli.js +95 -0
  530. package/dist/standardVerifyWorkflowCli.js.map +1 -0
  531. package/dist/taxonomyAuthority.test.d.ts +2 -0
  532. package/dist/taxonomyAuthority.test.d.ts.map +1 -0
  533. package/dist/taxonomyAuthority.test.js +44 -0
  534. package/dist/taxonomyAuthority.test.js.map +1 -0
  535. package/dist/toolsRegistryLoad.d.ts +7 -0
  536. package/dist/toolsRegistryLoad.d.ts.map +1 -0
  537. package/dist/toolsRegistryLoad.js +32 -0
  538. package/dist/toolsRegistryLoad.js.map +1 -0
  539. package/dist/truthLayerError.d.ts +8 -0
  540. package/dist/truthLayerError.d.ts.map +1 -0
  541. package/dist/truthLayerError.js +9 -0
  542. package/dist/truthLayerError.js.map +1 -0
  543. package/dist/types.d.ts +706 -0
  544. package/dist/types.d.ts.map +1 -0
  545. package/dist/types.js +24 -0
  546. package/dist/types.js.map +1 -0
  547. package/dist/valueVerification.d.ts +12 -0
  548. package/dist/valueVerification.d.ts.map +1 -0
  549. package/dist/valueVerification.js +112 -0
  550. package/dist/valueVerification.js.map +1 -0
  551. package/dist/valueVerification.test.d.ts +2 -0
  552. package/dist/valueVerification.test.d.ts.map +1 -0
  553. package/dist/valueVerification.test.js +112 -0
  554. package/dist/valueVerification.test.js.map +1 -0
  555. package/dist/verificationAgainstSystemState.requirements.test.d.ts +2 -0
  556. package/dist/verificationAgainstSystemState.requirements.test.d.ts.map +1 -0
  557. package/dist/verificationAgainstSystemState.requirements.test.js +326 -0
  558. package/dist/verificationAgainstSystemState.requirements.test.js.map +1 -0
  559. package/dist/verificationDiagnostics.d.ts +21 -0
  560. package/dist/verificationDiagnostics.d.ts.map +1 -0
  561. package/dist/verificationDiagnostics.js +141 -0
  562. package/dist/verificationDiagnostics.js.map +1 -0
  563. package/dist/verificationDiagnostics.test.d.ts +2 -0
  564. package/dist/verificationDiagnostics.test.d.ts.map +1 -0
  565. package/dist/verificationDiagnostics.test.js +228 -0
  566. package/dist/verificationDiagnostics.test.js.map +1 -0
  567. package/dist/verificationPolicy.d.ts +33 -0
  568. package/dist/verificationPolicy.d.ts.map +1 -0
  569. package/dist/verificationPolicy.js +495 -0
  570. package/dist/verificationPolicy.js.map +1 -0
  571. package/dist/verificationPolicy.test.d.ts +2 -0
  572. package/dist/verificationPolicy.test.d.ts.map +1 -0
  573. package/dist/verificationPolicy.test.js +252 -0
  574. package/dist/verificationPolicy.test.js.map +1 -0
  575. package/dist/verificationRunContext.d.ts +10 -0
  576. package/dist/verificationRunContext.d.ts.map +1 -0
  577. package/dist/verificationRunContext.js +111 -0
  578. package/dist/verificationRunContext.js.map +1 -0
  579. package/dist/verificationUserPhrases.d.ts +22 -0
  580. package/dist/verificationUserPhrases.d.ts.map +1 -0
  581. package/dist/verificationUserPhrases.js +99 -0
  582. package/dist/verificationUserPhrases.js.map +1 -0
  583. package/dist/verificationUserPhrases.test.d.ts +2 -0
  584. package/dist/verificationUserPhrases.test.d.ts.map +1 -0
  585. package/dist/verificationUserPhrases.test.js +47 -0
  586. package/dist/verificationUserPhrases.test.js.map +1 -0
  587. package/dist/verifyRunBundleSignature.d.ts +14 -0
  588. package/dist/verifyRunBundleSignature.d.ts.map +1 -0
  589. package/dist/verifyRunBundleSignature.js +139 -0
  590. package/dist/verifyRunBundleSignature.js.map +1 -0
  591. package/dist/verifyRunBundleSignature.test.d.ts +2 -0
  592. package/dist/verifyRunBundleSignature.test.d.ts.map +1 -0
  593. package/dist/verifyRunBundleSignature.test.js +169 -0
  594. package/dist/verifyRunBundleSignature.test.js.map +1 -0
  595. package/dist/wireReasonCodes.d.ts +57 -0
  596. package/dist/wireReasonCodes.d.ts.map +1 -0
  597. package/dist/wireReasonCodes.js +57 -0
  598. package/dist/wireReasonCodes.js.map +1 -0
  599. package/dist/wireReasonEmittersGuard.test.d.ts +2 -0
  600. package/dist/wireReasonEmittersGuard.test.d.ts.map +1 -0
  601. package/dist/wireReasonEmittersGuard.test.js +36 -0
  602. package/dist/wireReasonEmittersGuard.test.js.map +1 -0
  603. package/dist/withWorkflowVerification.persistBundle.test.d.ts +2 -0
  604. package/dist/withWorkflowVerification.persistBundle.test.d.ts.map +1 -0
  605. package/dist/withWorkflowVerification.persistBundle.test.js +104 -0
  606. package/dist/withWorkflowVerification.persistBundle.test.js.map +1 -0
  607. package/dist/workflowResultNormalize.d.ts +9 -0
  608. package/dist/workflowResultNormalize.d.ts.map +1 -0
  609. package/dist/workflowResultNormalize.js +40 -0
  610. package/dist/workflowResultNormalize.js.map +1 -0
  611. package/dist/workflowResultSignature.d.ts +8 -0
  612. package/dist/workflowResultSignature.d.ts.map +1 -0
  613. package/dist/workflowResultSignature.js +44 -0
  614. package/dist/workflowResultSignature.js.map +1 -0
  615. package/dist/workflowRunLevelConsistency.d.ts +5 -0
  616. package/dist/workflowRunLevelConsistency.d.ts.map +1 -0
  617. package/dist/workflowRunLevelConsistency.js +30 -0
  618. package/dist/workflowRunLevelConsistency.js.map +1 -0
  619. package/dist/workflowTruthReport.d.ts +24 -0
  620. package/dist/workflowTruthReport.d.ts.map +1 -0
  621. package/dist/workflowTruthReport.js +395 -0
  622. package/dist/workflowTruthReport.js.map +1 -0
  623. package/dist/workflowTruthReport.semantics.test.d.ts +2 -0
  624. package/dist/workflowTruthReport.semantics.test.d.ts.map +1 -0
  625. package/dist/workflowTruthReport.semantics.test.js +182 -0
  626. package/dist/workflowTruthReport.semantics.test.js.map +1 -0
  627. package/dist/workflowVerdictSurface.test.d.ts +2 -0
  628. package/dist/workflowVerdictSurface.test.d.ts.map +1 -0
  629. package/dist/workflowVerdictSurface.test.js +68 -0
  630. package/dist/workflowVerdictSurface.test.js.map +1 -0
  631. package/dist/writeRunBundleCli.d.ts +9 -0
  632. package/dist/writeRunBundleCli.d.ts.map +1 -0
  633. package/dist/writeRunBundleCli.js +28 -0
  634. package/dist/writeRunBundleCli.js.map +1 -0
  635. package/package.json +115 -0
  636. package/schemas/agent-run-record-v1.schema.json +51 -0
  637. package/schemas/agent-run-record-v2.schema.json +61 -0
  638. package/schemas/assurance-manifest-v1.schema.json +28 -0
  639. package/schemas/assurance-run-report-v1.schema.json +28 -0
  640. package/schemas/ci-lock-v1.schema.json +163 -0
  641. package/schemas/cli-error-envelope.schema.json +48 -0
  642. package/schemas/event.schema.json +111 -0
  643. package/schemas/execution-trace-view.schema.json +122 -0
  644. package/schemas/openapi-commercial-v1.in.yaml +215 -0
  645. package/schemas/openapi-commercial-v1.yaml +215 -0
  646. package/schemas/plan-validation-core.schema.json +95 -0
  647. package/schemas/public-verification-report-v1.schema.json +51 -0
  648. package/schemas/quick-verify-report.schema.json +251 -0
  649. package/schemas/registry-validation-result.schema.json +99 -0
  650. package/schemas/run-comparison-report.schema.json +513 -0
  651. package/schemas/tools-registry-export.schema.json +9 -0
  652. package/schemas/tools-registry.schema.json +284 -0
  653. package/schemas/workflow-engine-result.schema.json +591 -0
  654. package/schemas/workflow-result-compare-input.schema.json +15 -0
  655. package/schemas/workflow-result-signature.schema.json +20 -0
  656. package/schemas/workflow-result-v9.schema.json +85 -0
  657. package/schemas/workflow-result.schema.json +80 -0
  658. package/schemas/workflow-truth-report.schema.json +761 -0
  659. package/scripts/discovery-acquisition.lib.cjs +195 -0
  660. package/scripts/discovery-payload.lib.cjs +346 -0
  661. package/scripts/render-discovery-ci.mjs +103 -0
@@ -0,0 +1,675 @@
1
+ import { buildActionableCategoryRecurrence, buildCategoryHistogram, } from "./actionableFailure.js";
2
+ import { compareUtf16Id } from "./resolveExpectation.js";
3
+ /** Max keys / signatures per compareHighlights list (normative cap). */
4
+ export const COMPARE_HIGHLIGHTS_MAX = 20;
5
+ function severityRank(s) {
6
+ if (s === "high")
7
+ return 0;
8
+ if (s === "medium")
9
+ return 1;
10
+ return 2;
11
+ }
12
+ /** Trend from first run → last run actionable posture (higher severity rank = better). */
13
+ export function actionableTrend(first, last) {
14
+ const fc = first.category;
15
+ const lc = last.category;
16
+ if (fc === "complete" && lc === "complete")
17
+ return "unchanged";
18
+ if (fc !== "complete" && lc === "complete")
19
+ return "improving";
20
+ if (fc === "complete" && lc !== "complete")
21
+ return "worsening";
22
+ if (fc !== lc)
23
+ return "mixed";
24
+ const fr = severityRank(first.severity);
25
+ const lr = severityRank(last.severity);
26
+ if (lr > fr)
27
+ return "improving";
28
+ if (lr < fr)
29
+ return "worsening";
30
+ return "unchanged";
31
+ }
32
+ /** Per compared run: actionable rollup (`complete` + low severity when workflow is trusted). */
33
+ export function perRunActionableFromWorkflowResult(r, runIndex) {
34
+ const fa = r.workflowTruthReport.failureAnalysis;
35
+ if (fa === null) {
36
+ return {
37
+ runIndex,
38
+ category: "complete",
39
+ severity: "low",
40
+ recommendedAction: "none",
41
+ automationSafe: true,
42
+ };
43
+ }
44
+ return {
45
+ runIndex,
46
+ category: fa.actionableFailure.category,
47
+ severity: fa.actionableFailure.severity,
48
+ recommendedAction: fa.actionableFailure.recommendedAction,
49
+ automationSafe: fa.actionableFailure.automationSafe,
50
+ };
51
+ }
52
+ function buildRecurrenceBurden(patterns) {
53
+ const patternCount = patterns.length;
54
+ const maxRunsHitCount = patternCount === 0 ? 0 : Math.max(...patterns.map((p) => p.runsHitCount));
55
+ const crossRunFailure = patternCount > 0;
56
+ let rationale;
57
+ if (patternCount === 0) {
58
+ rationale = "No failure signature appears in two or more distinct runs in this window.";
59
+ }
60
+ else {
61
+ rationale = `${patternCount} failure signature(s) appear in two or more distinct runs in this window (max runs hit per signature: ${maxRunsHitCount}).`;
62
+ }
63
+ return { patternCount, maxRunsHitCount, crossRunFailure, rationale };
64
+ }
65
+ function buildReliabilityAssessment(perRun, priorRunIndex, currentRunIndex, patterns) {
66
+ const first = perRun[0];
67
+ const last = perRun[perRun.length - 1];
68
+ const windowTrend = actionableTrend(first, last);
69
+ const priorA = perRun[priorRunIndex];
70
+ const currentA = perRun[currentRunIndex];
71
+ const pairwiseTrend = actionableTrend(priorA, currentA);
72
+ const recurrenceBurden = buildRecurrenceBurden(patterns);
73
+ let headlineVerdict;
74
+ let headlineRationale;
75
+ if (windowTrend === "worsening") {
76
+ headlineVerdict = "worsening";
77
+ headlineRationale = `First run actionable ${first.category}/${first.severity} vs last run ${last.category}/${last.severity}: overall window worsened.`;
78
+ if (recurrenceBurden.crossRunFailure) {
79
+ headlineRationale += ` ${recurrenceBurden.rationale}`;
80
+ }
81
+ }
82
+ else if (windowTrend === "improving") {
83
+ headlineVerdict = "improving";
84
+ headlineRationale = `First run actionable ${first.category}/${first.severity} vs last run ${last.category}/${last.severity}: overall window improved.`;
85
+ if (pairwiseTrend === "worsening") {
86
+ headlineRationale +=
87
+ " Latest step backslid vs prior run (pairwise trend worsening) despite window-level improvement.";
88
+ }
89
+ }
90
+ else if (windowTrend === "mixed") {
91
+ headlineVerdict = "mixed";
92
+ headlineRationale = `Window trend mixed: first vs last actionable categories differ (${first.category} vs ${last.category}) without a single ordering rule.`;
93
+ }
94
+ else {
95
+ if (pairwiseTrend !== "unchanged") {
96
+ headlineVerdict = pairwiseTrend;
97
+ headlineRationale = `Window actionable unchanged (${last.category}/${last.severity}); immediate prior→current hop is ${pairwiseTrend}.`;
98
+ }
99
+ else if (recurrenceBurden.crossRunFailure) {
100
+ headlineVerdict = "mixed";
101
+ headlineRationale = `Window and pairwise actionable unchanged, but recurring failure patterns exist. ${recurrenceBurden.rationale}`;
102
+ }
103
+ else {
104
+ headlineVerdict = "unchanged";
105
+ headlineRationale = `Window and pairwise actionable posture unchanged; no cross-run recurring failure signatures.`;
106
+ }
107
+ }
108
+ return {
109
+ windowTrend,
110
+ pairwiseTrend,
111
+ recurrenceBurden,
112
+ headlineVerdict,
113
+ headlineRationale,
114
+ };
115
+ }
116
+ function capSortKeys(keys) {
117
+ return [...keys].sort(compareUtf16Id).slice(0, COMPARE_HIGHLIGHTS_MAX);
118
+ }
119
+ function buildCompareHighlights(bucketA, bucketB, patterns) {
120
+ const introduced = [];
121
+ const resolved = [];
122
+ const bothChurn = [];
123
+ for (const e of bucketA) {
124
+ if (e.kind === "introducedFailure")
125
+ introduced.push(e.logicalStepKey);
126
+ else if (e.kind === "resolvedFailure")
127
+ resolved.push(e.logicalStepKey);
128
+ else if (e.kind === "bothFailing") {
129
+ if (e.introducedStepReasonCodes.length > 0 || e.resolvedStepReasonCodes.length > 0) {
130
+ bothChurn.push({
131
+ logicalStepKey: e.logicalStepKey,
132
+ introducedStepReasonCodes: [...e.introducedStepReasonCodes],
133
+ resolvedStepReasonCodes: [...e.resolvedStepReasonCodes],
134
+ });
135
+ }
136
+ }
137
+ }
138
+ const recurring = capSortKeys(patterns.map((p) => p.signature));
139
+ const bIntro = bucketB.introducedFailureSignatures
140
+ .slice()
141
+ .sort((a, b) => compareUtf16Id(a.signature, b.signature))
142
+ .slice(0, COMPARE_HIGHLIGHTS_MAX);
143
+ const bReso = bucketB.resolvedFailureSignatures
144
+ .slice()
145
+ .sort((a, b) => compareUtf16Id(a.signature, b.signature))
146
+ .slice(0, COMPARE_HIGHLIGHTS_MAX);
147
+ return {
148
+ introducedLogicalStepKeys: capSortKeys(introduced),
149
+ resolvedLogicalStepKeys: capSortKeys(resolved),
150
+ bothFailingChurn: bothChurn
151
+ .sort((a, b) => compareUtf16Id(a.logicalStepKey, b.logicalStepKey))
152
+ .slice(0, COMPARE_HIGHLIGHTS_MAX),
153
+ bucketBIntroducedSignatures: bIntro,
154
+ bucketBResolvedSignatures: bReso,
155
+ recurringSignatures: recurring,
156
+ };
157
+ }
158
+ function isFailing(status) {
159
+ return status !== "verified";
160
+ }
161
+ function codesFromReasons(reasons) {
162
+ return reasons.map((r) => r.code);
163
+ }
164
+ /** Multiset: expand to sorted array (lexicographic on code string) for deterministic serialization. */
165
+ function sortMultisetCodes(codes) {
166
+ return [...codes].sort(compareUtf16Id);
167
+ }
168
+ function multisetFromCodes(codes) {
169
+ const m = new Map();
170
+ for (const c of codes) {
171
+ m.set(c, (m.get(c) ?? 0) + 1);
172
+ }
173
+ return m;
174
+ }
175
+ /** a minus b (multiset). */
176
+ function multisetSubtract(a, b) {
177
+ const out = new Map();
178
+ for (const [k, va] of a) {
179
+ const vb = b.get(k) ?? 0;
180
+ const d = va - vb;
181
+ if (d > 0)
182
+ out.set(k, d);
183
+ }
184
+ return out;
185
+ }
186
+ function multisetToCodes(m) {
187
+ const out = [];
188
+ const keys = [...m.keys()].sort(compareUtf16Id);
189
+ for (const k of keys) {
190
+ const n = m.get(k) ?? 0;
191
+ for (let i = 0; i < n; i++)
192
+ out.push(k);
193
+ }
194
+ return out;
195
+ }
196
+ function getEffectRows(step) {
197
+ const raw = step.evidenceSummary?.effects;
198
+ if (!Array.isArray(raw))
199
+ return null;
200
+ const out = [];
201
+ for (const e of raw) {
202
+ if (e === null || typeof e !== "object")
203
+ continue;
204
+ const rec = e;
205
+ const id = rec.id;
206
+ const status = rec.status;
207
+ if (typeof id !== "string" || typeof status !== "string")
208
+ continue;
209
+ const reasons = Array.isArray(rec.reasons) ? rec.reasons : [];
210
+ out.push({ id, status: status, reasons });
211
+ }
212
+ return out.length > 0 ? out : null;
213
+ }
214
+ function canonicalEqKey(pairs) {
215
+ return [...pairs]
216
+ .slice()
217
+ .sort((a, b) => compareUtf16Id(a.column, b.column))
218
+ .map((x) => `${x.column}=${x.value}`)
219
+ .join("&");
220
+ }
221
+ /** Normative: see docs — sql_row / sql_effects key. */
222
+ export function logicalStepKeyFromStep(step) {
223
+ const vr = step.verificationRequest;
224
+ if (vr === null)
225
+ return null;
226
+ if (vr.kind === "sql_row") {
227
+ return `sql_row|${vr.table}|${canonicalEqKey(vr.identityEq)}`;
228
+ }
229
+ if (vr.kind === "sql_row_absent") {
230
+ return `sql_row_absent|${vr.table}|${canonicalEqKey(vr.identityEq)}|${canonicalEqKey(vr.filterEq)}`;
231
+ }
232
+ if (vr.kind === "sql_relational") {
233
+ const parts = [...vr.checks].sort((a, b) => compareUtf16Id(a.id, b.id));
234
+ const segs = parts.map((c) => {
235
+ if (c.checkKind === "related_exists") {
236
+ return `id|${c.id}|related_exists|${c.childTable}|${canonicalEqKey(c.matchEq)}|`;
237
+ }
238
+ if (c.checkKind === "aggregate") {
239
+ const w = [...c.whereEq]
240
+ .map((x) => `${x.column}=${x.value}`)
241
+ .sort((a, b) => compareUtf16Id(a, b))
242
+ .join("&");
243
+ return `id|${c.id}|aggregate|${c.table}|${c.fn}|${c.sumColumn ?? ""}|${c.expectOp}|${c.expectValue}|${w}|`;
244
+ }
245
+ if (c.checkKind === "anti_join") {
246
+ return `id|${c.id}|anti_join|${c.anchorTable}|${c.lookupTable}|${c.anchorColumn}|${c.lookupColumn}|${c.lookupPresenceColumn}|fa:${canonicalEqKey(c.filterEqAnchor)}|fl:${canonicalEqKey(c.filterEqLookup)}|`;
247
+ }
248
+ const w = [...c.whereEq]
249
+ .map((x) => `${x.side}.${x.column}=${x.value}`)
250
+ .sort((a, b) => compareUtf16Id(a, b))
251
+ .join("&");
252
+ return `id|${c.id}|join_count|${c.leftTable}|${c.rightTable}|${c.leftJoinColumn}|${c.rightJoinColumn}|${c.expectOp}|${c.expectValue}|${w}|`;
253
+ });
254
+ return `sql_relational|${segs.join("")}`;
255
+ }
256
+ const parts = [...vr.effects].sort((a, b) => compareUtf16Id(a.id, b.id));
257
+ const segs = parts.map((ef) => `id|${ef.id}|${ef.table}|${canonicalEqKey(ef.identityEq)}|`);
258
+ return `sql_effects|${segs.join("")}`;
259
+ }
260
+ export function buildLogicalStepKeyMap(steps) {
261
+ const map = new Map();
262
+ const ambiguous = [];
263
+ for (const step of steps) {
264
+ const key = logicalStepKeyFromStep(step);
265
+ if (key === null)
266
+ continue;
267
+ const existing = map.get(key);
268
+ if (!existing) {
269
+ map.set(key, step);
270
+ continue;
271
+ }
272
+ if (step.seq < existing.seq) {
273
+ ambiguous.push({
274
+ logicalStepKey: key,
275
+ chosenSeq: step.seq,
276
+ droppedSeq: existing.seq,
277
+ });
278
+ map.set(key, step);
279
+ }
280
+ else {
281
+ ambiguous.push({
282
+ logicalStepKey: key,
283
+ chosenSeq: existing.seq,
284
+ droppedSeq: step.seq,
285
+ });
286
+ }
287
+ }
288
+ return { map, ambiguous };
289
+ }
290
+ /** Failing-effect contributions only; UTF-16 sort by effect id. */
291
+ export function recurrenceSignature(step) {
292
+ const stepCodes = sortMultisetCodes(codesFromReasons(step.reasons));
293
+ let s = `${step.status}|${stepCodes.join(",")}`;
294
+ const effects = getEffectRows(step);
295
+ if (effects) {
296
+ const failing = effects.filter((e) => isFailing(e.status));
297
+ failing.sort((a, b) => compareUtf16Id(a.id, b.id));
298
+ for (const e of failing) {
299
+ const rc = sortMultisetCodes(codesFromReasons(e.reasons));
300
+ s += `|e:${e.id}:${e.status}:r:${rc.join(",")}`;
301
+ }
302
+ }
303
+ return s;
304
+ }
305
+ function runLevelCodeMultiset(result) {
306
+ return multisetFromCodes(result.runLevelReasons.map((r) => r.code));
307
+ }
308
+ function compareBucketAEntry(a, b) {
309
+ const keyA = "logicalStepKey" in a ? a.logicalStepKey : "";
310
+ const keyB = "logicalStepKey" in b ? b.logicalStepKey : "";
311
+ return compareUtf16Id(keyA, keyB);
312
+ }
313
+ function pairwiseBucketA(prior, current) {
314
+ const { map: mapP, ambiguous: ambP } = buildLogicalStepKeyMap(prior.steps);
315
+ const { map: mapC, ambiguous: ambC } = buildLogicalStepKeyMap(current.steps);
316
+ const ambiguous = [...ambP, ...ambC].sort((x, y) => compareUtf16Id(x.logicalStepKey, y.logicalStepKey));
317
+ const keys = new Set([...mapP.keys(), ...mapC.keys()]);
318
+ const entries = [];
319
+ for (const k of [...keys].sort(compareUtf16Id)) {
320
+ const sp = mapP.get(k);
321
+ const sc = mapC.get(k);
322
+ if (sp && !sc) {
323
+ entries.push({
324
+ kind: "structuralRemoval",
325
+ logicalStepKey: k,
326
+ seqPrior: sp.seq,
327
+ toolIdPrior: sp.toolId,
328
+ priorWasFailing: isFailing(sp.status),
329
+ });
330
+ continue;
331
+ }
332
+ if (!sp && sc) {
333
+ entries.push({
334
+ kind: "structuralAddition",
335
+ logicalStepKey: k,
336
+ seqCurrent: sc.seq,
337
+ toolIdCurrent: sc.toolId,
338
+ currentIsFailing: isFailing(sc.status),
339
+ });
340
+ continue;
341
+ }
342
+ if (!sp || !sc)
343
+ continue;
344
+ const toolIdChanged = sp.toolId !== sc.toolId;
345
+ const fp = isFailing(sp.status);
346
+ const fc = isFailing(sc.status);
347
+ if (!fp && !fc) {
348
+ entries.push({
349
+ kind: "unchangedOk",
350
+ logicalStepKey: k,
351
+ seqPrior: sp.seq,
352
+ seqCurrent: sc.seq,
353
+ toolIdPrior: sp.toolId,
354
+ toolIdCurrent: sc.toolId,
355
+ });
356
+ continue;
357
+ }
358
+ if (!fp && fc) {
359
+ entries.push({
360
+ kind: "introducedFailure",
361
+ logicalStepKey: k,
362
+ seqPrior: sp.seq,
363
+ seqCurrent: sc.seq,
364
+ toolIdPrior: sp.toolId,
365
+ toolIdCurrent: sc.toolId,
366
+ });
367
+ continue;
368
+ }
369
+ if (fp && !fc) {
370
+ entries.push({
371
+ kind: "resolvedFailure",
372
+ logicalStepKey: k,
373
+ seqPrior: sp.seq,
374
+ seqCurrent: sc.seq,
375
+ toolIdPrior: sp.toolId,
376
+ toolIdCurrent: sc.toolId,
377
+ });
378
+ continue;
379
+ }
380
+ const mP = multisetFromCodes(codesFromReasons(sp.reasons));
381
+ const mC = multisetFromCodes(codesFromReasons(sc.reasons));
382
+ const introducedStepReasonCodes = multisetToCodes(multisetSubtract(mC, mP));
383
+ const resolvedStepReasonCodes = multisetToCodes(multisetSubtract(mP, mC));
384
+ const effectsP = getEffectRows(sp);
385
+ const effectsC = getEffectRows(sc);
386
+ const effectDeltas = [];
387
+ if (effectsP || effectsC) {
388
+ const byP = new Map((effectsP ?? []).map((e) => [e.id, e]));
389
+ const byC = new Map((effectsC ?? []).map((e) => [e.id, e]));
390
+ const ids = new Set([...byP.keys(), ...byC.keys()]);
391
+ for (const id of [...ids].sort(compareUtf16Id)) {
392
+ const ep = byP.get(id);
393
+ const ec = byC.get(id);
394
+ if (ep && !ec) {
395
+ effectDeltas.push({
396
+ effectId: id,
397
+ kind: isFailing(ep.status) ? "resolvedFailure" : "unchangedOk",
398
+ introducedReasonCodes: [],
399
+ resolvedReasonCodes: sortMultisetCodes(codesFromReasons(ep.reasons)),
400
+ statusPrior: ep.status,
401
+ statusCurrent: null,
402
+ });
403
+ continue;
404
+ }
405
+ if (!ep && ec) {
406
+ effectDeltas.push({
407
+ effectId: id,
408
+ kind: isFailing(ec.status) ? "introducedFailure" : "unchangedOk",
409
+ introducedReasonCodes: sortMultisetCodes(codesFromReasons(ec.reasons)),
410
+ resolvedReasonCodes: [],
411
+ statusPrior: null,
412
+ statusCurrent: ec.status,
413
+ });
414
+ continue;
415
+ }
416
+ if (!ep || !ec)
417
+ continue;
418
+ const mp = multisetFromCodes(codesFromReasons(ep.reasons));
419
+ const mc = multisetFromCodes(codesFromReasons(ec.reasons));
420
+ const intro = multisetToCodes(multisetSubtract(mc, mp));
421
+ const reso = multisetToCodes(multisetSubtract(mp, mc));
422
+ const fpE = isFailing(ep.status);
423
+ const fcE = isFailing(ec.status);
424
+ let kind;
425
+ if (!fpE && !fcE) {
426
+ kind = "unchangedOk";
427
+ }
428
+ else if (!fpE && fcE) {
429
+ kind = "introducedFailure";
430
+ }
431
+ else if (fpE && !fcE) {
432
+ kind = "resolvedFailure";
433
+ }
434
+ else {
435
+ kind = "bothFailing";
436
+ }
437
+ effectDeltas.push({
438
+ effectId: id,
439
+ kind,
440
+ introducedReasonCodes: intro,
441
+ resolvedReasonCodes: reso,
442
+ statusPrior: ep.status,
443
+ statusCurrent: ec.status,
444
+ });
445
+ }
446
+ }
447
+ entries.push({
448
+ kind: "bothFailing",
449
+ logicalStepKey: k,
450
+ seqPrior: sp.seq,
451
+ seqCurrent: sc.seq,
452
+ toolIdPrior: sp.toolId,
453
+ toolIdCurrent: sc.toolId,
454
+ toolIdChanged,
455
+ introducedStepReasonCodes,
456
+ resolvedStepReasonCodes,
457
+ effects: effectDeltas,
458
+ });
459
+ }
460
+ entries.sort(compareBucketAEntry);
461
+ return { entries, ambiguous };
462
+ }
463
+ function pairwiseBucketB(prior, current) {
464
+ const sigsP = prior.steps
465
+ .filter((s) => s.verificationRequest === null && isFailing(s.status))
466
+ .map((s) => recurrenceSignature(s));
467
+ const sigsC = current.steps
468
+ .filter((s) => s.verificationRequest === null && isFailing(s.status))
469
+ .map((s) => recurrenceSignature(s));
470
+ const mP = multisetFromCodes(sigsP);
471
+ const mC = multisetFromCodes(sigsC);
472
+ const introduced = multisetToCodes(multisetSubtract(mC, mP));
473
+ const resolved = multisetToCodes(multisetSubtract(mP, mC));
474
+ const introducedMap = multisetFromCodes(introduced);
475
+ const resolvedMap = multisetFromCodes(resolved);
476
+ const unchanged = [];
477
+ for (const sig of [...new Set([...mP.keys(), ...mC.keys()])].sort(compareUtf16Id)) {
478
+ const n = Math.min(mP.get(sig) ?? 0, mC.get(sig) ?? 0);
479
+ if (n > 0)
480
+ unchanged.push({ signature: sig, matchedCount: n });
481
+ }
482
+ return {
483
+ introducedFailureSignatures: multisetToPairArray(introducedMap),
484
+ resolvedFailureSignatures: multisetToPairArray(resolvedMap),
485
+ unchangedFailureInstanceCounts: unchanged,
486
+ };
487
+ }
488
+ function multisetToPairArray(m) {
489
+ return [...m.entries()]
490
+ .sort((a, b) => compareUtf16Id(a[0], b[0]))
491
+ .map(([signature, count]) => ({ signature, count }));
492
+ }
493
+ function buildRecurrence(results) {
494
+ const signatureToRuns = new Map();
495
+ const signatureToExemplars = new Map();
496
+ for (let ri = 0; ri < results.length; ri++) {
497
+ const seen = new Set();
498
+ for (const step of results[ri].steps) {
499
+ if (!isFailing(step.status))
500
+ continue;
501
+ const sig = recurrenceSignature(step);
502
+ if (seen.has(sig))
503
+ continue;
504
+ seen.add(sig);
505
+ let set = signatureToRuns.get(sig);
506
+ if (!set) {
507
+ set = new Set();
508
+ signatureToRuns.set(sig, set);
509
+ }
510
+ set.add(ri);
511
+ let ex = signatureToExemplars.get(sig);
512
+ if (!ex) {
513
+ ex = [];
514
+ signatureToExemplars.set(sig, ex);
515
+ }
516
+ if (ex.length < 3) {
517
+ ex.push({ runIndex: ri, seq: step.seq, toolId: step.toolId });
518
+ }
519
+ }
520
+ }
521
+ const patterns = [];
522
+ for (const sig of [...signatureToRuns.keys()].sort(compareUtf16Id)) {
523
+ const runs = signatureToRuns.get(sig);
524
+ if (runs.size < 2)
525
+ continue;
526
+ const runIndices = [...runs].sort((a, b) => a - b);
527
+ patterns.push({
528
+ signature: sig,
529
+ runIndices,
530
+ runsHitCount: runs.size,
531
+ exemplars: signatureToExemplars.get(sig) ?? [],
532
+ });
533
+ }
534
+ return { patterns };
535
+ }
536
+ export function buildRunComparisonReport(results, displayLabels) {
537
+ if (results.length !== displayLabels.length) {
538
+ throw new Error("buildRunComparisonReport: results and displayLabels length mismatch");
539
+ }
540
+ if (results.length < 2) {
541
+ throw new Error("buildRunComparisonReport: at least two runs required");
542
+ }
543
+ const wf = results[0].workflowId;
544
+ for (const r of results) {
545
+ if (r.workflowId !== wf) {
546
+ throw new Error("buildRunComparisonReport: workflowId mismatch");
547
+ }
548
+ }
549
+ const n = results.length;
550
+ const prior = results[n - 2];
551
+ const current = results[n - 1];
552
+ const mP = runLevelCodeMultiset(prior);
553
+ const mC = runLevelCodeMultiset(current);
554
+ const { entries: bucketA, ambiguous } = pairwiseBucketA(prior, current);
555
+ const bucketB = pairwiseBucketB(prior, current);
556
+ const perRunActionableFailures = results.map((r, i) => perRunActionableFromWorkflowResult(r, i));
557
+ const categoryHistogram = buildCategoryHistogram(perRunActionableFailures);
558
+ const actionableCategoryRecurrence = buildActionableCategoryRecurrence(perRunActionableFailures);
559
+ const recurrence = buildRecurrence(results);
560
+ const reliabilityAssessment = buildReliabilityAssessment(perRunActionableFailures, n - 2, n - 1, recurrence.patterns);
561
+ const compareHighlights = buildCompareHighlights(bucketA, bucketB, recurrence.patterns);
562
+ return {
563
+ schemaVersion: 4,
564
+ workflowId: wf,
565
+ runs: results.map((_, i) => ({
566
+ runIndex: i,
567
+ displayLabel: displayLabels[i],
568
+ })),
569
+ perRunActionableFailures,
570
+ categoryHistogram,
571
+ actionableCategoryRecurrence,
572
+ pairwise: {
573
+ priorRunIndex: n - 2,
574
+ currentRunIndex: n - 1,
575
+ runLevel: {
576
+ introducedRunLevelCodes: multisetToCodes(multisetSubtract(mC, mP)),
577
+ resolvedRunLevelCodes: multisetToCodes(multisetSubtract(mP, mC)),
578
+ },
579
+ ambiguousLogicalKeyResolutions: ambiguous.map((a) => ({
580
+ logicalStepKey: a.logicalStepKey,
581
+ chosenSeq: a.chosenSeq,
582
+ droppedSeq: a.droppedSeq,
583
+ })),
584
+ bucketA,
585
+ bucketB,
586
+ },
587
+ recurrence,
588
+ reliabilityAssessment,
589
+ compareHighlights,
590
+ };
591
+ }
592
+ export function formatRunComparisonReport(report) {
593
+ const lines = [];
594
+ lines.push(`cross_run_comparison:`);
595
+ lines.push(` workflow_id: ${report.workflowId}`);
596
+ lines.push(` runs: ${report.runs.map((r) => `${r.runIndex}=${r.displayLabel}`).join(", ")}`);
597
+ lines.push(` per_run_actionable: ${report.perRunActionableFailures.map((p) => `${p.runIndex}=${p.category}/${p.severity}/${p.recommendedAction}/${p.automationSafe}`).join(", ")}`);
598
+ lines.push(` category_histogram: ${report.categoryHistogram.map((h) => `${h.category}×${h.count}`).join("; ") || "(none)"}`);
599
+ lines.push(` actionable_category_recurrence:`);
600
+ for (const row of report.actionableCategoryRecurrence) {
601
+ lines.push(` - ${row.category} indices=${row.runIndicesAscending.join(",")} hits=${row.runsHitCount} max_streak=${row.maxConsecutiveRunStreak}`);
602
+ }
603
+ lines.push(` pairwise: prior_run_index=${report.pairwise.priorRunIndex} current_run_index=${report.pairwise.currentRunIndex}`);
604
+ const rl = report.pairwise.runLevel;
605
+ lines.push(` run_level_introduced: ${rl.introducedRunLevelCodes.length ? rl.introducedRunLevelCodes.join(", ") : "(none)"}`);
606
+ lines.push(` run_level_resolved: ${rl.resolvedRunLevelCodes.length ? rl.resolvedRunLevelCodes.join(", ") : "(none)"}`);
607
+ if (report.pairwise.ambiguousLogicalKeyResolutions.length) {
608
+ lines.push(` ambiguous_logical_keys:`);
609
+ for (const a of report.pairwise.ambiguousLogicalKeyResolutions) {
610
+ lines.push(` - key=${a.logicalStepKey} kept_seq=${a.chosenSeq} dropped_seq=${a.droppedSeq}`);
611
+ }
612
+ }
613
+ lines.push(` bucket_a:`);
614
+ for (const e of report.pairwise.bucketA) {
615
+ if (e.kind === "unchangedOk") {
616
+ lines.push(` - unchanged_ok key=${e.logicalStepKey} seq_prior=${e.seqPrior} seq_current=${e.seqCurrent} tool_prior=${e.toolIdPrior} tool_current=${e.toolIdCurrent}`);
617
+ }
618
+ else if (e.kind === "introducedFailure") {
619
+ lines.push(` - introduced_failure key=${e.logicalStepKey} seq_current=${e.seqCurrent} tool_current=${e.toolIdCurrent}`);
620
+ }
621
+ else if (e.kind === "resolvedFailure") {
622
+ lines.push(` - resolved_failure key=${e.logicalStepKey} seq_prior=${e.seqPrior} tool_prior=${e.toolIdPrior}`);
623
+ }
624
+ else if (e.kind === "structuralRemoval") {
625
+ lines.push(` - structural_removal key=${e.logicalStepKey} seq_prior=${e.seqPrior} prior_was_failing=${e.priorWasFailing}`);
626
+ }
627
+ else if (e.kind === "structuralAddition") {
628
+ lines.push(` - structural_addition key=${e.logicalStepKey} seq_current=${e.seqCurrent} current_is_failing=${e.currentIsFailing}`);
629
+ }
630
+ else if (e.kind === "bothFailing") {
631
+ lines.push(` - both_failing key=${e.logicalStepKey} seq_prior=${e.seqPrior} seq_current=${e.seqCurrent} tool_id_changed=${e.toolIdChanged} introduced_reasons=${e.introducedStepReasonCodes.join(",") || "(none)"} resolved_reasons=${e.resolvedStepReasonCodes.join(",") || "(none)"}`);
632
+ for (const ef of e.effects) {
633
+ lines.push(` effect ${ef.effectId}: ${ef.kind} intro=${ef.introducedReasonCodes.join(",") || "(none)"} resolved=${ef.resolvedReasonCodes.join(",") || "(none)"}`);
634
+ }
635
+ }
636
+ }
637
+ const b = report.pairwise.bucketB;
638
+ lines.push(` bucket_b_null_request:`);
639
+ lines.push(` introduced_signatures: ${b.introducedFailureSignatures.map((x) => `${x.signature}×${x.count}`).join("; ") || "(none)"}`);
640
+ lines.push(` resolved_signatures: ${b.resolvedFailureSignatures.map((x) => `${x.signature}×${x.count}`).join("; ") || "(none)"}`);
641
+ lines.push(` unchanged_instance_counts: ${b.unchangedFailureInstanceCounts.map((x) => `${x.signature}×${x.matchedCount}`).join("; ") || "(none)"}`);
642
+ lines.push(` recurrence_patterns:`);
643
+ if (report.recurrence.patterns.length === 0) {
644
+ lines.push(` (none)`);
645
+ }
646
+ else {
647
+ for (const p of report.recurrence.patterns) {
648
+ lines.push(` - runs=${p.runIndices.join(",")} hit_count=${p.runsHitCount}`);
649
+ lines.push(` signature: ${p.signature}`);
650
+ for (const ex of p.exemplars) {
651
+ lines.push(` exemplar: run=${ex.runIndex} seq=${ex.seq} tool=${ex.toolId}`);
652
+ }
653
+ }
654
+ }
655
+ const ra = report.reliabilityAssessment;
656
+ lines.push(` reliability_assessment:`);
657
+ lines.push(` window_trend: ${ra.windowTrend}`);
658
+ lines.push(` pairwise_trend: ${ra.pairwiseTrend}`);
659
+ lines.push(` recurrence_pattern_count: ${ra.recurrenceBurden.patternCount}`);
660
+ lines.push(` recurrence_max_runs_hit: ${ra.recurrenceBurden.maxRunsHitCount}`);
661
+ lines.push(` recurrence_cross_run_failure: ${ra.recurrenceBurden.crossRunFailure}`);
662
+ lines.push(` recurrence_rationale: ${ra.recurrenceBurden.rationale}`);
663
+ lines.push(` headline_verdict: ${ra.headlineVerdict}`);
664
+ lines.push(` headline_rationale: ${ra.headlineRationale}`);
665
+ const ch = report.compareHighlights;
666
+ lines.push(` compare_highlights:`);
667
+ lines.push(` introduced_keys: ${ch.introducedLogicalStepKeys.join("; ") || "(none)"}`);
668
+ lines.push(` resolved_keys: ${ch.resolvedLogicalStepKeys.join("; ") || "(none)"}`);
669
+ lines.push(` both_failing_churn_count: ${ch.bothFailingChurn.length}`);
670
+ lines.push(` bucket_b_introduced: ${ch.bucketBIntroducedSignatures.map((x) => `${x.signature}×${x.count}`).join("; ") || "(none)"}`);
671
+ lines.push(` bucket_b_resolved: ${ch.bucketBResolvedSignatures.map((x) => `${x.signature}×${x.count}`).join("; ") || "(none)"}`);
672
+ lines.push(` recurring_signatures: ${ch.recurringSignatures.join("; ") || "(none)"}`);
673
+ return lines.join("\n");
674
+ }
675
+ //# sourceMappingURL=runComparison.js.map