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.
- package/README.md +18 -20
- package/config/marketing.json +187 -0
- package/dist/actionableFailure.d.ts.map +1 -1
- package/dist/actionableFailure.js +95 -0
- package/dist/actionableFailure.js.map +1 -1
- package/dist/assurance/assurancePathArgs.d.ts.map +1 -1
- package/dist/assurance/assurancePathArgs.js +1 -0
- package/dist/assurance/assurancePathArgs.js.map +1 -1
- package/dist/assurance/buildAssuranceOutput.d.ts +29 -0
- package/dist/assurance/buildAssuranceOutput.d.ts.map +1 -0
- package/dist/assurance/buildAssuranceOutput.js +53 -0
- package/dist/assurance/buildAssuranceOutput.js.map +1 -0
- package/dist/assurance/checkStale.d.ts +7 -0
- package/dist/assurance/checkStale.d.ts.map +1 -1
- package/dist/assurance/checkStale.js +14 -3
- package/dist/assurance/checkStale.js.map +1 -1
- package/dist/assurance/runAssurance.d.ts.map +1 -1
- package/dist/assurance/runAssurance.js +26 -3
- package/dist/assurance/runAssurance.js.map +1 -1
- package/dist/bootstrap/executeBootstrapPack.d.ts.map +1 -1
- package/dist/bootstrap/executeBootstrapPack.js +3 -2
- package/dist/bootstrap/executeBootstrapPack.js.map +1 -1
- package/dist/certificateDigest.d.ts +4 -0
- package/dist/certificateDigest.d.ts.map +1 -0
- package/dist/certificateDigest.js +7 -0
- package/dist/certificateDigest.js.map +1 -0
- package/dist/certificateDigest.test.d.ts +2 -0
- package/dist/certificateDigest.test.d.ts.map +1 -0
- package/dist/certificateDigest.test.js +14 -0
- package/dist/certificateDigest.test.js.map +1 -0
- package/dist/cli/lockOrchestration.d.ts.map +1 -1
- package/dist/cli/lockOrchestration.js +30 -5
- package/dist/cli/lockOrchestration.js.map +1 -1
- package/dist/cli/runFunnelAnonSet.js +1 -1
- package/dist/cli.js +121 -114
- package/dist/cli.js.map +1 -1
- package/dist/cliArgv.d.ts.map +1 -1
- package/dist/cliArgv.js +4 -2
- package/dist/cliArgv.js.map +1 -1
- package/dist/cliArgv.test.d.ts +2 -0
- package/dist/cliArgv.test.d.ts.map +1 -0
- package/dist/cliArgv.test.js +34 -0
- package/dist/cliArgv.test.js.map +1 -0
- package/dist/cliOperationalCodes.d.ts +7 -0
- package/dist/cliOperationalCodes.d.ts.map +1 -1
- package/dist/cliOperationalCodes.js +7 -0
- package/dist/cliOperationalCodes.js.map +1 -1
- package/dist/commercial/activationCorrelation.d.ts +3 -0
- package/dist/commercial/activationCorrelation.d.ts.map +1 -0
- package/dist/commercial/activationCorrelation.js +6 -0
- package/dist/commercial/activationCorrelation.js.map +1 -0
- package/dist/commercial/getCurrentUsage.d.ts +16 -0
- package/dist/commercial/getCurrentUsage.d.ts.map +1 -0
- package/dist/commercial/getCurrentUsage.js +33 -0
- package/dist/commercial/getCurrentUsage.js.map +1 -0
- package/dist/commercial/licensePreflight.d.ts +1 -0
- package/dist/commercial/licensePreflight.d.ts.map +1 -1
- package/dist/commercial/licensePreflight.js +27 -8
- package/dist/commercial/licensePreflight.js.map +1 -1
- package/dist/commercial/postVerifyOutcomeBeacon.d.ts +2 -0
- package/dist/commercial/postVerifyOutcomeBeacon.d.ts.map +1 -1
- package/dist/commercial/postVerifyOutcomeBeacon.js +8 -4
- package/dist/commercial/postVerifyOutcomeBeacon.js.map +1 -1
- package/dist/commercial/verifyWorkloadClassify.d.ts +2 -7
- package/dist/commercial/verifyWorkloadClassify.d.ts.map +1 -1
- package/dist/commercial/verifyWorkloadClassify.js +1 -1
- package/dist/commercial/verifyWorkloadClassify.js.map +1 -1
- package/dist/commercial/verifyWorkloadClassify.test.js +7 -0
- package/dist/commercial/verifyWorkloadClassify.test.js.map +1 -1
- package/dist/compare.acceptance.test.js +25 -0
- package/dist/compare.acceptance.test.js.map +1 -1
- package/dist/compareRunManifest.d.ts +32 -0
- package/dist/compareRunManifest.d.ts.map +1 -0
- package/dist/compareRunManifest.js +60 -0
- package/dist/compareRunManifest.js.map +1 -0
- package/dist/crossing/crossingDecisionReadyFooter.d.ts +1 -1
- package/dist/crossing/crossingDecisionReadyFooter.d.ts.map +1 -1
- package/dist/crossing/crossingDecisionReadyFooter.js +1 -1
- package/dist/crossing/crossingDecisionReadyFooter.js.map +1 -1
- package/dist/debug-ui/app.css +42 -0
- package/dist/debug-ui/app.js +206 -15
- package/dist/debug-ui/index.html +11 -4
- package/dist/debug-ui/urlState.d.ts +15 -0
- package/dist/debug-ui/urlState.js +92 -0
- package/dist/debugCorpus.test.js +33 -7
- package/dist/debugCorpus.test.js.map +1 -1
- package/dist/debugPanels.d.ts +0 -3
- package/dist/debugPanels.d.ts.map +1 -1
- package/dist/debugPanels.js +0 -23
- package/dist/debugPanels.js.map +1 -1
- package/dist/debugPanels.test.js +16 -15
- package/dist/debugPanels.test.js.map +1 -1
- package/dist/debugServer.d.ts.map +1 -1
- package/dist/debugServer.js +19 -16
- package/dist/debugServer.js.map +1 -1
- package/dist/debugServer.test.js +18 -9
- package/dist/debugServer.test.js.map +1 -1
- package/dist/debugUiUrlState.test.d.ts +2 -0
- package/dist/debugUiUrlState.test.d.ts.map +1 -0
- package/dist/debugUiUrlState.test.js +49 -0
- package/dist/debugUiUrlState.test.js.map +1 -0
- package/dist/decisionGate.d.ts.map +1 -1
- package/dist/decisionGate.js +2 -5
- package/dist/decisionGate.js.map +1 -1
- package/dist/discovery-payload-v1.json +23 -27
- package/dist/enforceCli.d.ts.map +1 -1
- package/dist/enforceCli.js +15 -40
- package/dist/enforceCli.js.map +1 -1
- package/dist/enforceStateful.d.ts +2 -0
- package/dist/enforceStateful.d.ts.map +1 -0
- package/dist/enforceStateful.js +106 -0
- package/dist/enforceStateful.js.map +1 -0
- package/dist/enforcementProjection.d.ts +17 -0
- package/dist/enforcementProjection.d.ts.map +1 -0
- package/dist/enforcementProjection.js +20 -0
- package/dist/enforcementProjection.js.map +1 -0
- package/dist/executionTrace.test.js +35 -0
- package/dist/executionTrace.test.js.map +1 -1
- package/dist/executionTraceDiff.d.ts +36 -0
- package/dist/executionTraceDiff.d.ts.map +1 -0
- package/dist/executionTraceDiff.js +86 -0
- package/dist/executionTraceDiff.js.map +1 -0
- package/dist/executionTraceDiff.test.d.ts +2 -0
- package/dist/executionTraceDiff.test.d.ts.map +1 -0
- package/dist/executionTraceDiff.test.js +44 -0
- package/dist/executionTraceDiff.test.js.map +1 -0
- package/dist/failureOriginCatalog.d.ts.map +1 -1
- package/dist/failureOriginCatalog.js +19 -0
- package/dist/failureOriginCatalog.js.map +1 -1
- package/dist/firstFiveMinutesChecklist.d.ts +11 -0
- package/dist/firstFiveMinutesChecklist.d.ts.map +1 -0
- package/dist/firstFiveMinutesChecklist.js +18 -0
- package/dist/firstFiveMinutesChecklist.js.map +1 -0
- package/dist/funnel/workflowLineageClassify.d.ts +1 -1
- package/dist/funnel/workflowLineageClassify.js +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/langGraphCheckpointTrustGate.d.ts.map +1 -1
- package/dist/langGraphCheckpointTrustGate.js +2 -5
- package/dist/langGraphCheckpointTrustGate.js.map +1 -1
- package/dist/operationalDisposition.d.ts +56 -0
- package/dist/operationalDisposition.d.ts.map +1 -1
- package/dist/operationalDisposition.js +56 -0
- package/dist/operationalDisposition.js.map +1 -1
- package/dist/pipeline.d.ts +1 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +18 -18
- package/dist/pipeline.js.map +1 -1
- package/dist/publicDistribution.generated.d.ts +2 -2
- package/dist/publicDistribution.generated.d.ts.map +1 -1
- package/dist/publicDistribution.generated.js +7 -8
- package/dist/publicDistribution.generated.js.map +1 -1
- package/dist/quickVerify/quickVerifyScope.d.ts +1 -1
- package/dist/quickVerify/quickVerifyScope.js +1 -1
- package/dist/quickVerify/runQuickVerify.js +1 -1
- package/dist/quickVerify/runQuickVerify.js.map +1 -1
- package/dist/quickVerify/verifyExecution.d.ts +1 -1
- package/dist/quickVerify/verifyExecution.d.ts.map +1 -1
- package/dist/quickVerify/verifyExecution.js +3 -2
- package/dist/quickVerify/verifyExecution.js.map +1 -1
- package/dist/reconciler.d.ts +6 -2
- package/dist/reconciler.d.ts.map +1 -1
- package/dist/reconciler.js +17 -11
- package/dist/reconciler.js.map +1 -1
- package/dist/registryDraft/createRegistryDraftAjv.d.ts +1 -1
- package/dist/registryDraft/createRegistryDraftAjv.js +1 -1
- package/dist/regressionArtifact.d.ts +63 -0
- package/dist/regressionArtifact.d.ts.map +1 -0
- package/dist/regressionArtifact.js +290 -0
- package/dist/regressionArtifact.js.map +1 -0
- package/dist/relationalInvariant.d.ts +13 -3
- package/dist/relationalInvariant.d.ts.map +1 -1
- package/dist/relationalInvariant.existsSql.test.js +1 -1
- package/dist/relationalInvariant.existsSql.test.js.map +1 -1
- package/dist/relationalInvariant.js +59 -39
- package/dist/relationalInvariant.js.map +1 -1
- package/dist/relationalInvariant.test.js +2 -2
- package/dist/relationalInvariant.test.js.map +1 -1
- package/dist/resolveExpectation.d.ts +18 -2
- package/dist/resolveExpectation.d.ts.map +1 -1
- package/dist/resolveExpectation.js +332 -1
- package/dist/resolveExpectation.js.map +1 -1
- package/dist/resolveExpectation.test.js +25 -0
- package/dist/resolveExpectation.test.js.map +1 -1
- package/dist/runComparison.d.ts +0 -1
- package/dist/runComparison.d.ts.map +1 -1
- package/dist/runComparison.js +18 -86
- package/dist/runComparison.js.map +1 -1
- package/dist/runComparison.test.js +101 -57
- package/dist/runComparison.test.js.map +1 -1
- package/dist/schema-validation.test.js +29 -0
- package/dist/schema-validation.test.js.map +1 -1
- package/dist/schemaLoad.d.ts +1 -1
- package/dist/schemaLoad.d.ts.map +1 -1
- package/dist/schemaLoad.js +10 -0
- package/dist/schemaLoad.js.map +1 -1
- package/dist/sortedJsonStringify.d.ts +2 -0
- package/dist/sortedJsonStringify.d.ts.map +1 -0
- package/dist/sortedJsonStringify.js +23 -0
- package/dist/sortedJsonStringify.js.map +1 -0
- package/dist/sqlDialect.d.ts +8 -0
- package/dist/sqlDialect.d.ts.map +1 -0
- package/dist/sqlDialect.js +37 -0
- package/dist/sqlDialect.js.map +1 -0
- package/dist/standardVerifyWorkflowCli.d.ts.map +1 -1
- package/dist/standardVerifyWorkflowCli.js +3 -2
- package/dist/standardVerifyWorkflowCli.js.map +1 -1
- package/dist/stateWitness.d.ts +4 -0
- package/dist/stateWitness.d.ts.map +1 -0
- package/dist/stateWitness.js +383 -0
- package/dist/stateWitness.js.map +1 -0
- package/dist/stateWitness.test.d.ts +2 -0
- package/dist/stateWitness.test.d.ts.map +1 -0
- package/dist/stateWitness.test.js +120 -0
- package/dist/stateWitness.test.js.map +1 -0
- package/dist/telemetry/maybeEmitOssClaimTicketUrl.d.ts +2 -0
- package/dist/telemetry/maybeEmitOssClaimTicketUrl.d.ts.map +1 -1
- package/dist/telemetry/maybeEmitOssClaimTicketUrl.js +13 -2
- package/dist/telemetry/maybeEmitOssClaimTicketUrl.js.map +1 -1
- package/dist/telemetry/ossClaimOrigin.d.ts +1 -1
- package/dist/telemetry/ossClaimOrigin.js +1 -1
- package/dist/telemetry/postOssClaimContinuation.d.ts +1 -1
- package/dist/telemetry/postOssClaimContinuation.d.ts.map +1 -1
- package/dist/telemetry/postOssClaimContinuation.js +10 -6
- package/dist/telemetry/postOssClaimContinuation.js.map +1 -1
- package/dist/telemetry/postOssClaimTicket.d.ts +8 -0
- package/dist/telemetry/postOssClaimTicket.d.ts.map +1 -1
- package/dist/telemetry/postOssClaimTicket.js +31 -5
- package/dist/telemetry/postOssClaimTicket.js.map +1 -1
- package/dist/telemetry/verificationHypothesisContract.d.ts +1 -1
- package/dist/telemetry/verificationHypothesisContract.js +1 -1
- package/dist/types.d.ts +115 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/verificationConnections.d.ts +10 -0
- package/dist/verificationConnections.d.ts.map +1 -0
- package/dist/verificationConnections.js +190 -0
- package/dist/verificationConnections.js.map +1 -0
- package/dist/verificationDatabaseUrl.d.ts +11 -0
- package/dist/verificationDatabaseUrl.d.ts.map +1 -0
- package/dist/verificationDatabaseUrl.js +41 -0
- package/dist/verificationDatabaseUrl.js.map +1 -0
- package/dist/verificationDatabaseUrl.test.d.ts +2 -0
- package/dist/verificationDatabaseUrl.test.d.ts.map +1 -0
- package/dist/verificationDatabaseUrl.test.js +66 -0
- package/dist/verificationDatabaseUrl.test.js.map +1 -0
- package/dist/verificationDiagnostics.d.ts.map +1 -1
- package/dist/verificationDiagnostics.js +33 -9
- package/dist/verificationDiagnostics.js.map +1 -1
- package/dist/verificationDiagnostics.test.js +15 -0
- package/dist/verificationDiagnostics.test.js.map +1 -1
- package/dist/verificationPolicy.d.ts +2 -1
- package/dist/verificationPolicy.d.ts.map +1 -1
- package/dist/verificationPolicy.js +97 -0
- package/dist/verificationPolicy.js.map +1 -1
- package/dist/verificationPolicy.test.js +7 -0
- package/dist/verificationPolicy.test.js.map +1 -1
- package/dist/verificationUserPhrases.d.ts.map +1 -1
- package/dist/verificationUserPhrases.js +21 -0
- package/dist/verificationUserPhrases.js.map +1 -1
- package/dist/verify/batchVerifyTelemetrySubcommand.d.ts.map +1 -1
- package/dist/verify/batchVerifyTelemetrySubcommand.js +8 -1
- package/dist/verify/batchVerifyTelemetrySubcommand.js.map +1 -1
- package/dist/vitestMonorepoRoot.d.ts +10 -0
- package/dist/vitestMonorepoRoot.d.ts.map +1 -0
- package/dist/vitestMonorepoRoot.js +97 -0
- package/dist/vitestMonorepoRoot.js.map +1 -0
- package/dist/wireReasonCodes.d.ts +21 -0
- package/dist/wireReasonCodes.d.ts.map +1 -1
- package/dist/wireReasonCodes.js +21 -0
- package/dist/wireReasonCodes.js.map +1 -1
- package/package.json +61 -40
- package/schemas/assurance-output-v1.schema.json +81 -0
- package/schemas/compare-run-manifest-v1.schema.json +65 -0
- package/schemas/conformance-normalized-result.schema.json +73 -0
- package/schemas/connector-capabilities.schema.json +38 -0
- package/schemas/execution-trace-view.schema.json +1 -1
- package/schemas/openapi-commercial-v1.in.yaml +613 -14
- package/schemas/openapi-commercial-v1.yaml +613 -14
- package/schemas/quick-verify-report.schema.json +1 -1
- package/schemas/regression-artifact-v1.schema.json +212 -0
- package/schemas/tools-registry.schema.json +103 -0
- package/schemas/workflow-engine-result.schema.json +69 -1
- package/schemas/workflow-truth-report.schema.json +12 -0
- package/scripts/discovery-acquisition.lib.cjs +6 -17
- package/scripts/discovery-payload.lib.cjs +5 -3
- package/scripts/emit-primary-marketing.cjs +326 -0
- package/scripts/origin.cjs +52 -0
- package/scripts/public-product-anchors.cjs +3 -0
- 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, "&")
|
|
25
|
+
.replace(/</g, "<")
|
|
26
|
+
.replace(/>/g, ">")
|
|
27
|
+
.replace(/"/g, """);
|
|
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:
|
|
8
|
+
export declare function buildRelatedExistsSql(dialect: RelationalSqlDialect, childTable: string, fkColumn: string): {
|
|
6
9
|
text: string;
|
|
7
10
|
};
|
|
8
|
-
export declare function buildRelationalScalarSql(dialect:
|
|
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:
|
|
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;
|
|
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", "
|
|
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,
|
|
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
|
-
|
|
6
|
-
|
|
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 =
|
|
22
|
+
const t = qid(dialect, check.childTable);
|
|
24
23
|
const conds = [];
|
|
25
24
|
const values = [];
|
|
26
|
-
|
|
25
|
+
let pn = 1;
|
|
27
26
|
for (const w of check.matchEq) {
|
|
28
|
-
conds.push(`${t}.${
|
|
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 =
|
|
36
|
-
const lt =
|
|
34
|
+
const at = qid(dialect, check.anchorTable);
|
|
35
|
+
const lt = qid(dialect, check.lookupTable);
|
|
37
36
|
const condsOn = [];
|
|
38
37
|
const values = [];
|
|
39
|
-
|
|
40
|
-
condsOn.push(`A.${
|
|
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.${
|
|
41
|
+
condsOn.push(`L.${qid(dialect, w.column)} = ${nextPlaceholderRelational(dialect, pn++)}`);
|
|
43
42
|
values.push(w.value);
|
|
44
43
|
}
|
|
45
|
-
const whereParts = [`L.${
|
|
44
|
+
const whereParts = [`L.${qid(dialect, check.lookupPresenceColumn)} IS NULL`];
|
|
46
45
|
for (const w of check.filterEqAnchor) {
|
|
47
|
-
whereParts.push(`A.${
|
|
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 =
|
|
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(${
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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 =
|
|
80
|
-
const rt =
|
|
81
|
-
const base = `SELECT COUNT(*) AS v FROM ${lt} AS L INNER JOIN ${rt} AS R ON L.${
|
|
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
|
-
|
|
86
|
-
|
|
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}.${
|
|
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 =
|
|
101
|
-
const lt =
|
|
101
|
+
const at = qid(dialect, check.anchorTable);
|
|
102
|
+
const lt = qid(dialect, check.lookupTable);
|
|
102
103
|
const condsOn = [];
|
|
103
104
|
const values = [];
|
|
104
|
-
|
|
105
|
-
condsOn.push(`A.${
|
|
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.${
|
|
108
|
+
condsOn.push(`L.${qid(dialect, w.column)} = ${nextPlaceholderRelational(dialect, pn++)}`);
|
|
108
109
|
values.push(w.value);
|
|
109
110
|
}
|
|
110
|
-
const whereParts = [`L.${
|
|
111
|
+
const whereParts = [`L.${qid(dialect, check.lookupPresenceColumn)} IS NULL`];
|
|
111
112
|
for (const w of check.filterEqAnchor) {
|
|
112
|
-
whereParts.push(`A.${
|
|
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.${
|
|
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
|
|
315
|
-
const { text, values } = buildRelationalScalarSql(
|
|
315
|
+
export async function reconcileRelationalQuery(dialect, query, check) {
|
|
316
|
+
const { text, values } = buildRelationalScalarSql(dialect, check);
|
|
316
317
|
try {
|
|
317
|
-
const r = await
|
|
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(
|
|
327
|
-
const sr = await
|
|
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
|