agentskeptic 1.0.4 → 1.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 (292) hide show
  1. package/README.md +18 -20
  2. package/config/marketing.json +187 -0
  3. package/dist/actionableFailure.d.ts.map +1 -1
  4. package/dist/actionableFailure.js +95 -0
  5. package/dist/actionableFailure.js.map +1 -1
  6. package/dist/assurance/assurancePathArgs.d.ts.map +1 -1
  7. package/dist/assurance/assurancePathArgs.js +1 -0
  8. package/dist/assurance/assurancePathArgs.js.map +1 -1
  9. package/dist/assurance/buildAssuranceOutput.d.ts +29 -0
  10. package/dist/assurance/buildAssuranceOutput.d.ts.map +1 -0
  11. package/dist/assurance/buildAssuranceOutput.js +53 -0
  12. package/dist/assurance/buildAssuranceOutput.js.map +1 -0
  13. package/dist/assurance/checkStale.d.ts +7 -0
  14. package/dist/assurance/checkStale.d.ts.map +1 -1
  15. package/dist/assurance/checkStale.js +14 -3
  16. package/dist/assurance/checkStale.js.map +1 -1
  17. package/dist/assurance/runAssurance.d.ts.map +1 -1
  18. package/dist/assurance/runAssurance.js +26 -3
  19. package/dist/assurance/runAssurance.js.map +1 -1
  20. package/dist/bootstrap/executeBootstrapPack.d.ts.map +1 -1
  21. package/dist/bootstrap/executeBootstrapPack.js +3 -2
  22. package/dist/bootstrap/executeBootstrapPack.js.map +1 -1
  23. package/dist/certificateDigest.d.ts +4 -0
  24. package/dist/certificateDigest.d.ts.map +1 -0
  25. package/dist/certificateDigest.js +7 -0
  26. package/dist/certificateDigest.js.map +1 -0
  27. package/dist/certificateDigest.test.d.ts +2 -0
  28. package/dist/certificateDigest.test.d.ts.map +1 -0
  29. package/dist/certificateDigest.test.js +14 -0
  30. package/dist/certificateDigest.test.js.map +1 -0
  31. package/dist/cli/lockOrchestration.d.ts.map +1 -1
  32. package/dist/cli/lockOrchestration.js +30 -5
  33. package/dist/cli/lockOrchestration.js.map +1 -1
  34. package/dist/cli/runFunnelAnonSet.js +1 -1
  35. package/dist/cli.js +121 -114
  36. package/dist/cli.js.map +1 -1
  37. package/dist/cliArgv.d.ts.map +1 -1
  38. package/dist/cliArgv.js +4 -2
  39. package/dist/cliArgv.js.map +1 -1
  40. package/dist/cliArgv.test.d.ts +2 -0
  41. package/dist/cliArgv.test.d.ts.map +1 -0
  42. package/dist/cliArgv.test.js +34 -0
  43. package/dist/cliArgv.test.js.map +1 -0
  44. package/dist/cliOperationalCodes.d.ts +7 -0
  45. package/dist/cliOperationalCodes.d.ts.map +1 -1
  46. package/dist/cliOperationalCodes.js +7 -0
  47. package/dist/cliOperationalCodes.js.map +1 -1
  48. package/dist/commercial/activationCorrelation.d.ts +3 -0
  49. package/dist/commercial/activationCorrelation.d.ts.map +1 -0
  50. package/dist/commercial/activationCorrelation.js +6 -0
  51. package/dist/commercial/activationCorrelation.js.map +1 -0
  52. package/dist/commercial/getCurrentUsage.d.ts +16 -0
  53. package/dist/commercial/getCurrentUsage.d.ts.map +1 -0
  54. package/dist/commercial/getCurrentUsage.js +33 -0
  55. package/dist/commercial/getCurrentUsage.js.map +1 -0
  56. package/dist/commercial/licensePreflight.d.ts +1 -0
  57. package/dist/commercial/licensePreflight.d.ts.map +1 -1
  58. package/dist/commercial/licensePreflight.js +27 -8
  59. package/dist/commercial/licensePreflight.js.map +1 -1
  60. package/dist/commercial/postVerifyOutcomeBeacon.d.ts +2 -0
  61. package/dist/commercial/postVerifyOutcomeBeacon.d.ts.map +1 -1
  62. package/dist/commercial/postVerifyOutcomeBeacon.js +8 -4
  63. package/dist/commercial/postVerifyOutcomeBeacon.js.map +1 -1
  64. package/dist/commercial/verifyWorkloadClassify.d.ts +2 -7
  65. package/dist/commercial/verifyWorkloadClassify.d.ts.map +1 -1
  66. package/dist/commercial/verifyWorkloadClassify.js +1 -1
  67. package/dist/commercial/verifyWorkloadClassify.js.map +1 -1
  68. package/dist/commercial/verifyWorkloadClassify.test.js +7 -0
  69. package/dist/commercial/verifyWorkloadClassify.test.js.map +1 -1
  70. package/dist/compare.acceptance.test.js +25 -0
  71. package/dist/compare.acceptance.test.js.map +1 -1
  72. package/dist/compareRunManifest.d.ts +32 -0
  73. package/dist/compareRunManifest.d.ts.map +1 -0
  74. package/dist/compareRunManifest.js +60 -0
  75. package/dist/compareRunManifest.js.map +1 -0
  76. package/dist/crossing/crossingDecisionReadyFooter.d.ts +1 -1
  77. package/dist/crossing/crossingDecisionReadyFooter.d.ts.map +1 -1
  78. package/dist/crossing/crossingDecisionReadyFooter.js +1 -1
  79. package/dist/crossing/crossingDecisionReadyFooter.js.map +1 -1
  80. package/dist/debug-ui/app.css +42 -0
  81. package/dist/debug-ui/app.js +206 -15
  82. package/dist/debug-ui/index.html +11 -4
  83. package/dist/debug-ui/urlState.d.ts +15 -0
  84. package/dist/debug-ui/urlState.js +92 -0
  85. package/dist/debugCorpus.test.js +33 -7
  86. package/dist/debugCorpus.test.js.map +1 -1
  87. package/dist/debugPanels.d.ts +0 -3
  88. package/dist/debugPanels.d.ts.map +1 -1
  89. package/dist/debugPanels.js +0 -23
  90. package/dist/debugPanels.js.map +1 -1
  91. package/dist/debugPanels.test.js +16 -15
  92. package/dist/debugPanels.test.js.map +1 -1
  93. package/dist/debugServer.d.ts.map +1 -1
  94. package/dist/debugServer.js +19 -16
  95. package/dist/debugServer.js.map +1 -1
  96. package/dist/debugServer.test.js +18 -9
  97. package/dist/debugServer.test.js.map +1 -1
  98. package/dist/debugUiUrlState.test.d.ts +2 -0
  99. package/dist/debugUiUrlState.test.d.ts.map +1 -0
  100. package/dist/debugUiUrlState.test.js +49 -0
  101. package/dist/debugUiUrlState.test.js.map +1 -0
  102. package/dist/decisionGate.d.ts.map +1 -1
  103. package/dist/decisionGate.js +2 -5
  104. package/dist/decisionGate.js.map +1 -1
  105. package/dist/discovery-payload-v1.json +23 -27
  106. package/dist/enforceCli.d.ts.map +1 -1
  107. package/dist/enforceCli.js +15 -40
  108. package/dist/enforceCli.js.map +1 -1
  109. package/dist/enforceStateful.d.ts +2 -0
  110. package/dist/enforceStateful.d.ts.map +1 -0
  111. package/dist/enforceStateful.js +106 -0
  112. package/dist/enforceStateful.js.map +1 -0
  113. package/dist/enforcementProjection.d.ts +17 -0
  114. package/dist/enforcementProjection.d.ts.map +1 -0
  115. package/dist/enforcementProjection.js +20 -0
  116. package/dist/enforcementProjection.js.map +1 -0
  117. package/dist/executionTrace.test.js +35 -0
  118. package/dist/executionTrace.test.js.map +1 -1
  119. package/dist/executionTraceDiff.d.ts +36 -0
  120. package/dist/executionTraceDiff.d.ts.map +1 -0
  121. package/dist/executionTraceDiff.js +86 -0
  122. package/dist/executionTraceDiff.js.map +1 -0
  123. package/dist/executionTraceDiff.test.d.ts +2 -0
  124. package/dist/executionTraceDiff.test.d.ts.map +1 -0
  125. package/dist/executionTraceDiff.test.js +44 -0
  126. package/dist/executionTraceDiff.test.js.map +1 -0
  127. package/dist/failureOriginCatalog.d.ts.map +1 -1
  128. package/dist/failureOriginCatalog.js +19 -0
  129. package/dist/failureOriginCatalog.js.map +1 -1
  130. package/dist/firstFiveMinutesChecklist.d.ts +11 -0
  131. package/dist/firstFiveMinutesChecklist.d.ts.map +1 -0
  132. package/dist/firstFiveMinutesChecklist.js +18 -0
  133. package/dist/firstFiveMinutesChecklist.js.map +1 -0
  134. package/dist/funnel/workflowLineageClassify.d.ts +1 -1
  135. package/dist/funnel/workflowLineageClassify.js +1 -1
  136. package/dist/index.d.ts +5 -2
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +4 -2
  139. package/dist/index.js.map +1 -1
  140. package/dist/langGraphCheckpointTrustGate.d.ts.map +1 -1
  141. package/dist/langGraphCheckpointTrustGate.js +2 -5
  142. package/dist/langGraphCheckpointTrustGate.js.map +1 -1
  143. package/dist/operationalDisposition.d.ts +56 -0
  144. package/dist/operationalDisposition.d.ts.map +1 -1
  145. package/dist/operationalDisposition.js +56 -0
  146. package/dist/operationalDisposition.js.map +1 -1
  147. package/dist/pipeline.d.ts +1 -0
  148. package/dist/pipeline.d.ts.map +1 -1
  149. package/dist/pipeline.js +18 -18
  150. package/dist/pipeline.js.map +1 -1
  151. package/dist/publicDistribution.generated.d.ts +2 -2
  152. package/dist/publicDistribution.generated.d.ts.map +1 -1
  153. package/dist/publicDistribution.generated.js +7 -8
  154. package/dist/publicDistribution.generated.js.map +1 -1
  155. package/dist/quickVerify/quickVerifyScope.d.ts +1 -1
  156. package/dist/quickVerify/quickVerifyScope.js +1 -1
  157. package/dist/quickVerify/runQuickVerify.js +1 -1
  158. package/dist/quickVerify/runQuickVerify.js.map +1 -1
  159. package/dist/quickVerify/verifyExecution.d.ts +1 -1
  160. package/dist/quickVerify/verifyExecution.d.ts.map +1 -1
  161. package/dist/quickVerify/verifyExecution.js +3 -2
  162. package/dist/quickVerify/verifyExecution.js.map +1 -1
  163. package/dist/reconciler.d.ts +6 -2
  164. package/dist/reconciler.d.ts.map +1 -1
  165. package/dist/reconciler.js +17 -11
  166. package/dist/reconciler.js.map +1 -1
  167. package/dist/registryDraft/createRegistryDraftAjv.d.ts +1 -1
  168. package/dist/registryDraft/createRegistryDraftAjv.js +1 -1
  169. package/dist/regressionArtifact.d.ts +63 -0
  170. package/dist/regressionArtifact.d.ts.map +1 -0
  171. package/dist/regressionArtifact.js +290 -0
  172. package/dist/regressionArtifact.js.map +1 -0
  173. package/dist/relationalInvariant.d.ts +13 -3
  174. package/dist/relationalInvariant.d.ts.map +1 -1
  175. package/dist/relationalInvariant.existsSql.test.js +1 -1
  176. package/dist/relationalInvariant.existsSql.test.js.map +1 -1
  177. package/dist/relationalInvariant.js +59 -39
  178. package/dist/relationalInvariant.js.map +1 -1
  179. package/dist/relationalInvariant.test.js +2 -2
  180. package/dist/relationalInvariant.test.js.map +1 -1
  181. package/dist/resolveExpectation.d.ts +18 -2
  182. package/dist/resolveExpectation.d.ts.map +1 -1
  183. package/dist/resolveExpectation.js +332 -1
  184. package/dist/resolveExpectation.js.map +1 -1
  185. package/dist/resolveExpectation.test.js +25 -0
  186. package/dist/resolveExpectation.test.js.map +1 -1
  187. package/dist/runComparison.d.ts +0 -1
  188. package/dist/runComparison.d.ts.map +1 -1
  189. package/dist/runComparison.js +18 -86
  190. package/dist/runComparison.js.map +1 -1
  191. package/dist/runComparison.test.js +101 -57
  192. package/dist/runComparison.test.js.map +1 -1
  193. package/dist/schema-validation.test.js +29 -0
  194. package/dist/schema-validation.test.js.map +1 -1
  195. package/dist/schemaLoad.d.ts +1 -1
  196. package/dist/schemaLoad.d.ts.map +1 -1
  197. package/dist/schemaLoad.js +10 -0
  198. package/dist/schemaLoad.js.map +1 -1
  199. package/dist/sortedJsonStringify.d.ts +2 -0
  200. package/dist/sortedJsonStringify.d.ts.map +1 -0
  201. package/dist/sortedJsonStringify.js +23 -0
  202. package/dist/sortedJsonStringify.js.map +1 -0
  203. package/dist/sqlDialect.d.ts +8 -0
  204. package/dist/sqlDialect.d.ts.map +1 -0
  205. package/dist/sqlDialect.js +37 -0
  206. package/dist/sqlDialect.js.map +1 -0
  207. package/dist/standardVerifyWorkflowCli.d.ts.map +1 -1
  208. package/dist/standardVerifyWorkflowCli.js +3 -2
  209. package/dist/standardVerifyWorkflowCli.js.map +1 -1
  210. package/dist/stateWitness.d.ts +4 -0
  211. package/dist/stateWitness.d.ts.map +1 -0
  212. package/dist/stateWitness.js +383 -0
  213. package/dist/stateWitness.js.map +1 -0
  214. package/dist/stateWitness.test.d.ts +2 -0
  215. package/dist/stateWitness.test.d.ts.map +1 -0
  216. package/dist/stateWitness.test.js +120 -0
  217. package/dist/stateWitness.test.js.map +1 -0
  218. package/dist/telemetry/maybeEmitOssClaimTicketUrl.d.ts +2 -0
  219. package/dist/telemetry/maybeEmitOssClaimTicketUrl.d.ts.map +1 -1
  220. package/dist/telemetry/maybeEmitOssClaimTicketUrl.js +13 -2
  221. package/dist/telemetry/maybeEmitOssClaimTicketUrl.js.map +1 -1
  222. package/dist/telemetry/ossClaimOrigin.d.ts +1 -1
  223. package/dist/telemetry/ossClaimOrigin.js +1 -1
  224. package/dist/telemetry/postOssClaimContinuation.d.ts +1 -1
  225. package/dist/telemetry/postOssClaimContinuation.d.ts.map +1 -1
  226. package/dist/telemetry/postOssClaimContinuation.js +10 -6
  227. package/dist/telemetry/postOssClaimContinuation.js.map +1 -1
  228. package/dist/telemetry/postOssClaimTicket.d.ts +8 -0
  229. package/dist/telemetry/postOssClaimTicket.d.ts.map +1 -1
  230. package/dist/telemetry/postOssClaimTicket.js +31 -5
  231. package/dist/telemetry/postOssClaimTicket.js.map +1 -1
  232. package/dist/telemetry/verificationHypothesisContract.d.ts +1 -1
  233. package/dist/telemetry/verificationHypothesisContract.js +1 -1
  234. package/dist/types.d.ts +115 -3
  235. package/dist/types.d.ts.map +1 -1
  236. package/dist/types.js.map +1 -1
  237. package/dist/verificationConnections.d.ts +10 -0
  238. package/dist/verificationConnections.d.ts.map +1 -0
  239. package/dist/verificationConnections.js +190 -0
  240. package/dist/verificationConnections.js.map +1 -0
  241. package/dist/verificationDatabaseUrl.d.ts +11 -0
  242. package/dist/verificationDatabaseUrl.d.ts.map +1 -0
  243. package/dist/verificationDatabaseUrl.js +41 -0
  244. package/dist/verificationDatabaseUrl.js.map +1 -0
  245. package/dist/verificationDatabaseUrl.test.d.ts +2 -0
  246. package/dist/verificationDatabaseUrl.test.d.ts.map +1 -0
  247. package/dist/verificationDatabaseUrl.test.js +66 -0
  248. package/dist/verificationDatabaseUrl.test.js.map +1 -0
  249. package/dist/verificationDiagnostics.d.ts.map +1 -1
  250. package/dist/verificationDiagnostics.js +33 -9
  251. package/dist/verificationDiagnostics.js.map +1 -1
  252. package/dist/verificationDiagnostics.test.js +15 -0
  253. package/dist/verificationDiagnostics.test.js.map +1 -1
  254. package/dist/verificationPolicy.d.ts +2 -1
  255. package/dist/verificationPolicy.d.ts.map +1 -1
  256. package/dist/verificationPolicy.js +97 -0
  257. package/dist/verificationPolicy.js.map +1 -1
  258. package/dist/verificationPolicy.test.js +7 -0
  259. package/dist/verificationPolicy.test.js.map +1 -1
  260. package/dist/verificationUserPhrases.d.ts.map +1 -1
  261. package/dist/verificationUserPhrases.js +21 -0
  262. package/dist/verificationUserPhrases.js.map +1 -1
  263. package/dist/verify/batchVerifyTelemetrySubcommand.d.ts.map +1 -1
  264. package/dist/verify/batchVerifyTelemetrySubcommand.js +8 -1
  265. package/dist/verify/batchVerifyTelemetrySubcommand.js.map +1 -1
  266. package/dist/vitestMonorepoRoot.d.ts +10 -0
  267. package/dist/vitestMonorepoRoot.d.ts.map +1 -0
  268. package/dist/vitestMonorepoRoot.js +97 -0
  269. package/dist/vitestMonorepoRoot.js.map +1 -0
  270. package/dist/wireReasonCodes.d.ts +21 -0
  271. package/dist/wireReasonCodes.d.ts.map +1 -1
  272. package/dist/wireReasonCodes.js +21 -0
  273. package/dist/wireReasonCodes.js.map +1 -1
  274. package/package.json +61 -40
  275. package/schemas/assurance-output-v1.schema.json +81 -0
  276. package/schemas/compare-run-manifest-v1.schema.json +65 -0
  277. package/schemas/conformance-normalized-result.schema.json +73 -0
  278. package/schemas/connector-capabilities.schema.json +38 -0
  279. package/schemas/execution-trace-view.schema.json +1 -1
  280. package/schemas/openapi-commercial-v1.in.yaml +613 -14
  281. package/schemas/openapi-commercial-v1.yaml +613 -14
  282. package/schemas/quick-verify-report.schema.json +1 -1
  283. package/schemas/regression-artifact-v1.schema.json +212 -0
  284. package/schemas/tools-registry.schema.json +103 -0
  285. package/schemas/workflow-engine-result.schema.json +69 -1
  286. package/schemas/workflow-truth-report.schema.json +12 -0
  287. package/scripts/discovery-acquisition.lib.cjs +6 -17
  288. package/scripts/discovery-payload.lib.cjs +5 -3
  289. package/scripts/emit-primary-marketing.cjs +326 -0
  290. package/scripts/origin.cjs +52 -0
  291. package/scripts/public-product-anchors.cjs +3 -0
  292. package/scripts/validate-marketing.cjs +156 -0
@@ -0,0 +1,63 @@
1
+ import type { CompareRunManifestV1, CertificateProfileV1, OutcomeCertificateRunKindForCompare } from "./compareRunManifest.js";
2
+ import { buildTracePairwisePayload } from "./executionTraceDiff.js";
3
+ import { type OutcomeCertificateV1 } from "./outcomeCertificate.js";
4
+ import { type ReliabilityTrend, type RunComparisonReport } from "./runComparison.js";
5
+ import type { WorkflowResult } from "./types.js";
6
+ export type RegressionArtifactV1 = {
7
+ schemaVersion: 1;
8
+ artifactSource: "cli_manifest" | "debug_corpus";
9
+ manifestSha256: string;
10
+ workflowId: string;
11
+ certificateProfile: CertificateProfileV1;
12
+ verification: RunComparisonReport;
13
+ outcomeCertificates: Array<{
14
+ runIndex: number;
15
+ displayLabel: string;
16
+ outcomeCertificateRunKind: OutcomeCertificateRunKindForCompare;
17
+ certificateCanonicalDigest: string;
18
+ certificate: OutcomeCertificateV1;
19
+ }>;
20
+ tracePairwise: ReturnType<typeof buildTracePairwisePayload>;
21
+ narrative: {
22
+ classification: ReliabilityTrend;
23
+ whyItMatters: string;
24
+ headline: string;
25
+ structural: {
26
+ introducedLogicalStepKeysCount: number;
27
+ resolvedLogicalStepKeysCount: number;
28
+ recurringSignatureCount: number;
29
+ };
30
+ traceSummary: {
31
+ seqTimelineOrderDiverged: boolean;
32
+ onlyInPriorSeqCount: number;
33
+ onlyInCurrentSeqCount: number;
34
+ inBothCount: number;
35
+ nonToolCountsDiverged: boolean;
36
+ };
37
+ };
38
+ humanText: string;
39
+ narrativeHtml: string;
40
+ };
41
+ export declare function buildRegressionArtifactFromInputs(options: {
42
+ artifactSource: "cli_manifest" | "debug_corpus";
43
+ manifestSha256: string;
44
+ certificateProfile: CertificateProfileV1;
45
+ results: WorkflowResult[];
46
+ displayLabels: string[];
47
+ /** NDJSON event paths, same order as results */
48
+ eventPaths: string[];
49
+ }): RegressionArtifactV1;
50
+ export declare function stringifyRegressionArtifact(artifact: RegressionArtifactV1): string;
51
+ export declare function buildRegressionArtifactFromCompareManifest(manifestPath: string): {
52
+ artifact: RegressionArtifactV1;
53
+ manifest: CompareRunManifestV1;
54
+ manifestFileAbs: string;
55
+ };
56
+ /** Debug / corpus: `manifestSha256` = 64x `0` per normative contract. */
57
+ export declare const DEBUG_MANIFEST_SHA256_PLACEHOLDER: string;
58
+ export declare function buildRegressionArtifactFromDebugCorpus(options: {
59
+ results: WorkflowResult[];
60
+ runIds: string[];
61
+ eventPaths: string[];
62
+ }): RegressionArtifactV1;
63
+ //# sourceMappingURL=regressionArtifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regressionArtifact.d.ts","sourceRoot":"","sources":["../src/regressionArtifact.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,mCAAmC,EAAE,MAAM,yBAAyB,CAAC;AAG/H,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAA4B,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAM/G,OAAO,KAAK,EAAwB,cAAc,EAAE,MAAM,YAAY,CAAC;AAUvE,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,CAAC,CAAC;IACjB,cAAc,EAAE,cAAc,GAAG,cAAc,CAAC;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,oBAAoB,CAAC;IACzC,YAAY,EAAE,mBAAmB,CAAC;IAClC,mBAAmB,EAAE,KAAK,CAAC;QACzB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,yBAAyB,EAAE,mCAAmC,CAAC;QAC/D,0BAA0B,EAAE,MAAM,CAAC;QACnC,WAAW,EAAE,oBAAoB,CAAC;KACnC,CAAC,CAAC;IACH,aAAa,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IAC5D,SAAS,EAAE;QACT,cAAc,EAAE,gBAAgB,CAAC;QACjC,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE;YACV,8BAA8B,EAAE,MAAM,CAAC;YACvC,4BAA4B,EAAE,MAAM,CAAC;YACrC,uBAAuB,EAAE,MAAM,CAAC;SACjC,CAAC;QACF,YAAY,EAAE;YACZ,wBAAwB,EAAE,OAAO,CAAC;YAClC,mBAAmB,EAAE,MAAM,CAAC;YAC5B,qBAAqB,EAAE,MAAM,CAAC;YAC9B,WAAW,EAAE,MAAM,CAAC;YACpB,qBAAqB,EAAE,OAAO,CAAC;SAChC,CAAC;KACH,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AA8EF,wBAAgB,iCAAiC,CAAC,OAAO,EAAE;IACzD,cAAc,EAAE,cAAc,GAAG,cAAc,CAAC;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,oBAAoB,CAAC;IACzC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gDAAgD;IAChD,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,GAAG,oBAAoB,CAyHvB;AA6BD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAElF;AAMD,wBAAgB,0CAA0C,CACxD,YAAY,EAAE,MAAM,GACnB;IAAE,QAAQ,EAAE,oBAAoB,CAAC;IAAC,QAAQ,EAAE,oBAAoB,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAgE7F;AAED,yEAAyE;AACzE,eAAO,MAAM,iCAAiC,QAAiB,CAAC;AAEhE,wBAAgB,sCAAsC,CACpD,OAAO,EAAE;IACP,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,GACA,oBAAoB,CAYtB"}
@@ -0,0 +1,290 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { loadCompareRunManifest } from "./compareRunManifest.js";
5
+ import { certificateCanonicalDigestHex } from "./certificateDigest.js";
6
+ import { buildTracePairwisePayload } from "./executionTraceDiff.js";
7
+ import { buildExecutionTraceView } from "./executionTrace.js";
8
+ import { buildOutcomeCertificateFromWorkflowResult, buildOutcomeCertificateLangGraphCheckpointTrustFromWorkflowResult, } from "./outcomeCertificate.js";
9
+ import { buildRunComparisonReport } from "./runComparison.js";
10
+ import { loadEventsForWorkflow } from "./loadEvents.js";
11
+ import { loadSchemaValidator } from "./schemaLoad.js";
12
+ import { stringifyWithSortedKeys } from "./sortedJsonStringify.js";
13
+ import { CLI_OPERATIONAL_CODES } from "./cliOperationalCodes.js";
14
+ import { TruthLayerError } from "./truthLayerError.js";
15
+ import { normalizeToEmittedWorkflowResult } from "./workflowResultNormalize.js";
16
+ import { isV9RunLevelCodesInconsistent } from "./workflowRunLevelConsistency.js";
17
+ import { COMPARE_INPUT_RUN_LEVEL_INCONSISTENT_MESSAGE } from "./runLevelDriftMessages.js";
18
+ const DEBUG_CORPUS_PROFILE = {
19
+ mode: "uniform",
20
+ outcomeCertificateRunKind: "contract_sql",
21
+ };
22
+ function escapeHtml(s) {
23
+ return String(s)
24
+ .replace(/&/g, "&amp;")
25
+ .replace(/</g, "&lt;")
26
+ .replace(/>/g, "&gt;")
27
+ .replace(/"/g, "&quot;");
28
+ }
29
+ function getRunKindForIndex(profile, runIndex) {
30
+ if (profile.mode === "uniform") {
31
+ return profile.outcomeCertificateRunKind;
32
+ }
33
+ const ent = profile.entries.find((e) => e.runIndex === runIndex);
34
+ if (!ent) {
35
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.INTERNAL_ERROR, `regression: missing certificateProfile entry for runIndex ${runIndex}`);
36
+ }
37
+ return ent.outcomeCertificateRunKind;
38
+ }
39
+ function buildCertificateFor(r, kind) {
40
+ try {
41
+ if (kind === "contract_sql") {
42
+ return buildOutcomeCertificateFromWorkflowResult(r, "contract_sql");
43
+ }
44
+ return buildOutcomeCertificateLangGraphCheckpointTrustFromWorkflowResult(r);
45
+ }
46
+ catch (e) {
47
+ const msg = e instanceof Error ? e.message : String(e);
48
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.COMPARE_CERTIFICATE_BUILD_FAILED, msg);
49
+ }
50
+ }
51
+ function buildWhyItMatters(ra, traceSummary, structural) {
52
+ const { windowTrend, pairwiseTrend, headlineVerdict } = ra;
53
+ const introducedN = structural.introducedLogicalStepKeysCount;
54
+ const { seqTimelineOrderDiverged, nonToolCountsDiverged } = traceSummary;
55
+ if (headlineVerdict === "worsening") {
56
+ let s = `Overall reliability worsened over the run window: window=${windowTrend}, pairwise hop=${pairwiseTrend}.`;
57
+ if (introducedN > 0)
58
+ s += " There are introduced verification failures.";
59
+ if (nonToolCountsDiverged)
60
+ s += " Control-path event counts differ between runs.";
61
+ if (seqTimelineOrderDiverged)
62
+ s += " Tool step order changed between runs.";
63
+ return s;
64
+ }
65
+ if (headlineVerdict === "improving") {
66
+ let s = `Overall reliability improved over the run window: window=${windowTrend}, pairwise hop=${pairwiseTrend}.`;
67
+ if (introducedN > 0)
68
+ s += " There are introduced verification failures.";
69
+ if (nonToolCountsDiverged)
70
+ s += " Control-path event counts differ between runs.";
71
+ if (seqTimelineOrderDiverged)
72
+ s += " Tool step order changed between runs.";
73
+ return s;
74
+ }
75
+ if (headlineVerdict === "unchanged") {
76
+ let s = `No headline shift in the reliability assessment: window=${windowTrend}, pairwise=${pairwiseTrend}.`;
77
+ if (introducedN > 0)
78
+ s += " There are introduced verification failures.";
79
+ if (nonToolCountsDiverged)
80
+ s += " Control-path event counts differ between runs.";
81
+ if (seqTimelineOrderDiverged)
82
+ s += " Tool step order changed between runs.";
83
+ return s;
84
+ }
85
+ return `Mixed signal: window=${windowTrend}, pairwise=${pairwiseTrend}; see headline rationale in narrative.headline.`;
86
+ }
87
+ function nonToolCountsDiverged(a, b) {
88
+ return stringifyWithSortedKeys(a) !== stringifyWithSortedKeys(b);
89
+ }
90
+ export function buildRegressionArtifactFromInputs(options) {
91
+ const { artifactSource, manifestSha256, certificateProfile, results, displayLabels, eventPaths } = options;
92
+ if (results.length !== displayLabels.length || results.length !== eventPaths.length) {
93
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.INTERNAL_ERROR, "regression: results, displayLabels, eventPaths length mismatch");
94
+ }
95
+ if (displayLabels.length < 2) {
96
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.COMPARE_INSUFFICIENT_RUNS, "At least two runs required for compare");
97
+ }
98
+ if (artifactSource === "debug_corpus" && JSON.stringify(certificateProfile) !== JSON.stringify(DEBUG_CORPUS_PROFILE)) {
99
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.INTERNAL_ERROR, "regression: debug_corpus must use contract_sql uniform profile");
100
+ }
101
+ const verification = buildRunComparisonReport(results, displayLabels);
102
+ const ra = verification.reliabilityAssessment;
103
+ const ch = verification.compareHighlights;
104
+ const priorIdx = verification.pairwise.priorRunIndex;
105
+ const currentIdx = verification.pairwise.currentRunIndex;
106
+ const outcomeCertificates = results.map((r, i) => {
107
+ const k = getRunKindForIndex(certificateProfile, i);
108
+ const cert = buildCertificateFor(r, k);
109
+ return {
110
+ runIndex: i,
111
+ displayLabel: displayLabels[i],
112
+ outcomeCertificateRunKind: k,
113
+ certificateCanonicalDigest: certificateCanonicalDigestHex(cert),
114
+ certificate: cert,
115
+ };
116
+ });
117
+ let priorLoad;
118
+ let currentLoad;
119
+ try {
120
+ priorLoad = loadEventsForWorkflow(eventPaths[priorIdx], results[priorIdx].workflowId);
121
+ currentLoad = loadEventsForWorkflow(eventPaths[currentIdx], results[currentIdx].workflowId);
122
+ }
123
+ catch (e) {
124
+ const msg = e instanceof Error ? e.message : String(e);
125
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.COMPARE_EVENTS_LOAD_FAILED, msg);
126
+ }
127
+ const priorView = buildExecutionTraceView({
128
+ workflowId: results[priorIdx].workflowId,
129
+ runEvents: priorLoad.runEvents,
130
+ malformedEventLineCount: priorLoad.malformedEventLineCount,
131
+ workflowResult: results[priorIdx],
132
+ });
133
+ const currentView = buildExecutionTraceView({
134
+ workflowId: results[currentIdx].workflowId,
135
+ runEvents: currentLoad.runEvents,
136
+ malformedEventLineCount: currentLoad.malformedEventLineCount,
137
+ workflowResult: results[currentIdx],
138
+ });
139
+ const traceDiff = buildTracePairwisePayload({
140
+ priorView,
141
+ currentView,
142
+ priorRunIndex: priorIdx,
143
+ currentRunIndex: currentIdx,
144
+ });
145
+ const ntd = nonToolCountsDiverged(traceDiff.nonToolEventCounts.prior, traceDiff.nonToolEventCounts.current);
146
+ const onlyInPrior = traceDiff.bySeq.filter((r) => r.class === "only_in_prior").length;
147
+ const onlyInCurrent = traceDiff.bySeq.filter((r) => r.class === "only_in_current").length;
148
+ const inBoth = traceDiff.bySeq.filter((r) => r.class === "in_both").length;
149
+ const structural = {
150
+ introducedLogicalStepKeysCount: ch.introducedLogicalStepKeys.length,
151
+ resolvedLogicalStepKeysCount: ch.resolvedLogicalStepKeys.length,
152
+ recurringSignatureCount: verification.recurrence.patterns.length,
153
+ };
154
+ const traceSummary = {
155
+ seqTimelineOrderDiverged: traceDiff.seqTimelineOrderDiverged,
156
+ onlyInPriorSeqCount: onlyInPrior,
157
+ onlyInCurrentSeqCount: onlyInCurrent,
158
+ inBothCount: inBoth,
159
+ nonToolCountsDiverged: ntd,
160
+ };
161
+ const whyItMatters = buildWhyItMatters(ra, traceSummary, structural);
162
+ const narrative = {
163
+ classification: ra.headlineVerdict,
164
+ whyItMatters,
165
+ headline: ra.headlineRationale,
166
+ structural,
167
+ traceSummary,
168
+ };
169
+ const tracePairwise = traceDiff;
170
+ const workflowId = verification.workflowId;
171
+ const artifact = {
172
+ schemaVersion: 1,
173
+ artifactSource,
174
+ manifestSha256,
175
+ workflowId,
176
+ certificateProfile,
177
+ verification,
178
+ outcomeCertificates,
179
+ tracePairwise,
180
+ narrative,
181
+ humanText: "",
182
+ narrativeHtml: "",
183
+ };
184
+ artifact.humanText = buildRegressionArtifactHumanText(artifact);
185
+ artifact.narrativeHtml = buildRegressionArtifactNarrativeHtml(artifact);
186
+ const validate = loadSchemaValidator("regression-artifact-v1");
187
+ if (!validate(artifact)) {
188
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.COMPARE_REGRESSION_ARTIFACT_INVALID, JSON.stringify(validate.errors ?? []));
189
+ }
190
+ return artifact;
191
+ }
192
+ function buildRegressionArtifactHumanText(a) {
193
+ const lines = [];
194
+ lines.push(`regression_artifact: workflowId=${a.workflowId} classification=${a.narrative.classification}`);
195
+ lines.push(`headline: ${a.narrative.headline}`);
196
+ lines.push(`why_it_matters: ${a.narrative.whyItMatters}`);
197
+ lines.push("outcome_certificates:");
198
+ for (const c of a.outcomeCertificates) {
199
+ lines.push(` run ${c.runIndex} label=${c.displayLabel} kind=${c.outcomeCertificateRunKind} digest=${c.certificateCanonicalDigest} state=${c.certificate.stateRelation}`);
200
+ }
201
+ lines.push("trace_pairwise: priorRunIndex=" + String(a.tracePairwise.priorRunIndex) + " currentRunIndex=" + String(a.tracePairwise.currentRunIndex));
202
+ lines.push("verification: embedded in JSON field `verification` (RunComparisonReport v4).");
203
+ return lines.join("\n");
204
+ }
205
+ function buildRegressionArtifactNarrativeHtml(a) {
206
+ const ra = a.narrative;
207
+ return [
208
+ `<section data-etl-section="regression-artifact">`,
209
+ `<h2 data-etl-regression-classification>Classification: ${escapeHtml(ra.classification)}</h2>`,
210
+ `<p data-etl-regression-headline>${escapeHtml(ra.headline)}</p>`,
211
+ `<p data-etl-why-matters>${escapeHtml(ra.whyItMatters)}</p>`,
212
+ `</section>`,
213
+ ].join("");
214
+ }
215
+ export function stringifyRegressionArtifact(artifact) {
216
+ return stringifyWithSortedKeys(artifact);
217
+ }
218
+ function sha256FileHex(absPath) {
219
+ return createHash("sha256").update(readFileSync(absPath)).digest("hex");
220
+ }
221
+ export function buildRegressionArtifactFromCompareManifest(manifestPath) {
222
+ const { manifest, baseDirAbs, manifestFileAbs } = loadCompareRunManifest(manifestPath);
223
+ const validateCompareInput = loadSchemaValidator("workflow-result-compare-input");
224
+ const results = [];
225
+ const eventPaths = [];
226
+ for (const run of manifest.runs) {
227
+ const wrAbs = path.resolve(baseDirAbs, run.workflowResult);
228
+ const evAbs = path.resolve(baseDirAbs, run.events);
229
+ if (!existsSync(wrAbs) || !existsSync(evAbs)) {
230
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.COMPARE_RESOLVE_PATH_FAILED, `Missing file: ${!existsSync(wrAbs) ? wrAbs : evAbs}`);
231
+ }
232
+ const raw = readFileSync(wrAbs, "utf8");
233
+ let parsed;
234
+ try {
235
+ parsed = JSON.parse(raw);
236
+ }
237
+ catch (e) {
238
+ const m = e instanceof Error ? e.message : String(e);
239
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.COMPARE_INPUT_JSON_SYNTAX, m);
240
+ }
241
+ if (isV9RunLevelCodesInconsistent(parsed)) {
242
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.COMPARE_INPUT_RUN_LEVEL_INCONSISTENT, COMPARE_INPUT_RUN_LEVEL_INCONSISTENT_MESSAGE);
243
+ }
244
+ if (!validateCompareInput(parsed)) {
245
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.COMPARE_INPUT_SCHEMA_INVALID, JSON.stringify(validateCompareInput.errors ?? []));
246
+ }
247
+ try {
248
+ results.push(normalizeToEmittedWorkflowResult(parsed));
249
+ }
250
+ catch (e) {
251
+ if (e instanceof TruthLayerError)
252
+ throw e;
253
+ const msg = e instanceof Error ? e.message : String(e);
254
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.INTERNAL_ERROR, msg);
255
+ }
256
+ eventPaths.push(evAbs);
257
+ }
258
+ const wf0 = results[0].workflowId;
259
+ for (const r of results) {
260
+ if (r.workflowId !== wf0) {
261
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.COMPARE_WORKFLOW_ID_MISMATCH, "All WorkflowResult inputs must share the same workflowId.");
262
+ }
263
+ }
264
+ const dig = sha256FileHex(manifestFileAbs);
265
+ const artifact = buildRegressionArtifactFromInputs({
266
+ artifactSource: "cli_manifest",
267
+ manifestSha256: dig,
268
+ certificateProfile: manifest.certificateProfile,
269
+ results,
270
+ displayLabels: manifest.runs.map((r) => r.displayLabel),
271
+ eventPaths,
272
+ });
273
+ return { artifact, manifest, manifestFileAbs };
274
+ }
275
+ /** Debug / corpus: `manifestSha256` = 64x `0` per normative contract. */
276
+ export const DEBUG_MANIFEST_SHA256_PLACEHOLDER = "0".repeat(64);
277
+ export function buildRegressionArtifactFromDebugCorpus(options) {
278
+ if (options.results.length !== options.runIds.length || options.results.length !== options.eventPaths.length) {
279
+ throw new TruthLayerError(CLI_OPERATIONAL_CODES.INTERNAL_ERROR, "regression: debug length mismatch");
280
+ }
281
+ return buildRegressionArtifactFromInputs({
282
+ artifactSource: "debug_corpus",
283
+ manifestSha256: DEBUG_MANIFEST_SHA256_PLACEHOLDER,
284
+ certificateProfile: DEBUG_CORPUS_PROFILE,
285
+ results: options.results,
286
+ displayLabels: options.runIds,
287
+ eventPaths: options.eventPaths,
288
+ });
289
+ }
290
+ //# sourceMappingURL=regressionArtifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regressionArtifact.js","sourceRoot":"","sources":["../src/regressionArtifact.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,19 @@
1
1
  import type { DatabaseSync } from "node:sqlite";
2
+ import type { Pool as Mysql2Pool } from "mysql2/promise";
3
+ import sql from "mssql";
2
4
  import type { ResolvedRelationalCheck } from "./types.js";
3
5
  import type { ReconcileOutput } from "./reconciler.js";
6
+ import { type RelationalSqlDialect } from "./sqlDialect.js";
4
7
  /** Exported for tests: EXISTS SQL shape for `related_exists` (single-column match). */
5
- export declare function buildRelatedExistsSql(dialect: "sqlite" | "postgres", childTable: string, fkColumn: string): {
8
+ export declare function buildRelatedExistsSql(dialect: RelationalSqlDialect, childTable: string, fkColumn: string): {
6
9
  text: string;
7
10
  };
8
- export declare function buildRelationalScalarSql(dialect: "sqlite" | "postgres", check: ResolvedRelationalCheck): {
11
+ export declare function buildRelationalScalarSql(dialect: RelationalSqlDialect, check: ResolvedRelationalCheck): {
9
12
  text: string;
10
13
  values: string[];
11
14
  };
12
15
  /** Sample SELECT for anti_join failures (anchor columns only). */
13
- export declare function buildAntiJoinSampleSql(dialect: "sqlite" | "postgres", check: ResolvedRelationalCheck & {
16
+ export declare function buildAntiJoinSampleSql(dialect: RelationalSqlDialect, check: ResolvedRelationalCheck & {
14
17
  checkKind: "anti_join";
15
18
  }): {
16
19
  text: string;
@@ -18,11 +21,18 @@ export declare function buildAntiJoinSampleSql(dialect: "sqlite" | "postgres", c
18
21
  };
19
22
  export declare function reconcileRelationalRow(row: Record<string, unknown> | undefined, check: ResolvedRelationalCheck): ReconcileOutput;
20
23
  export declare function reconcileRelationalSqlite(db: DatabaseSync, check: ResolvedRelationalCheck): ReconcileOutput;
24
+ type RowsQuery = (text: string, values: string[]) => Promise<{
25
+ rows: Record<string, unknown>[];
26
+ }>;
27
+ export declare function reconcileRelationalQuery(dialect: RelationalSqlDialect, query: RowsQuery, check: ResolvedRelationalCheck): Promise<ReconcileOutput>;
21
28
  type PgClientLike = {
22
29
  query: (text: string, values: string[]) => Promise<{
23
30
  rows: Record<string, unknown>[];
24
31
  }>;
25
32
  };
26
33
  export declare function reconcileRelationalPostgres(client: PgClientLike, check: ResolvedRelationalCheck): Promise<ReconcileOutput>;
34
+ export declare function reconcileRelationalMysql2(pool: Mysql2Pool, check: ResolvedRelationalCheck): Promise<ReconcileOutput>;
35
+ type MssqlConnectionPool = Awaited<ReturnType<typeof sql.connect>>;
36
+ export declare function reconcileRelationalMssql(pool: MssqlConnectionPool, check: ResolvedRelationalCheck): Promise<ReconcileOutput>;
27
37
  export {};
28
38
  //# sourceMappingURL=relationalInvariant.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"relationalInvariant.d.ts","sourceRoot":"","sources":["../src/relationalInvariant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMvD,uFAAuF;AACvF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAQlB;AAMD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,KAAK,EAAE,uBAAuB,GAC7B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAgFpC;AAED,kEAAkE;AAClE,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,KAAK,EAAE,uBAAuB,GAAG;IAAE,SAAS,EAAE,WAAW,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAsBpC;AA2BD,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACxC,KAAK,EAAE,uBAAuB,GAC7B,eAAe,CAiIjB;AAYD,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,uBAAuB,GAAG,eAAe,CAqC3G;AAED,KAAK,YAAY,GAAG;IAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAEhH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAoC1B"}
1
+ {"version":3,"file":"relationalInvariant.d.ts","sourceRoot":"","sources":["../src/relationalInvariant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,GAAG,MAAM,OAAO,CAAC;AAGxB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAA8D,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAMxH,uFAAuF;AACvF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,oBAAoB,EAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAQlB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,uBAAuB,GAC7B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAkFpC;AAED,kEAAkE;AAClE,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,uBAAuB,GAAG;IAAE,SAAS,EAAE,WAAW,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAsBpC;AA2BD,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACxC,KAAK,EAAE,uBAAuB,GAC7B,eAAe,CAiIjB;AAYD,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,uBAAuB,GAAG,eAAe,CAqC3G;AAED,KAAK,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;CAAE,CAAC,CAAC;AAElG,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAoC1B;AAED,KAAK,YAAY,GAAG;IAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAEhH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC,CAK1H;AAED,KAAK,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEnE,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAS1B"}
@@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest";
2
2
  import { buildRelatedExistsSql } from "./relationalInvariant.js";
3
3
  describe("buildRelatedExistsSql", () => {
4
4
  it("emits EXISTS for both dialects and never COUNT(*)", () => {
5
- for (const dialect of ["sqlite", "postgres"]) {
5
+ for (const dialect of ["sqlite", "postgresql"]) {
6
6
  const { text } = buildRelatedExistsSql(dialect, "child", "fk");
7
7
  expect(text).toContain("EXISTS (");
8
8
  expect(text).not.toMatch(/COUNT\s*\(\s*\*\s*\)/i);
@@ -1 +1 @@
1
- {"version":3,"file":"relationalInvariant.existsSql.test.js","sourceRoot":"","sources":["../src/relationalInvariant.existsSql.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAU,EAAE,CAAC;YACtD,MAAM,EAAE,IAAI,EAAE,GAAG,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"relationalInvariant.existsSql.test.js","sourceRoot":"","sources":["../src/relationalInvariant.existsSql.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAU,EAAE,CAAC;YACxD,MAAM,EAAE,IAAI,EAAE,GAAG,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,9 +1,11 @@
1
+ import sql from "mssql";
1
2
  import { formatOperationalMessage } from "./failureCatalog.js";
2
3
  import { compareUtf16Id } from "./resolveExpectation.js";
3
4
  import { MAX_VERIFICATION_SAMPLE_ROWS } from "./reconciler.js";
4
5
  import { SQL_VERIFICATION_OUTCOME_CODE } from "./wireReasonCodes.js";
5
- function quoteIdent(id) {
6
- return `"${id.replace(/"/g, '""')}"`;
6
+ import { nextPlaceholderRelational, quoteIdent as quoteIdentDialect } from "./sqlDialect.js";
7
+ function qid(dialect, id) {
8
+ return quoteIdentDialect(dialect, id);
7
9
  }
8
10
  /** Exported for tests: EXISTS SQL shape for `related_exists` (single-column match). */
9
11
  export function buildRelatedExistsSql(dialect, childTable, fkColumn) {
@@ -15,43 +17,40 @@ export function buildRelatedExistsSql(dialect, childTable, fkColumn) {
15
17
  });
16
18
  return { text };
17
19
  }
18
- function nextPlaceholder(dialect, p) {
19
- return dialect === "postgres" ? `$${p.n++}` : "?";
20
- }
21
20
  export function buildRelationalScalarSql(dialect, check) {
22
21
  if (check.checkKind === "related_exists") {
23
- const t = quoteIdent(check.childTable);
22
+ const t = qid(dialect, check.childTable);
24
23
  const conds = [];
25
24
  const values = [];
26
- const p = { n: 1 };
25
+ let pn = 1;
27
26
  for (const w of check.matchEq) {
28
- conds.push(`${t}.${quoteIdent(w.column)} = ${nextPlaceholder(dialect, p)}`);
27
+ conds.push(`${t}.${qid(dialect, w.column)} = ${nextPlaceholderRelational(dialect, pn++)}`);
29
28
  values.push(w.value);
30
29
  }
31
30
  const text = `SELECT EXISTS (SELECT 1 FROM ${t} WHERE ${conds.join(" AND ")} LIMIT 1) AS v`;
32
31
  return { text, values };
33
32
  }
34
33
  if (check.checkKind === "anti_join") {
35
- const at = quoteIdent(check.anchorTable);
36
- const lt = quoteIdent(check.lookupTable);
34
+ const at = qid(dialect, check.anchorTable);
35
+ const lt = qid(dialect, check.lookupTable);
37
36
  const condsOn = [];
38
37
  const values = [];
39
- const p = { n: 1 };
40
- condsOn.push(`A.${quoteIdent(check.anchorColumn)} = L.${quoteIdent(check.lookupColumn)}`);
38
+ let pn = 1;
39
+ condsOn.push(`A.${qid(dialect, check.anchorColumn)} = L.${qid(dialect, check.lookupColumn)}`);
41
40
  for (const w of check.filterEqLookup) {
42
- condsOn.push(`L.${quoteIdent(w.column)} = ${nextPlaceholder(dialect, p)}`);
41
+ condsOn.push(`L.${qid(dialect, w.column)} = ${nextPlaceholderRelational(dialect, pn++)}`);
43
42
  values.push(w.value);
44
43
  }
45
- const whereParts = [`L.${quoteIdent(check.lookupPresenceColumn)} IS NULL`];
44
+ const whereParts = [`L.${qid(dialect, check.lookupPresenceColumn)} IS NULL`];
46
45
  for (const w of check.filterEqAnchor) {
47
- whereParts.push(`A.${quoteIdent(w.column)} = ${nextPlaceholder(dialect, p)}`);
46
+ whereParts.push(`A.${qid(dialect, w.column)} = ${nextPlaceholderRelational(dialect, pn++)}`);
48
47
  values.push(w.value);
49
48
  }
50
49
  const text = `SELECT COUNT(*) AS v FROM ${at} AS A LEFT JOIN ${lt} AS L ON ${condsOn.join(" AND ")} WHERE ${whereParts.join(" AND ")}`;
51
50
  return { text, values };
52
51
  }
53
52
  if (check.checkKind === "aggregate") {
54
- const tbl = quoteIdent(check.table);
53
+ const tbl = qid(dialect, check.table);
55
54
  let selectPart;
56
55
  if (check.fn === "COUNT_STAR") {
57
56
  selectPart = `SELECT COUNT(*) AS v FROM ${tbl}`;
@@ -61,14 +60,15 @@ export function buildRelationalScalarSql(dialect, check) {
61
60
  if (!col) {
62
61
  throw new Error("SUM requires sumColumn");
63
62
  }
64
- selectPart = `SELECT COALESCE(SUM(${quoteIdent(col)}), 0) AS v FROM ${tbl}`;
63
+ selectPart = `SELECT COALESCE(SUM(${qid(dialect, col)}), 0) AS v FROM ${tbl}`;
65
64
  }
66
65
  if (check.whereEq.length === 0) {
67
66
  return { text: selectPart, values: [] };
68
67
  }
69
- const conds = check.whereEq.map((w, i) => {
70
- const ph = dialect === "postgres" ? `$${i + 1}` : "?";
71
- return `${tbl}.${quoteIdent(w.column)} = ${ph}`;
68
+ let pn = 1;
69
+ const conds = check.whereEq.map((w) => {
70
+ const ph = nextPlaceholderRelational(dialect, pn++);
71
+ return `${tbl}.${qid(dialect, w.column)} = ${ph}`;
72
72
  });
73
73
  return {
74
74
  text: `${selectPart} WHERE ${conds.join(" AND ")}`,
@@ -76,16 +76,17 @@ export function buildRelationalScalarSql(dialect, check) {
76
76
  };
77
77
  }
78
78
  if (check.checkKind === "join_count") {
79
- const lt = quoteIdent(check.leftTable);
80
- const rt = quoteIdent(check.rightTable);
81
- const base = `SELECT COUNT(*) AS v FROM ${lt} AS L INNER JOIN ${rt} AS R ON L.${quoteIdent(check.leftJoinColumn)} = R.${quoteIdent(check.rightJoinColumn)}`;
79
+ const lt = qid(dialect, check.leftTable);
80
+ const rt = qid(dialect, check.rightTable);
81
+ const base = `SELECT COUNT(*) AS v FROM ${lt} AS L INNER JOIN ${rt} AS R ON L.${qid(dialect, check.leftJoinColumn)} = R.${qid(dialect, check.rightJoinColumn)}`;
82
82
  if (check.whereEq.length === 0) {
83
83
  return { text: base, values: [] };
84
84
  }
85
- const conds = check.whereEq.map((w, i) => {
86
- const ph = dialect === "postgres" ? `$${i + 1}` : "?";
85
+ let pn = 1;
86
+ const conds = check.whereEq.map((w) => {
87
+ const ph = nextPlaceholderRelational(dialect, pn++);
87
88
  const alias = w.side === "left" ? "L" : "R";
88
- return `${alias}.${quoteIdent(w.column)} = ${ph}`;
89
+ return `${alias}.${qid(dialect, w.column)} = ${ph}`;
89
90
  });
90
91
  return {
91
92
  text: `${base} WHERE ${conds.join(" AND ")}`,
@@ -97,26 +98,26 @@ export function buildRelationalScalarSql(dialect, check) {
97
98
  }
98
99
  /** Sample SELECT for anti_join failures (anchor columns only). */
99
100
  export function buildAntiJoinSampleSql(dialect, check) {
100
- const at = quoteIdent(check.anchorTable);
101
- const lt = quoteIdent(check.lookupTable);
101
+ const at = qid(dialect, check.anchorTable);
102
+ const lt = qid(dialect, check.lookupTable);
102
103
  const condsOn = [];
103
104
  const values = [];
104
- const p = { n: 1 };
105
- condsOn.push(`A.${quoteIdent(check.anchorColumn)} = L.${quoteIdent(check.lookupColumn)}`);
105
+ let pn = 1;
106
+ condsOn.push(`A.${qid(dialect, check.anchorColumn)} = L.${qid(dialect, check.lookupColumn)}`);
106
107
  for (const w of check.filterEqLookup) {
107
- condsOn.push(`L.${quoteIdent(w.column)} = ${nextPlaceholder(dialect, p)}`);
108
+ condsOn.push(`L.${qid(dialect, w.column)} = ${nextPlaceholderRelational(dialect, pn++)}`);
108
109
  values.push(w.value);
109
110
  }
110
- const whereParts = [`L.${quoteIdent(check.lookupPresenceColumn)} IS NULL`];
111
+ const whereParts = [`L.${qid(dialect, check.lookupPresenceColumn)} IS NULL`];
111
112
  for (const w of check.filterEqAnchor) {
112
- whereParts.push(`A.${quoteIdent(w.column)} = ${nextPlaceholder(dialect, p)}`);
113
+ whereParts.push(`A.${qid(dialect, w.column)} = ${nextPlaceholderRelational(dialect, pn++)}`);
113
114
  values.push(w.value);
114
115
  }
115
116
  const anchorColSet = new Set([check.anchorColumn]);
116
117
  for (const w of check.filterEqAnchor)
117
118
  anchorColSet.add(w.column);
118
119
  const proj = [...anchorColSet].sort((a, b) => compareUtf16Id(a, b));
119
- const selectList = proj.map((c) => `A.${quoteIdent(c)}`).join(", ");
120
+ const selectList = proj.map((c) => `A.${qid(dialect, c)}`).join(", ");
120
121
  const text = `SELECT ${selectList} FROM ${at} AS A LEFT JOIN ${lt} AS L ON ${condsOn.join(" AND ")} WHERE ${whereParts.join(" AND ")} LIMIT ${MAX_VERIFICATION_SAMPLE_ROWS}`;
121
122
  return { text, values };
122
123
  }
@@ -311,10 +312,10 @@ export function reconcileRelationalSqlite(db, check) {
311
312
  };
312
313
  }
313
314
  }
314
- export async function reconcileRelationalPostgres(client, check) {
315
- const { text, values } = buildRelationalScalarSql("postgres", check);
315
+ export async function reconcileRelationalQuery(dialect, query, check) {
316
+ const { text, values } = buildRelationalScalarSql(dialect, check);
316
317
  try {
317
- const r = await client.query(text, values);
318
+ const r = await query(text, values);
318
319
  const row0 = r.rows[0];
319
320
  const lowered = row0 === undefined
320
321
  ? undefined
@@ -323,8 +324,8 @@ export async function reconcileRelationalPostgres(client, check) {
323
324
  if (check.checkKind === "anti_join" &&
324
325
  out.status === "inconsistent" &&
325
326
  out.reasons[0]?.code === SQL_VERIFICATION_OUTCOME_CODE.ORPHAN_ROW_DETECTED) {
326
- const { text: st, values: sv } = buildAntiJoinSampleSql("postgres", check);
327
- const sr = await client.query(st, sv);
327
+ const { text: st, values: sv } = buildAntiJoinSampleSql(dialect, check);
328
+ const sr = await query(st, sv);
328
329
  const sampleRows = sr.rows.map((row) => Object.fromEntries(Object.entries(row).map(([k, v]) => [k.toLowerCase(), v])));
329
330
  out = mergeAntiJoinSamples(out, sampleRows);
330
331
  }
@@ -344,4 +345,23 @@ export async function reconcileRelationalPostgres(client, check) {
344
345
  };
345
346
  }
346
347
  }
348
+ export async function reconcileRelationalPostgres(client, check) {
349
+ return reconcileRelationalQuery("postgresql", (t, v) => client.query(t, v), check);
350
+ }
351
+ export async function reconcileRelationalMysql2(pool, check) {
352
+ return reconcileRelationalQuery("mysql", async (t, v) => {
353
+ const [rows] = await pool.query(t, v);
354
+ return { rows: rows };
355
+ }, check);
356
+ }
357
+ export async function reconcileRelationalMssql(pool, check) {
358
+ return reconcileRelationalQuery("mssql", async (t, v) => {
359
+ const req = pool.request();
360
+ for (let i = 0; i < v.length; i++) {
361
+ req.input(`p${i + 1}`, sql.NVarChar(sql.MAX), v[i]);
362
+ }
363
+ const res = await req.query(t);
364
+ return { rows: res.recordset };
365
+ }, check);
366
+ }
347
367
  //# sourceMappingURL=relationalInvariant.js.map