tracegrove 0.0.0-stage → 0.3.0
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 +202 -0
- package/README.md +588 -2
- package/conformance/coordination-vectors.json +377 -0
- package/dist/adapters/browser/capabilities.d.ts +45 -0
- package/dist/adapters/browser/capabilities.js +14 -0
- package/dist/adapters/browser/capabilities.js.map +1 -0
- package/dist/adapters/browser/driver.d.ts +45 -0
- package/dist/adapters/browser/driver.js +295 -0
- package/dist/adapters/browser/driver.js.map +1 -0
- package/dist/adapters/browser/session.d.ts +21 -0
- package/dist/adapters/browser/session.js +87 -0
- package/dist/adapters/browser/session.js.map +1 -0
- package/dist/adapters/http/capabilities.d.ts +2 -0
- package/dist/adapters/http/capabilities.js +21 -0
- package/dist/adapters/http/capabilities.js.map +1 -0
- package/dist/adapters/http/driver.d.ts +55 -0
- package/dist/adapters/http/driver.js +125 -0
- package/dist/adapters/http/driver.js.map +1 -0
- package/dist/adapters/job/capabilities.d.ts +45 -0
- package/dist/adapters/job/capabilities.js +8 -0
- package/dist/adapters/job/capabilities.js.map +1 -0
- package/dist/adapters/job/driver.d.ts +26 -0
- package/dist/adapters/job/driver.js +110 -0
- package/dist/adapters/job/driver.js.map +1 -0
- package/dist/adapters/job/types.d.ts +9 -0
- package/dist/adapters/job/types.js +2 -0
- package/dist/adapters/job/types.js.map +1 -0
- package/dist/adapters/mcp/capabilities.d.ts +46 -0
- package/dist/adapters/mcp/capabilities.js +17 -0
- package/dist/adapters/mcp/capabilities.js.map +1 -0
- package/dist/adapters/mcp/driver.d.ts +10 -0
- package/dist/adapters/mcp/driver.js +83 -0
- package/dist/adapters/mcp/driver.js.map +1 -0
- package/dist/adapters/poll.d.ts +12 -0
- package/dist/adapters/poll.js +31 -0
- package/dist/adapters/poll.js.map +1 -0
- package/dist/authoring/activity.d.ts +17 -0
- package/dist/authoring/activity.js +18 -0
- package/dist/authoring/activity.js.map +1 -0
- package/dist/authoring/agent.d.ts +70 -0
- package/dist/authoring/agent.js +268 -0
- package/dist/authoring/agent.js.map +1 -0
- package/dist/authoring/appLaunch.d.ts +7 -0
- package/dist/authoring/appLaunch.js +32 -0
- package/dist/authoring/appLaunch.js.map +1 -0
- package/dist/authoring/appLocation.d.ts +2 -0
- package/dist/authoring/appLocation.js +5 -0
- package/dist/authoring/appLocation.js.map +1 -0
- package/dist/authoring/browser.d.ts +15 -0
- package/dist/authoring/browser.js +20 -0
- package/dist/authoring/browser.js.map +1 -0
- package/dist/authoring/compile.d.ts +47 -0
- package/dist/authoring/compile.js +508 -0
- package/dist/authoring/compile.js.map +1 -0
- package/dist/authoring/discover.d.ts +43 -0
- package/dist/authoring/discover.js +149 -0
- package/dist/authoring/discover.js.map +1 -0
- package/dist/authoring/environmentTemplates.d.ts +3 -0
- package/dist/authoring/environmentTemplates.js +24 -0
- package/dist/authoring/environmentTemplates.js.map +1 -0
- package/dist/authoring/heal.d.ts +108 -0
- package/dist/authoring/heal.js +723 -0
- package/dist/authoring/heal.js.map +1 -0
- package/dist/authoring/index.d.ts +14 -0
- package/dist/authoring/index.js +15 -0
- package/dist/authoring/index.js.map +1 -0
- package/dist/authoring/init.d.ts +21 -0
- package/dist/authoring/init.js +141 -0
- package/dist/authoring/init.js.map +1 -0
- package/dist/authoring/localSettings.d.ts +33 -0
- package/dist/authoring/localSettings.js +31 -0
- package/dist/authoring/localSettings.js.map +1 -0
- package/dist/authoring/media.d.ts +10 -0
- package/dist/authoring/media.js +37 -0
- package/dist/authoring/media.js.map +1 -0
- package/dist/authoring/module.d.ts +2 -0
- package/dist/authoring/module.js +38 -0
- package/dist/authoring/module.js.map +1 -0
- package/dist/authoring/run.d.ts +74 -0
- package/dist/authoring/run.js +242 -0
- package/dist/authoring/run.js.map +1 -0
- package/dist/authoring/runSource.d.ts +6 -0
- package/dist/authoring/runSource.js +24 -0
- package/dist/authoring/runSource.js.map +1 -0
- package/dist/authoring/savedRun.d.ts +13 -0
- package/dist/authoring/savedRun.js +94 -0
- package/dist/authoring/savedRun.js.map +1 -0
- package/dist/authoring/schema.d.ts +574 -0
- package/dist/authoring/schema.js +147 -0
- package/dist/authoring/schema.js.map +1 -0
- package/dist/authoring/snapshotSource.d.ts +13 -0
- package/dist/authoring/snapshotSource.js +41 -0
- package/dist/authoring/snapshotSource.js.map +1 -0
- package/dist/authoring/sourceSelection.d.ts +34 -0
- package/dist/authoring/sourceSelection.js +13 -0
- package/dist/authoring/sourceSelection.js.map +1 -0
- package/dist/authoring/sources.d.ts +5 -0
- package/dist/authoring/sources.js +65 -0
- package/dist/authoring/sources.js.map +1 -0
- package/dist/authoring/status.d.ts +48 -0
- package/dist/authoring/status.js +100 -0
- package/dist/authoring/status.js.map +1 -0
- package/dist/authoring/typed.d.ts +6 -0
- package/dist/authoring/typed.js +5 -0
- package/dist/authoring/typed.js.map +1 -0
- package/dist/authoring/ui.d.ts +10 -0
- package/dist/authoring/ui.js +486 -0
- package/dist/authoring/ui.js.map +1 -0
- package/dist/authoring/uiPage.d.ts +1 -0
- package/dist/authoring/uiPage.js +358 -0
- package/dist/authoring/uiPage.js.map +1 -0
- package/dist/authoring/uiSourceControls.d.ts +2 -0
- package/dist/authoring/uiSourceControls.js +41 -0
- package/dist/authoring/uiSourceControls.js.map +1 -0
- package/dist/authoring/verificationSource.d.ts +41 -0
- package/dist/authoring/verificationSource.js +46 -0
- package/dist/authoring/verificationSource.js.map +1 -0
- package/dist/authoring/workspace.d.ts +33 -0
- package/dist/authoring/workspace.js +58 -0
- package/dist/authoring/workspace.js.map +1 -0
- package/dist/cli/arguments.d.ts +288 -0
- package/dist/cli/arguments.js +121 -0
- package/dist/cli/arguments.js.map +1 -0
- package/dist/cli/cleanup.d.ts +18 -0
- package/dist/cli/cleanup.js +40 -0
- package/dist/cli/cleanup.js.map +1 -0
- package/dist/cli/doctor.d.ts +51 -0
- package/dist/cli/doctor.js +118 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/errors.d.ts +2 -0
- package/dist/cli/errors.js +84 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/jsonFile.d.ts +2 -0
- package/dist/cli/jsonFile.js +15 -0
- package/dist/cli/jsonFile.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +603 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/render.d.ts +22 -0
- package/dist/cli/render.js +150 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/cli/samples/catalog.d.ts +10 -0
- package/dist/cli/samples/catalog.js +3 -0
- package/dist/cli/samples/catalog.js.map +1 -0
- package/dist/cli/samples/write.d.ts +5 -0
- package/dist/cli/samples/write.js +64 -0
- package/dist/cli/samples/write.js.map +1 -0
- package/dist/cli/source.d.ts +41 -0
- package/dist/cli/source.js +59 -0
- package/dist/cli/source.js.map +1 -0
- package/dist/core/activationDecision.d.ts +153 -0
- package/dist/core/activationDecision.js +34 -0
- package/dist/core/activationDecision.js.map +1 -0
- package/dist/core/artifacts.d.ts +18 -0
- package/dist/core/artifacts.js +79 -0
- package/dist/core/artifacts.js.map +1 -0
- package/dist/core/atomicFiles.d.ts +9 -0
- package/dist/core/atomicFiles.js +76 -0
- package/dist/core/atomicFiles.js.map +1 -0
- package/dist/core/boundedFile.d.ts +2 -0
- package/dist/core/boundedFile.js +28 -0
- package/dist/core/boundedFile.js.map +1 -0
- package/dist/core/bundle.d.ts +77 -0
- package/dist/core/bundle.js +375 -0
- package/dist/core/bundle.js.map +1 -0
- package/dist/core/bundleArchive.d.ts +10 -0
- package/dist/core/bundleArchive.js +47 -0
- package/dist/core/bundleArchive.js.map +1 -0
- package/dist/core/bundleEvidence.d.ts +12 -0
- package/dist/core/bundleEvidence.js +169 -0
- package/dist/core/bundleEvidence.js.map +1 -0
- package/dist/core/bundleExport.d.ts +12 -0
- package/dist/core/bundleExport.js +36 -0
- package/dist/core/bundleExport.js.map +1 -0
- package/dist/core/bundleFiles.d.ts +5 -0
- package/dist/core/bundleFiles.js +47 -0
- package/dist/core/bundleFiles.js.map +1 -0
- package/dist/core/bundlePaths.d.ts +2 -0
- package/dist/core/bundlePaths.js +7 -0
- package/dist/core/bundlePaths.js.map +1 -0
- package/dist/core/bundleSnapshot.d.ts +26 -0
- package/dist/core/bundleSnapshot.js +71 -0
- package/dist/core/bundleSnapshot.js.map +1 -0
- package/dist/core/capabilityBoundary.d.ts +1452 -0
- package/dist/core/capabilityBoundary.js +361 -0
- package/dist/core/capabilityBoundary.js.map +1 -0
- package/dist/core/capabilityLifecycle.d.ts +366 -0
- package/dist/core/capabilityLifecycle.js +79 -0
- package/dist/core/capabilityLifecycle.js.map +1 -0
- package/dist/core/cleanup.d.ts +35 -0
- package/dist/core/cleanup.js +71 -0
- package/dist/core/cleanup.js.map +1 -0
- package/dist/core/cleanupActions.d.ts +5 -0
- package/dist/core/cleanupActions.js +15 -0
- package/dist/core/cleanupActions.js.map +1 -0
- package/dist/core/cleanupAttestation.d.ts +23 -0
- package/dist/core/cleanupAttestation.js +57 -0
- package/dist/core/cleanupAttestation.js.map +1 -0
- package/dist/core/clock.d.ts +4 -0
- package/dist/core/clock.js +14 -0
- package/dist/core/clock.js.map +1 -0
- package/dist/core/compiler.d.ts +19 -0
- package/dist/core/compiler.js +200 -0
- package/dist/core/compiler.js.map +1 -0
- package/dist/core/controller.d.ts +7 -0
- package/dist/core/controller.js +132 -0
- package/dist/core/controller.js.map +1 -0
- package/dist/core/coordination.d.ts +72 -0
- package/dist/core/coordination.js +118 -0
- package/dist/core/coordination.js.map +1 -0
- package/dist/core/corpus.d.ts +60 -0
- package/dist/core/corpus.js +216 -0
- package/dist/core/corpus.js.map +1 -0
- package/dist/core/deadline.d.ts +12 -0
- package/dist/core/deadline.js +38 -0
- package/dist/core/deadline.js.map +1 -0
- package/dist/core/deliveryJournal.d.ts +37 -0
- package/dist/core/deliveryJournal.js +85 -0
- package/dist/core/deliveryJournal.js.map +1 -0
- package/dist/core/environmentPreflight.d.ts +14 -0
- package/dist/core/environmentPreflight.js +179 -0
- package/dist/core/environmentPreflight.js.map +1 -0
- package/dist/core/errors.d.ts +22 -0
- package/dist/core/errors.js +29 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events.d.ts +14 -0
- package/dist/core/events.js +37 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/executionInspection.d.ts +90 -0
- package/dist/core/executionInspection.js +31 -0
- package/dist/core/executionInspection.js.map +1 -0
- package/dist/core/executionOwnership.d.ts +72 -0
- package/dist/core/executionOwnership.js +82 -0
- package/dist/core/executionOwnership.js.map +1 -0
- package/dist/core/executionPreparation.d.ts +362 -0
- package/dist/core/executionPreparation.js +93 -0
- package/dist/core/executionPreparation.js.map +1 -0
- package/dist/core/executionReadback.d.ts +15 -0
- package/dist/core/executionReadback.js +21 -0
- package/dist/core/executionReadback.js.map +1 -0
- package/dist/core/executor.d.ts +46 -0
- package/dist/core/executor.js +616 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/frozenBundle.d.ts +314 -0
- package/dist/core/frozenBundle.js +24 -0
- package/dist/core/frozenBundle.js.map +1 -0
- package/dist/core/fsDurability.d.ts +2 -0
- package/dist/core/fsDurability.js +12 -0
- package/dist/core/fsDurability.js.map +1 -0
- package/dist/core/generators.d.ts +4 -0
- package/dist/core/generators.js +71 -0
- package/dist/core/generators.js.map +1 -0
- package/dist/core/gitSnapshot.d.ts +63 -0
- package/dist/core/gitSnapshot.js +55 -0
- package/dist/core/gitSnapshot.js.map +1 -0
- package/dist/core/gitSources.d.ts +29 -0
- package/dist/core/gitSources.js +97 -0
- package/dist/core/gitSources.js.map +1 -0
- package/dist/core/ledger.d.ts +38 -0
- package/dist/core/ledger.js +169 -0
- package/dist/core/ledger.js.map +1 -0
- package/dist/core/ledgerInspection.d.ts +18 -0
- package/dist/core/ledgerInspection.js +66 -0
- package/dist/core/ledgerInspection.js.map +1 -0
- package/dist/core/ledgerRecords.d.ts +23 -0
- package/dist/core/ledgerRecords.js +29 -0
- package/dist/core/ledgerRecords.js.map +1 -0
- package/dist/core/localActivationState.d.ts +260 -0
- package/dist/core/localActivationState.js +49 -0
- package/dist/core/localActivationState.js.map +1 -0
- package/dist/core/localPromotionState.d.ts +387 -0
- package/dist/core/localPromotionState.js +22 -0
- package/dist/core/localPromotionState.js.map +1 -0
- package/dist/core/localQualificationResults.d.ts +39 -0
- package/dist/core/localQualificationResults.js +160 -0
- package/dist/core/localQualificationResults.js.map +1 -0
- package/dist/core/localReviewStore.d.ts +28 -0
- package/dist/core/localReviewStore.js +167 -0
- package/dist/core/localReviewStore.js.map +1 -0
- package/dist/core/localScenarioActivation.d.ts +6 -0
- package/dist/core/localScenarioActivation.js +70 -0
- package/dist/core/localScenarioActivation.js.map +1 -0
- package/dist/core/localScenarioOwner.d.ts +20 -0
- package/dist/core/localScenarioOwner.js +2 -0
- package/dist/core/localScenarioOwner.js.map +1 -0
- package/dist/core/localScenarioPromotion.d.ts +9 -0
- package/dist/core/localScenarioPromotion.js +49 -0
- package/dist/core/localScenarioPromotion.js.map +1 -0
- package/dist/core/localScenarioState.d.ts +2297 -0
- package/dist/core/localScenarioState.js +117 -0
- package/dist/core/localScenarioState.js.map +1 -0
- package/dist/core/localScenarioStore.d.ts +838 -0
- package/dist/core/localScenarioStore.js +218 -0
- package/dist/core/localScenarioStore.js.map +1 -0
- package/dist/core/localScenarioStructure.d.ts +4 -0
- package/dist/core/localScenarioStructure.js +52 -0
- package/dist/core/localScenarioStructure.js.map +1 -0
- package/dist/core/localStructureState.d.ts +2 -0
- package/dist/core/localStructureState.js +22 -0
- package/dist/core/localStructureState.js.map +1 -0
- package/dist/core/lookup.d.ts +662 -0
- package/dist/core/lookup.js +55 -0
- package/dist/core/lookup.js.map +1 -0
- package/dist/core/ownership.d.ts +3 -0
- package/dist/core/ownership.js +24 -0
- package/dist/core/ownership.js.map +1 -0
- package/dist/core/planInspection.d.ts +108 -0
- package/dist/core/planInspection.js +44 -0
- package/dist/core/planInspection.js.map +1 -0
- package/dist/core/planner.d.ts +14 -0
- package/dist/core/planner.js +261 -0
- package/dist/core/planner.js.map +1 -0
- package/dist/core/qualification.d.ts +26 -0
- package/dist/core/qualification.js +58 -0
- package/dist/core/qualification.js.map +1 -0
- package/dist/core/qualificationBundle.d.ts +6 -0
- package/dist/core/qualificationBundle.js +51 -0
- package/dist/core/qualificationBundle.js.map +1 -0
- package/dist/core/qualificationExecution.d.ts +879 -0
- package/dist/core/qualificationExecution.js +54 -0
- package/dist/core/qualificationExecution.js.map +1 -0
- package/dist/core/recoveryStatus.d.ts +6 -0
- package/dist/core/recoveryStatus.js +123 -0
- package/dist/core/recoveryStatus.js.map +1 -0
- package/dist/core/reducer.d.ts +56 -0
- package/dist/core/reducer.js +355 -0
- package/dist/core/reducer.js.map +1 -0
- package/dist/core/replayAssessment.d.ts +15 -0
- package/dist/core/replayAssessment.js +78 -0
- package/dist/core/replayAssessment.js.map +1 -0
- package/dist/core/replayEvidence.d.ts +7 -0
- package/dist/core/replayEvidence.js +58 -0
- package/dist/core/replayEvidence.js.map +1 -0
- package/dist/core/repositorySelectionEvidence.d.ts +3 -0
- package/dist/core/repositorySelectionEvidence.js +58 -0
- package/dist/core/repositorySelectionEvidence.js.map +1 -0
- package/dist/core/rerun.d.ts +3 -0
- package/dist/core/rerun.js +24 -0
- package/dist/core/rerun.js.map +1 -0
- package/dist/core/resultSink.d.ts +52 -0
- package/dist/core/resultSink.js +120 -0
- package/dist/core/resultSink.js.map +1 -0
- package/dist/core/review.d.ts +22 -0
- package/dist/core/review.js +65 -0
- package/dist/core/review.js.map +1 -0
- package/dist/core/runnerCapabilities.d.ts +22 -0
- package/dist/core/runnerCapabilities.js +44 -0
- package/dist/core/runnerCapabilities.js.map +1 -0
- package/dist/core/scenario.d.ts +32 -0
- package/dist/core/scenario.js +119 -0
- package/dist/core/scenario.js.map +1 -0
- package/dist/core/scenarioActivation.d.ts +16 -0
- package/dist/core/scenarioActivation.js +47 -0
- package/dist/core/scenarioActivation.js.map +1 -0
- package/dist/core/scenarioStructure.d.ts +400 -0
- package/dist/core/scenarioStructure.js +72 -0
- package/dist/core/scenarioStructure.js.map +1 -0
- package/dist/core/snapshotEvidence.d.ts +3 -0
- package/dist/core/snapshotEvidence.js +37 -0
- package/dist/core/snapshotEvidence.js.map +1 -0
- package/dist/core/snapshotRepository.d.ts +48 -0
- package/dist/core/snapshotRepository.js +47 -0
- package/dist/core/snapshotRepository.js.map +1 -0
- package/dist/core/source-analysis.d.ts +18 -0
- package/dist/core/source-analysis.js +99 -0
- package/dist/core/source-analysis.js.map +1 -0
- package/dist/core/source-citation.d.ts +53 -0
- package/dist/core/source-citation.js +59 -0
- package/dist/core/source-citation.js.map +1 -0
- package/dist/core/sourcePromotion.d.ts +929 -0
- package/dist/core/sourcePromotion.js +92 -0
- package/dist/core/sourcePromotion.js.map +1 -0
- package/dist/core/sourceReviewEvidence.d.ts +271 -0
- package/dist/core/sourceReviewEvidence.js +24 -0
- package/dist/core/sourceReviewEvidence.js.map +1 -0
- package/dist/core/targetObservation.d.ts +3 -0
- package/dist/core/targetObservation.js +26 -0
- package/dist/core/targetObservation.js.map +1 -0
- package/dist/hosts/launchTemplates.d.ts +2 -0
- package/dist/hosts/launchTemplates.js +5 -0
- package/dist/hosts/launchTemplates.js.map +1 -0
- package/dist/hosts/local.d.ts +17 -0
- package/dist/hosts/local.js +311 -0
- package/dist/hosts/local.js.map +1 -0
- package/dist/hosts/localSupervisor.d.ts +1 -0
- package/dist/hosts/localSupervisor.js +115 -0
- package/dist/hosts/localSupervisor.js.map +1 -0
- package/dist/hosts/mock.d.ts +4 -0
- package/dist/hosts/mock.js +82 -0
- package/dist/hosts/mock.js.map +1 -0
- package/dist/hosts/pinnedArguments.d.ts +3 -0
- package/dist/hosts/pinnedArguments.js +39 -0
- package/dist/hosts/pinnedArguments.js.map +1 -0
- package/dist/hosts/runtime.d.ts +5 -0
- package/dist/hosts/runtime.js +60 -0
- package/dist/hosts/runtime.js.map +1 -0
- package/dist/hosts/sourceIdentity.d.ts +54 -0
- package/dist/hosts/sourceIdentity.js +27 -0
- package/dist/hosts/sourceIdentity.js.map +1 -0
- package/dist/hosts/types.d.ts +39 -0
- package/dist/hosts/types.js +2 -0
- package/dist/hosts/types.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/awr/attachment.d.ts +34 -0
- package/dist/integrations/awr/attachment.js +120 -0
- package/dist/integrations/awr/attachment.js.map +1 -0
- package/dist/integrations/awr/attachmentContracts.d.ts +273 -0
- package/dist/integrations/awr/attachmentContracts.js +39 -0
- package/dist/integrations/awr/attachmentContracts.js.map +1 -0
- package/dist/integrations/awr/attachmentHttp.d.ts +9 -0
- package/dist/integrations/awr/attachmentHttp.js +19 -0
- package/dist/integrations/awr/attachmentHttp.js.map +1 -0
- package/dist/integrations/awr/cli.d.ts +7 -0
- package/dist/integrations/awr/cli.js +43 -0
- package/dist/integrations/awr/cli.js.map +1 -0
- package/dist/integrations/awr/contracts.d.ts +54 -0
- package/dist/integrations/awr/contracts.js +33 -0
- package/dist/integrations/awr/contracts.js.map +1 -0
- package/dist/integrations/awr/http.d.ts +8 -0
- package/dist/integrations/awr/http.js +23 -0
- package/dist/integrations/awr/http.js.map +1 -0
- package/dist/integrations/awr/index.d.ts +7 -0
- package/dist/integrations/awr/index.js +8 -0
- package/dist/integrations/awr/index.js.map +1 -0
- package/dist/integrations/awr/jsonHttp.d.ts +15 -0
- package/dist/integrations/awr/jsonHttp.js +69 -0
- package/dist/integrations/awr/jsonHttp.js.map +1 -0
- package/dist/integrations/awr/outbox.d.ts +28 -0
- package/dist/integrations/awr/outbox.js +88 -0
- package/dist/integrations/awr/outbox.js.map +1 -0
- package/dist/integrations/awr/projection.d.ts +4 -0
- package/dist/integrations/awr/projection.js +54 -0
- package/dist/integrations/awr/projection.js.map +1 -0
- package/dist/protocol/canonical.d.ts +41 -0
- package/dist/protocol/canonical.js +114 -0
- package/dist/protocol/canonical.js.map +1 -0
- package/dist/protocol/index.d.ts +9620 -0
- package/dist/protocol/index.js +185 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/primitives.d.ts +63 -0
- package/dist/protocol/primitives.js +46 -0
- package/dist/protocol/primitives.js.map +1 -0
- package/dist/protocol/schemas/browser.d.ts +153 -0
- package/dist/protocol/schemas/browser.js +29 -0
- package/dist/protocol/schemas/browser.js.map +1 -0
- package/dist/protocol/schemas/capability.d.ts +2126 -0
- package/dist/protocol/schemas/capability.js +165 -0
- package/dist/protocol/schemas/capability.js.map +1 -0
- package/dist/protocol/schemas/capabilityLifecycle.d.ts +509 -0
- package/dist/protocol/schemas/capabilityLifecycle.js +47 -0
- package/dist/protocol/schemas/capabilityLifecycle.js.map +1 -0
- package/dist/protocol/schemas/cleanup.d.ts +109 -0
- package/dist/protocol/schemas/cleanup.js +59 -0
- package/dist/protocol/schemas/cleanup.js.map +1 -0
- package/dist/protocol/schemas/cli.d.ts +121 -0
- package/dist/protocol/schemas/cli.js +24 -0
- package/dist/protocol/schemas/cli.js.map +1 -0
- package/dist/protocol/schemas/config.d.ts +59 -0
- package/dist/protocol/schemas/config.js +32 -0
- package/dist/protocol/schemas/config.js.map +1 -0
- package/dist/protocol/schemas/corpus.d.ts +36 -0
- package/dist/protocol/schemas/corpus.js +10 -0
- package/dist/protocol/schemas/corpus.js.map +1 -0
- package/dist/protocol/schemas/definitions.d.ts +3409 -0
- package/dist/protocol/schemas/definitions.js +431 -0
- package/dist/protocol/schemas/definitions.js.map +1 -0
- package/dist/protocol/schemas/evidenceProjection.d.ts +146 -0
- package/dist/protocol/schemas/evidenceProjection.js +18 -0
- package/dist/protocol/schemas/evidenceProjection.js.map +1 -0
- package/dist/protocol/schemas/execution.d.ts +3179 -0
- package/dist/protocol/schemas/execution.js +500 -0
- package/dist/protocol/schemas/execution.js.map +1 -0
- package/dist/protocol/schemas/gitSources.d.ts +330 -0
- package/dist/protocol/schemas/gitSources.js +32 -0
- package/dist/protocol/schemas/gitSources.js.map +1 -0
- package/dist/protocol/schemas/mcp.d.ts +24 -0
- package/dist/protocol/schemas/mcp.js +16 -0
- package/dist/protocol/schemas/mcp.js.map +1 -0
- package/dist/protocol/schemas/nativeJob.d.ts +106 -0
- package/dist/protocol/schemas/nativeJob.js +16 -0
- package/dist/protocol/schemas/nativeJob.js.map +1 -0
- package/dist/protocol/schemas/portableEnvironment.d.ts +1256 -0
- package/dist/protocol/schemas/portableEnvironment.js +108 -0
- package/dist/protocol/schemas/portableEnvironment.js.map +1 -0
- package/dist/protocol/schemas/promotion.d.ts +132 -0
- package/dist/protocol/schemas/promotion.js +9 -0
- package/dist/protocol/schemas/promotion.js.map +1 -0
- package/dist/protocol/schemas/protocol.d.ts +146 -0
- package/dist/protocol/schemas/protocol.js +25 -0
- package/dist/protocol/schemas/protocol.js.map +1 -0
- package/dist/protocol/schemas/recoveryStatus.d.ts +88 -0
- package/dist/protocol/schemas/recoveryStatus.js +20 -0
- package/dist/protocol/schemas/recoveryStatus.js.map +1 -0
- package/dist/protocol/schemas/resultSink.d.ts +80 -0
- package/dist/protocol/schemas/resultSink.js +14 -0
- package/dist/protocol/schemas/resultSink.js.map +1 -0
- package/dist/protocol/schemas/review.d.ts +248 -0
- package/dist/protocol/schemas/review.js +45 -0
- package/dist/protocol/schemas/review.js.map +1 -0
- package/dist/protocol/schemas/scenario.d.ts +810 -0
- package/dist/protocol/schemas/scenario.js +53 -0
- package/dist/protocol/schemas/scenario.js.map +1 -0
- package/dist/protocol/schemas/source.d.ts +300 -0
- package/dist/protocol/schemas/source.js +25 -0
- package/dist/protocol/schemas/source.js.map +1 -0
- package/dist/source/git.d.ts +36 -0
- package/dist/source/git.js +159 -0
- package/dist/source/git.js.map +1 -0
- package/dist/source/gitObjectProof.d.ts +12 -0
- package/dist/source/gitObjectProof.js +115 -0
- package/dist/source/gitObjectProof.js.map +1 -0
- package/dist/source/snapshotPaths.d.ts +2 -0
- package/dist/source/snapshotPaths.js +24 -0
- package/dist/source/snapshotPaths.js.map +1 -0
- package/dist/source/snapshotTree.d.ts +15 -0
- package/dist/source/snapshotTree.js +79 -0
- package/dist/source/snapshotTree.js.map +1 -0
- package/docs/architecture.md +126 -0
- package/docs/awr-delivery.md +102 -0
- package/docs/browser-driver.md +148 -0
- package/docs/cleanup-followups.md +74 -0
- package/docs/developer-ux.md +315 -0
- package/docs/examples/portable-environments/alongside_runner.json +199 -0
- package/docs/examples/portable-environments/external_staging.json +183 -0
- package/docs/git-object-proof.md +100 -0
- package/docs/git-source-resolution.md +133 -0
- package/docs/images/ui-run.png +0 -0
- package/docs/local-execution-recovery.md +55 -0
- package/docs/local-review-store.md +13 -0
- package/docs/local-scenario-store.md +91 -0
- package/docs/mcp-driver.md +87 -0
- package/docs/native-jobs.md +96 -0
- package/docs/portable-environments.md +155 -0
- package/docs/qualification-registration.md +58 -0
- package/docs/qualification-results.md +59 -0
- package/docs/replay-assessment.md +17 -0
- package/docs/result-sink.md +87 -0
- package/docs/scenario-activation.md +54 -0
- package/docs/scenario-structure.md +58 -0
- package/docs/source-promotion.md +104 -0
- package/docs/source-review.md +21 -0
- package/docs/verified-bundles.md +175 -0
- package/docs/work-report-attachment.md +127 -0
- package/package.json +45 -4
- package/samples/django-notes/manage.py +8 -0
- package/samples/django-notes/notes/__init__.py +0 -0
- package/samples/django-notes/notes/auth.py +14 -0
- package/samples/django-notes/notes/migrations/0001_initial.py +19 -0
- package/samples/django-notes/notes/migrations/__init__.py +0 -0
- package/samples/django-notes/notes/models.py +13 -0
- package/samples/django-notes/notes/views.py +33 -0
- package/samples/django-notes/notesite/__init__.py +0 -0
- package/samples/django-notes/notesite/settings.py +17 -0
- package/samples/django-notes/notesite/urls.py +9 -0
- package/samples/django-notes/requirements.txt +1 -0
- package/samples/django-notes/tracegrove/notes/crud.flow.yaml +27 -0
- package/samples/django-notes/tracegrove.config.yaml +7 -0
- package/samples/fastapi-notes/app/__init__.py +0 -0
- package/samples/fastapi-notes/app/main.py +69 -0
- package/samples/fastapi-notes/requirements.txt +2 -0
- package/samples/fastapi-notes/tracegrove/notes/crud.flow.yaml +27 -0
- package/samples/fastapi-notes/tracegrove.config.yaml +8 -0
- package/samples/notes-api/app/app.mjs +67 -0
- package/samples/notes-api/app/http.mjs +16 -0
- package/samples/notes-api/tracegrove/fixtures/existing-note.fixture.yaml +12 -0
- package/samples/notes-api/tracegrove/notes/create-read-delete.flow.yaml +35 -0
- package/samples/notes-api/tracegrove/notes/list.flow.yaml +25 -0
- package/samples/notes-api/tracegrove.config.yaml +15 -0
- package/samples/notes-api/verification/actions/notes.registry.yaml +6 -0
- package/samples/notes-api/verification/auth/host-issued-owner.yaml +6 -0
- package/samples/notes-api/verification/cases/notes.contract.yaml +51 -0
- package/samples/notes-api/verification/cases/notes.create.yaml +123 -0
- package/samples/notes-api/verification/cases/notes.suite.yaml +5 -0
- package/samples/notes-api/verification/components/notes-api-stub.profile.yaml +8 -0
- package/samples/notes-api/verification/components/notes-api.profile.yaml +15 -0
- package/samples/notes-api/verification/environments/local-notes.yaml +11 -0
- package/samples/notes-api/verification/environments/mock-notes.yaml +11 -0
- package/samples/notes-api/verification/fidelity/full-live-sandbox.yaml +7 -0
- package/samples/notes-api/verification/fidelity/mock-contract.yaml +6 -0
- package/samples/notes-api/verification/fixtures/existing-note.payload.yaml +15 -0
- package/samples/notes-api/verification/fixtures/existing-note.plan.yaml +9 -0
- package/samples/notes-api/verification/fixtures/existing-note.recipe.yaml +29 -0
- package/samples/notes-api/verification/hosts/local-process.yaml +27 -0
- package/samples/notes-api/verification/hosts/mock-loopback.yaml +14 -0
- package/samples/notes-api/verification/mocks/notes.responses.yaml +5 -0
- package/samples/notes-api/verification/personas/owner.yaml +16 -0
- package/samples/notes-api/verification/policies/no-authoring-inference.yaml +10 -0
- package/samples/notes-api/verification/runners/http.yaml +5 -0
- package/samples/notes-api/verification/surfaces/http-api.binding.yaml +11 -0
- package/samples/notes-api/verification/surfaces/http-api.pack.yaml +7 -0
- package/samples/notes-api/verification/workflow.yaml +27 -0
- package/samples/notes-browser/tracegrove/notes/browser.flow.yaml +19 -0
- package/samples/notes-browser/verification/cases/notes.browser.yaml +63 -0
- package/samples/notes-browser/verification/cases/notes.suite.yaml +4 -0
- package/samples/notes-browser/verification/runners/http.yaml +5 -0
- package/samples/notes-browser/verification/surfaces/http-api.binding.yaml +11 -0
- package/samples/notes-browser/verification/surfaces/http-api.pack.yaml +7 -0
- package/samples/notes-django/README.md +21 -0
- package/samples/notes-django/app/django_app.py +119 -0
- package/samples/notes-django/app/requirements.lock +4 -0
- package/samples/notes-mcp/app/mcp.mjs +47 -0
- package/samples/notes-mcp/tracegrove/notes.flow.yaml +20 -0
- package/samples/notes-mcp/tracegrove.config.yaml +13 -0
- package/samples/report-jobs/README.md +30 -0
- package/samples/report-jobs/app/jobs-api.mjs +65 -0
- package/samples/report-jobs/app/native-bridge.mjs +30 -0
- package/samples/report-jobs/app/store.mjs +74 -0
- package/samples/report-jobs/app/worker.mjs +22 -0
- package/samples/report-jobs/tracegrove/fixtures/failed-job.fixture.yaml +12 -0
- package/samples/report-jobs/tracegrove/fixtures/held-job.fixture.yaml +12 -0
- package/samples/report-jobs/tracegrove/fixtures/success-job.fixture.yaml +12 -0
- package/samples/report-jobs/tracegrove/reports/cancellation.flow.yaml +15 -0
- package/samples/report-jobs/tracegrove/reports/completion.flow.yaml +31 -0
- package/samples/report-jobs/tracegrove/reports/failure.flow.yaml +12 -0
- package/samples/report-jobs/tracegrove.config.yaml +10 -0
- package/samples/report-native/README.md +11 -0
- package/samples/report-native/tracegrove/cancellation.flow.yaml +11 -0
- package/samples/report-native/tracegrove/completion.flow.yaml +22 -0
- package/samples/report-native/tracegrove/failure.flow.yaml +7 -0
- package/samples/report-native/tracegrove.config.yaml +11 -0
- package/schema/tracegrove_cli-error_v1.json +156 -0
- package/schema/tracegrove_config_v1.json +233 -0
- package/schema/tracegrove_fixture_v1.json +297 -0
- package/schema/tracegrove_flow_v1.json +960 -0
- package/schema/tracegrove_recovery-status_v1.json +234 -0
- package/schema/tracegrove_run-video_v1.json +25 -0
- package/schema/workflow_action-registry_v1.json +303 -0
- package/schema/workflow_auth-recipe_v1.json +146 -0
- package/schema/workflow_boundary-observation_v1.json +515 -0
- package/schema/workflow_browser-command_v1.json +292 -0
- package/schema/workflow_browser-locator_v1.json +74 -0
- package/schema/workflow_browser-network-observation_v1.json +48 -0
- package/schema/workflow_browser-observation_v1.json +53 -0
- package/schema/workflow_budget-reservation_v1.json +150 -0
- package/schema/workflow_campaign-result_v1.json +382 -0
- package/schema/workflow_capability-artifact-manifest_v1.json +529 -0
- package/schema/workflow_capability-descriptor_v1.json +351 -0
- package/schema/workflow_capability-lifecycle-checkpoint_v1.json +510 -0
- package/schema/workflow_capability-observation_v1.json +1707 -0
- package/schema/workflow_capability-operation_v1.json +3212 -0
- package/schema/workflow_capability-replay-plan_v1.json +1247 -0
- package/schema/workflow_capability-retry-policy_v1.json +39 -0
- package/schema/workflow_capability-retry-state_v1.json +242 -0
- package/schema/workflow_case_v1.json +4222 -0
- package/schema/workflow_change-model_v1.json +614 -0
- package/schema/workflow_cleanup-expectation_v1.json +108 -0
- package/schema/workflow_cleanup-followup_v1.json +145 -0
- package/schema/workflow_component-profile_v1.json +219 -0
- package/schema/workflow_config_v1.json +180 -0
- package/schema/workflow_corpus_v1.json +172 -0
- package/schema/workflow_cost-observation_v1.json +366 -0
- package/schema/workflow_credential-lease_v1.json +222 -0
- package/schema/workflow_effective-config_v1.json +214 -0
- package/schema/workflow_environment-plan_v1.json +445 -0
- package/schema/workflow_environment_v1.json +1827 -0
- package/schema/workflow_evidence-projection_v1.json +636 -0
- package/schema/workflow_execution_v1.json +4086 -0
- package/schema/workflow_fidelity-plan_v1.json +512 -0
- package/schema/workflow_fidelity-profile_v1.json +396 -0
- package/schema/workflow_fixture-manifest_v1.json +918 -0
- package/schema/workflow_fixture-plan_v1.json +594 -0
- package/schema/workflow_git-source-request_v1.json +124 -0
- package/schema/workflow_git-source-resolution_v1.json +660 -0
- package/schema/workflow_git-source-snapshot_v1.json +287 -0
- package/schema/workflow_host-lease_v1.json +321 -0
- package/schema/workflow_host-observation_v1.json +282 -0
- package/schema/workflow_host-plan_v1.json +719 -0
- package/schema/workflow_identity-attestation_v1.json +412 -0
- package/schema/workflow_intelligence-policy_v1.json +153 -0
- package/schema/workflow_logical-payload_v1.json +206 -0
- package/schema/workflow_mcp-tool-call_v1.json +70 -0
- package/schema/workflow_mcp-tool-observation_v1.json +125 -0
- package/schema/workflow_mock-responses_v1.json +185 -0
- package/schema/workflow_native-job-action_v1.json +123 -0
- package/schema/workflow_native-job-observation_v1.json +138 -0
- package/schema/workflow_native-job-ready_v1.json +31 -0
- package/schema/workflow_native-job-request_v1.json +155 -0
- package/schema/workflow_native-job-response_v1.json +125 -0
- package/schema/workflow_ownership_v1.json +116 -0
- package/schema/workflow_persona_v1.json +499 -0
- package/schema/workflow_plan-edit-projection_v1.json +152 -0
- package/schema/workflow_plan-review_v1.json +246 -0
- package/schema/workflow_portable-environment-intent_v1.json +499 -0
- package/schema/workflow_portable-environment-profile_v1.json +1429 -0
- package/schema/workflow_portable-preflight_v1.json +2281 -0
- package/schema/workflow_qualification-admission_v1.json +467 -0
- package/schema/workflow_qualification-intent_v1.json +98 -0
- package/schema/workflow_qualification-policy_v1.json +109 -0
- package/schema/workflow_qualification-round_v1.json +226 -0
- package/schema/workflow_replay-assessment_v1.json +197 -0
- package/schema/workflow_replay-finding_v1.json +147 -0
- package/schema/workflow_request_v1.json +1567 -0
- package/schema/workflow_result-ingest_v1.json +343 -0
- package/schema/workflow_revisions_v1.json +334 -0
- package/schema/workflow_routing-decision_v1.json +482 -0
- package/schema/workflow_runner-capabilities_v1.json +316 -0
- package/schema/workflow_runner-profile_v1.json +119 -0
- package/schema/workflow_runner-protocol_v1_host.json +382 -0
- package/schema/workflow_runner-protocol_v1_plugin.json +491 -0
- package/schema/workflow_scenario-activation-intent_v1.json +346 -0
- package/schema/workflow_scenario-activation_v1.json +562 -0
- package/schema/workflow_scenario-projection_v1.json +221 -0
- package/schema/workflow_scenario-promotion_v1.json +455 -0
- package/schema/workflow_scenario-replay-assessment_v1.json +696 -0
- package/schema/workflow_scenario-revision-token_v1.json +115 -0
- package/schema/workflow_scenario-structure_v1.json +368 -0
- package/schema/workflow_scenario_v1.json +401 -0
- package/schema/workflow_scoped-resource_v1.json +550 -0
- package/schema/workflow_seed-recipe_v1.json +724 -0
- package/schema/workflow_selection_v1.json +1108 -0
- package/schema/workflow_signed-cleanup-followup_v1.json +175 -0
- package/schema/workflow_source-plan_v1.json +756 -0
- package/schema/workflow_source-selection_v1.json +456 -0
- package/schema/workflow_source-validation_v1.json +366 -0
- package/schema/workflow_step-event_v1.json +228 -0
- package/schema/workflow_stream-transcript_v1.json +1030 -0
- package/schema/workflow_suite_v1.json +64 -0
- package/schema/workflow_surface-binding_v1.json +411 -0
- package/schema/workflow_surface-pack_v1.json +159 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Replay assessment
|
|
2
|
+
|
|
3
|
+
`assessScenarioReplay(ports, token)` derives read-only readiness from the complete registered scenario history and authenticated raw bundle snapshots. It never accepts caller-provided passing assessments and never activates coverage. A host must still perform explicit authenticated activation with an atomic comparison against the returned scenario revision token, chosen rounds and exact definition bindings.
|
|
4
|
+
|
|
5
|
+
The immutable, scoped `workflow.qualification-policy/v1` selects environment or revision proof and requires between two and twenty independent rounds. Two is the minimum; there is no mock-only or single-run activation policy. Source-derived scenarios additionally require revision proof even when the policy requests environment proof.
|
|
6
|
+
|
|
7
|
+
Every current-epoch round retains its exact scenario/replay/policy/matrix/target-profile/strata bindings. Registration history is complete, monotonic and checked before any results are filtered. Reused campaign, execution, attempt or leased-state identities are refused. An incomplete history or unknown issuer is an error, never an empty passing report. Old epochs remain in the host's history but cannot count toward current qualification.
|
|
8
|
+
|
|
9
|
+
Each terminal round is re-derived through the same authenticated snapshot reader used by `reduceQualificationRound`; the trusted result index must match that derived round reference. Required cell coverage, assertions, capture, observed identity and cleanup guards therefore run again. Mock, replayed, intercepted, fault-injected or stubbed claimed boundaries cannot count as live proof. Required target identities must be nonempty and observed; the full observed tuple must match the expected tuple. A failed, cancelled, blocked or inconclusive campaign cannot qualify even when some cells passed.
|
|
10
|
+
|
|
11
|
+
Revision proof additionally binds every resolved repository role, URL, commit, origin, object reference and lockfile digest to the observed target and requires a registered resolver reference. Generic environment proof cannot satisfy a revision-specific policy or waive missing/mismatched source identity when source bindings or expected repository identities exist. Source-bound requests must retain the scenario's reviewed source plan. These comparisons do not authenticate observations by themselves: `authenticateEvidence` must establish issuer authority, real state leases, the reviewed source/replay/policy/matrix/target closure, required capture and independently observed target fields against the captured manifest digest. Copying requested identities into an observation is insufficient. The prototype does not install that host adapter or a source resolver.
|
|
12
|
+
|
|
13
|
+
The latest admitted current-epoch round must be terminal and qualify. Two older passes do not hide a newer pending or nonqualifying campaign. All current-epoch rounds, including nonqualifying ones, appear in the report. Version, definition, epoch and latest sequence are rechecked after reading evidence; a concurrent registration or semantic edit makes the report stale. A subsequent activation must repeat its atomic comparison because an edit can still arrive after this read-only report returns.
|
|
14
|
+
|
|
15
|
+
Reports contain sealed `workflow.replay-assessment/v1` documents and their resolvable `workflow.replay-finding/v1` reason documents. Proof levels are structural, mock, environment or revision. These are observations, not permissions. The report contains its exact revision token and qualifying round refs for a future activation owner; the schema's `qualifies` boolean alone grants no authority.
|
|
16
|
+
|
|
17
|
+
Tests run real local native application observations and genuine mock observations with explicitly simulated catalog registration and issuer ports. They prove consumer reduction and race handling. Synthetic resolved-source fixtures exercise classifier guards only. The [local result index](qualification-results.md#durable-local-terminal-results) supplies retained terminal evidence, and [explicit activation](scenario-activation.md#local-atomic-storage) has a durable journal adapter. [Structural validation](scenario-structure.md) shares the executor preflight and supports proposed/degraded transitions. [Source-plan promotion](source-promotion.md) binds current approved storage to proposed scenarios. Additional integration tests use actual registration and native execution with simulated external authority. Hosted registration/issuer authority, live staging qualification and activated regression execution remain open.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Independent local result retention
|
|
2
|
+
|
|
3
|
+
The result sink retains complete verified bundles independently of the producer's
|
|
4
|
+
run directory. It reuses the existing fenced `LocalLedger` for its index; there is
|
|
5
|
+
no second database, mutable status file, or hosted service in this implementation.
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
tracegrove result-ingest --bundle ./run/bundle --sink ./retained-results --json
|
|
9
|
+
tracegrove results --sink ./retained-results --limit 20 --json
|
|
10
|
+
tracegrove results --sink ./retained-results --id <result-id> --json
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`result-ingest` captures a bounded verified snapshot, checks the selected consumer
|
|
14
|
+
scope, copies only sealed files, reads the completed archive back, and publishes
|
|
15
|
+
an immutable `workflow.result-ingest/v1` receipt. Manifest and payload bytes come
|
|
16
|
+
from the same snapshot that passed complete evidence reduction; the source is
|
|
17
|
+
not reopened during copy. Binary artifacts retain their exact bytes. Unsealed
|
|
18
|
+
files, including accidental scratch files, are not imported.
|
|
19
|
+
|
|
20
|
+
SDK consumers that authenticated an earlier snapshot can pass
|
|
21
|
+
`sink.ingest(bundleDir, { expectedManifestDigest })`. A mismatch is refused before
|
|
22
|
+
archiving or publishing a campaign receipt. This binds retention to the authenticated
|
|
23
|
+
bytes without treating the digest itself as issuer authentication.
|
|
24
|
+
|
|
25
|
+
The receipt records the actual retained outcome, exact campaign/request/selection
|
|
26
|
+
and fidelity-plan refs, planned fidelity lanes, manifest digest, receipt count,
|
|
27
|
+
and acceptance time. A failed, cancelled, blocked, or mocked result never becomes
|
|
28
|
+
a passing live result through storage. Every receipt explicitly says:
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{"evidenceClass":"integrity_checked_local_bundle","issuerStatus":"unverified","qualificationStatus":"not_evaluated"}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Exit 0 from ingestion means durable retention succeeded, including retention of
|
|
35
|
+
an honestly failed attempt. Check `receipt.retainedOutcome` for the result's
|
|
36
|
+
verdict. The ordinary CLI error convention remains stderr plus a nonzero exit;
|
|
37
|
+
invalid or inconsistent evidence is a conflict (exit 2).
|
|
38
|
+
|
|
39
|
+
## Reading and replaying deliveries
|
|
40
|
+
|
|
41
|
+
Listing returns stored receipt metadata with `archiveStatus: not_checked`. It
|
|
42
|
+
does not renew an earlier integrity check. Inspecting a result by ID captures and
|
|
43
|
+
re-verifies the retained archive against its exact indexed manifest and refs.
|
|
44
|
+
Missing or corrupted archives fail rather than echoing the recorded verdict as a
|
|
45
|
+
fresh verification. Inspection keeps working when the original run is removed.
|
|
46
|
+
|
|
47
|
+
Delivering the identical campaign and manifest again returns the original receipt
|
|
48
|
+
with `replayed: true`; it does not append another result. Reusing that scoped
|
|
49
|
+
`campaignId` with different evidence is a conflict, including renaming its result
|
|
50
|
+
document reference. Even a differently serialized
|
|
51
|
+
manifest is different evidence. Preserve the original manifest bytes for retries.
|
|
52
|
+
|
|
53
|
+
List pages are bounded to 100 records. An opaque cursor binds the selected scope,
|
|
54
|
+
index version, and offset; later deliveries do not change that page sequence.
|
|
55
|
+
Cursors are pagination positions, not access grants. An exhausted 10,000-record
|
|
56
|
+
prototype index blocks new admissions until an authoritative archival index is
|
|
57
|
+
provided. Entries are never silently evicted.
|
|
58
|
+
|
|
59
|
+
## Durability and scope
|
|
60
|
+
|
|
61
|
+
Archive files and directories are synced before their immutable content-addressed
|
|
62
|
+
directory is published. The archive namespace is synced before the ledger receipt
|
|
63
|
+
is appended and synced. A crash between those operations can leave an unindexed
|
|
64
|
+
complete object, but cannot publish an accepted receipt for an incomplete copy.
|
|
65
|
+
A retry verifies that object and syncs its namespace again before publishing one receipt. Partial
|
|
66
|
+
staging directories are not indexed; only a staging directory created by the
|
|
67
|
+
current operation is removed on an ordinary write failure. Existing content is
|
|
68
|
+
not replaced or silently repaired. The test suite includes an actual SIGKILL at
|
|
69
|
+
the archive/index boundary, reopen/retry, and injected sync failure.
|
|
70
|
+
|
|
71
|
+
The SDK exports `ResultSink`, `ResultSinkAuthority`, `LocalResultSink`, and
|
|
72
|
+
`VerifiedBundleSnapshot`. A host supplies consumer authorization; ingestion
|
|
73
|
+
rechecks it after capture and commits without an asynchronous gap. The CLI uses
|
|
74
|
+
the same local operator scope as ordinary runs, with no producer-supplied scope
|
|
75
|
+
override. The journal and objects are namespaced by that complete scope.
|
|
76
|
+
|
|
77
|
+
The operator must provide protected, quiescent source and storage directories
|
|
78
|
+
and authorize the source location before calling the SDK. The existing local
|
|
79
|
+
ledger supplies one writer and stale-process recovery; this is not distributed
|
|
80
|
+
fencing or a filesystem ACL against a hostile same-user process. Local owner
|
|
81
|
+
labels, including `WORKFLOW_VERIFY_OWNER`, do not authenticate a remote tenant.
|
|
82
|
+
|
|
83
|
+
This sink verifies integrity and record consistency. It does not authenticate an
|
|
84
|
+
issuer, approve a source plan, provision qualification leases, activate coverage,
|
|
85
|
+
or publish an OrgX AWR record. Hosted receiver authentication, tenant delivery,
|
|
86
|
+
and scoped OrgX projection require their own trusted adapters. A storage receipt
|
|
87
|
+
cannot stand in for those acceptance gates.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Explicit scenario activation
|
|
2
|
+
|
|
3
|
+
`activateScenario(ports, intent)` consumes an exact scenario revision token, replay/policy/matrix/target references, an explicit selection of terminal round references and a scoped idempotency key. It returns a sealed `workflow.scenario-activation/v1` receipt. Actor identity and the authorization policy come from the authenticated host's `authorizeActivation(scope, intentDigest)`; callers cannot submit an actor, approval flag or readiness result.
|
|
4
|
+
|
|
5
|
+
The operation requires a validating scenario, checks all expected definition bindings and re-derives replay qualification from authenticated complete evidence. The selected set must satisfy the policy's independent-round minimum and include the latest admitted qualifying round. Duplicate or foreign rounds, mock-only proof, a newer pending round and stale scope/version/epoch are refused. Existing matrix, history, issuer and bundle guards are shared with replay assessment.
|
|
6
|
+
|
|
7
|
+
`compareAndSwapActivation` is an atomic authority boundary. In one transaction, the host must compare validating state, aggregate version, definition and replay/policy/matrix/target digests, epoch, latest admitted sequence, exact immutable selected result refs and current activation authorization. It must enforce the scoped idempotency key and publish the assessment/finding records, activation receipt and active projection together, or publish none. The selected-result check still matters when a result index changes without advancing the scenario version. A registered newer round or semantic invalidation must conflict with an older activation attempt. The local adapter below uses the existing journal; hosted transaction storage remains a separate host integration.
|
|
8
|
+
|
|
9
|
+
Repeated round order is normalized. An already committed identical intent returns its original receipt without another write, including after a lost commit acknowledgement or concurrent identical delivery. Reusing the key for a different intent conflicts. Authorization runs before historical receipt lookup too. Returning an earlier activation receipt does not assert that coverage remains active now: a later semantic invalidation or retirement remains in effect, and retries cannot resurrect it. Read the current projection to establish current state.
|
|
10
|
+
|
|
11
|
+
This API cannot activate proposed, degraded, active or retired projections through a fresh intent. Promotion and successful structural validation must first establish validating state through their own authority. Product regressions remain visible through qualification/release evidence; they do not implicitly call semantic invalidation or remove the detecting case.
|
|
12
|
+
|
|
13
|
+
## Local atomic storage
|
|
14
|
+
|
|
15
|
+
`LocalScenarioStore.activationPorts(results, authority)` connects explicit activation
|
|
16
|
+
to the scenario registry and `LocalQualificationResults` on the same `LocalLedger`.
|
|
17
|
+
It reuses the public decision validator and independently rederives replay assessment
|
|
18
|
+
inside the commit boundary. Submitted readiness flags, actors, reports and projections
|
|
19
|
+
are compared with freshly derived values; they cannot grant authority.
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
const ports = store.activationPorts(results, {
|
|
23
|
+
resolvePolicy,
|
|
24
|
+
authorizeActivation, // Current authenticated owner and policy for this exact intent digest.
|
|
25
|
+
});
|
|
26
|
+
const activation = await activateScenario(ports, intent);
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
The adapter checks the scenario registry version, complete result-index version and
|
|
30
|
+
captured archive manifest digests after its final activation authorization await.
|
|
31
|
+
There is no await between those checks and the single synced append containing the
|
|
32
|
+
active projection, receipt and full assessment/finding records. An unrelated change
|
|
33
|
+
to the scope's registry or result index can conflict conservatively; retry from a
|
|
34
|
+
fresh snapshot. Revocation and physical/provider fencing outside this local writer
|
|
35
|
+
still require the host to synchronize its authority checks with its controller.
|
|
36
|
+
|
|
37
|
+
Idempotency keys are unique across scenarios in the scope. Reopen reads the complete
|
|
38
|
+
activation and projection from the same journal entry. A write failure publishes
|
|
39
|
+
neither; a committed entry with a lost acknowledgement returns its original receipt
|
|
40
|
+
on retry. Historical retrieval requires current activation authorization and never
|
|
41
|
+
reverses a later invalidation. Existing registration-only journals read with empty
|
|
42
|
+
activation history; an active projection without its persisted receipt is refused.
|
|
43
|
+
The scope permits 500 retained activations before explicit archival indexing is needed.
|
|
44
|
+
|
|
45
|
+
Tests use actual registered native/mock execution, the immutable result sink and
|
|
46
|
+
durable scenario journal, alongside the earlier in-memory consumer tests. They cover
|
|
47
|
+
concurrency, lost acknowledgement with reopen, pre-write failure, forged submissions,
|
|
48
|
+
registration/invalidation/revocation/archive/index races and corrupt persisted reports.
|
|
49
|
+
Host, reviewed-source, physical-lease and issuer authority are explicitly simulated.
|
|
50
|
+
These proofs do not establish hosted activation, deployed staging qualification or
|
|
51
|
+
live regression admission. [Structural transitions](scenario-structure.md) have a local
|
|
52
|
+
adapter. [Source-plan promotion](source-promotion.md) has a local approved-review bridge.
|
|
53
|
+
Hosted persistence and
|
|
54
|
+
activated regression execution remain open.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Structural validation before qualification
|
|
2
|
+
|
|
3
|
+
`LocalScenarioStore.propose(definition, selections)` stores an authorized immutable
|
|
4
|
+
scenario in `proposed` state. Qualification registration refuses that state.
|
|
5
|
+
`validateScenarioStructure(ports, token, frozenPlan)` performs static checks and
|
|
6
|
+
records the transition to `validating`. It can also revalidate a `degraded` revision
|
|
7
|
+
after semantic invalidation. It does not run the candidate or claim functional PASS.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
await store.propose(definition, [qualificationMatrix, selectedRound]);
|
|
11
|
+
const validation = await validateScenarioStructure(
|
|
12
|
+
store.structuralPorts({ authorizeValidation }),
|
|
13
|
+
exactScenarioRevisionToken,
|
|
14
|
+
frozenTrialPlan,
|
|
15
|
+
);
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The plan must be a sealed trial/work-proof request without lifecycle refs or plan
|
|
19
|
+
blockers. Its cases, personas, target cells and exclusions must exactly match the
|
|
20
|
+
scenario matrix. The implementation shares the executor's actual document resolution,
|
|
21
|
+
capability reproduction, fixture/fidelity checks and case compiler. Missing fixture
|
|
22
|
+
plans, changed fidelity, unsupported capabilities and unresolved/modified documents
|
|
23
|
+
fail before a host, fixture operation or provider starts. Matrix policy is taken from
|
|
24
|
+
the scenario's reviewed definition; this operation cannot change that matrix.
|
|
25
|
+
|
|
26
|
+
The authenticated host supplies `authorizeValidation(scope, intentDigest)`, returning
|
|
27
|
+
the current actor and authorization policy for the exact token, frozen request and
|
|
28
|
+
executable-closure digest. Source/review/definition checking remains the store's
|
|
29
|
+
required `validateDefinition` responsibility. No permission or independent source
|
|
30
|
+
validation is inferred from a caller's success flag. Proposed storage is not itself
|
|
31
|
+
the source-plan promotion manifest; [source promotion](source-promotion.md) supplies
|
|
32
|
+
that separate approved-review operation.
|
|
33
|
+
|
|
34
|
+
The local adapter recompiles the supplied closure and rechecks definition and actor
|
|
35
|
+
authority before publishing the sealed `workflow.scenario-structure/v1` receipt and
|
|
36
|
+
validating projection in one synced registry entry. A competing edit, invalidation or
|
|
37
|
+
authorization change publishes no validation. The receipt records the exact scenario
|
|
38
|
+
token, request, qualification matrix, executable closure, actor, policy and timestamp.
|
|
39
|
+
It clears current qualification/activation refs without deleting historical evidence.
|
|
40
|
+
|
|
41
|
+
Repeated identical deliveries recover one receipt, including after lost acknowledgement
|
|
42
|
+
or journal reopen. Historical receipt retrieval requires current validation permission;
|
|
43
|
+
it does not reverse later invalidation or prove that coverage remains validating now.
|
|
44
|
+
Revalidation of a replacement definition uses a new token and preserves its advanced
|
|
45
|
+
invalidation epoch. Keep the original frozen plan alongside the receipt: the digest
|
|
46
|
+
binds that plan but does not make the receipt an executable bundle.
|
|
47
|
+
|
|
48
|
+
The index is bounded to 500 structural records per scope and refuses exhaustion rather
|
|
49
|
+
than dropping history. Existing journals read with empty structural history. The earlier
|
|
50
|
+
`initialize` API remains a trusted-host import of an already structurally validated
|
|
51
|
+
scenario; it does not produce this receipt and requires the host to establish both
|
|
52
|
+
promotion and validation authority before calling it.
|
|
53
|
+
|
|
54
|
+
This is protected local single-writer storage. It does not install hosted IAM, physical
|
|
55
|
+
state leases, hosted source promotion, CLI lifecycle commands, live qualification or
|
|
56
|
+
activation. Tests use real journal bytes and static compilation; one positive test then
|
|
57
|
+
executes two newly admitted native cells. Host/source/review/effect authority is explicitly
|
|
58
|
+
simulated, and structural success alone is never reported as application success.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Promoting an approved source plan
|
|
2
|
+
|
|
3
|
+
`promoteScenario(ports, intent, definition, selections)` registers an approved source
|
|
4
|
+
scenario as `proposed`. It returns a sealed `workflow.scenario-promotion/v1` manifest.
|
|
5
|
+
It creates no plan approval, structural validation, runtime PASS or active coverage.
|
|
6
|
+
|
|
7
|
+
The intent names the scenario, immutable definition and selection refs, exact editable
|
|
8
|
+
plan revision token, and scoped idempotency key. The definition binds the source plan
|
|
9
|
+
and current review. Promotion requires the stored review to be approved for that exact
|
|
10
|
+
plan/edit revision and to retain its atomically stored source validation. Each promoted
|
|
11
|
+
case must belong to approved runnable candidates whose source elements were independently
|
|
12
|
+
validated. Blocked/excluded candidates and non-scenario plan dispositions cannot become
|
|
13
|
+
promoted cases. The matrix and every supplied selection retain the exact case/persona/
|
|
14
|
+
target strata and policy.
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
const ports = scenarios.promotionPorts(reviews, { authorizePromotion });
|
|
18
|
+
const manifest = await promoteScenario(ports, {
|
|
19
|
+
scenarioId,
|
|
20
|
+
definitionRef: definition.ref,
|
|
21
|
+
reviewToken,
|
|
22
|
+
selectionManifestRefs: selections.map(selection => selection.ref),
|
|
23
|
+
idempotencyKey,
|
|
24
|
+
}, definition, selections);
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`LocalReviewStore.approvedSnapshot(ledger, token, reviewRef)` resolves actual approved
|
|
28
|
+
storage on the same writer. It requires current review authority without writing a
|
|
29
|
+
review or approving anything. Its documents are copies; its runtime `assertCurrent`
|
|
30
|
+
checks the review aggregate version. The local promotion adapter resolves that snapshot
|
|
31
|
+
again inside its commit, compares the submitted context, rechecks creation/promotion
|
|
32
|
+
authority and verifies both review and scenario versions after the final await.
|
|
33
|
+
One synced scenario-registry entry contains the proposed definition, selections,
|
|
34
|
+
manifest, full reviewed plan, review and source-validation snapshot. Gaps, withheld
|
|
35
|
+
flows, excluded candidates and diagnostics remain in that immutable snapshot.
|
|
36
|
+
|
|
37
|
+
The manifest binds the review/source-validation refs and storage version as well as
|
|
38
|
+
the authenticated promoter and policy. Selection order is normalized. Repeated or
|
|
39
|
+
concurrent identical intent returns one manifest; a changed scoped key binding or an
|
|
40
|
+
attempt to overwrite an existing scenario conflicts. A pre-write failure publishes
|
|
41
|
+
nothing; a lost acknowledgement recovers the committed manifest after reopen. The
|
|
42
|
+
registry's existing 100-scenario bound applies. Older journals have no promotion record.
|
|
43
|
+
|
|
44
|
+
## Current review checks after promotion
|
|
45
|
+
|
|
46
|
+
Bind the current review owner once when constructing a source-backed local scenario store:
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
const scenarios = new LocalScenarioStore(ledger, scenarioId, scope, {
|
|
50
|
+
reviewStore: reviews,
|
|
51
|
+
authorize,
|
|
52
|
+
validateDefinition: validateReplayPolicyAndTarget,
|
|
53
|
+
validateStateLeases,
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
`reviewStore` is required when a definition names a source plan. It must own the same
|
|
58
|
+
ledger. The store checks its exact current approved review and independently validated
|
|
59
|
+
runnable cases in addition to the host's replay/target/policy checks. Initialize,
|
|
60
|
+
structural validation, round registration and activation hold its synchronous version
|
|
61
|
+
fence through their last awaited authorization and assert it immediately before the
|
|
62
|
+
registry write. An edit during that await publishes no transition.
|
|
63
|
+
|
|
64
|
+
An edit clears the current plan review. These guards then refuse later structural,
|
|
65
|
+
qualification and activation admission against the old review. Use `invalidateScenario`
|
|
66
|
+
with a replacement definition to advance its epoch and clear activation. Historical
|
|
67
|
+
promotion retries return the original receipt without renewing approval or altering
|
|
68
|
+
the scenario. Promotion registers new entries; replacing an existing scenario remains
|
|
69
|
+
an explicit semantic edit and review flow.
|
|
70
|
+
|
|
71
|
+
All ports belong to the trusted host. A saved source plan or producer-supplied approval
|
|
72
|
+
object cannot supply them. Protect the state directory and synchronize external IAM,
|
|
73
|
+
revocation and provider fencing with the controller. Local hashes and receipts do not
|
|
74
|
+
establish a hosted issuer or deployed revision. Source-bound activation still requires
|
|
75
|
+
independent runtime revision proof; source inspection alone cannot grant it.
|
|
76
|
+
|
|
77
|
+
## Execute the reviewed revision
|
|
78
|
+
|
|
79
|
+
Use the compiler's `--source-snapshot` and `--source-repository-role` options to bind
|
|
80
|
+
the complete resolver-head snapshot before selecting, reviewing and promoting cases.
|
|
81
|
+
The approved source plan must name that exact resolver matrix. A different matrix
|
|
82
|
+
ref is rejected even when its commits happen to match. Component-only source runs
|
|
83
|
+
can still execute, but cannot establish revision qualification.
|
|
84
|
+
|
|
85
|
+
`prepareQualificationExecution` reads current source review evidence through the
|
|
86
|
+
scenario owner and carries copies of the sealed plan, approved review and source
|
|
87
|
+
validation into the frozen execution documents. It leaves the original trial plan
|
|
88
|
+
unchanged. Each effect authorization resolves current owner state again, including
|
|
89
|
+
after awaited effect permission. The controller never obtains approval from the
|
|
90
|
+
copied documents.
|
|
91
|
+
|
|
92
|
+
Preflight and saved-bundle checks use `validateReviewedSourceDocuments` to check seals,
|
|
93
|
+
scope, plan/review/validation links and the selected matrix. The same pure schema is
|
|
94
|
+
shared with promotion. Saved evidence proves the recorded relationships; the owning
|
|
95
|
+
review store determines current approval. Historical bundles remain readable after
|
|
96
|
+
an edit, while new execution and activation require current authority.
|
|
97
|
+
|
|
98
|
+
Tests compose immutable Git reads, an actual bounded TypeScript AST predicate, source
|
|
99
|
+
validation, durable review, promotion, structural validation, two independently admitted
|
|
100
|
+
native revision rounds and atomic activation, including reopen recovery and source-edit
|
|
101
|
+
races at the final structural, registration and activation boundaries.
|
|
102
|
+
Authentication, coverage policy, physical leases and issuer authority are explicitly
|
|
103
|
+
simulated. The AST oracle proves a declared POST branch only. These proofs do not
|
|
104
|
+
establish full semantic coverage, a deployed source tuple or hosted qualification.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Source-backed plan review
|
|
2
|
+
|
|
3
|
+
`validatePlanSources` checks a sealed source plan against its exact change model and revision matrix. It authorizes each repository, hashes the fetched full diff, resolves citations only at selected immutable commits, and reuses `verifySourceCitation` for file/excerpt checks. A modified working checkout cannot substitute for unavailable selected source.
|
|
4
|
+
|
|
5
|
+
Runnable derivations need confirmed metadata, citations, and nonempty evidence from a registered independent AST/schema/route oracle. Confidence and a proposed `confirmed` label do not establish that evidence. Failed/partial/unsupported extraction retains diagnostic refs as plan gaps. The trusted coverage policy checks frozen requirements, unresolved questions, excluded material and no-E2E reasoning. Source checks never produce runtime PASS, qualification or activation.
|
|
6
|
+
|
|
7
|
+
Trusted host integration:
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
const reviewPorts: PlanReviewPorts = {
|
|
11
|
+
...authenticatedReviewAndStorage,
|
|
12
|
+
validateSources: (plan, policyRef) => validatePlanSources(sourcePorts, plan, policyRef),
|
|
13
|
+
};
|
|
14
|
+
const reviewed = await reviewPlan(reviewPorts, revisionToken, 'approved', reasonRefs);
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
All ports belong to the authenticated host. A candidate, plugin or authoring model cannot supply its own source checker, oracle or coverage policy. Revision policy must explicitly admit a missing merge base and its alternative diff method. A full diff over 4 MiB, over 500 distinct runnable citations, unavailable objects, mismatched refs or denied authority block validation rather than truncate source.
|
|
18
|
+
|
|
19
|
+
Approval requires a sealed `workflow.source-validation/v1` result binding the same plan, change model, matrix, scope and admitted review policy. Its ref is included in the immutable review's reason refs. The host's `compareAndSwap` must publish that validation record, review and projection in one atomic write. A losing write publishes none of them. Rejection requires no fabricated successful source check. An edit still clears the current review; historical validation records remain evidence of their original source digests.
|
|
20
|
+
|
|
21
|
+
This changes the experimental `PlanReviewPorts` contract: approved reviews require `validateSources`, and `compareAndSwap` receives a fourth validation argument. Persist it atomically; ignoring it is not a conforming host. [Local review storage](local-review-store.md) persists its records and [source promotion](source-promotion.md) binds current approved storage to a proposed scenario. This review API installs no hosted source registry or production oracle. Qualification execution requires a separately registered runtime owner; activated regression execution remains blocked.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# Verified bundle snapshots
|
|
2
|
+
|
|
3
|
+
`verifyBundle(directory)` retains its summary response shape; invalid bundles report a null outcome instead of echoing a producer's PASS label. `readVerifiedBundle(directory)` returns the checked request, selection, campaign, per-cell receipts, frozen document map and manifest byte digest; it throws instead of returning records for an invalid bundle. These records prepare whole-round qualification evaluation but do not themselves qualify or activate a scenario.
|
|
4
|
+
|
|
5
|
+
Both paths use one `BundleSnapshot`. Each listed payload is read once, checked against its sealed byte count/hash and retained privately. JSON decoding, assertion checks and campaign reduction consume those captured bytes. Mutating the directory after capture does not change that snapshot. Buffers returned by the snapshot are copies. A later verification call takes a fresh snapshot rather than caching a former success.
|
|
6
|
+
|
|
7
|
+
`VerifiedBundleSnapshot.open(directory)` exposes the exact verified manifest and
|
|
8
|
+
payload bytes as defensive copies for storage adapters. Its records and manifest
|
|
9
|
+
digest are copies too. The [local result sink](result-sink.md) writes those
|
|
10
|
+
captured bytes, verifies the completed archive, and publishes a scoped receipt
|
|
11
|
+
through the existing ledger. It does not re-open producer files during copying
|
|
12
|
+
or promote a storage receipt into qualification authority.
|
|
13
|
+
|
|
14
|
+
The reader refuses traversal, duplicate paths, symlinks and nonregular files. Reads are bounded to the expected size plus one byte so growth is detected without loading an arbitrarily larger file. Current prototype bounds are 1 MiB for the manifest, 16 MiB per file, 64 MiB of payload and 10,000 files. Oversize bundles fail verification; files are never truncated or silently omitted. Larger media packs need an explicitly supported bounded reader.
|
|
15
|
+
|
|
16
|
+
Campaign verification rechecks complete receipt bindings, missing cells, coverage and proof eligibility, as well as full request/selection/campaign scope and reference identity. Per-cell checks bind exact case/persona/surface/variant and qualification-admission refs. The outcome label alone cannot cover inconsistent campaign metadata.
|
|
17
|
+
|
|
18
|
+
Target comparison checks every target metadata field and each required component's
|
|
19
|
+
kind and identity. Current hosts supply component attestations and, when explicitly
|
|
20
|
+
bound, verified pinned Git-object repository observations. Remote ownership,
|
|
21
|
+
release, schema, flag, browser, container and model metadata remain unobserved.
|
|
22
|
+
Requesting those fields cannot fill their observations; a required mismatch blocks
|
|
23
|
+
the run before fixtures or steps. The saved-bundle reader reconstructs the observed
|
|
24
|
+
tuple from the captured host attestations too, so inventing matching expected and
|
|
25
|
+
observed metadata and recomputing all file/document hashes cannot create passing
|
|
26
|
+
source or deployment evidence. Unsupported target observations need a real host
|
|
27
|
+
contract before they can qualify. Honest blocked attempts retain their evidence.
|
|
28
|
+
|
|
29
|
+
An optional source-snapshot binding covers local launch content. Its frozen
|
|
30
|
+
manifest must match the admitted scope and supervisor observation; every attested
|
|
31
|
+
identity file must belong to that manifest with the same bytes. The reader also
|
|
32
|
+
recomputes the source digest from those file observations. This binds captured
|
|
33
|
+
local content. The [Git proof guide](git-object-proof.md) describes the separate
|
|
34
|
+
actual-file object check and opt-in repository role. Neither establishes remote
|
|
35
|
+
ownership, deployment identity or hosted issuer trust.
|
|
36
|
+
|
|
37
|
+
This is integrity and record-consistency verification. A passing mocked bundle retains its mocked proof boundary. It is not live qualification, trusted issuer identity, tenant authorization or production acceptance. The host must authorize a quiescent artifact directory and apply its own issuer/admission policy. The snapshot API is not a remote filesystem ACL or a defense against a hostile process replacing parent directories during capture.
|
|
38
|
+
|
|
39
|
+
## Atomic local export
|
|
40
|
+
|
|
41
|
+
`exportVerifiedBundle(source, output)` captures and reduces one bounded snapshot, writes only its sealed bytes into a private sibling staging directory, verifies the staged copy, and renames it into a fresh output directory. The manifest comes from that same snapshot; unlisted host/private files are excluded. The CLI `export` and authoring `test` use this path. CLI JSON includes `published`; invalid source evidence publishes no output. Existing outputs are never merged or overwritten, including an empty directory.
|
|
42
|
+
|
|
43
|
+
Files and directory entries are synced before acknowledgement, including newly created ancestor entries. Content-addressed object publication uses an exclusive hard link, unique temporary storage, bounded no-follow readback and a single digest-checked read. A preexisting corrupt object is retained and reported, never silently replaced. Preexisting symlink ancestors are rejected before directory creation. These operations require a supported owned local filesystem with directory fsync and hard links; unsupported filesystem behavior fails rather than claiming durability.
|
|
44
|
+
|
|
45
|
+
Cooperating exporters share an exclusive sibling publication lock. A writer crash can leave its private staging directory and lock; the destination is absent or contains the complete verified bundle. Locks are never automatically broken. The operator must establish that the writer is gone and inspect the owned staging/output state before a separately authorized cleanup/retry; do not blindly remove a lock belonging to another writer. If final parent sync fails after rename, the command reports that publication durability is unconfirmed: the complete output may exist, so verify it before retrying and do not overwrite it.
|
|
46
|
+
|
|
47
|
+
Tests include concurrent independent publishers, actual writer SIGKILL during a payload write, source mutation after snapshot capture, corrupt objects, symlink/no-effect refusal and injected write/sync failures. This establishes local process-crash behavior and fsync ordering, not physical power-loss qualification, arbitrary hostile-parent confinement, distributed fencing, automatic recovery or provider attestation.
|
|
48
|
+
|
|
49
|
+
## Durable original execution seal
|
|
50
|
+
|
|
51
|
+
`writeExecutionBundle` now persists the original execution records before acknowledging the
|
|
52
|
+
source seal, rather than relying on a later exported copy. Cell and final payload files are created
|
|
53
|
+
exclusively and fsynced. Existing cell payloads are re-read through the bounded no-follow reader,
|
|
54
|
+
synced as regular files, and their directories are synced before final publication. Existing
|
|
55
|
+
payloads or manifests are never overwritten, including corrupt bytes left by an interrupted write.
|
|
56
|
+
|
|
57
|
+
The writer builds the existing v1 manifest in a unique private `.bundle-pending-*` directory.
|
|
58
|
+
An internal candidate snapshot checks its bounded payload hashes and performs the same complete
|
|
59
|
+
frozen-record, assertion and campaign reduction as the public verifier. The verified receipt set
|
|
60
|
+
must also match the final records supplied by the executor. Only then does an exclusive hard link
|
|
61
|
+
publish `manifest.json`, followed by directory fsync. The executor's ledger finalization follows
|
|
62
|
+
the returned source seal. The bundle format and public reader contract are unchanged: a candidate
|
|
63
|
+
without a published manifest is never a valid public bundle.
|
|
64
|
+
|
|
65
|
+
The caller must own a quiescent local execution tree and retain its existing ledger writer.
|
|
66
|
+
An exclusive `.bundle-write.lock` serializes cooperating source writers. A write/sync/candidate
|
|
67
|
+
failure or process death retains its incomplete records, lock and any manifest staging for explicit
|
|
68
|
+
reconciliation; no stale lock is automatically removed and no assertion is retried. A manifest
|
|
69
|
+
that became visible before a later directory sync failure is reported as published with durability
|
|
70
|
+
unconfirmed, rather than removed or overwritten. Verify that existing bundle before any retry.
|
|
71
|
+
|
|
72
|
+
Tests cover actual SIGKILL before the manifest link and after its first directory fsync, injected
|
|
73
|
+
payload write/fsync failures, corruption during manifest staging, a hash-consistent candidate
|
|
74
|
+
whose campaign disagrees with reduction, existing corrupt payload preservation, linked-parent
|
|
75
|
+
refusal and post-publication sync uncertainty. A process crash can leave an invalid incomplete
|
|
76
|
+
source or a complete verifiable source with reconciliation remnants. These bounded local tests
|
|
77
|
+
do not simulate physical power loss, establish hostile-writer confinement, distributed fencing,
|
|
78
|
+
provider/host qualification, or transactional recovery across the separate ledger and bundle seal.
|
|
79
|
+
|
|
80
|
+
## Local commit-window readback
|
|
81
|
+
|
|
82
|
+
If a controller dies after the original manifest commits but before ledger finalization, local
|
|
83
|
+
redelivery first requires the existing durable ownership inventory to show acknowledged removal
|
|
84
|
+
of every resource. It then verifies and reduces the entire committed bundle and binds its exact
|
|
85
|
+
request/selection, scope, execution/attempt/generation, attempt number, idempotency key and
|
|
86
|
+
per-cell receipt references to the trusted ledger. Only a matching commit can reconstruct the
|
|
87
|
+
original summary, sync the manifest's directory and append the missing `finalized` transition.
|
|
88
|
+
A failed recovery directory sync leaves finalization blocked with durability unconfirmed.
|
|
89
|
+
It returns checked receipts and
|
|
90
|
+
starts no second host or fixture. A manifest's mere presence or a producer PASS label is insufficient.
|
|
91
|
+
|
|
92
|
+
Finalized redelivery also reads this bound committed evidence instead of trusting the cached
|
|
93
|
+
summary containing an empty receipt list. Missing, corrupt or foreign finalized evidence fails
|
|
94
|
+
closed without acquisition. Interrupted attempts without a committed manifest retain the existing
|
|
95
|
+
retry policy and ownership gate; this readback does not repair incomplete files or invent cleanup.
|
|
96
|
+
Actual controller SIGKILL immediately before the ledger finalization write, zero-launch readback,
|
|
97
|
+
unknown ownership, corrupt/foreign/missing evidence and false cached summary are regression-tested.
|
|
98
|
+
This is local reconciliation under one ledger writer, not a distributed transaction or a claim that
|
|
99
|
+
physical power loss was simulated.
|
|
100
|
+
|
|
101
|
+
## Inspect and hand off a frozen run
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
tracegrove inspect --request ./frozen.json --json
|
|
105
|
+
tracegrove rerun --request ./frozen.json --output ./next-attempt.json
|
|
106
|
+
tracegrove run --request ./next-attempt.json --state-dir ./state
|
|
107
|
+
tracegrove inspect --execution <id> --state-dir ./state --json
|
|
108
|
+
tracegrove inspect --bundle ./exported-evidence --failed-step --json
|
|
109
|
+
tracegrove export --execution <id> --state-dir ./state --output ./new-export
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
`inspect --request` uses the typed frozen transport envelope and static executable
|
|
113
|
+
closure checks. It reports requested refs, selected cells, a closure digest, blockers
|
|
114
|
+
and whether a qualification owner is required. `executionAuthority: not_checked`
|
|
115
|
+
means exactly that: inspection does not query an approval owner, probe a runtime,
|
|
116
|
+
start an application, provision state or grant effects. It needs no mutable project
|
|
117
|
+
YAML. A blocked structure exits 2; a valid structure exits 0.
|
|
118
|
+
|
|
119
|
+
The CLI reads frozen envelopes from bounded regular files (96 MiB maximum), rejects
|
|
120
|
+
unknown envelope fields and checks document keys and seals before rerun. A trial or
|
|
121
|
+
work-proof rerun retains the exact frozen case/persona/target selection, assigns fresh
|
|
122
|
+
campaign/request identities and records `replayOf`. Its documents are independent
|
|
123
|
+
copies of the original. Qualification/lifecycle requests cannot use `rerun` to erase
|
|
124
|
+
registration; use the current owning registry to admit a new independent round and
|
|
125
|
+
`prepareQualificationExecution` to bind it.
|
|
126
|
+
|
|
127
|
+
Execution inspection first captures and independently verifies the complete evidence
|
|
128
|
+
bundle. It never reports an unverified producer PASS. `--bundle` supports evidence
|
|
129
|
+
outside the original state directory; `--execution` requires one safe path segment
|
|
130
|
+
and a state directory. `--failed-step` is the explicit path for failed observation
|
|
131
|
+
payloads. Ordinary summaries retain compact step/assertion labels. Successful
|
|
132
|
+
inspection exits 0 even when the verified product outcome is a failure; read `outcome`.
|
|
133
|
+
Invalid evidence exits 2 and reports no success summary.
|
|
134
|
+
|
|
135
|
+
The CLI `export` uses the atomic local export described above. The library also exports
|
|
136
|
+
`exportCapturedBundle(snapshot, output)`, which writes a `VerifiedBundleSnapshot`'s captured
|
|
137
|
+
sealed bytes through the same file writer as the result archive. It never rereads the producer directory or copies
|
|
138
|
+
unlisted scratch files or workspaces. The output must be a new directory. Files are
|
|
139
|
+
exclusive, the manifest is written last, and completed output is reverified. Failed
|
|
140
|
+
writes remove only the newly allocated output; existing destinations and links are
|
|
141
|
+
left intact. Capturing before the producer disappears still permits export afterward.
|
|
142
|
+
|
|
143
|
+
The library exports the `FrozenBundle`, `FrozenPlanInspection`, `ExecutionInspection`
|
|
144
|
+
and `FailedStepInspection` Zod schemas with the corresponding reader/inspection
|
|
145
|
+
functions. These local projections are not new execution authority or outcome records.
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
## Runner compatibility
|
|
149
|
+
|
|
150
|
+
A frozen runner profile is evidence of the selected configuration, not permission to
|
|
151
|
+
substitute the verifier's current runner identity. `verify-bundle --json` and failed verified
|
|
152
|
+
exports may include `diagnostics` with schema `tracegrove.runner-compatibility/v1`:
|
|
153
|
+
|
|
154
|
+
- `runner_profile_missing`: no valid, self-digest-checked profile reproduces the requested runner kind.
|
|
155
|
+
- `runner_capability_revision_unsupported`: a valid matching profile is present, but this verifier
|
|
156
|
+
cannot reproduce the requested capability revision.
|
|
157
|
+
- `runner_capability_digest_mismatch`: the kind and revision are supported, but the exact capability
|
|
158
|
+
digest cannot be reproduced from the frozen profiles. Investigate the producer/profile mismatch.
|
|
159
|
+
|
|
160
|
+
The diagnostic includes the exact `requestedRunner` ref and up to 32 matching valid profiles with
|
|
161
|
+
`reproducedRunner` refs. It always says `verification: "not_completed"`; it never grants a historical
|
|
162
|
+
outcome. Unsupported evidence still returns `ok: false`, `outcome: null`, and CLI exit 2. Other
|
|
163
|
+
integrity failures retain their own errors and need not produce a compatibility diagnostic.
|
|
164
|
+
|
|
165
|
+
Preserve the original bytes and manifest. Do not edit or reseal references, choose a runner by
|
|
166
|
+
step names, or replace a requested revision merely because the case uses a subset of its operations.
|
|
167
|
+
For historical inspection, use the producer's recorded compatible verifier and pinned dependency
|
|
168
|
+
closure. An npm version alone may be insufficient for an unpublished build; retain its source commit
|
|
169
|
+
and package integrity too. To qualify a current runtime, perform a new authorized execution, preserving
|
|
170
|
+
both attempts and their distinct identities. This is a new qualification, not a migration of old proof.
|
|
171
|
+
|
|
172
|
+
For example, a valid browser profile captured by an unreleased verifier with capability revision
|
|
173
|
+
`0.3.0` cannot be reproduced by a verifier that implements only `0.1.0`. That is an unsupported reader
|
|
174
|
+
boundary, not proof that the profile is absent or that either workflow passed now. These diagnostics
|
|
175
|
+
do not add historical runner implementations, alter accepted evidence, or grant replay authority.
|