agentskeptic 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +342 -0
- package/dist/actionableFailure.d.ts +53 -0
- package/dist/actionableFailure.d.ts.map +1 -0
- package/dist/actionableFailure.js +424 -0
- package/dist/actionableFailure.js.map +1 -0
- package/dist/actionableFailure.partitionExhaustive.test.d.ts +2 -0
- package/dist/actionableFailure.partitionExhaustive.test.d.ts.map +1 -0
- package/dist/actionableFailure.partitionExhaustive.test.js +20 -0
- package/dist/actionableFailure.partitionExhaustive.test.js.map +1 -0
- package/dist/actionableFailure.remediationExhaustive.test.d.ts +2 -0
- package/dist/actionableFailure.remediationExhaustive.test.d.ts.map +1 -0
- package/dist/actionableFailure.remediationExhaustive.test.js +297 -0
- package/dist/actionableFailure.remediationExhaustive.test.js.map +1 -0
- package/dist/actionableFailure.test.d.ts +2 -0
- package/dist/actionableFailure.test.d.ts.map +1 -0
- package/dist/actionableFailure.test.js +211 -0
- package/dist/actionableFailure.test.js.map +1 -0
- package/dist/agentRunBundle.d.ts +24 -0
- package/dist/agentRunBundle.d.ts.map +1 -0
- package/dist/agentRunBundle.js +114 -0
- package/dist/agentRunBundle.js.map +1 -0
- package/dist/agentRunBundle.rollback.test.d.ts +2 -0
- package/dist/agentRunBundle.rollback.test.d.ts.map +1 -0
- package/dist/agentRunBundle.rollback.test.js +65 -0
- package/dist/agentRunBundle.rollback.test.js.map +1 -0
- package/dist/agentRunBundle.test.d.ts +2 -0
- package/dist/agentRunBundle.test.d.ts.map +1 -0
- package/dist/agentRunBundle.test.js +126 -0
- package/dist/agentRunBundle.test.js.map +1 -0
- package/dist/agentRunRecord.d.ts +82 -0
- package/dist/agentRunRecord.d.ts.map +1 -0
- package/dist/agentRunRecord.js +51 -0
- package/dist/agentRunRecord.js.map +1 -0
- package/dist/agentRunRecord.test.d.ts +2 -0
- package/dist/agentRunRecord.test.d.ts.map +1 -0
- package/dist/agentRunRecord.test.js +49 -0
- package/dist/agentRunRecord.test.js.map +1 -0
- package/dist/aggregate.d.ts +3 -0
- package/dist/aggregate.d.ts.map +1 -0
- package/dist/aggregate.js +36 -0
- package/dist/aggregate.js.map +1 -0
- package/dist/assurance/assurancePathArgs.d.ts +10 -0
- package/dist/assurance/assurancePathArgs.d.ts.map +1 -0
- package/dist/assurance/assurancePathArgs.js +54 -0
- package/dist/assurance/assurancePathArgs.js.map +1 -0
- package/dist/assurance/checkStale.d.ts +14 -0
- package/dist/assurance/checkStale.d.ts.map +1 -0
- package/dist/assurance/checkStale.js +48 -0
- package/dist/assurance/checkStale.js.map +1 -0
- package/dist/assurance/findRepoRoot.d.ts +6 -0
- package/dist/assurance/findRepoRoot.d.ts.map +1 -0
- package/dist/assurance/findRepoRoot.js +27 -0
- package/dist/assurance/findRepoRoot.js.map +1 -0
- package/dist/assurance/runAssurance.d.ts +24 -0
- package/dist/assurance/runAssurance.d.ts.map +1 -0
- package/dist/assurance/runAssurance.js +105 -0
- package/dist/assurance/runAssurance.js.map +1 -0
- package/dist/bundleSignatureCodes.d.ts +13 -0
- package/dist/bundleSignatureCodes.d.ts.map +1 -0
- package/dist/bundleSignatureCodes.js +12 -0
- package/dist/bundleSignatureCodes.js.map +1 -0
- package/dist/canonicalParams.d.ts +3 -0
- package/dist/canonicalParams.d.ts.map +1 -0
- package/dist/canonicalParams.js +16 -0
- package/dist/canonicalParams.js.map +1 -0
- package/dist/ciLock.d.ts +52 -0
- package/dist/ciLock.d.ts.map +1 -0
- package/dist/ciLock.js +117 -0
- package/dist/ciLock.js.map +1 -0
- package/dist/ciLockWorkflow.d.ts +4 -0
- package/dist/ciLockWorkflow.d.ts.map +1 -0
- package/dist/ciLockWorkflow.js +278 -0
- package/dist/ciLockWorkflow.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.failureExplanationInvariant.test.d.ts +2 -0
- package/dist/cli.failureExplanationInvariant.test.d.ts.map +1 -0
- package/dist/cli.failureExplanationInvariant.test.js +40 -0
- package/dist/cli.failureExplanationInvariant.test.js.map +1 -0
- package/dist/cli.js +998 -0
- package/dist/cli.js.map +1 -0
- package/dist/cliArgv.d.ts +40 -0
- package/dist/cliArgv.d.ts.map +1 -0
- package/dist/cliArgv.js +149 -0
- package/dist/cliArgv.js.map +1 -0
- package/dist/cliOperationalCodes.d.ts +65 -0
- package/dist/cliOperationalCodes.d.ts.map +1 -0
- package/dist/cliOperationalCodes.js +64 -0
- package/dist/cliOperationalCodes.js.map +1 -0
- package/dist/commercial/licensePreflight.d.ts +7 -0
- package/dist/commercial/licensePreflight.d.ts.map +1 -0
- package/dist/commercial/licensePreflight.js +95 -0
- package/dist/commercial/licensePreflight.js.map +1 -0
- package/dist/commercial/licensePreflight.test.d.ts +2 -0
- package/dist/commercial/licensePreflight.test.d.ts.map +1 -0
- package/dist/commercial/licensePreflight.test.js +123 -0
- package/dist/commercial/licensePreflight.test.js.map +1 -0
- package/dist/compare.acceptance.test.d.ts +2 -0
- package/dist/compare.acceptance.test.d.ts.map +1 -0
- package/dist/compare.acceptance.test.js +80 -0
- package/dist/compare.acceptance.test.js.map +1 -0
- package/dist/correctnessDefinition.d.ts +23 -0
- package/dist/correctnessDefinition.d.ts.map +1 -0
- package/dist/correctnessDefinition.docParity.test.d.ts +2 -0
- package/dist/correctnessDefinition.docParity.test.d.ts.map +1 -0
- package/dist/correctnessDefinition.docParity.test.js +22 -0
- package/dist/correctnessDefinition.docParity.test.js.map +1 -0
- package/dist/correctnessDefinition.js +283 -0
- package/dist/correctnessDefinition.js.map +1 -0
- package/dist/correctnessDefinitionTemplates.d.ts +70 -0
- package/dist/correctnessDefinitionTemplates.d.ts.map +1 -0
- package/dist/correctnessDefinitionTemplates.js +121 -0
- package/dist/correctnessDefinitionTemplates.js.map +1 -0
- package/dist/debug-ui/app.css +188 -0
- package/dist/debug-ui/app.js +245 -0
- package/dist/debug-ui/index.html +79 -0
- package/dist/debugCorpus.d.ts +68 -0
- package/dist/debugCorpus.d.ts.map +1 -0
- package/dist/debugCorpus.js +544 -0
- package/dist/debugCorpus.js.map +1 -0
- package/dist/debugCorpus.test.d.ts +2 -0
- package/dist/debugCorpus.test.d.ts.map +1 -0
- package/dist/debugCorpus.test.js +159 -0
- package/dist/debugCorpus.test.js.map +1 -0
- package/dist/debugFocus.d.ts +16 -0
- package/dist/debugFocus.d.ts.map +1 -0
- package/dist/debugFocus.js +51 -0
- package/dist/debugFocus.js.map +1 -0
- package/dist/debugFocus.test.d.ts +2 -0
- package/dist/debugFocus.test.d.ts.map +1 -0
- package/dist/debugFocus.test.js +43 -0
- package/dist/debugFocus.test.js.map +1 -0
- package/dist/debugPanels.d.ts +13 -0
- package/dist/debugPanels.d.ts.map +1 -0
- package/dist/debugPanels.js +113 -0
- package/dist/debugPanels.js.map +1 -0
- package/dist/debugPanels.test.d.ts +2 -0
- package/dist/debugPanels.test.d.ts.map +1 -0
- package/dist/debugPanels.test.js +204 -0
- package/dist/debugPanels.test.js.map +1 -0
- package/dist/debugPatterns.d.ts +47 -0
- package/dist/debugPatterns.d.ts.map +1 -0
- package/dist/debugPatterns.js +113 -0
- package/dist/debugPatterns.js.map +1 -0
- package/dist/debugPatterns.test.d.ts +2 -0
- package/dist/debugPatterns.test.d.ts.map +1 -0
- package/dist/debugPatterns.test.js +48 -0
- package/dist/debugPatterns.test.js.map +1 -0
- package/dist/debugRunFilters.d.ts +31 -0
- package/dist/debugRunFilters.d.ts.map +1 -0
- package/dist/debugRunFilters.js +118 -0
- package/dist/debugRunFilters.js.map +1 -0
- package/dist/debugRunFilters.test.d.ts +2 -0
- package/dist/debugRunFilters.test.d.ts.map +1 -0
- package/dist/debugRunFilters.test.js +78 -0
- package/dist/debugRunFilters.test.js.map +1 -0
- package/dist/debugRunIndex.d.ts +27 -0
- package/dist/debugRunIndex.d.ts.map +1 -0
- package/dist/debugRunIndex.js +58 -0
- package/dist/debugRunIndex.js.map +1 -0
- package/dist/debugServer.d.ts +19 -0
- package/dist/debugServer.d.ts.map +1 -0
- package/dist/debugServer.js +315 -0
- package/dist/debugServer.js.map +1 -0
- package/dist/debugServer.test.d.ts +2 -0
- package/dist/debugServer.test.d.ts.map +1 -0
- package/dist/debugServer.test.js +207 -0
- package/dist/debugServer.test.js.map +1 -0
- package/dist/discovery-payload-v1.json +75 -0
- package/dist/distributionFooter.d.ts +3 -0
- package/dist/distributionFooter.d.ts.map +1 -0
- package/dist/distributionFooter.js +3 -0
- package/dist/distributionFooter.js.map +1 -0
- package/dist/documentationCopyConsistency.test.d.ts +2 -0
- package/dist/documentationCopyConsistency.test.d.ts.map +1 -0
- package/dist/documentationCopyConsistency.test.js +94 -0
- package/dist/documentationCopyConsistency.test.js.map +1 -0
- package/dist/enforceCli.d.ts +4 -0
- package/dist/enforceCli.d.ts.map +1 -0
- package/dist/enforceCli.js +93 -0
- package/dist/enforceCli.js.map +1 -0
- package/dist/eventSequenceIntegrity.d.ts +7 -0
- package/dist/eventSequenceIntegrity.d.ts.map +1 -0
- package/dist/eventSequenceIntegrity.js +47 -0
- package/dist/eventSequenceIntegrity.js.map +1 -0
- package/dist/eventSequenceIntegrity.test.d.ts +2 -0
- package/dist/eventSequenceIntegrity.test.d.ts.map +1 -0
- package/dist/eventSequenceIntegrity.test.js +65 -0
- package/dist/eventSequenceIntegrity.test.js.map +1 -0
- package/dist/executionPathFindings.d.ts +15 -0
- package/dist/executionPathFindings.d.ts.map +1 -0
- package/dist/executionPathFindings.js +299 -0
- package/dist/executionPathFindings.js.map +1 -0
- package/dist/executionPathFindings.requirements.test.d.ts +2 -0
- package/dist/executionPathFindings.requirements.test.d.ts.map +1 -0
- package/dist/executionPathFindings.requirements.test.js +332 -0
- package/dist/executionPathFindings.requirements.test.js.map +1 -0
- package/dist/executionTrace.d.ts +13 -0
- package/dist/executionTrace.d.ts.map +1 -0
- package/dist/executionTrace.js +272 -0
- package/dist/executionTrace.js.map +1 -0
- package/dist/executionTrace.test.d.ts +2 -0
- package/dist/executionTrace.test.d.ts.map +1 -0
- package/dist/executionTrace.test.js +200 -0
- package/dist/executionTrace.test.js.map +1 -0
- package/dist/failureAnalysis.d.ts +8 -0
- package/dist/failureAnalysis.d.ts.map +1 -0
- package/dist/failureAnalysis.js +337 -0
- package/dist/failureAnalysis.js.map +1 -0
- package/dist/failureAnalysis.test.d.ts +2 -0
- package/dist/failureAnalysis.test.d.ts.map +1 -0
- package/dist/failureAnalysis.test.js +196 -0
- package/dist/failureAnalysis.test.js.map +1 -0
- package/dist/failureCatalog.d.ts +26 -0
- package/dist/failureCatalog.d.ts.map +1 -0
- package/dist/failureCatalog.js +51 -0
- package/dist/failureCatalog.js.map +1 -0
- package/dist/failureCatalog.test.d.ts +2 -0
- package/dist/failureCatalog.test.d.ts.map +1 -0
- package/dist/failureCatalog.test.js +25 -0
- package/dist/failureCatalog.test.js.map +1 -0
- package/dist/failureExplanation.d.ts +52 -0
- package/dist/failureExplanation.d.ts.map +1 -0
- package/dist/failureExplanation.failureAnalysisMock.test.d.ts +2 -0
- package/dist/failureExplanation.failureAnalysisMock.test.d.ts.map +1 -0
- package/dist/failureExplanation.failureAnalysisMock.test.js +200 -0
- package/dist/failureExplanation.failureAnalysisMock.test.js.map +1 -0
- package/dist/failureExplanation.golden.test.d.ts +2 -0
- package/dist/failureExplanation.golden.test.d.ts.map +1 -0
- package/dist/failureExplanation.golden.test.js +530 -0
- package/dist/failureExplanation.golden.test.js.map +1 -0
- package/dist/failureExplanation.js +389 -0
- package/dist/failureExplanation.js.map +1 -0
- package/dist/failureExplanationDocumentationParity.test.d.ts +2 -0
- package/dist/failureExplanationDocumentationParity.test.d.ts.map +1 -0
- package/dist/failureExplanationDocumentationParity.test.js +56 -0
- package/dist/failureExplanationDocumentationParity.test.js.map +1 -0
- package/dist/failureOriginCatalog.d.ts +30 -0
- package/dist/failureOriginCatalog.d.ts.map +1 -0
- package/dist/failureOriginCatalog.js +106 -0
- package/dist/failureOriginCatalog.js.map +1 -0
- package/dist/failureOriginCatalog.test.d.ts +2 -0
- package/dist/failureOriginCatalog.test.d.ts.map +1 -0
- package/dist/failureOriginCatalog.test.js +17 -0
- package/dist/failureOriginCatalog.test.js.map +1 -0
- package/dist/failureOriginSchemaEnum.test.d.ts +2 -0
- package/dist/failureOriginSchemaEnum.test.d.ts.map +1 -0
- package/dist/failureOriginSchemaEnum.test.js +21 -0
- package/dist/failureOriginSchemaEnum.test.js.map +1 -0
- package/dist/failureOriginSchemaParity.test.d.ts +2 -0
- package/dist/failureOriginSchemaParity.test.d.ts.map +1 -0
- package/dist/failureOriginSchemaParity.test.js +33 -0
- package/dist/failureOriginSchemaParity.test.js.map +1 -0
- package/dist/failureOriginTypes.d.ts +4 -0
- package/dist/failureOriginTypes.d.ts.map +1 -0
- package/dist/failureOriginTypes.generated.d.ts +4 -0
- package/dist/failureOriginTypes.generated.d.ts.map +1 -0
- package/dist/failureOriginTypes.generated.js +10 -0
- package/dist/failureOriginTypes.generated.js.map +1 -0
- package/dist/failureOriginTypes.js +3 -0
- package/dist/failureOriginTypes.js.map +1 -0
- package/dist/generated/commercialBuildFlags.d.ts +4 -0
- package/dist/generated/commercialBuildFlags.d.ts.map +1 -0
- package/dist/generated/commercialBuildFlags.js +5 -0
- package/dist/generated/commercialBuildFlags.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/jsonPointer.d.ts +3 -0
- package/dist/jsonPointer.d.ts.map +1 -0
- package/dist/jsonPointer.js +28 -0
- package/dist/jsonPointer.js.map +1 -0
- package/dist/jsonStableStringify.d.ts +3 -0
- package/dist/jsonStableStringify.d.ts.map +1 -0
- package/dist/jsonStableStringify.js +3 -0
- package/dist/jsonStableStringify.js.map +1 -0
- package/dist/loadEvents.d.ts +3 -0
- package/dist/loadEvents.d.ts.map +1 -0
- package/dist/loadEvents.eventFileAggregateCounts.test.d.ts +2 -0
- package/dist/loadEvents.eventFileAggregateCounts.test.d.ts.map +1 -0
- package/dist/loadEvents.eventFileAggregateCounts.test.js +18 -0
- package/dist/loadEvents.eventFileAggregateCounts.test.js.map +1 -0
- package/dist/loadEvents.js +85 -0
- package/dist/loadEvents.js.map +1 -0
- package/dist/multiEffectRollup.d.ts +43 -0
- package/dist/multiEffectRollup.d.ts.map +1 -0
- package/dist/multiEffectRollup.js +164 -0
- package/dist/multiEffectRollup.js.map +1 -0
- package/dist/multiEffectRollup.test.d.ts +2 -0
- package/dist/multiEffectRollup.test.d.ts.map +1 -0
- package/dist/multiEffectRollup.test.js +128 -0
- package/dist/multiEffectRollup.test.js.map +1 -0
- package/dist/noStepsMessage.d.ts +7 -0
- package/dist/noStepsMessage.d.ts.map +1 -0
- package/dist/noStepsMessage.js +12 -0
- package/dist/noStepsMessage.js.map +1 -0
- package/dist/noStepsMessage.test.d.ts +2 -0
- package/dist/noStepsMessage.test.d.ts.map +1 -0
- package/dist/noStepsMessage.test.js +15 -0
- package/dist/noStepsMessage.test.js.map +1 -0
- package/dist/operationalDisposition.d.ts +498 -0
- package/dist/operationalDisposition.d.ts.map +1 -0
- package/dist/operationalDisposition.js +490 -0
- package/dist/operationalDisposition.js.map +1 -0
- package/dist/operationalDispositionDerivation.test.d.ts +2 -0
- package/dist/operationalDispositionDerivation.test.d.ts.map +1 -0
- package/dist/operationalDispositionDerivation.test.js +19 -0
- package/dist/operationalDispositionDerivation.test.js.map +1 -0
- package/dist/operationalFailureDiagnosis.d.ts +3 -0
- package/dist/operationalFailureDiagnosis.d.ts.map +1 -0
- package/dist/operationalFailureDiagnosis.js +25 -0
- package/dist/operationalFailureDiagnosis.js.map +1 -0
- package/dist/pipeline.d.ts +38 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +457 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/planLogicalSteps.d.ts +16 -0
- package/dist/planLogicalSteps.d.ts.map +1 -0
- package/dist/planLogicalSteps.js +51 -0
- package/dist/planLogicalSteps.js.map +1 -0
- package/dist/planLogicalSteps.test.d.ts +2 -0
- package/dist/planLogicalSteps.test.d.ts.map +1 -0
- package/dist/planLogicalSteps.test.js +88 -0
- package/dist/planLogicalSteps.test.js.map +1 -0
- package/dist/planTransition.d.ts +88 -0
- package/dist/planTransition.d.ts.map +1 -0
- package/dist/planTransition.js +490 -0
- package/dist/planTransition.js.map +1 -0
- package/dist/planTransition.test.d.ts +2 -0
- package/dist/planTransition.test.d.ts.map +1 -0
- package/dist/planTransition.test.js +956 -0
- package/dist/planTransition.test.js.map +1 -0
- package/dist/planTransitionConstants.d.ts +3 -0
- package/dist/planTransitionConstants.d.ts.map +1 -0
- package/dist/planTransitionConstants.js +3 -0
- package/dist/planTransitionConstants.js.map +1 -0
- package/dist/planTransitionPathHarvest.d.ts +24 -0
- package/dist/planTransitionPathHarvest.d.ts.map +1 -0
- package/dist/planTransitionPathHarvest.js +273 -0
- package/dist/planTransitionPathHarvest.js.map +1 -0
- package/dist/planTransitionPathHarvest.test.d.ts +2 -0
- package/dist/planTransitionPathHarvest.test.d.ts.map +1 -0
- package/dist/planTransitionPathHarvest.test.js +232 -0
- package/dist/planTransitionPathHarvest.test.js.map +1 -0
- package/dist/prepareWorkflowEvents.d.ts +6 -0
- package/dist/prepareWorkflowEvents.d.ts.map +1 -0
- package/dist/prepareWorkflowEvents.js +8 -0
- package/dist/prepareWorkflowEvents.js.map +1 -0
- package/dist/publicDistribution.generated.d.ts +3 -0
- package/dist/publicDistribution.generated.d.ts.map +1 -0
- package/dist/publicDistribution.generated.js +9 -0
- package/dist/publicDistribution.generated.js.map +1 -0
- package/dist/quickVerify/atomicWrite.d.ts +6 -0
- package/dist/quickVerify/atomicWrite.d.ts.map +1 -0
- package/dist/quickVerify/atomicWrite.js +33 -0
- package/dist/quickVerify/atomicWrite.js.map +1 -0
- package/dist/quickVerify/buildQuickContractEventsNdjson.d.ts +14 -0
- package/dist/quickVerify/buildQuickContractEventsNdjson.d.ts.map +1 -0
- package/dist/quickVerify/buildQuickContractEventsNdjson.js +28 -0
- package/dist/quickVerify/buildQuickContractEventsNdjson.js.map +1 -0
- package/dist/quickVerify/canonicalJson.d.ts +5 -0
- package/dist/quickVerify/canonicalJson.d.ts.map +1 -0
- package/dist/quickVerify/canonicalJson.js +23 -0
- package/dist/quickVerify/canonicalJson.js.map +1 -0
- package/dist/quickVerify/decomposeUnits.d.ts +15 -0
- package/dist/quickVerify/decomposeUnits.d.ts.map +1 -0
- package/dist/quickVerify/decomposeUnits.js +50 -0
- package/dist/quickVerify/decomposeUnits.js.map +1 -0
- package/dist/quickVerify/exportTool.d.ts +6 -0
- package/dist/quickVerify/exportTool.d.ts.map +1 -0
- package/dist/quickVerify/exportTool.js +20 -0
- package/dist/quickVerify/exportTool.js.map +1 -0
- package/dist/quickVerify/forbiddenMutatingSql.d.ts +4 -0
- package/dist/quickVerify/forbiddenMutatingSql.d.ts.map +1 -0
- package/dist/quickVerify/forbiddenMutatingSql.js +6 -0
- package/dist/quickVerify/forbiddenMutatingSql.js.map +1 -0
- package/dist/quickVerify/formatQuickVerifyHumanReport.d.ts +17 -0
- package/dist/quickVerify/formatQuickVerifyHumanReport.d.ts.map +1 -0
- package/dist/quickVerify/formatQuickVerifyHumanReport.js +65 -0
- package/dist/quickVerify/formatQuickVerifyHumanReport.js.map +1 -0
- package/dist/quickVerify/formatQuickVerifyHumanReport.test.d.ts +2 -0
- package/dist/quickVerify/formatQuickVerifyHumanReport.test.d.ts.map +1 -0
- package/dist/quickVerify/formatQuickVerifyHumanReport.test.js +41 -0
- package/dist/quickVerify/formatQuickVerifyHumanReport.test.js.map +1 -0
- package/dist/quickVerify/ingest.d.ts +34 -0
- package/dist/quickVerify/ingest.d.ts.map +1 -0
- package/dist/quickVerify/ingest.js +327 -0
- package/dist/quickVerify/ingest.js.map +1 -0
- package/dist/quickVerify/noMutatingSqlInSources.test.d.ts +2 -0
- package/dist/quickVerify/noMutatingSqlInSources.test.d.ts.map +1 -0
- package/dist/quickVerify/noMutatingSqlInSources.test.js +34 -0
- package/dist/quickVerify/noMutatingSqlInSources.test.js.map +1 -0
- package/dist/quickVerify/postgresCatalog.d.ts +19 -0
- package/dist/quickVerify/postgresCatalog.d.ts.map +1 -0
- package/dist/quickVerify/postgresCatalog.js +107 -0
- package/dist/quickVerify/postgresCatalog.js.map +1 -0
- package/dist/quickVerify/quickVerifyHumanCopy.d.ts +9 -0
- package/dist/quickVerify/quickVerifyHumanCopy.d.ts.map +1 -0
- package/dist/quickVerify/quickVerifyHumanCopy.js +24 -0
- package/dist/quickVerify/quickVerifyHumanCopy.js.map +1 -0
- package/dist/quickVerify/quickVerifyProductTruth.d.ts +16 -0
- package/dist/quickVerify/quickVerifyProductTruth.d.ts.map +1 -0
- package/dist/quickVerify/quickVerifyProductTruth.js +19 -0
- package/dist/quickVerify/quickVerifyProductTruth.js.map +1 -0
- package/dist/quickVerify/quickVerifyScope.d.ts +12 -0
- package/dist/quickVerify/quickVerifyScope.d.ts.map +1 -0
- package/dist/quickVerify/quickVerifyScope.js +16 -0
- package/dist/quickVerify/quickVerifyScope.js.map +1 -0
- package/dist/quickVerify/relationalPlan.d.ts +10 -0
- package/dist/quickVerify/relationalPlan.d.ts.map +1 -0
- package/dist/quickVerify/relationalPlan.js +37 -0
- package/dist/quickVerify/relationalPlan.js.map +1 -0
- package/dist/quickVerify/rowUnit.d.ts +15 -0
- package/dist/quickVerify/rowUnit.d.ts.map +1 -0
- package/dist/quickVerify/rowUnit.js +132 -0
- package/dist/quickVerify/rowUnit.js.map +1 -0
- package/dist/quickVerify/runQuickVerify.d.ts +65 -0
- package/dist/quickVerify/runQuickVerify.d.ts.map +1 -0
- package/dist/quickVerify/runQuickVerify.js +320 -0
- package/dist/quickVerify/runQuickVerify.js.map +1 -0
- package/dist/quickVerify/schemaCatalogTypes.d.ts +22 -0
- package/dist/quickVerify/schemaCatalogTypes.d.ts.map +1 -0
- package/dist/quickVerify/schemaCatalogTypes.js +2 -0
- package/dist/quickVerify/schemaCatalogTypes.js.map +1 -0
- package/dist/quickVerify/sqliteCatalog.d.ts +13 -0
- package/dist/quickVerify/sqliteCatalog.d.ts.map +1 -0
- package/dist/quickVerify/sqliteCatalog.js +48 -0
- package/dist/quickVerify/sqliteCatalog.js.map +1 -0
- package/dist/quickVerify/tableScoring.d.ts +24 -0
- package/dist/quickVerify/tableScoring.d.ts.map +1 -0
- package/dist/quickVerify/tableScoring.js +156 -0
- package/dist/quickVerify/tableScoring.js.map +1 -0
- package/dist/quickVerify/thresholds.d.ts +11 -0
- package/dist/quickVerify/thresholds.d.ts.map +1 -0
- package/dist/quickVerify/thresholds.js +11 -0
- package/dist/quickVerify/thresholds.js.map +1 -0
- package/dist/quickVerify/verifyExecution.d.ts +15 -0
- package/dist/quickVerify/verifyExecution.d.ts.map +1 -0
- package/dist/quickVerify/verifyExecution.js +153 -0
- package/dist/quickVerify/verifyExecution.js.map +1 -0
- package/dist/reconciler.d.ts +25 -0
- package/dist/reconciler.d.ts.map +1 -0
- package/dist/reconciler.js +266 -0
- package/dist/reconciler.js.map +1 -0
- package/dist/reconciliationPresentation.d.ts +83 -0
- package/dist/reconciliationPresentation.d.ts.map +1 -0
- package/dist/reconciliationPresentation.js +195 -0
- package/dist/reconciliationPresentation.js.map +1 -0
- package/dist/registryValidation.d.ts +48 -0
- package/dist/registryValidation.d.ts.map +1 -0
- package/dist/registryValidation.js +254 -0
- package/dist/registryValidation.js.map +1 -0
- package/dist/registryValidation.test.d.ts +2 -0
- package/dist/registryValidation.test.d.ts.map +1 -0
- package/dist/registryValidation.test.js +186 -0
- package/dist/registryValidation.test.js.map +1 -0
- package/dist/relationalInvariant.d.ts +28 -0
- package/dist/relationalInvariant.d.ts.map +1 -0
- package/dist/relationalInvariant.existsSql.test.d.ts +2 -0
- package/dist/relationalInvariant.existsSql.test.d.ts.map +1 -0
- package/dist/relationalInvariant.existsSql.test.js +12 -0
- package/dist/relationalInvariant.existsSql.test.js.map +1 -0
- package/dist/relationalInvariant.js +347 -0
- package/dist/relationalInvariant.js.map +1 -0
- package/dist/relationalInvariant.test.d.ts +2 -0
- package/dist/relationalInvariant.test.d.ts.map +1 -0
- package/dist/relationalInvariant.test.js +32 -0
- package/dist/relationalInvariant.test.js.map +1 -0
- package/dist/remediationConsumptionGuard.test.d.ts +2 -0
- package/dist/remediationConsumptionGuard.test.d.ts.map +1 -0
- package/dist/remediationConsumptionGuard.test.js +80 -0
- package/dist/remediationConsumptionGuard.test.js.map +1 -0
- package/dist/remediationWireSurfaceGuard.test.d.ts +2 -0
- package/dist/remediationWireSurfaceGuard.test.d.ts.map +1 -0
- package/dist/remediationWireSurfaceGuard.test.js +39 -0
- package/dist/remediationWireSurfaceGuard.test.js.map +1 -0
- package/dist/resolveExpectation.d.ts +28 -0
- package/dist/resolveExpectation.d.ts.map +1 -0
- package/dist/resolveExpectation.js +654 -0
- package/dist/resolveExpectation.js.map +1 -0
- package/dist/resolveExpectation.test.d.ts +2 -0
- package/dist/resolveExpectation.test.d.ts.map +1 -0
- package/dist/resolveExpectation.test.js +434 -0
- package/dist/resolveExpectation.test.js.map +1 -0
- package/dist/resolveFailureCodes.d.ts +2 -0
- package/dist/resolveFailureCodes.d.ts.map +1 -0
- package/dist/resolveFailureCodes.js +7 -0
- package/dist/resolveFailureCodes.js.map +1 -0
- package/dist/runComparison.d.ts +168 -0
- package/dist/runComparison.d.ts.map +1 -0
- package/dist/runComparison.js +675 -0
- package/dist/runComparison.js.map +1 -0
- package/dist/runComparison.test.d.ts +2 -0
- package/dist/runComparison.test.d.ts.map +1 -0
- package/dist/runComparison.test.js +507 -0
- package/dist/runComparison.test.js.map +1 -0
- package/dist/runLevelDriftMessages.d.ts +4 -0
- package/dist/runLevelDriftMessages.d.ts.map +1 -0
- package/dist/runLevelDriftMessages.js +4 -0
- package/dist/runLevelDriftMessages.js.map +1 -0
- package/dist/schema-validation.test.d.ts +2 -0
- package/dist/schema-validation.test.d.ts.map +1 -0
- package/dist/schema-validation.test.js +531 -0
- package/dist/schema-validation.test.js.map +1 -0
- package/dist/schemaLoad.d.ts +5 -0
- package/dist/schemaLoad.d.ts.map +1 -0
- package/dist/schemaLoad.js +152 -0
- package/dist/schemaLoad.js.map +1 -0
- package/dist/shareReport/postPublicVerificationReport.d.ts +26 -0
- package/dist/shareReport/postPublicVerificationReport.d.ts.map +1 -0
- package/dist/shareReport/postPublicVerificationReport.js +38 -0
- package/dist/shareReport/postPublicVerificationReport.js.map +1 -0
- package/dist/slice6.compare.ac.test.d.ts +2 -0
- package/dist/slice6.compare.ac.test.d.ts.map +1 -0
- package/dist/slice6.compare.ac.test.js +81 -0
- package/dist/slice6.compare.ac.test.js.map +1 -0
- package/dist/sqlConnector.d.ts +15 -0
- package/dist/sqlConnector.d.ts.map +1 -0
- package/dist/sqlConnector.js +36 -0
- package/dist/sqlConnector.js.map +1 -0
- package/dist/sqlReadBackend.d.ts +19 -0
- package/dist/sqlReadBackend.d.ts.map +1 -0
- package/dist/sqlReadBackend.js +67 -0
- package/dist/sqlReadBackend.js.map +1 -0
- package/dist/standardVerifyWorkflowCli.d.ts +24 -0
- package/dist/standardVerifyWorkflowCli.d.ts.map +1 -0
- package/dist/standardVerifyWorkflowCli.js +95 -0
- package/dist/standardVerifyWorkflowCli.js.map +1 -0
- package/dist/taxonomyAuthority.test.d.ts +2 -0
- package/dist/taxonomyAuthority.test.d.ts.map +1 -0
- package/dist/taxonomyAuthority.test.js +44 -0
- package/dist/taxonomyAuthority.test.js.map +1 -0
- package/dist/toolsRegistryLoad.d.ts +7 -0
- package/dist/toolsRegistryLoad.d.ts.map +1 -0
- package/dist/toolsRegistryLoad.js +32 -0
- package/dist/toolsRegistryLoad.js.map +1 -0
- package/dist/truthLayerError.d.ts +8 -0
- package/dist/truthLayerError.d.ts.map +1 -0
- package/dist/truthLayerError.js +9 -0
- package/dist/truthLayerError.js.map +1 -0
- package/dist/types.d.ts +706 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +24 -0
- package/dist/types.js.map +1 -0
- package/dist/valueVerification.d.ts +12 -0
- package/dist/valueVerification.d.ts.map +1 -0
- package/dist/valueVerification.js +112 -0
- package/dist/valueVerification.js.map +1 -0
- package/dist/valueVerification.test.d.ts +2 -0
- package/dist/valueVerification.test.d.ts.map +1 -0
- package/dist/valueVerification.test.js +112 -0
- package/dist/valueVerification.test.js.map +1 -0
- package/dist/verificationAgainstSystemState.requirements.test.d.ts +2 -0
- package/dist/verificationAgainstSystemState.requirements.test.d.ts.map +1 -0
- package/dist/verificationAgainstSystemState.requirements.test.js +326 -0
- package/dist/verificationAgainstSystemState.requirements.test.js.map +1 -0
- package/dist/verificationDiagnostics.d.ts +21 -0
- package/dist/verificationDiagnostics.d.ts.map +1 -0
- package/dist/verificationDiagnostics.js +141 -0
- package/dist/verificationDiagnostics.js.map +1 -0
- package/dist/verificationDiagnostics.test.d.ts +2 -0
- package/dist/verificationDiagnostics.test.d.ts.map +1 -0
- package/dist/verificationDiagnostics.test.js +228 -0
- package/dist/verificationDiagnostics.test.js.map +1 -0
- package/dist/verificationPolicy.d.ts +33 -0
- package/dist/verificationPolicy.d.ts.map +1 -0
- package/dist/verificationPolicy.js +495 -0
- package/dist/verificationPolicy.js.map +1 -0
- package/dist/verificationPolicy.test.d.ts +2 -0
- package/dist/verificationPolicy.test.d.ts.map +1 -0
- package/dist/verificationPolicy.test.js +252 -0
- package/dist/verificationPolicy.test.js.map +1 -0
- package/dist/verificationRunContext.d.ts +10 -0
- package/dist/verificationRunContext.d.ts.map +1 -0
- package/dist/verificationRunContext.js +111 -0
- package/dist/verificationRunContext.js.map +1 -0
- package/dist/verificationUserPhrases.d.ts +22 -0
- package/dist/verificationUserPhrases.d.ts.map +1 -0
- package/dist/verificationUserPhrases.js +99 -0
- package/dist/verificationUserPhrases.js.map +1 -0
- package/dist/verificationUserPhrases.test.d.ts +2 -0
- package/dist/verificationUserPhrases.test.d.ts.map +1 -0
- package/dist/verificationUserPhrases.test.js +47 -0
- package/dist/verificationUserPhrases.test.js.map +1 -0
- package/dist/verifyRunBundleSignature.d.ts +14 -0
- package/dist/verifyRunBundleSignature.d.ts.map +1 -0
- package/dist/verifyRunBundleSignature.js +139 -0
- package/dist/verifyRunBundleSignature.js.map +1 -0
- package/dist/verifyRunBundleSignature.test.d.ts +2 -0
- package/dist/verifyRunBundleSignature.test.d.ts.map +1 -0
- package/dist/verifyRunBundleSignature.test.js +169 -0
- package/dist/verifyRunBundleSignature.test.js.map +1 -0
- package/dist/wireReasonCodes.d.ts +57 -0
- package/dist/wireReasonCodes.d.ts.map +1 -0
- package/dist/wireReasonCodes.js +57 -0
- package/dist/wireReasonCodes.js.map +1 -0
- package/dist/wireReasonEmittersGuard.test.d.ts +2 -0
- package/dist/wireReasonEmittersGuard.test.d.ts.map +1 -0
- package/dist/wireReasonEmittersGuard.test.js +36 -0
- package/dist/wireReasonEmittersGuard.test.js.map +1 -0
- package/dist/withWorkflowVerification.persistBundle.test.d.ts +2 -0
- package/dist/withWorkflowVerification.persistBundle.test.d.ts.map +1 -0
- package/dist/withWorkflowVerification.persistBundle.test.js +104 -0
- package/dist/withWorkflowVerification.persistBundle.test.js.map +1 -0
- package/dist/workflowResultNormalize.d.ts +9 -0
- package/dist/workflowResultNormalize.d.ts.map +1 -0
- package/dist/workflowResultNormalize.js +40 -0
- package/dist/workflowResultNormalize.js.map +1 -0
- package/dist/workflowResultSignature.d.ts +8 -0
- package/dist/workflowResultSignature.d.ts.map +1 -0
- package/dist/workflowResultSignature.js +44 -0
- package/dist/workflowResultSignature.js.map +1 -0
- package/dist/workflowRunLevelConsistency.d.ts +5 -0
- package/dist/workflowRunLevelConsistency.d.ts.map +1 -0
- package/dist/workflowRunLevelConsistency.js +30 -0
- package/dist/workflowRunLevelConsistency.js.map +1 -0
- package/dist/workflowTruthReport.d.ts +24 -0
- package/dist/workflowTruthReport.d.ts.map +1 -0
- package/dist/workflowTruthReport.js +395 -0
- package/dist/workflowTruthReport.js.map +1 -0
- package/dist/workflowTruthReport.semantics.test.d.ts +2 -0
- package/dist/workflowTruthReport.semantics.test.d.ts.map +1 -0
- package/dist/workflowTruthReport.semantics.test.js +182 -0
- package/dist/workflowTruthReport.semantics.test.js.map +1 -0
- package/dist/workflowVerdictSurface.test.d.ts +2 -0
- package/dist/workflowVerdictSurface.test.d.ts.map +1 -0
- package/dist/workflowVerdictSurface.test.js +68 -0
- package/dist/workflowVerdictSurface.test.js.map +1 -0
- package/dist/writeRunBundleCli.d.ts +9 -0
- package/dist/writeRunBundleCli.d.ts.map +1 -0
- package/dist/writeRunBundleCli.js +28 -0
- package/dist/writeRunBundleCli.js.map +1 -0
- package/package.json +115 -0
- package/schemas/agent-run-record-v1.schema.json +51 -0
- package/schemas/agent-run-record-v2.schema.json +61 -0
- package/schemas/assurance-manifest-v1.schema.json +28 -0
- package/schemas/assurance-run-report-v1.schema.json +28 -0
- package/schemas/ci-lock-v1.schema.json +163 -0
- package/schemas/cli-error-envelope.schema.json +48 -0
- package/schemas/event.schema.json +111 -0
- package/schemas/execution-trace-view.schema.json +122 -0
- package/schemas/openapi-commercial-v1.in.yaml +215 -0
- package/schemas/openapi-commercial-v1.yaml +215 -0
- package/schemas/plan-validation-core.schema.json +95 -0
- package/schemas/public-verification-report-v1.schema.json +51 -0
- package/schemas/quick-verify-report.schema.json +251 -0
- package/schemas/registry-validation-result.schema.json +99 -0
- package/schemas/run-comparison-report.schema.json +513 -0
- package/schemas/tools-registry-export.schema.json +9 -0
- package/schemas/tools-registry.schema.json +284 -0
- package/schemas/workflow-engine-result.schema.json +591 -0
- package/schemas/workflow-result-compare-input.schema.json +15 -0
- package/schemas/workflow-result-signature.schema.json +20 -0
- package/schemas/workflow-result-v9.schema.json +85 -0
- package/schemas/workflow-result.schema.json +80 -0
- package/schemas/workflow-truth-report.schema.json +761 -0
- package/scripts/discovery-acquisition.lib.cjs +195 -0
- package/scripts/discovery-payload.lib.cjs +346 -0
- package/scripts/render-discovery-ci.mjs +103 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { createPublicKey, verify } from "node:crypto";
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { BUNDLE_SIGNATURE_ARTIFACT_INTEGRITY, BUNDLE_SIGNATURE_CRYPTO_INVALID, BUNDLE_SIGNATURE_MANIFEST_INVALID, BUNDLE_SIGNATURE_MANIFEST_UNSUPPORTED_VERSION, BUNDLE_SIGNATURE_MISSING_ARTIFACT, BUNDLE_SIGNATURE_PUBLIC_KEY_MISMATCH, BUNDLE_SIGNATURE_SIDECAR_INVALID, BUNDLE_SIGNATURE_SIGNED_HASH_MISMATCH, BUNDLE_SIGNATURE_UNSIGNED_MANIFEST, } from "./bundleSignatureCodes.js";
|
|
5
|
+
import { sha256Hex } from "./agentRunRecord.js";
|
|
6
|
+
import { loadSchemaValidator } from "./schemaLoad.js";
|
|
7
|
+
import { AGENT_RUN_FILENAME, EVENTS_FILENAME, WORKFLOW_RESULT_FILENAME, WORKFLOW_RESULT_SIG_FILENAME, } from "./debugCorpus.js";
|
|
8
|
+
import { normalizeSpkiPemForSidecar } from "./workflowResultSignature.js";
|
|
9
|
+
const validateV2 = loadSchemaValidator("agent-run-record-v2");
|
|
10
|
+
const validateSidecar = loadSchemaValidator("workflow-result-signature");
|
|
11
|
+
function fail(code, message) {
|
|
12
|
+
return { ok: false, code, message };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Normative verify order (1–9): manifest parse + dispatch; events hash; wr hash; sig hash; sidecar parse+schema;
|
|
16
|
+
* signedContentSha256Hex vs manifest; PEM equality; crypto.verify.
|
|
17
|
+
*/
|
|
18
|
+
export function verifyRunBundleSignature(runDir, ed25519PublicKeyPemPath) {
|
|
19
|
+
const resolved = path.resolve(runDir);
|
|
20
|
+
const agentRunPath = path.join(resolved, AGENT_RUN_FILENAME);
|
|
21
|
+
if (!existsSync(agentRunPath)) {
|
|
22
|
+
return fail(BUNDLE_SIGNATURE_MISSING_ARTIFACT, `Missing ${AGENT_RUN_FILENAME}`);
|
|
23
|
+
}
|
|
24
|
+
let agentRunParsed;
|
|
25
|
+
try {
|
|
26
|
+
agentRunParsed = JSON.parse(readFileSync(agentRunPath, "utf8"));
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
30
|
+
return fail(BUNDLE_SIGNATURE_MANIFEST_INVALID, msg);
|
|
31
|
+
}
|
|
32
|
+
const sv = agentRunParsed.schemaVersion;
|
|
33
|
+
if (sv !== 1 && sv !== 2) {
|
|
34
|
+
return fail(BUNDLE_SIGNATURE_MANIFEST_UNSUPPORTED_VERSION, `schemaVersion must be 1 or 2, got ${String(sv)}`);
|
|
35
|
+
}
|
|
36
|
+
if (sv === 1) {
|
|
37
|
+
return fail(BUNDLE_SIGNATURE_UNSIGNED_MANIFEST, "Bundle manifest is unsigned (schemaVersion 1)");
|
|
38
|
+
}
|
|
39
|
+
if (!validateV2(agentRunParsed)) {
|
|
40
|
+
return fail(BUNDLE_SIGNATURE_MANIFEST_INVALID, `${AGENT_RUN_FILENAME} failed agent-run-record-v2 schema validation.`);
|
|
41
|
+
}
|
|
42
|
+
const record = agentRunParsed;
|
|
43
|
+
const evSpec = record.artifacts.events;
|
|
44
|
+
const wrSpec = record.artifacts.workflowResult;
|
|
45
|
+
const sigSpec = record.artifacts.workflowResultSignature;
|
|
46
|
+
const evPath = path.join(resolved, evSpec.relativePath);
|
|
47
|
+
const wrPath = path.join(resolved, wrSpec.relativePath);
|
|
48
|
+
const sigPath = path.join(resolved, sigSpec.relativePath);
|
|
49
|
+
if (!existsSync(evPath)) {
|
|
50
|
+
return fail(BUNDLE_SIGNATURE_MISSING_ARTIFACT, `Missing ${EVENTS_FILENAME}`);
|
|
51
|
+
}
|
|
52
|
+
let evBuf;
|
|
53
|
+
try {
|
|
54
|
+
evBuf = readFileSync(evPath);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
58
|
+
return fail(BUNDLE_SIGNATURE_MISSING_ARTIFACT, msg);
|
|
59
|
+
}
|
|
60
|
+
if (evBuf.length !== evSpec.byteLength || sha256Hex(evBuf) !== evSpec.sha256) {
|
|
61
|
+
return fail(BUNDLE_SIGNATURE_ARTIFACT_INTEGRITY, `${EVENTS_FILENAME} does not match manifest`);
|
|
62
|
+
}
|
|
63
|
+
if (!existsSync(wrPath)) {
|
|
64
|
+
return fail(BUNDLE_SIGNATURE_MISSING_ARTIFACT, `Missing ${WORKFLOW_RESULT_FILENAME}`);
|
|
65
|
+
}
|
|
66
|
+
let wrBuf;
|
|
67
|
+
try {
|
|
68
|
+
wrBuf = readFileSync(wrPath);
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
72
|
+
return fail(BUNDLE_SIGNATURE_MISSING_ARTIFACT, msg);
|
|
73
|
+
}
|
|
74
|
+
if (wrBuf.length !== wrSpec.byteLength || sha256Hex(wrBuf) !== wrSpec.sha256) {
|
|
75
|
+
return fail(BUNDLE_SIGNATURE_ARTIFACT_INTEGRITY, `${WORKFLOW_RESULT_FILENAME} does not match manifest`);
|
|
76
|
+
}
|
|
77
|
+
if (!existsSync(sigPath)) {
|
|
78
|
+
return fail(BUNDLE_SIGNATURE_MISSING_ARTIFACT, `Missing ${WORKFLOW_RESULT_SIG_FILENAME}`);
|
|
79
|
+
}
|
|
80
|
+
let sigFileBuf;
|
|
81
|
+
try {
|
|
82
|
+
sigFileBuf = readFileSync(sigPath);
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
86
|
+
return fail(BUNDLE_SIGNATURE_MISSING_ARTIFACT, msg);
|
|
87
|
+
}
|
|
88
|
+
if (sigFileBuf.length !== sigSpec.byteLength || sha256Hex(sigFileBuf) !== sigSpec.sha256) {
|
|
89
|
+
return fail(BUNDLE_SIGNATURE_ARTIFACT_INTEGRITY, `${WORKFLOW_RESULT_SIG_FILENAME} does not match manifest`);
|
|
90
|
+
}
|
|
91
|
+
let sidecar;
|
|
92
|
+
try {
|
|
93
|
+
sidecar = JSON.parse(sigFileBuf.toString("utf8"));
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
97
|
+
return fail(BUNDLE_SIGNATURE_SIDECAR_INVALID, msg);
|
|
98
|
+
}
|
|
99
|
+
if (!validateSidecar(sidecar)) {
|
|
100
|
+
return fail(BUNDLE_SIGNATURE_SIDECAR_INVALID, "workflow-result.sig.json failed schema validation");
|
|
101
|
+
}
|
|
102
|
+
const sc = sidecar;
|
|
103
|
+
if (sc.signedContentSha256Hex !== wrSpec.sha256) {
|
|
104
|
+
return fail(BUNDLE_SIGNATURE_SIGNED_HASH_MISMATCH, "signedContentSha256Hex does not match manifest");
|
|
105
|
+
}
|
|
106
|
+
let trustedPem;
|
|
107
|
+
try {
|
|
108
|
+
trustedPem = readFileSync(path.resolve(ed25519PublicKeyPemPath), "utf8");
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
112
|
+
return fail(BUNDLE_SIGNATURE_MISSING_ARTIFACT, `Cannot read public key: ${msg}`);
|
|
113
|
+
}
|
|
114
|
+
const sidecarPem = sidecar.signingPublicKeySpkiPem;
|
|
115
|
+
if (typeof sidecarPem !== "string") {
|
|
116
|
+
return fail(BUNDLE_SIGNATURE_SIDECAR_INVALID, "Missing signingPublicKeySpkiPem");
|
|
117
|
+
}
|
|
118
|
+
if (normalizeSpkiPemForSidecar(sidecarPem) !== normalizeSpkiPemForSidecar(trustedPem)) {
|
|
119
|
+
return fail(BUNDLE_SIGNATURE_PUBLIC_KEY_MISMATCH, "Public key file does not match sidecar PEM");
|
|
120
|
+
}
|
|
121
|
+
const publicKey = createPublicKey({ key: trustedPem, format: "pem", type: "spki" });
|
|
122
|
+
const sigB64 = sidecar.signatureBase64;
|
|
123
|
+
if (typeof sigB64 !== "string") {
|
|
124
|
+
return fail(BUNDLE_SIGNATURE_SIDECAR_INVALID, "Missing signatureBase64");
|
|
125
|
+
}
|
|
126
|
+
let sigBytes;
|
|
127
|
+
try {
|
|
128
|
+
sigBytes = Buffer.from(sigB64, "base64");
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return fail(BUNDLE_SIGNATURE_SIDECAR_INVALID, "Invalid signatureBase64");
|
|
132
|
+
}
|
|
133
|
+
const ok = verify(null, wrBuf, publicKey, sigBytes);
|
|
134
|
+
if (!ok) {
|
|
135
|
+
return fail(BUNDLE_SIGNATURE_CRYPTO_INVALID, "Ed25519 verify failed");
|
|
136
|
+
}
|
|
137
|
+
return { ok: true };
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=verifyRunBundleSignature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyRunBundleSignature.js","sourceRoot":"","sources":["../src/verifyRunBundleSignature.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyRunBundleSignature.test.d.ts","sourceRoot":"","sources":["../src/verifyRunBundleSignature.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { generateKeyPairSync } from "node:crypto";
|
|
2
|
+
import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
7
|
+
import { buildAgentRunRecordForBundle } from "./agentRunRecord.js";
|
|
8
|
+
import { BUNDLE_SIGNATURE_ARTIFACT_INTEGRITY, BUNDLE_SIGNATURE_CRYPTO_INVALID, BUNDLE_SIGNATURE_PUBLIC_KEY_MISMATCH, BUNDLE_SIGNATURE_SIGNED_HASH_MISMATCH, BUNDLE_SIGNATURE_UNSIGNED_MANIFEST, } from "./bundleSignatureCodes.js";
|
|
9
|
+
import { AGENT_RUN_FILENAME, EVENTS_FILENAME, WORKFLOW_RESULT_FILENAME, WORKFLOW_RESULT_SIG_FILENAME, } from "./debugCorpus.js";
|
|
10
|
+
import { buildWorkflowResultSigSidecarBytes, normalizeSpkiPemForSidecar } from "./workflowResultSignature.js";
|
|
11
|
+
import { verifyRunBundleSignature } from "./verifyRunBundleSignature.js";
|
|
12
|
+
const root = join(fileURLToPath(import.meta.url), "..", "..");
|
|
13
|
+
const runOk = join(root, "examples", "debug-corpus", "run_ok");
|
|
14
|
+
function writeV2BundleDir(dir, opts) {
|
|
15
|
+
mkdirSync(dir, { recursive: true });
|
|
16
|
+
let sidecar = buildWorkflowResultSigSidecarBytes(opts.wrBytes, opts.privatePem);
|
|
17
|
+
if (opts.mutateSidecar) {
|
|
18
|
+
const p = JSON.parse(sidecar.toString("utf8").trim());
|
|
19
|
+
opts.mutateSidecar(p);
|
|
20
|
+
sidecar = Buffer.from(`${JSON.stringify(p)}\n`, "utf8");
|
|
21
|
+
}
|
|
22
|
+
const record = buildAgentRunRecordForBundle({
|
|
23
|
+
runId: "t",
|
|
24
|
+
workflowId: JSON.parse(opts.wrBytes.toString("utf8")).workflowId,
|
|
25
|
+
producer: { name: "n", version: "1" },
|
|
26
|
+
verifiedAt: "2026-04-07T12:00:00.000Z",
|
|
27
|
+
workflowResultBytes: opts.wrBytes,
|
|
28
|
+
eventsBytes: opts.evBytes,
|
|
29
|
+
workflowResultSignatureBytes: sidecar,
|
|
30
|
+
});
|
|
31
|
+
const manifestBuf = Buffer.from(`${JSON.stringify(record, null, 2)}\n`, "utf8");
|
|
32
|
+
writeFileSync(join(dir, EVENTS_FILENAME), opts.evBytes);
|
|
33
|
+
writeFileSync(join(dir, WORKFLOW_RESULT_FILENAME), opts.wrBytes);
|
|
34
|
+
writeFileSync(join(dir, WORKFLOW_RESULT_SIG_FILENAME), sidecar);
|
|
35
|
+
writeFileSync(join(dir, AGENT_RUN_FILENAME), manifestBuf);
|
|
36
|
+
}
|
|
37
|
+
describe("verifyRunBundleSignature", () => {
|
|
38
|
+
const { privateKey, publicKey } = generateKeyPairSync("ed25519");
|
|
39
|
+
const privatePem = privateKey.export({ type: "pkcs8", format: "pem" });
|
|
40
|
+
const publicPem = publicKey.export({ type: "spki", format: "pem" });
|
|
41
|
+
const wrBytes = readFileSync(join(runOk, "workflow-result.json"));
|
|
42
|
+
const evBytes = readFileSync(join(runOk, "events.ndjson"));
|
|
43
|
+
const dirs = [];
|
|
44
|
+
afterEach(() => {
|
|
45
|
+
for (const d of dirs) {
|
|
46
|
+
try {
|
|
47
|
+
rmSync(d, { recursive: true, force: true });
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
/* ignore */
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
dirs.length = 0;
|
|
54
|
+
});
|
|
55
|
+
it("returns ok true for valid v2 bundle", () => {
|
|
56
|
+
const dir = join(tmpdir(), `etl-sig-ok-${Date.now()}`);
|
|
57
|
+
dirs.push(dir);
|
|
58
|
+
writeV2BundleDir(dir, { wrBytes, evBytes, privatePem, publicPem });
|
|
59
|
+
const pubPath = join(dir, "pub.pem");
|
|
60
|
+
writeFileSync(pubPath, normalizeSpkiPemForSidecar(publicPem), "utf8");
|
|
61
|
+
const r = verifyRunBundleSignature(dir, pubPath);
|
|
62
|
+
expect(r).toEqual({ ok: true });
|
|
63
|
+
});
|
|
64
|
+
it("tampered workflow-result → ARTIFACT_INTEGRITY", () => {
|
|
65
|
+
const dir = join(tmpdir(), `etl-sig-t1-${Date.now()}`);
|
|
66
|
+
dirs.push(dir);
|
|
67
|
+
writeV2BundleDir(dir, { wrBytes, evBytes, privatePem, publicPem });
|
|
68
|
+
const wrPath = join(dir, WORKFLOW_RESULT_FILENAME);
|
|
69
|
+
const b = readFileSync(wrPath);
|
|
70
|
+
const t = Buffer.from(b);
|
|
71
|
+
t[t.length - 2] ^= 1;
|
|
72
|
+
writeFileSync(wrPath, t);
|
|
73
|
+
const pubPath = join(dir, "pub.pem");
|
|
74
|
+
writeFileSync(pubPath, normalizeSpkiPemForSidecar(publicPem), "utf8");
|
|
75
|
+
const r = verifyRunBundleSignature(dir, pubPath);
|
|
76
|
+
expect(r.ok).toBe(false);
|
|
77
|
+
if (!r.ok)
|
|
78
|
+
expect(r.code).toBe(BUNDLE_SIGNATURE_ARTIFACT_INTEGRITY);
|
|
79
|
+
});
|
|
80
|
+
it("tampered sidecar bytes → ARTIFACT_INTEGRITY", () => {
|
|
81
|
+
const dir = join(tmpdir(), `etl-sig-t2-${Date.now()}`);
|
|
82
|
+
dirs.push(dir);
|
|
83
|
+
writeV2BundleDir(dir, { wrBytes, evBytes, privatePem, publicPem });
|
|
84
|
+
const sigPath = join(dir, WORKFLOW_RESULT_SIG_FILENAME);
|
|
85
|
+
const b = readFileSync(sigPath);
|
|
86
|
+
const t = Buffer.from(b);
|
|
87
|
+
t[5] ^= 1;
|
|
88
|
+
writeFileSync(sigPath, t);
|
|
89
|
+
const pubPath = join(dir, "pub.pem");
|
|
90
|
+
writeFileSync(pubPath, normalizeSpkiPemForSidecar(publicPem), "utf8");
|
|
91
|
+
const r = verifyRunBundleSignature(dir, pubPath);
|
|
92
|
+
expect(r.ok).toBe(false);
|
|
93
|
+
if (!r.ok)
|
|
94
|
+
expect(r.code).toBe(BUNDLE_SIGNATURE_ARTIFACT_INTEGRITY);
|
|
95
|
+
});
|
|
96
|
+
it("wrong public key file vs sidecar → PUBLIC_KEY_MISMATCH", () => {
|
|
97
|
+
const dir = join(tmpdir(), `etl-sig-pk-${Date.now()}`);
|
|
98
|
+
dirs.push(dir);
|
|
99
|
+
writeV2BundleDir(dir, { wrBytes, evBytes, privatePem, publicPem });
|
|
100
|
+
const other = generateKeyPairSync("ed25519").publicKey.export({ type: "spki", format: "pem" });
|
|
101
|
+
const pubPath = join(dir, "wrong.pem");
|
|
102
|
+
writeFileSync(pubPath, normalizeSpkiPemForSidecar(other), "utf8");
|
|
103
|
+
const r = verifyRunBundleSignature(dir, pubPath);
|
|
104
|
+
expect(r.ok).toBe(false);
|
|
105
|
+
if (!r.ok)
|
|
106
|
+
expect(r.code).toBe(BUNDLE_SIGNATURE_PUBLIC_KEY_MISMATCH);
|
|
107
|
+
});
|
|
108
|
+
it("corrupted signatureBase64 → CRYPTO_INVALID", () => {
|
|
109
|
+
const dir = join(tmpdir(), `etl-sig-crypto-${Date.now()}`);
|
|
110
|
+
dirs.push(dir);
|
|
111
|
+
writeV2BundleDir(dir, {
|
|
112
|
+
wrBytes,
|
|
113
|
+
evBytes,
|
|
114
|
+
privatePem,
|
|
115
|
+
publicPem,
|
|
116
|
+
mutateSidecar: (p) => {
|
|
117
|
+
p.signatureBase64 = Buffer.alloc(64, 7).toString("base64");
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
const pubPath = join(dir, "pub.pem");
|
|
121
|
+
writeFileSync(pubPath, normalizeSpkiPemForSidecar(publicPem), "utf8");
|
|
122
|
+
const r = verifyRunBundleSignature(dir, pubPath);
|
|
123
|
+
expect(r.ok).toBe(false);
|
|
124
|
+
if (!r.ok)
|
|
125
|
+
expect(r.code).toBe(BUNDLE_SIGNATURE_CRYPTO_INVALID);
|
|
126
|
+
});
|
|
127
|
+
it("v1 manifest → UNSIGNED_MANIFEST", () => {
|
|
128
|
+
const dir = join(tmpdir(), `etl-sig-v1-${Date.now()}`);
|
|
129
|
+
dirs.push(dir);
|
|
130
|
+
mkdirSync(dir, { recursive: true });
|
|
131
|
+
const rec = buildAgentRunRecordForBundle({
|
|
132
|
+
runId: "x",
|
|
133
|
+
workflowId: "w",
|
|
134
|
+
producer: { name: "n", version: "v" },
|
|
135
|
+
verifiedAt: "2026-04-07T12:00:00.000Z",
|
|
136
|
+
workflowResultBytes: wrBytes,
|
|
137
|
+
eventsBytes: evBytes,
|
|
138
|
+
});
|
|
139
|
+
writeFileSync(join(dir, EVENTS_FILENAME), evBytes);
|
|
140
|
+
writeFileSync(join(dir, WORKFLOW_RESULT_FILENAME), wrBytes);
|
|
141
|
+
writeFileSync(join(dir, AGENT_RUN_FILENAME), `${JSON.stringify(rec, null, 2)}\n`, "utf8");
|
|
142
|
+
const pubPath = join(dir, "pub.pem");
|
|
143
|
+
writeFileSync(pubPath, normalizeSpkiPemForSidecar(publicPem), "utf8");
|
|
144
|
+
const r = verifyRunBundleSignature(dir, pubPath);
|
|
145
|
+
expect(r.ok).toBe(false);
|
|
146
|
+
if (!r.ok)
|
|
147
|
+
expect(r.code).toBe(BUNDLE_SIGNATURE_UNSIGNED_MANIFEST);
|
|
148
|
+
});
|
|
149
|
+
it("wrong signedContentSha256Hex → SIGNED_HASH_MISMATCH", () => {
|
|
150
|
+
const dir = join(tmpdir(), `etl-sig-hash-${Date.now()}`);
|
|
151
|
+
dirs.push(dir);
|
|
152
|
+
writeV2BundleDir(dir, {
|
|
153
|
+
wrBytes,
|
|
154
|
+
evBytes,
|
|
155
|
+
privatePem,
|
|
156
|
+
publicPem,
|
|
157
|
+
mutateSidecar: (p) => {
|
|
158
|
+
p.signedContentSha256Hex = "a".repeat(64);
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
const pubPath = join(dir, "pub.pem");
|
|
162
|
+
writeFileSync(pubPath, normalizeSpkiPemForSidecar(publicPem), "utf8");
|
|
163
|
+
const r = verifyRunBundleSignature(dir, pubPath);
|
|
164
|
+
expect(r.ok).toBe(false);
|
|
165
|
+
if (!r.ok)
|
|
166
|
+
expect(r.code).toBe(BUNDLE_SIGNATURE_SIGNED_HASH_MISMATCH);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
//# sourceMappingURL=verifyRunBundleSignature.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyRunBundleSignature.test.js","sourceRoot":"","sources":["../src/verifyRunBundleSignature.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sole definition of emitted step / resolver `reason.code` and registry validation resolution codes.
|
|
3
|
+
* Pair with wireReasonEmittersGuard.test.ts (six emitter files only).
|
|
4
|
+
*/
|
|
5
|
+
/** Resolver / registry parameter resolution failures (`{ ok: false }` from resolveVerificationRequest). */
|
|
6
|
+
export declare const REGISTRY_RESOLVER_CODE: {
|
|
7
|
+
readonly CONST_STRING_EMPTY: "CONST_STRING_EMPTY";
|
|
8
|
+
readonly STRING_SPEC_POINTER_MISSING: "STRING_SPEC_POINTER_MISSING";
|
|
9
|
+
readonly STRING_SPEC_TYPE: "STRING_SPEC_TYPE";
|
|
10
|
+
readonly STRING_SPEC_EMPTY: "STRING_SPEC_EMPTY";
|
|
11
|
+
readonly KEY_VALUE_POINTER_MISSING: "KEY_VALUE_POINTER_MISSING";
|
|
12
|
+
readonly KEY_VALUE_NOT_SCALAR: "KEY_VALUE_NOT_SCALAR";
|
|
13
|
+
readonly KEY_VALUE_SPEC_INVALID: "KEY_VALUE_SPEC_INVALID";
|
|
14
|
+
readonly TABLE_POINTER_INVALID: "TABLE_POINTER_INVALID";
|
|
15
|
+
readonly TABLE_SPEC_INVALID: "TABLE_SPEC_INVALID";
|
|
16
|
+
readonly INVALID_IDENTIFIER: "INVALID_IDENTIFIER";
|
|
17
|
+
readonly REQUIRED_FIELDS_POINTER_MISSING: "REQUIRED_FIELDS_POINTER_MISSING";
|
|
18
|
+
readonly REQUIRED_FIELDS_NOT_OBJECT: "REQUIRED_FIELDS_NOT_OBJECT";
|
|
19
|
+
readonly REQUIRED_FIELDS_VALUE_UNDEFINED: "REQUIRED_FIELDS_VALUE_UNDEFINED";
|
|
20
|
+
readonly REQUIRED_FIELDS_VALUE_NOT_SCALAR: "REQUIRED_FIELDS_VALUE_NOT_SCALAR";
|
|
21
|
+
readonly UNSUPPORTED_VERIFICATION_KIND: "UNSUPPORTED_VERIFICATION_KIND";
|
|
22
|
+
readonly DUPLICATE_EFFECT_ID: "DUPLICATE_EFFECT_ID";
|
|
23
|
+
readonly RELATIONAL_EXPECT_VALUE_INVALID: "RELATIONAL_EXPECT_VALUE_INVALID";
|
|
24
|
+
readonly RELATIONAL_SUM_COLUMN_REQUIRED: "RELATIONAL_SUM_COLUMN_REQUIRED";
|
|
25
|
+
readonly EQUALITY_DUPLICATE_COLUMN: "EQUALITY_DUPLICATE_COLUMN";
|
|
26
|
+
readonly FILTER_EQ_OVERLAPS_IDENTITY: "FILTER_EQ_OVERLAPS_IDENTITY";
|
|
27
|
+
};
|
|
28
|
+
/** SQL reconciliation / policy / pipeline step `reasons[].code` values (post-resolution verification axis). */
|
|
29
|
+
export declare const SQL_VERIFICATION_OUTCOME_CODE: {
|
|
30
|
+
readonly ROW_ABSENT: "ROW_ABSENT";
|
|
31
|
+
readonly DUPLICATE_ROWS: "DUPLICATE_ROWS";
|
|
32
|
+
readonly ROW_SHAPE_MISMATCH: "ROW_SHAPE_MISMATCH";
|
|
33
|
+
readonly UNREADABLE_VALUE: "UNREADABLE_VALUE";
|
|
34
|
+
readonly VALUE_MISMATCH: "VALUE_MISMATCH";
|
|
35
|
+
readonly CONNECTOR_ERROR: "CONNECTOR_ERROR";
|
|
36
|
+
readonly MULTI_EFFECT_INCOMPLETE: "MULTI_EFFECT_INCOMPLETE";
|
|
37
|
+
readonly MULTI_EFFECT_ALL_FAILED: "MULTI_EFFECT_ALL_FAILED";
|
|
38
|
+
readonly MULTI_EFFECT_PARTIAL: "MULTI_EFFECT_PARTIAL";
|
|
39
|
+
readonly ROW_NOT_OBSERVED_WITHIN_WINDOW: "ROW_NOT_OBSERVED_WITHIN_WINDOW";
|
|
40
|
+
readonly MULTI_EFFECT_UNCERTAIN_WITHIN_WINDOW: "MULTI_EFFECT_UNCERTAIN_WITHIN_WINDOW";
|
|
41
|
+
readonly UNKNOWN_TOOL: "UNKNOWN_TOOL";
|
|
42
|
+
readonly RETRY_OBSERVATIONS_DIVERGE: "RETRY_OBSERVATIONS_DIVERGE";
|
|
43
|
+
readonly RELATED_ROWS_ABSENT: "RELATED_ROWS_ABSENT";
|
|
44
|
+
readonly RELATIONAL_EXPECTATION_MISMATCH: "RELATIONAL_EXPECTATION_MISMATCH";
|
|
45
|
+
readonly RELATIONAL_SCALAR_UNUSABLE: "RELATIONAL_SCALAR_UNUSABLE";
|
|
46
|
+
readonly ROW_PRESENT_WHEN_FORBIDDEN: "ROW_PRESENT_WHEN_FORBIDDEN";
|
|
47
|
+
readonly ORPHAN_ROW_DETECTED: "ORPHAN_ROW_DETECTED";
|
|
48
|
+
readonly FORBIDDEN_ROWS_STILL_PRESENT_WITHIN_WINDOW: "FORBIDDEN_ROWS_STILL_PRESENT_WITHIN_WINDOW";
|
|
49
|
+
};
|
|
50
|
+
export declare const UNKNOWN_TOOL: "UNKNOWN_TOOL";
|
|
51
|
+
/** Fixed `code` strings on registry validation resolutionIssues / resolutionSkipped. */
|
|
52
|
+
export declare const REGISTRY_VALIDATION_CODE: {
|
|
53
|
+
readonly NO_STEPS_FOR_WORKFLOW: "NO_STEPS_FOR_WORKFLOW";
|
|
54
|
+
readonly RETRY_OBSERVATIONS_DIVERGE: "RETRY_OBSERVATIONS_DIVERGE";
|
|
55
|
+
readonly UNKNOWN_TOOL: "UNKNOWN_TOOL";
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=wireReasonCodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireReasonCodes.d.ts","sourceRoot":"","sources":["../src/wireReasonCodes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2GAA2G;AAC3G,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;CAqBzB,CAAC;AAEX,+GAA+G;AAC/G,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;CAoBhC,CAAC;AAEX,eAAO,MAAM,YAAY,gBAA6C,CAAC;AAEvE,wFAAwF;AACxF,eAAO,MAAM,wBAAwB;;;;CAI3B,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sole definition of emitted step / resolver `reason.code` and registry validation resolution codes.
|
|
3
|
+
* Pair with wireReasonEmittersGuard.test.ts (six emitter files only).
|
|
4
|
+
*/
|
|
5
|
+
/** Resolver / registry parameter resolution failures (`{ ok: false }` from resolveVerificationRequest). */
|
|
6
|
+
export const REGISTRY_RESOLVER_CODE = {
|
|
7
|
+
CONST_STRING_EMPTY: "CONST_STRING_EMPTY",
|
|
8
|
+
STRING_SPEC_POINTER_MISSING: "STRING_SPEC_POINTER_MISSING",
|
|
9
|
+
STRING_SPEC_TYPE: "STRING_SPEC_TYPE",
|
|
10
|
+
STRING_SPEC_EMPTY: "STRING_SPEC_EMPTY",
|
|
11
|
+
KEY_VALUE_POINTER_MISSING: "KEY_VALUE_POINTER_MISSING",
|
|
12
|
+
KEY_VALUE_NOT_SCALAR: "KEY_VALUE_NOT_SCALAR",
|
|
13
|
+
KEY_VALUE_SPEC_INVALID: "KEY_VALUE_SPEC_INVALID",
|
|
14
|
+
TABLE_POINTER_INVALID: "TABLE_POINTER_INVALID",
|
|
15
|
+
TABLE_SPEC_INVALID: "TABLE_SPEC_INVALID",
|
|
16
|
+
INVALID_IDENTIFIER: "INVALID_IDENTIFIER",
|
|
17
|
+
REQUIRED_FIELDS_POINTER_MISSING: "REQUIRED_FIELDS_POINTER_MISSING",
|
|
18
|
+
REQUIRED_FIELDS_NOT_OBJECT: "REQUIRED_FIELDS_NOT_OBJECT",
|
|
19
|
+
REQUIRED_FIELDS_VALUE_UNDEFINED: "REQUIRED_FIELDS_VALUE_UNDEFINED",
|
|
20
|
+
REQUIRED_FIELDS_VALUE_NOT_SCALAR: "REQUIRED_FIELDS_VALUE_NOT_SCALAR",
|
|
21
|
+
UNSUPPORTED_VERIFICATION_KIND: "UNSUPPORTED_VERIFICATION_KIND",
|
|
22
|
+
DUPLICATE_EFFECT_ID: "DUPLICATE_EFFECT_ID",
|
|
23
|
+
RELATIONAL_EXPECT_VALUE_INVALID: "RELATIONAL_EXPECT_VALUE_INVALID",
|
|
24
|
+
RELATIONAL_SUM_COLUMN_REQUIRED: "RELATIONAL_SUM_COLUMN_REQUIRED",
|
|
25
|
+
EQUALITY_DUPLICATE_COLUMN: "EQUALITY_DUPLICATE_COLUMN",
|
|
26
|
+
FILTER_EQ_OVERLAPS_IDENTITY: "FILTER_EQ_OVERLAPS_IDENTITY",
|
|
27
|
+
};
|
|
28
|
+
/** SQL reconciliation / policy / pipeline step `reasons[].code` values (post-resolution verification axis). */
|
|
29
|
+
export const SQL_VERIFICATION_OUTCOME_CODE = {
|
|
30
|
+
ROW_ABSENT: "ROW_ABSENT",
|
|
31
|
+
DUPLICATE_ROWS: "DUPLICATE_ROWS",
|
|
32
|
+
ROW_SHAPE_MISMATCH: "ROW_SHAPE_MISMATCH",
|
|
33
|
+
UNREADABLE_VALUE: "UNREADABLE_VALUE",
|
|
34
|
+
VALUE_MISMATCH: "VALUE_MISMATCH",
|
|
35
|
+
CONNECTOR_ERROR: "CONNECTOR_ERROR",
|
|
36
|
+
MULTI_EFFECT_INCOMPLETE: "MULTI_EFFECT_INCOMPLETE",
|
|
37
|
+
MULTI_EFFECT_ALL_FAILED: "MULTI_EFFECT_ALL_FAILED",
|
|
38
|
+
MULTI_EFFECT_PARTIAL: "MULTI_EFFECT_PARTIAL",
|
|
39
|
+
ROW_NOT_OBSERVED_WITHIN_WINDOW: "ROW_NOT_OBSERVED_WITHIN_WINDOW",
|
|
40
|
+
MULTI_EFFECT_UNCERTAIN_WITHIN_WINDOW: "MULTI_EFFECT_UNCERTAIN_WITHIN_WINDOW",
|
|
41
|
+
UNKNOWN_TOOL: "UNKNOWN_TOOL",
|
|
42
|
+
RETRY_OBSERVATIONS_DIVERGE: "RETRY_OBSERVATIONS_DIVERGE",
|
|
43
|
+
RELATED_ROWS_ABSENT: "RELATED_ROWS_ABSENT",
|
|
44
|
+
RELATIONAL_EXPECTATION_MISMATCH: "RELATIONAL_EXPECTATION_MISMATCH",
|
|
45
|
+
RELATIONAL_SCALAR_UNUSABLE: "RELATIONAL_SCALAR_UNUSABLE",
|
|
46
|
+
ROW_PRESENT_WHEN_FORBIDDEN: "ROW_PRESENT_WHEN_FORBIDDEN",
|
|
47
|
+
ORPHAN_ROW_DETECTED: "ORPHAN_ROW_DETECTED",
|
|
48
|
+
FORBIDDEN_ROWS_STILL_PRESENT_WITHIN_WINDOW: "FORBIDDEN_ROWS_STILL_PRESENT_WITHIN_WINDOW",
|
|
49
|
+
};
|
|
50
|
+
export const UNKNOWN_TOOL = SQL_VERIFICATION_OUTCOME_CODE.UNKNOWN_TOOL;
|
|
51
|
+
/** Fixed `code` strings on registry validation resolutionIssues / resolutionSkipped. */
|
|
52
|
+
export const REGISTRY_VALIDATION_CODE = {
|
|
53
|
+
NO_STEPS_FOR_WORKFLOW: "NO_STEPS_FOR_WORKFLOW",
|
|
54
|
+
RETRY_OBSERVATIONS_DIVERGE: "RETRY_OBSERVATIONS_DIVERGE",
|
|
55
|
+
UNKNOWN_TOOL: "UNKNOWN_TOOL",
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=wireReasonCodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireReasonCodes.js","sourceRoot":"","sources":["../src/wireReasonCodes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2GAA2G;AAC3G,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,kBAAkB,EAAE,oBAAoB;IACxC,2BAA2B,EAAE,6BAA6B;IAC1D,gBAAgB,EAAE,kBAAkB;IACpC,iBAAiB,EAAE,mBAAmB;IACtC,yBAAyB,EAAE,2BAA2B;IACtD,oBAAoB,EAAE,sBAAsB;IAC5C,sBAAsB,EAAE,wBAAwB;IAChD,qBAAqB,EAAE,uBAAuB;IAC9C,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,+BAA+B,EAAE,iCAAiC;IAClE,0BAA0B,EAAE,4BAA4B;IACxD,+BAA+B,EAAE,iCAAiC;IAClE,gCAAgC,EAAE,kCAAkC;IACpE,6BAA6B,EAAE,+BAA+B;IAC9D,mBAAmB,EAAE,qBAAqB;IAC1C,+BAA+B,EAAE,iCAAiC;IAClE,8BAA8B,EAAE,gCAAgC;IAChE,yBAAyB,EAAE,2BAA2B;IACtD,2BAA2B,EAAE,6BAA6B;CAClD,CAAC;AAEX,+GAA+G;AAC/G,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,UAAU,EAAE,YAAY;IACxB,cAAc,EAAE,gBAAgB;IAChC,kBAAkB,EAAE,oBAAoB;IACxC,gBAAgB,EAAE,kBAAkB;IACpC,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,uBAAuB,EAAE,yBAAyB;IAClD,uBAAuB,EAAE,yBAAyB;IAClD,oBAAoB,EAAE,sBAAsB;IAC5C,8BAA8B,EAAE,gCAAgC;IAChE,oCAAoC,EAAE,sCAAsC;IAC5E,YAAY,EAAE,cAAc;IAC5B,0BAA0B,EAAE,4BAA4B;IACxD,mBAAmB,EAAE,qBAAqB;IAC1C,+BAA+B,EAAE,iCAAiC;IAClE,0BAA0B,EAAE,4BAA4B;IACxD,0BAA0B,EAAE,4BAA4B;IACxD,mBAAmB,EAAE,qBAAqB;IAC1C,0CAA0C,EAAE,4CAA4C;CAChF,CAAC;AAEX,MAAM,CAAC,MAAM,YAAY,GAAG,6BAA6B,CAAC,YAAY,CAAC;AAEvE,wFAAwF;AACxF,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,qBAAqB,EAAE,uBAAuB;IAC9C,0BAA0B,EAAE,4BAA4B;IACxD,YAAY,EAAE,cAAc;CACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireReasonEmittersGuard.test.d.ts","sourceRoot":"","sources":["../src/wireReasonEmittersGuard.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
const root = path.join(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
6
|
+
const EMITTER_FILES = [
|
|
7
|
+
"reconciler.ts",
|
|
8
|
+
"multiEffectRollup.ts",
|
|
9
|
+
"relationalInvariant.ts",
|
|
10
|
+
"verificationPolicy.ts",
|
|
11
|
+
"resolveExpectation.ts",
|
|
12
|
+
"pipeline.ts",
|
|
13
|
+
"registryValidation.ts",
|
|
14
|
+
];
|
|
15
|
+
const CODE_STRING_LITERAL = /\bcode\s*:\s*"([A-Z][A-Z0-9_]*)"/g;
|
|
16
|
+
function stripWholeLineComments(src) {
|
|
17
|
+
return src
|
|
18
|
+
.split("\n")
|
|
19
|
+
.filter((line) => {
|
|
20
|
+
const t = line.trimStart();
|
|
21
|
+
return !t.startsWith("//");
|
|
22
|
+
})
|
|
23
|
+
.join("\n");
|
|
24
|
+
}
|
|
25
|
+
describe("wireReasonEmittersGuard", () => {
|
|
26
|
+
it("emitter files contain no code: \"UPPER_SNAKE\" property literals", () => {
|
|
27
|
+
for (const rel of EMITTER_FILES) {
|
|
28
|
+
const p = path.join(root, "src", rel);
|
|
29
|
+
const raw = readFileSync(p, "utf8");
|
|
30
|
+
const body = stripWholeLineComments(raw);
|
|
31
|
+
const matches = [...body.matchAll(CODE_STRING_LITERAL)];
|
|
32
|
+
expect(matches, rel).toEqual([]);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=wireReasonEmittersGuard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireReasonEmittersGuard.test.js","sourceRoot":"","sources":["../src/wireReasonEmittersGuard.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAE3E,MAAM,aAAa,GAAG;IACpB,eAAe;IACf,sBAAsB;IACtB,wBAAwB;IACxB,uBAAuB;IACvB,uBAAuB;IACvB,aAAa;IACb,uBAAuB;CACxB,CAAC;AAEF,MAAM,mBAAmB,GAAG,mCAAmC,CAAC;AAEhE,SAAS,sBAAsB,CAAC,GAAW;IACzC,OAAO,GAAG;SACP,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YACtC,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withWorkflowVerification.persistBundle.test.d.ts","sourceRoot":"","sources":["../src/withWorkflowVerification.persistBundle.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { generateKeyPairSync } from "node:crypto";
|
|
2
|
+
import { readFileSync, writeFileSync, mkdtempSync, rmSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { DatabaseSync } from "node:sqlite";
|
|
7
|
+
import { describe, expect, it, beforeAll, afterAll } from "vitest";
|
|
8
|
+
import { normalizeSpkiPemForSidecar } from "./workflowResultSignature.js";
|
|
9
|
+
import { loadCorpusRun, resolveCorpusRootReal } from "./debugCorpus.js";
|
|
10
|
+
import { withWorkflowVerification } from "./pipeline.js";
|
|
11
|
+
import { verifyRunBundleSignature } from "./verifyRunBundleSignature.js";
|
|
12
|
+
const root = join(fileURLToPath(import.meta.url), "..", "..");
|
|
13
|
+
describe("withWorkflowVerification persistBundle", () => {
|
|
14
|
+
let workDir;
|
|
15
|
+
let dbPath;
|
|
16
|
+
beforeAll(() => {
|
|
17
|
+
workDir = mkdtempSync(join(tmpdir(), "etl-wfv-persist-"));
|
|
18
|
+
dbPath = join(workDir, "demo.db");
|
|
19
|
+
const sql = readFileSync(join(root, "examples", "seed.sql"), "utf8");
|
|
20
|
+
const db = new DatabaseSync(dbPath);
|
|
21
|
+
db.exec(sql);
|
|
22
|
+
db.close();
|
|
23
|
+
});
|
|
24
|
+
afterAll(() => {
|
|
25
|
+
rmSync(workDir, { recursive: true, force: true });
|
|
26
|
+
});
|
|
27
|
+
it("writes a bundle that loadCorpusRun loads as ok with one verified step", async () => {
|
|
28
|
+
const eventsPath = join(root, "examples", "events.ndjson");
|
|
29
|
+
const registryPath = join(root, "examples", "tools.json");
|
|
30
|
+
const wfId = "wf_complete";
|
|
31
|
+
const lines = readFileSync(eventsPath, "utf8").split(/\r?\n/).filter((l) => l.trim().length > 0);
|
|
32
|
+
const events = lines.map((l) => JSON.parse(l)).filter((e) => e.workflowId === wfId);
|
|
33
|
+
const bundleParent = mkdtempSync(join(tmpdir(), "etl-persist-out-"));
|
|
34
|
+
const runId = "hook_run";
|
|
35
|
+
const outDir = join(bundleParent, runId);
|
|
36
|
+
try {
|
|
37
|
+
const result = await withWorkflowVerification({
|
|
38
|
+
workflowId: wfId,
|
|
39
|
+
registryPath,
|
|
40
|
+
dbPath,
|
|
41
|
+
truthReport: () => { },
|
|
42
|
+
persistBundle: { outDir },
|
|
43
|
+
}, (observeStep) => {
|
|
44
|
+
for (const ev of events) {
|
|
45
|
+
observeStep(ev);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
expect(result.steps.length).toBe(1);
|
|
49
|
+
expect(result.steps[0].status).toBe("verified");
|
|
50
|
+
const loaded = loadCorpusRun(resolveCorpusRootReal(bundleParent), runId);
|
|
51
|
+
expect(loaded.loadStatus).toBe("ok");
|
|
52
|
+
const written = readFileSync(join(outDir, "events.ndjson"), "utf8").trim().split(/\r?\n/);
|
|
53
|
+
expect(written.length).toBe(1);
|
|
54
|
+
expect(JSON.parse(written[0])).toEqual(events[0]);
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
rmSync(bundleParent, { recursive: true, force: true });
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
it("persistBundle with ed25519PrivateKeyPemPath writes v2 bundle verifiable by verifyRunBundleSignature", async () => {
|
|
61
|
+
const eventsPath = join(root, "examples", "events.ndjson");
|
|
62
|
+
const registryPath = join(root, "examples", "tools.json");
|
|
63
|
+
const wfId = "wf_complete";
|
|
64
|
+
const lines = readFileSync(eventsPath, "utf8").split(/\r?\n/).filter((l) => l.trim().length > 0);
|
|
65
|
+
const events = lines.map((l) => JSON.parse(l)).filter((e) => e.workflowId === wfId);
|
|
66
|
+
const bundleParent = mkdtempSync(join(tmpdir(), "etl-persist-sign-"));
|
|
67
|
+
const runId = "hook_signed";
|
|
68
|
+
const outDir = join(bundleParent, runId);
|
|
69
|
+
const { privateKey, publicKey } = generateKeyPairSync("ed25519");
|
|
70
|
+
const privatePem = privateKey.export({ type: "pkcs8", format: "pem" });
|
|
71
|
+
const publicPem = publicKey.export({ type: "spki", format: "pem" });
|
|
72
|
+
const keyPath = join(bundleParent, "private.pem");
|
|
73
|
+
const pubPath = join(bundleParent, "public.pem");
|
|
74
|
+
writeFileSync(keyPath, privatePem, "utf8");
|
|
75
|
+
writeFileSync(pubPath, normalizeSpkiPemForSidecar(publicPem), "utf8");
|
|
76
|
+
try {
|
|
77
|
+
await withWorkflowVerification({
|
|
78
|
+
workflowId: wfId,
|
|
79
|
+
registryPath,
|
|
80
|
+
dbPath,
|
|
81
|
+
truthReport: () => { },
|
|
82
|
+
persistBundle: { outDir, ed25519PrivateKeyPemPath: keyPath },
|
|
83
|
+
}, (observeStep) => {
|
|
84
|
+
for (const ev of events) {
|
|
85
|
+
observeStep(ev);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
const loaded = loadCorpusRun(resolveCorpusRootReal(bundleParent), runId);
|
|
89
|
+
expect(loaded.loadStatus).toBe("ok");
|
|
90
|
+
if (loaded.loadStatus !== "ok")
|
|
91
|
+
return;
|
|
92
|
+
expect(loaded.agentRunRecord.schemaVersion).toBe(2);
|
|
93
|
+
if (loaded.agentRunRecord.schemaVersion !== 2)
|
|
94
|
+
return;
|
|
95
|
+
expect(loaded.agentRunRecord.artifacts.workflowResultSignature.relativePath).toBe("workflow-result.sig.json");
|
|
96
|
+
const vr = verifyRunBundleSignature(outDir, pubPath);
|
|
97
|
+
expect(vr).toEqual({ ok: true });
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
rmSync(bundleParent, { recursive: true, force: true });
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=withWorkflowVerification.persistBundle.test.js.map
|