agentskeptic 1.0.0 → 1.0.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 +39 -44
- 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/agentRunBundle.d.ts +2 -0
- package/dist/agentRunBundle.d.ts.map +1 -1
- package/dist/agentRunBundle.js +4 -0
- package/dist/agentRunBundle.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 +42 -6
- package/dist/cli/lockOrchestration.js.map +1 -1
- package/dist/cli/lockOrchestration.test.js +1 -0
- package/dist/cli/lockOrchestration.test.js.map +1 -1
- package/dist/cli/runFunnelAnonSet.js +1 -1
- package/dist/cli.js +122 -114
- package/dist/cli.js.map +1 -1
- package/dist/cliArgv.d.ts +2 -0
- package/dist/cliArgv.d.ts.map +1 -1
- package/dist/cliArgv.js +6 -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 +8 -0
- package/dist/cliOperationalCodes.d.ts.map +1 -1
- package/dist/cliOperationalCodes.js +8 -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 +5 -3
- package/dist/commercial/postVerifyOutcomeBeacon.d.ts.map +1 -1
- package/dist/commercial/postVerifyOutcomeBeacon.js +17 -10
- package/dist/commercial/postVerifyOutcomeBeacon.js.map +1 -1
- package/dist/commercial/verifyOutcomeBeaconBody.d.ts +12 -0
- package/dist/commercial/verifyOutcomeBeaconBody.d.ts.map +1 -0
- package/dist/commercial/verifyOutcomeBeaconBody.js +26 -0
- package/dist/commercial/verifyOutcomeBeaconBody.js.map +1 -0
- 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/decisionBlocker.contract.test.d.ts +2 -0
- package/dist/decisionBlocker.contract.test.d.ts.map +1 -0
- package/dist/decisionBlocker.contract.test.js +51 -0
- package/dist/decisionBlocker.contract.test.js.map +1 -0
- package/dist/decisionBlocker.d.ts +10 -0
- package/dist/decisionBlocker.d.ts.map +1 -0
- package/dist/decisionBlocker.js +66 -0
- package/dist/decisionBlocker.js.map +1 -0
- package/dist/decisionGate.assertSafe.test.d.ts +2 -0
- package/dist/decisionGate.assertSafe.test.d.ts.map +1 -0
- package/dist/decisionGate.assertSafe.test.js +52 -0
- package/dist/decisionGate.assertSafe.test.js.map +1 -0
- package/dist/decisionGate.d.ts +23 -0
- package/dist/decisionGate.d.ts.map +1 -0
- package/dist/decisionGate.js +85 -0
- package/dist/decisionGate.js.map +1 -0
- package/dist/decisionGate.persistBundle.test.d.ts +2 -0
- package/dist/decisionGate.persistBundle.test.d.ts.map +1 -0
- package/dist/{withWorkflowVerification.persistBundle.test.js → decisionGate.persistBundle.test.js} +31 -19
- package/dist/decisionGate.persistBundle.test.js.map +1 -0
- package/dist/decisionUnsafeError.d.ts +8 -0
- package/dist/decisionUnsafeError.d.ts.map +1 -0
- package/dist/decisionUnsafeError.js +12 -0
- package/dist/decisionUnsafeError.js.map +1 -0
- package/dist/discovery-payload-v1.json +167 -59
- 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/executionPathFindings.d.ts +1 -1
- package/dist/executionPathFindings.d.ts.map +1 -1
- package/dist/executionPathFindings.js +2 -2
- package/dist/executionPathFindings.js.map +1 -1
- package/dist/executionTrace.js +2 -2
- package/dist/executionTrace.js.map +1 -1
- 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/failureCatalog.d.ts +1 -0
- package/dist/failureCatalog.d.ts.map +1 -1
- package/dist/failureCatalog.js +1 -0
- package/dist/failureCatalog.js.map +1 -1
- package/dist/failureOriginCatalog.d.ts.map +1 -1
- package/dist/failureOriginCatalog.js +20 -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 +20 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -6
- package/dist/index.js.map +1 -1
- package/dist/langGraphCheckpointTrustGate.d.ts +38 -0
- package/dist/langGraphCheckpointTrustGate.d.ts.map +1 -0
- package/dist/langGraphCheckpointTrustGate.js +124 -0
- package/dist/langGraphCheckpointTrustGate.js.map +1 -0
- package/dist/langGraphCheckpointTrustIneligibleCertificate.d.ts +8 -0
- package/dist/langGraphCheckpointTrustIneligibleCertificate.d.ts.map +1 -0
- package/dist/langGraphCheckpointTrustIneligibleCertificate.js +17 -0
- package/dist/langGraphCheckpointTrustIneligibleCertificate.js.map +1 -0
- package/dist/langGraphCheckpointTrustUnsafeError.d.ts +8 -0
- package/dist/langGraphCheckpointTrustUnsafeError.d.ts.map +1 -0
- package/dist/langGraphCheckpointTrustUnsafeError.js +12 -0
- package/dist/langGraphCheckpointTrustUnsafeError.js.map +1 -0
- package/dist/loadEvents.d.ts +5 -0
- package/dist/loadEvents.d.ts.map +1 -1
- package/dist/loadEvents.js +32 -0
- package/dist/loadEvents.js.map +1 -1
- package/dist/operationalDisposition.d.ts +64 -0
- package/dist/operationalDisposition.d.ts.map +1 -1
- package/dist/operationalDisposition.js +64 -0
- package/dist/operationalDisposition.js.map +1 -1
- package/dist/outcomeCertificate.d.ts +14 -2
- package/dist/outcomeCertificate.d.ts.map +1 -1
- package/dist/outcomeCertificate.js +119 -0
- package/dist/outcomeCertificate.js.map +1 -1
- package/dist/outcomeCertificate.test.js +2 -0
- package/dist/outcomeCertificate.test.js.map +1 -1
- package/dist/pipeline.d.ts +19 -17
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +61 -167
- 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 +6 -1
- package/dist/standardVerifyWorkflowCli.d.ts.map +1 -1
- package/dist/standardVerifyWorkflowCli.js +24 -5
- 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/trustDecision.d.ts +8 -0
- package/dist/trustDecision.d.ts.map +1 -0
- package/dist/trustDecision.js +13 -0
- package/dist/trustDecision.js.map +1 -0
- package/dist/types.d.ts +139 -7
- 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/verificationRunContext.d.ts.map +1 -1
- package/dist/verificationRunContext.js +3 -0
- package/dist/verificationRunContext.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 +115 -20
- package/dist/verify/batchVerifyTelemetrySubcommand.js.map +1 -1
- package/dist/verifyAgentskeptic.d.ts +3 -4
- package/dist/verifyAgentskeptic.d.ts.map +1 -1
- package/dist/verifyAgentskeptic.js +15 -27
- package/dist/verifyAgentskeptic.js.map +1 -1
- package/dist/verifyRunStateFromBufferedRunEvents.d.ts +18 -0
- package/dist/verifyRunStateFromBufferedRunEvents.d.ts.map +1 -0
- package/dist/verifyRunStateFromBufferedRunEvents.js +65 -0
- package/dist/verifyRunStateFromBufferedRunEvents.js.map +1 -0
- 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 +62 -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/event.schema.json +35 -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/outcome-certificate-v1.schema.json +25 -2
- 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 +71 -2
- package/schemas/workflow-truth-report.schema.json +12 -0
- package/scripts/discovery-acquisition.lib.cjs +60 -97
- package/scripts/discovery-payload.lib.cjs +41 -7
- 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
- package/dist/withWorkflowVerification.persistBundle.test.d.ts +0 -2
- package/dist/withWorkflowVerification.persistBundle.test.d.ts.map +0 -1
- package/dist/withWorkflowVerification.persistBundle.test.js.map +0 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { readFileSync, mkdtempSync, rmSync } from "node:fs";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { DatabaseSync } from "node:sqlite";
|
|
6
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
7
|
+
import { createDecisionGate } from "./decisionGate.js";
|
|
8
|
+
import { DecisionUnsafeError } from "./decisionUnsafeError.js";
|
|
9
|
+
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
10
|
+
describe("DecisionGate.assertSafeForIrreversibleAction", () => {
|
|
11
|
+
/** Seeded SQLite under tmp — `examples/demo.db` is gitignored and absent on clean CI. */
|
|
12
|
+
let workDir;
|
|
13
|
+
let dbPath;
|
|
14
|
+
beforeAll(() => {
|
|
15
|
+
workDir = mkdtempSync(join(tmpdir(), "agentskeptic-assert-safe-"));
|
|
16
|
+
dbPath = join(workDir, "demo.db");
|
|
17
|
+
const sql = readFileSync(join(root, "examples", "seed.sql"), "utf8");
|
|
18
|
+
const db = new DatabaseSync(dbPath);
|
|
19
|
+
db.exec(sql);
|
|
20
|
+
db.close();
|
|
21
|
+
});
|
|
22
|
+
afterAll(() => {
|
|
23
|
+
rmSync(workDir, { recursive: true, force: true });
|
|
24
|
+
});
|
|
25
|
+
it("throws DecisionUnsafeError when DB does not match (wf_missing)", async () => {
|
|
26
|
+
const eventsPath = join(root, "examples", "events.ndjson");
|
|
27
|
+
const registryPath = join(root, "examples", "tools.json");
|
|
28
|
+
const lines = readFileSync(eventsPath, "utf8").split(/\r?\n/).filter((l) => l.trim().length > 0);
|
|
29
|
+
const gate = createDecisionGate({
|
|
30
|
+
workflowId: "wf_missing",
|
|
31
|
+
registryPath,
|
|
32
|
+
databaseUrl: dbPath,
|
|
33
|
+
projectRoot: root,
|
|
34
|
+
logStep: () => { },
|
|
35
|
+
truthReport: () => { },
|
|
36
|
+
});
|
|
37
|
+
for (const line of lines) {
|
|
38
|
+
const ev = JSON.parse(line);
|
|
39
|
+
if (ev.workflowId === "wf_missing") {
|
|
40
|
+
gate.appendRunEvent(ev);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
await expect(gate.assertSafeForIrreversibleAction()).rejects.toSatisfy((e) => {
|
|
44
|
+
if (!(e instanceof DecisionUnsafeError))
|
|
45
|
+
return false;
|
|
46
|
+
if (e.trustDecision !== "unsafe")
|
|
47
|
+
return false;
|
|
48
|
+
return e.message.split("\n").length === 6;
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=decisionGate.assertSafe.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisionGate.assertSafe.test.js","sourceRoot":"","sources":["../src/decisionGate.assertSafe.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type OutcomeCertificateV1 } from "./outcomeCertificate.js";
|
|
2
|
+
import type { VerificationPolicy, WorkflowResult } from "./types.js";
|
|
3
|
+
export type CreateDecisionGateOptions = {
|
|
4
|
+
workflowId: string;
|
|
5
|
+
registryPath: string;
|
|
6
|
+
databaseUrl: string;
|
|
7
|
+
projectRoot?: string;
|
|
8
|
+
verificationPolicy?: VerificationPolicy;
|
|
9
|
+
logStep?: (line: object) => void;
|
|
10
|
+
truthReport?: (report: string) => void;
|
|
11
|
+
};
|
|
12
|
+
export type DecisionGate = {
|
|
13
|
+
appendRunEvent(value: unknown): void;
|
|
14
|
+
toNdjsonUtf8(): Buffer;
|
|
15
|
+
evaluate(): Promise<WorkflowResult>;
|
|
16
|
+
evaluateCertificate(): Promise<OutcomeCertificateV1>;
|
|
17
|
+
assertSafeForIrreversibleAction(): Promise<void>;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Runtime integration: buffer structured run events, evaluate against the registry + DB, assert before irreversible work.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createDecisionGate(options: CreateDecisionGateOptions): DecisionGate;
|
|
23
|
+
//# sourceMappingURL=decisionGate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisionGate.d.ts","sourceRoot":"","sources":["../src/decisionGate.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAA0C,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAW7G,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,YAAY,IAAI,MAAM,CAAC;IACvB,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IACpC,mBAAmB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrD,+BAA+B,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,YAAY,CA+EnF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { parseVerificationDatabaseUrl } from "./verificationDatabaseUrl.js";
|
|
3
|
+
import { CLI_OPERATIONAL_CODES, runLevelIssue } from "./failureCatalog.js";
|
|
4
|
+
import { buildOutcomeCertificateFromWorkflowResult, } from "./outcomeCertificate.js";
|
|
5
|
+
import { verifyRunStateFromBufferedRunEvents } from "./verifyRunStateFromBufferedRunEvents.js";
|
|
6
|
+
import { loadSchemaValidator } from "./schemaLoad.js";
|
|
7
|
+
import { resolveVerificationPolicyInput } from "./verificationPolicy.js";
|
|
8
|
+
import { TruthLayerError } from "./truthLayerError.js";
|
|
9
|
+
import { trustDecisionFromCertificate } from "./trustDecision.js";
|
|
10
|
+
import { formatDecisionBlockerForHumans } from "./decisionBlocker.js";
|
|
11
|
+
import { DecisionUnsafeError } from "./decisionUnsafeError.js";
|
|
12
|
+
const validateEvent = loadSchemaValidator("event");
|
|
13
|
+
function verificationDatabaseFromUrl(databaseUrl, projectRoot) {
|
|
14
|
+
return parseVerificationDatabaseUrl(databaseUrl, projectRoot);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Runtime integration: buffer structured run events, evaluate against the registry + DB, assert before irreversible work.
|
|
18
|
+
*/
|
|
19
|
+
export function createDecisionGate(options) {
|
|
20
|
+
const projectRoot = path.resolve(options.projectRoot ?? process.cwd());
|
|
21
|
+
const registryPath = path.resolve(projectRoot, options.registryPath);
|
|
22
|
+
const verificationPolicy = resolveVerificationPolicyInput(options.verificationPolicy);
|
|
23
|
+
const database = verificationDatabaseFromUrl(options.databaseUrl, projectRoot);
|
|
24
|
+
const logStep = options.logStep ?? (() => { });
|
|
25
|
+
const truthReport = options.truthReport ?? (() => { });
|
|
26
|
+
const bufferedRunEvents = [];
|
|
27
|
+
const runLevelReasons = [];
|
|
28
|
+
const api = {};
|
|
29
|
+
api.appendRunEvent = (value) => {
|
|
30
|
+
if (typeof value !== "object" || value === null) {
|
|
31
|
+
runLevelReasons.push(runLevelIssue("MALFORMED_EVENT_LINE"));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (!validateEvent(value)) {
|
|
35
|
+
runLevelReasons.push(runLevelIssue("MALFORMED_EVENT_LINE"));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const ev = value;
|
|
39
|
+
if (ev.workflowId !== options.workflowId) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
bufferedRunEvents.push(ev);
|
|
43
|
+
};
|
|
44
|
+
api.toNdjsonUtf8 = () => {
|
|
45
|
+
const parts = [];
|
|
46
|
+
for (const ev of bufferedRunEvents) {
|
|
47
|
+
parts.push(`${JSON.stringify(ev)}\n`);
|
|
48
|
+
}
|
|
49
|
+
return Buffer.from(parts.join(""), "utf8");
|
|
50
|
+
};
|
|
51
|
+
api.evaluate = async () => {
|
|
52
|
+
if (!bufferedRunEvents.length && !runLevelReasons.length) {
|
|
53
|
+
throw new TruthLayerError(CLI_OPERATIONAL_CODES.CLI_USAGE, "DecisionGate.evaluate requires at least one buffered run event for the workflow.");
|
|
54
|
+
}
|
|
55
|
+
return verifyRunStateFromBufferedRunEvents({
|
|
56
|
+
workflowId: options.workflowId,
|
|
57
|
+
registryPath,
|
|
58
|
+
database,
|
|
59
|
+
projectRoot,
|
|
60
|
+
bufferedRunEvents,
|
|
61
|
+
runLevelReasons,
|
|
62
|
+
verificationPolicy,
|
|
63
|
+
logStep,
|
|
64
|
+
truthReport,
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
api.evaluateCertificate = async () => {
|
|
68
|
+
const result = await api.evaluate();
|
|
69
|
+
const certificate = buildOutcomeCertificateFromWorkflowResult(result, "contract_sql");
|
|
70
|
+
const validateCert = loadSchemaValidator("outcome-certificate-v1");
|
|
71
|
+
if (!validateCert(certificate)) {
|
|
72
|
+
throw new TruthLayerError(CLI_OPERATIONAL_CODES.WORKFLOW_RESULT_SCHEMA_INVALID, JSON.stringify(validateCert.errors ?? []));
|
|
73
|
+
}
|
|
74
|
+
return certificate;
|
|
75
|
+
};
|
|
76
|
+
api.assertSafeForIrreversibleAction = async () => {
|
|
77
|
+
const certificate = await api.evaluateCertificate();
|
|
78
|
+
if (trustDecisionFromCertificate(certificate) !== "safe") {
|
|
79
|
+
const { lines } = formatDecisionBlockerForHumans(certificate);
|
|
80
|
+
throw new DecisionUnsafeError(certificate, lines);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
return api;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=decisionGate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisionGate.js","sourceRoot":"","sources":["../src/decisionGate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisionGate.persistBundle.test.d.ts","sourceRoot":"","sources":["../src/decisionGate.persistBundle.test.ts"],"names":[],"mappings":""}
|
package/dist/{withWorkflowVerification.persistBundle.test.js → decisionGate.persistBundle.test.js}
RENAMED
|
@@ -7,14 +7,15 @@ import { DatabaseSync } from "node:sqlite";
|
|
|
7
7
|
import { describe, expect, it, beforeAll, afterAll } from "vitest";
|
|
8
8
|
import { normalizeSpkiPemForSidecar } from "./workflowResultSignature.js";
|
|
9
9
|
import { loadCorpusRun, resolveCorpusRootReal } from "./debugCorpus.js";
|
|
10
|
-
import {
|
|
10
|
+
import { createDecisionGate } from "./decisionGate.js";
|
|
11
|
+
import { writeRunBundleFromDecisionGate } from "./agentRunBundle.js";
|
|
11
12
|
import { verifyRunBundleSignature } from "./verifyRunBundleSignature.js";
|
|
12
13
|
const root = join(fileURLToPath(import.meta.url), "..", "..");
|
|
13
|
-
describe("
|
|
14
|
+
describe("DecisionGate run bundle write", () => {
|
|
14
15
|
let workDir;
|
|
15
16
|
let dbPath;
|
|
16
17
|
beforeAll(() => {
|
|
17
|
-
workDir = mkdtempSync(join(tmpdir(), "etl-
|
|
18
|
+
workDir = mkdtempSync(join(tmpdir(), "etl-dg-persist-"));
|
|
18
19
|
dbPath = join(workDir, "demo.db");
|
|
19
20
|
const sql = readFileSync(join(root, "examples", "seed.sql"), "utf8");
|
|
20
21
|
const db = new DatabaseSync(dbPath);
|
|
@@ -34,19 +35,24 @@ describe("withWorkflowVerification persistBundle", () => {
|
|
|
34
35
|
const runId = "hook_run";
|
|
35
36
|
const outDir = join(bundleParent, runId);
|
|
36
37
|
try {
|
|
37
|
-
const
|
|
38
|
+
const gate = createDecisionGate({
|
|
38
39
|
workflowId: wfId,
|
|
39
40
|
registryPath,
|
|
40
|
-
dbPath,
|
|
41
|
+
databaseUrl: dbPath,
|
|
42
|
+
projectRoot: root,
|
|
41
43
|
truthReport: () => { },
|
|
42
|
-
persistBundle: { outDir },
|
|
43
|
-
}, (observeStep) => {
|
|
44
|
-
for (const ev of events) {
|
|
45
|
-
observeStep(ev);
|
|
46
|
-
}
|
|
47
44
|
});
|
|
45
|
+
for (const ev of events) {
|
|
46
|
+
gate.appendRunEvent(ev);
|
|
47
|
+
}
|
|
48
|
+
const result = await gate.evaluate();
|
|
48
49
|
expect(result.steps.length).toBe(1);
|
|
49
50
|
expect(result.steps[0].status).toBe("verified");
|
|
51
|
+
writeRunBundleFromDecisionGate({
|
|
52
|
+
outDir,
|
|
53
|
+
eventsNdjson: gate.toNdjsonUtf8(),
|
|
54
|
+
workflowResult: result,
|
|
55
|
+
});
|
|
50
56
|
const loaded = loadCorpusRun(resolveCorpusRootReal(bundleParent), runId);
|
|
51
57
|
expect(loaded.loadStatus).toBe("ok");
|
|
52
58
|
const written = readFileSync(join(outDir, "events.ndjson"), "utf8").trim().split(/\r?\n/);
|
|
@@ -57,7 +63,7 @@ describe("withWorkflowVerification persistBundle", () => {
|
|
|
57
63
|
rmSync(bundleParent, { recursive: true, force: true });
|
|
58
64
|
}
|
|
59
65
|
});
|
|
60
|
-
it("
|
|
66
|
+
it("ed25519PrivateKeyPemPath writes v2 bundle verifiable by verifyRunBundleSignature", async () => {
|
|
61
67
|
const eventsPath = join(root, "examples", "events.ndjson");
|
|
62
68
|
const registryPath = join(root, "examples", "tools.json");
|
|
63
69
|
const wfId = "wf_complete";
|
|
@@ -74,16 +80,22 @@ describe("withWorkflowVerification persistBundle", () => {
|
|
|
74
80
|
writeFileSync(keyPath, privatePem, "utf8");
|
|
75
81
|
writeFileSync(pubPath, normalizeSpkiPemForSidecar(publicPem), "utf8");
|
|
76
82
|
try {
|
|
77
|
-
|
|
83
|
+
const gate = createDecisionGate({
|
|
78
84
|
workflowId: wfId,
|
|
79
85
|
registryPath,
|
|
80
|
-
dbPath,
|
|
86
|
+
databaseUrl: dbPath,
|
|
87
|
+
projectRoot: root,
|
|
81
88
|
truthReport: () => { },
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
89
|
+
});
|
|
90
|
+
for (const ev of events) {
|
|
91
|
+
gate.appendRunEvent(ev);
|
|
92
|
+
}
|
|
93
|
+
const result = await gate.evaluate();
|
|
94
|
+
writeRunBundleFromDecisionGate({
|
|
95
|
+
outDir,
|
|
96
|
+
eventsNdjson: gate.toNdjsonUtf8(),
|
|
97
|
+
workflowResult: result,
|
|
98
|
+
ed25519PrivateKeyPemPath: keyPath,
|
|
87
99
|
});
|
|
88
100
|
const loaded = loadCorpusRun(resolveCorpusRootReal(bundleParent), runId);
|
|
89
101
|
expect(loaded.loadStatus).toBe("ok");
|
|
@@ -101,4 +113,4 @@ describe("withWorkflowVerification persistBundle", () => {
|
|
|
101
113
|
}
|
|
102
114
|
});
|
|
103
115
|
});
|
|
104
|
-
//# sourceMappingURL=
|
|
116
|
+
//# sourceMappingURL=decisionGate.persistBundle.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisionGate.persistBundle.test.js","sourceRoot":"","sources":["../src/decisionGate.persistBundle.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { OutcomeCertificateV1 } from "./outcomeCertificate.js";
|
|
2
|
+
import type { TrustDecision } from "./trustDecision.js";
|
|
3
|
+
export declare class DecisionUnsafeError extends Error {
|
|
4
|
+
readonly trustDecision: TrustDecision;
|
|
5
|
+
readonly certificate: OutcomeCertificateV1;
|
|
6
|
+
constructor(certificate: OutcomeCertificateV1, lines: string[]);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=decisionUnsafeError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisionUnsafeError.d.ts","sourceRoot":"","sources":["../src/decisionUnsafeError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;gBAE/B,WAAW,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE;CAM/D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { trustDecisionFromCertificate } from "./trustDecision.js";
|
|
2
|
+
export class DecisionUnsafeError extends Error {
|
|
3
|
+
trustDecision;
|
|
4
|
+
certificate;
|
|
5
|
+
constructor(certificate, lines) {
|
|
6
|
+
super(lines.join("\n"));
|
|
7
|
+
this.name = "DecisionUnsafeError";
|
|
8
|
+
this.certificate = certificate;
|
|
9
|
+
this.trustDecision = trustDecisionFromCertificate(certificate);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=decisionUnsafeError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisionUnsafeError.js","sourceRoot":"","sources":["../src/decisionUnsafeError.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAElE,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,aAAa,CAAgB;IAC7B,WAAW,CAAuB;IAE3C,YAAY,WAAiC,EAAE,KAAe;QAC5D,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC;CACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"identityOneLiner": "
|
|
3
|
+
"identityOneLiner": "Read-only checks at verify time—not color.",
|
|
4
4
|
"llmBranch": "main",
|
|
5
5
|
"links": {
|
|
6
6
|
"site": "https://agentskeptic.com/",
|
|
@@ -11,110 +11,218 @@
|
|
|
11
11
|
"repo": "https://github.com/jwekavanagh/agentskeptic",
|
|
12
12
|
"npm": "https://www.npmjs.com/package/agentskeptic",
|
|
13
13
|
"llmsRaw": "https://raw.githubusercontent.com/jwekavanagh/agentskeptic/refs/heads/main/llms.txt",
|
|
14
|
-
"llmsBlob": "https://github.com/jwekavanagh/agentskeptic/blob/main/llms.txt"
|
|
14
|
+
"llmsBlob": "https://github.com/jwekavanagh/agentskeptic/blob/main/llms.txt",
|
|
15
|
+
"integratorVerificationSsotRaw": "https://raw.githubusercontent.com/jwekavanagh/agentskeptic/refs/heads/main/docs/integrator-verification.md"
|
|
15
16
|
},
|
|
16
17
|
"appendix": {
|
|
17
18
|
"slug": "/database-truth-vs-traces",
|
|
18
|
-
"visitorProblemAnswer": "
|
|
19
|
+
"visitorProblemAnswer": "Traces say success. Your data often disagrees. Read-only checks at verify time compare tool claims to stored state—before you ship or bill.",
|
|
19
20
|
"intentPhrases": [
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"structured tool activity NDJSON verification",
|
|
24
|
-
"ROW_ABSENT inconsistent workflow result"
|
|
21
|
+
"trace v data",
|
|
22
|
+
"read-only verify",
|
|
23
|
+
"ROW_ABSENT"
|
|
25
24
|
],
|
|
26
25
|
"notFor": [
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
26
|
+
"logs",
|
|
27
|
+
"HTTP proof",
|
|
28
|
+
"no store"
|
|
30
29
|
],
|
|
31
30
|
"relatedQueries": [
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"compare tool parameters to sql row verification",
|
|
36
|
-
"agent run record workflow result json"
|
|
31
|
+
"langgraph",
|
|
32
|
+
"agent verify",
|
|
33
|
+
"trace data"
|
|
37
34
|
],
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
35
|
+
"problemIndex": [
|
|
36
|
+
{
|
|
37
|
+
"moment": "Green trace, bad data",
|
|
38
|
+
"primaryRoute": "/guides/trace-green-postgres-row-missing",
|
|
39
|
+
"relatedRoutes": [
|
|
40
|
+
"/integrate",
|
|
41
|
+
"/database-truth-vs-traces"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"moment": "Tool ok, CRM wrong",
|
|
46
|
+
"primaryRoute": "/guides/tool-loop-success-crm-state-wrong",
|
|
47
|
+
"relatedRoutes": [
|
|
48
|
+
"/integrate",
|
|
49
|
+
"/pricing"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"moment": "CI green, no write",
|
|
54
|
+
"primaryRoute": "/guides/ci-green-logs-row-absent",
|
|
55
|
+
"relatedRoutes": [
|
|
56
|
+
"/guides/ci-green-missing-database-side-effect",
|
|
57
|
+
"/integrate"
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"moment": "Pre-prod read-only gate",
|
|
62
|
+
"primaryRoute": "/guides/pre-production-read-only-sql-gate",
|
|
63
|
+
"relatedRoutes": [
|
|
64
|
+
"/integrate",
|
|
65
|
+
"/pricing"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"moment": "AI CRM data wrong",
|
|
70
|
+
"primaryRoute": "/guides/ai-agent-wrong-crm-data",
|
|
71
|
+
"relatedRoutes": [
|
|
72
|
+
"/database-truth-vs-traces"
|
|
73
|
+
]
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"moment": "Params vs store",
|
|
77
|
+
"primaryRoute": "/guides/automation-success-database-mismatch",
|
|
78
|
+
"relatedRoutes": [
|
|
79
|
+
"/integrate"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"moment": "LangGraph data check",
|
|
84
|
+
"primaryRoute": "/guides/debug-postgres-after-langgraph",
|
|
85
|
+
"relatedRoutes": [
|
|
86
|
+
"/guides/verify-langgraph-workflows",
|
|
87
|
+
"/integrate"
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"moment": "Webhook vs ledger",
|
|
92
|
+
"primaryRoute": "/guides/stripe-webhook-database-alignment",
|
|
93
|
+
"relatedRoutes": [
|
|
94
|
+
"/pricing"
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"moment": "CI green, no effect",
|
|
99
|
+
"primaryRoute": "/guides/scenario-ci-green-side-effect-missing",
|
|
100
|
+
"relatedRoutes": [
|
|
101
|
+
"/guides/ci-green-missing-database-side-effect",
|
|
102
|
+
"/integrate"
|
|
103
|
+
]
|
|
104
|
+
}
|
|
48
105
|
],
|
|
49
106
|
"indexableGuides": [
|
|
50
107
|
{
|
|
51
|
-
"path": "/guides/
|
|
52
|
-
"navLabel": "
|
|
53
|
-
"problemAnchor": "
|
|
108
|
+
"path": "/guides/ai-agent-wrong-crm-data",
|
|
109
|
+
"navLabel": "ai-agent-wrong-crm-data",
|
|
110
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/ai-agent-wrong-crm-data — read-only SQL verification context."
|
|
54
111
|
},
|
|
55
112
|
{
|
|
56
|
-
"path": "/guides/
|
|
57
|
-
"navLabel": "
|
|
58
|
-
"problemAnchor": "
|
|
113
|
+
"path": "/guides/automation-success-database-mismatch",
|
|
114
|
+
"navLabel": "automation-success-database-mismatch",
|
|
115
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/automation-success-database-mismatch — read-only SQL verification context."
|
|
59
116
|
},
|
|
60
117
|
{
|
|
61
|
-
"path": "/guides/
|
|
62
|
-
"navLabel": "
|
|
63
|
-
"problemAnchor": "
|
|
118
|
+
"path": "/guides/buyer-ci-enforcement-metering",
|
|
119
|
+
"navLabel": "buyer-ci-enforcement-metering",
|
|
120
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/buyer-ci-enforcement-metering — read-only SQL verification context."
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"path": "/guides/buyer-commercial-boundary",
|
|
124
|
+
"navLabel": "buyer-commercial-boundary",
|
|
125
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/buyer-commercial-boundary — read-only SQL verification context."
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"path": "/guides/buyer-trust-production-implications",
|
|
129
|
+
"navLabel": "buyer-trust-production-implications",
|
|
130
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/buyer-trust-production-implications — read-only SQL verification context."
|
|
64
131
|
},
|
|
65
132
|
{
|
|
66
133
|
"path": "/guides/ci-green-logs-row-absent",
|
|
67
|
-
"navLabel": "
|
|
68
|
-
"problemAnchor": "
|
|
134
|
+
"navLabel": "ci-green-logs-row-absent",
|
|
135
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/ci-green-logs-row-absent — read-only SQL verification context."
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"path": "/guides/ci-green-missing-database-side-effect",
|
|
139
|
+
"navLabel": "ci-green-missing-database-side-effect",
|
|
140
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/ci-green-missing-database-side-effect — read-only SQL verification context."
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"path": "/guides/debug-postgres-after-langgraph",
|
|
144
|
+
"navLabel": "debug-postgres-after-langgraph",
|
|
145
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/debug-postgres-after-langgraph — read-only SQL verification context."
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"path": "/guides/first-run-verification",
|
|
149
|
+
"navLabel": "first-run-verification",
|
|
150
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/first-run-verification — read-only SQL verification context."
|
|
69
151
|
},
|
|
70
152
|
{
|
|
71
153
|
"path": "/guides/pre-production-read-only-sql-gate",
|
|
72
|
-
"navLabel": "
|
|
73
|
-
"problemAnchor": "
|
|
154
|
+
"navLabel": "pre-production-read-only-sql-gate",
|
|
155
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/pre-production-read-only-sql-gate — read-only SQL verification context."
|
|
74
156
|
},
|
|
75
157
|
{
|
|
76
|
-
"path": "/guides/
|
|
77
|
-
"navLabel": "
|
|
78
|
-
"problemAnchor": "
|
|
158
|
+
"path": "/guides/scenario-agent-crm-silent-drift",
|
|
159
|
+
"navLabel": "scenario-agent-crm-silent-drift",
|
|
160
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/scenario-agent-crm-silent-drift — read-only SQL verification context."
|
|
79
161
|
},
|
|
80
162
|
{
|
|
81
|
-
"path": "/guides/
|
|
82
|
-
"navLabel": "
|
|
83
|
-
"problemAnchor": "
|
|
163
|
+
"path": "/guides/scenario-ci-green-side-effect-missing",
|
|
164
|
+
"navLabel": "scenario-ci-green-side-effect-missing",
|
|
165
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/scenario-ci-green-side-effect-missing — read-only SQL verification context."
|
|
84
166
|
},
|
|
85
167
|
{
|
|
86
|
-
"path": "/guides/
|
|
87
|
-
"navLabel": "
|
|
88
|
-
"problemAnchor": "
|
|
168
|
+
"path": "/guides/scenario-green-trace-row-missing",
|
|
169
|
+
"navLabel": "scenario-green-trace-row-missing",
|
|
170
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/scenario-green-trace-row-missing — read-only SQL verification context."
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"path": "/guides/scenario-preprod-gate-before-ship",
|
|
174
|
+
"navLabel": "scenario-preprod-gate-before-ship",
|
|
175
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/scenario-preprod-gate-before-ship — read-only SQL verification context."
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"path": "/guides/scenario-stripe-webhook-ledger-mismatch",
|
|
179
|
+
"navLabel": "scenario-stripe-webhook-ledger-mismatch",
|
|
180
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/scenario-stripe-webhook-ledger-mismatch — read-only SQL verification context."
|
|
89
181
|
},
|
|
90
182
|
{
|
|
91
183
|
"path": "/guides/stripe-webhook-database-alignment",
|
|
92
|
-
"navLabel": "
|
|
93
|
-
"problemAnchor": "
|
|
184
|
+
"navLabel": "stripe-webhook-database-alignment",
|
|
185
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/stripe-webhook-database-alignment — read-only SQL verification context."
|
|
94
186
|
},
|
|
95
187
|
{
|
|
96
|
-
"path": "/guides/
|
|
97
|
-
"navLabel": "
|
|
98
|
-
"problemAnchor": "
|
|
188
|
+
"path": "/guides/tool-loop-success-crm-state-wrong",
|
|
189
|
+
"navLabel": "tool-loop-success-crm-state-wrong",
|
|
190
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/tool-loop-success-crm-state-wrong — read-only SQL verification context."
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
"path": "/guides/trace-green-postgres-row-missing",
|
|
194
|
+
"navLabel": "trace-green-postgres-row-missing",
|
|
195
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/trace-green-postgres-row-missing — read-only SQL verification context."
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"path": "/guides/verify-langgraph-workflows",
|
|
199
|
+
"navLabel": "verify-langgraph-workflows",
|
|
200
|
+
"problemAnchor": "Markdown-backed discovery surface content for /guides/verify-langgraph-workflows — read-only SQL verification context."
|
|
99
201
|
}
|
|
100
202
|
],
|
|
101
203
|
"indexableExamples": [
|
|
204
|
+
{
|
|
205
|
+
"path": "/examples/langgraph-checkpoint-trust",
|
|
206
|
+
"navLabel": "langgraph-checkpoint-trust",
|
|
207
|
+
"problemAnchor": "Markdown-backed discovery surface content for /examples/langgraph-checkpoint-trust — read-only SQL verification context.",
|
|
208
|
+
"embedKey": "langgraph_checkpoint_trust"
|
|
209
|
+
},
|
|
102
210
|
{
|
|
103
211
|
"path": "/examples/wf-complete",
|
|
104
|
-
"navLabel": "
|
|
105
|
-
"problemAnchor": "
|
|
212
|
+
"navLabel": "wf-complete",
|
|
213
|
+
"problemAnchor": "Markdown-backed discovery surface content for /examples/wf-complete — read-only SQL verification context.",
|
|
106
214
|
"embedKey": "wf_complete"
|
|
107
215
|
},
|
|
108
216
|
{
|
|
109
217
|
"path": "/examples/wf-missing",
|
|
110
|
-
"navLabel": "
|
|
111
|
-
"problemAnchor": "
|
|
218
|
+
"navLabel": "wf-missing",
|
|
219
|
+
"problemAnchor": "Markdown-backed discovery surface content for /examples/wf-missing — read-only SQL verification context.",
|
|
112
220
|
"embedKey": "wf_missing"
|
|
113
221
|
}
|
|
114
222
|
],
|
|
115
223
|
"shareableTerminalDemo": {
|
|
116
|
-
"title": "
|
|
117
|
-
"transcript": "### Success (`wf_complete`)\n\nworkflow_id: wf_complete\nworkflow_status: complete\ntrust: TRUSTED: Every step matched the database under the configured verification rules.\nsteps:\n - seq=0 tool=crm.upsert_contact result=Matched the database.\n\n{\n \"schemaVersion\": 15,\n \"workflowId\": \"wf_complete\",\n \"status\": \"complete\",\n \"steps\": [{ \"seq\": 0, \"toolId\": \"crm.upsert_contact\", \"status\": \"verified\" }]\n}\n\n### Failure (`wf_missing`)\n\nworkflow_id: wf_missing\nworkflow_status: inconsistent\nsteps:\n - seq=0 tool=crm.upsert_contact result
|
|
224
|
+
"title": "Bundled terminal proof",
|
|
225
|
+
"transcript": "### Success (`wf_complete`)\n\nworkflow_id: wf_complete\nworkflow_status: complete\ntrust: TRUSTED: Every step matched the database under the configured verification rules.\nsteps:\n - seq=0 tool=crm.upsert_contact result=Matched the database.\n\n{\n \"schemaVersion\": 15,\n \"workflowId\": \"wf_complete\",\n \"status\": \"complete\",\n \"steps\": [{ \"seq\": 0, \"toolId\": \"crm.upsert_contact\", \"status\": \"verified\" }]\n}\n\n### Failure (`wf_missing`)\n\nworkflow_id: wf_missing\nworkflow_status: inconsistent\nsteps:\n - seq=0 tool=crm.upsert_contact result:Expected row is missing from the database (the log implies a write that is not present).\n reference_code: ROW_ABSENT\n\n{\n \"schemaVersion\": 15,\n \"workflowId\": \"wf_missing\",\n \"status\": \"inconsistent\",\n \"steps\": [\n {\n \"seq\": 0,\n \"toolId\": \"crm.upsert_contact\",\n \"status\": \"missing\",\n \"reasons\": [{ \"code\": \"ROW_ABSENT\" }]\n }\n ]\n}"
|
|
118
226
|
}
|
|
119
227
|
}
|
|
120
228
|
}
|