tracegrove 0.0.0-stage → 0.3.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 +202 -0
- package/README.md +61 -2
- 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/agent-guide.md +21 -0
- package/docs/browser-driver.md +146 -0
- package/docs/getting-started.md +13 -0
- package/docs/git-object-proof.md +100 -0
- package/docs/local-execution-recovery.md +55 -0
- package/docs/mcp-driver.md +87 -0
- package/docs/native-jobs.md +96 -0
- package/docs/result-sink.md +87 -0
- package/docs/verified-bundles.md +175 -0
- package/package.json +98 -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,87 @@
|
|
|
1
|
+
# Test a local MCP tool through the existing verification path
|
|
2
|
+
|
|
3
|
+
Install the optional protocol adapter dependency when using MCP flows:
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
npm install --save-dev --save-exact @modelcontextprotocol/sdk@1.32.1
|
|
7
|
+
tracegrove sample-config --sample notes-mcp --output ./mcp-notes
|
|
8
|
+
tracegrove test --config ./mcp-notes/tracegrove.config.yaml
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
The core, HTTP, browser and native job startup paths do not load this peer. Planning
|
|
12
|
+
an MCP flow without it reports `mcp_sdk_missing` with the installation command.
|
|
13
|
+
The package pins the SDK version and lockfile integrity. This driver uses the
|
|
14
|
+
[official v1 client](https://ts.sdk.modelcontextprotocol.io/client) and its
|
|
15
|
+
Streamable HTTP transport. Conformance exercises the negotiated `2025-11-25`
|
|
16
|
+
protocol with JSON and SSE responses. Other protocol revisions, legacy HTTP+SSE
|
|
17
|
+
fallback, stdio servers, OAuth discovery and hosted targets are not qualified here.
|
|
18
|
+
|
|
19
|
+
## Author a flow
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
title: A created note is independently readable
|
|
23
|
+
effects:
|
|
24
|
+
maxMcpCalls: 1
|
|
25
|
+
allowedMcpTools: [notes.create]
|
|
26
|
+
steps:
|
|
27
|
+
- name: create
|
|
28
|
+
mcp:
|
|
29
|
+
endpoint: /mcp
|
|
30
|
+
tool: notes.create
|
|
31
|
+
arguments: {title: Protocol proof, body: Native persistence}
|
|
32
|
+
save: {noteId: structuredContent.note.id}
|
|
33
|
+
expect:
|
|
34
|
+
json: {structuredContent.note.title: Protocol proof}
|
|
35
|
+
- GET: /notes/{noteId}
|
|
36
|
+
expect:
|
|
37
|
+
status: 200
|
|
38
|
+
json: {note.title: Protocol proof}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
MCP steps use the ordinary persona selector, saved-value bindings, deadlines and
|
|
42
|
+
JSON captures. The endpoint stays on the launched application's admitted origin.
|
|
43
|
+
Tool and endpoint names are frozen; only arguments can contain saved values.
|
|
44
|
+
The compiler requires the tool allowlist, call ceiling, designated-write mode,
|
|
45
|
+
POST permission and endpoint prefix before any host starts. A tool's
|
|
46
|
+
`readOnlyHint` or other server-supplied annotation cannot grant authority.
|
|
47
|
+
The ceiling bounds calls, not the number or financial cost of downstream effects.
|
|
48
|
+
Use an isolated application with run-owned data and known tool effects. Hosted,
|
|
49
|
+
paid, messaging and external-provider tool qualifications remain separate gates.
|
|
50
|
+
MCP and HTTP can share a flow; browser/native-job combinations remain blocked
|
|
51
|
+
until jointly qualified.
|
|
52
|
+
|
|
53
|
+
## Results and recovery
|
|
54
|
+
|
|
55
|
+
The existing planner, executor, bundle writer and independent reducer handle the
|
|
56
|
+
flow. Each observation includes the tool, endpoint, negotiated protocol version,
|
|
57
|
+
observed server name/version, content, structured content, `isError`, duration and
|
|
58
|
+
attempt count. Server identity is self-reported protocol metadata; target source
|
|
59
|
+
and runtime identity still come from the local host's attestation.
|
|
60
|
+
|
|
61
|
+
The default required assertion checks `isError: false` in addition to configured
|
|
62
|
+
facts. A tool error is retained as a failed step, skips dependent effects, and
|
|
63
|
+
keeps potentially partial mutations unknown. An independently readable record is
|
|
64
|
+
stronger evidence than the tool saying it saved one: the sample's controlled
|
|
65
|
+
success-without-persistence defect fails on HTTP readback. Independent bundle
|
|
66
|
+
verification uses the frozen MCP runner and typed oracle; substituting an HTTP
|
|
67
|
+
runner or oracle is rejected.
|
|
68
|
+
|
|
69
|
+
Each call establishes a protocol connection with the same step deadline. There is
|
|
70
|
+
one tool attempt and no automatic tool replay or transport fallback. Throttling,
|
|
71
|
+
connection loss, cancellation or expiry does not prove that remote work stopped.
|
|
72
|
+
Potential effects remain unknown in cleanup accounting after an ambiguous call.
|
|
73
|
+
Local process/workspace cleanup is confirmed separately. Inspect the native
|
|
74
|
+
application before requesting another run; MCP has no generic idempotency-key or
|
|
75
|
+
rollback guarantee. SDK transport reconnection is disabled.
|
|
76
|
+
|
|
77
|
+
Requests and each response stream are bounded to 64 KiB. Credentials stay in
|
|
78
|
+
memory, are sent only to the admitted endpoint, and cannot be expanded into tool
|
|
79
|
+
arguments. Redirects are refused. Results echoing an issued bearer are withheld;
|
|
80
|
+
raw protocol/provider error messages are not saved. Resource links are inert
|
|
81
|
+
evidence: the driver does not fetch them, render embedded UI or call other tools.
|
|
82
|
+
|
|
83
|
+
The native `notes-mcp` sample uses file-backed notes and a JSON-response subset of
|
|
84
|
+
the `2025-11-25` transport. Separate tests interoperate with the official SDK server
|
|
85
|
+
using JSON and SSE. These are local protocol proofs, not an actual ChatGPT/Claude
|
|
86
|
+
widget-host, mobile, production authorization or complete MCP-server conformance
|
|
87
|
+
claim. No inference model or external account is used in these tests.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Native job bridge
|
|
2
|
+
|
|
3
|
+
The `native_job` runner uses Node IPC for job submission, independent readback,
|
|
4
|
+
and cancellation. HTTP remains available for fixtures and application readiness;
|
|
5
|
+
an HTTP response cannot satisfy a `job.observation/1` assertion. The core,
|
|
6
|
+
planner, reducer, evidence bundle, CLI, and Grove use the same frozen contracts.
|
|
7
|
+
|
|
8
|
+
```sh
|
|
9
|
+
tracegrove sample-config --sample report-native --output ./native-example
|
|
10
|
+
tracegrove test --config ./native-example/tracegrove.config.yaml
|
|
11
|
+
tracegrove ui --dir ./native-example
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The example reuses the report-jobs application's real SQLite store and separate
|
|
15
|
+
worker. It exercises duplicate delivery, a conflicting idempotency key, another
|
|
16
|
+
persona's denied read, persisted output, worker-confirmed cancellation, and a
|
|
17
|
+
failed job. The application and worker are stopped and their attempt-owned data
|
|
18
|
+
directory removed. The native sample uses no HTTP job endpoint.
|
|
19
|
+
|
|
20
|
+
## Authoring
|
|
21
|
+
|
|
22
|
+
Set `app.nativeJobs: node_ipc/v1` on a Node preset. The application must implement
|
|
23
|
+
the explicit handshake below; setting the option alone cannot establish a native
|
|
24
|
+
capability. Declare `effects.maxJobs`; every submit invocation, including a
|
|
25
|
+
duplicate or conflicting invocation, consumes one position in that ceiling.
|
|
26
|
+
The compiler derives the allowed queues from the flow. Low-level corpus authors
|
|
27
|
+
must supply `effects.allowedJobQueues` explicitly. Read-only envelopes refuse
|
|
28
|
+
submission and cancellation. Job steps require one attempt; there is no implicit
|
|
29
|
+
submission retry.
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
effects: { maxJobs: 1 }
|
|
33
|
+
steps:
|
|
34
|
+
- job:
|
|
35
|
+
action: submit
|
|
36
|
+
queue: reports
|
|
37
|
+
requestKey: one-report
|
|
38
|
+
payload: { title: Example, mode: succeed }
|
|
39
|
+
save: { jobId: jobId }
|
|
40
|
+
expect: { present: [jobId] }
|
|
41
|
+
- job: { action: read, queue: reports, jobId: '{jobId}' }
|
|
42
|
+
expect:
|
|
43
|
+
json: { status: succeeded, output.report.content: 'Report: Example' }
|
|
44
|
+
present: [workerId]
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
These compile to `job.submit`, `job.observe`, and `job.cancel`. Expectations
|
|
48
|
+
refer to the typed job observation, using `expect.json`, `present`, `absent`, or
|
|
49
|
+
`count`. HTTP status expectations are rejected. `as` uses the same attempt-issued
|
|
50
|
+
persona credentials as HTTP. Credentials cross the private IPC channel and are
|
|
51
|
+
excluded from protocol results and recorded observations. Provider output still
|
|
52
|
+
needs the application's ordinary data-redaction policy.
|
|
53
|
+
An output that echoes the issued credential is withheld with a typed adapter
|
|
54
|
+
failure; the credential is not sealed into observations.
|
|
55
|
+
|
|
56
|
+
The read operation polls to its step deadline. A completed readback survives a
|
|
57
|
+
later timeout, so `succeeded` without the required report is an assertion failure
|
|
58
|
+
with retained evidence. Cancellation or a transport failure remains a failure of
|
|
59
|
+
the attempt. Request and response IDs are correlated, read/cancel results must
|
|
60
|
+
name the requested job, and submitted results must retain the requested key.
|
|
61
|
+
|
|
62
|
+
## Application protocol
|
|
63
|
+
|
|
64
|
+
Schemas are exported through `tracegrove/protocol` and JSON Schema:
|
|
65
|
+
`workflow.native-job-{action,request,response,ready,observation}/v1`.
|
|
66
|
+
The supervisor opens IPC only for an opted-in Node application and sets
|
|
67
|
+
`TRACEGROVE_NATIVE_JOBS=node_ipc/v1`. After its worker/provider is ready, the
|
|
68
|
+
application sends:
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{"kind":"tracegrove.job.ready","version":1,"queues":["reports"]}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
It receives `tracegrove.job.request` messages with a UUID `id`, nullable
|
|
75
|
+
`credential`, and a typed `command`. Commands are `submit` (queue, requestKey,
|
|
76
|
+
payload), `read` (queue, jobId), or `cancel` (queue, jobId). The application owns
|
|
77
|
+
credential validation, tenant isolation, idempotency, actual submission, readback,
|
|
78
|
+
and cancellation semantics. It replies with the same UUID:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{"kind":"tracegrove.job.response","id":"00000000-0000-4000-8000-000000000001","result":{"jobId":"example","status":"queued","requestKey":"one-report","output":null,"workerId":null}}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Messages are bounded to 32 KiB. Malformed, missing, oversized, mismatched, or
|
|
85
|
+
late responses cannot become successful observations. Only job-namespace
|
|
86
|
+
messages are forwarded from the application; application output cannot impersonate
|
|
87
|
+
the supervisor's source or cleanup observations. The same supervisor owns the
|
|
88
|
+
application process group, including workers, and removes its workspace when the
|
|
89
|
+
controller disconnects. Snapshot-pinned launches use the same bridge from the
|
|
90
|
+
private pinned source copy.
|
|
91
|
+
|
|
92
|
+
This is a local Node provider seam. It does not qualify a hosted queue, a remote
|
|
93
|
+
provider account, production cancellation, or distributed crash recovery. The
|
|
94
|
+
handshake declares supported queues; it does not independently certify the
|
|
95
|
+
provider's implementation. Python bridges and mixed browser/native-job packs
|
|
96
|
+
require separate conformance work and currently block rather than downgrade.
|
|
@@ -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 a third-party work receipt. Hosted receiver authentication, tenant delivery,
|
|
86
|
+
and scoped downstream projections require their own trusted adapters. A storage receipt
|
|
87
|
+
cannot stand in for those acceptance gates.
|
|
@@ -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.
|
package/package.json
CHANGED
|
@@ -1,6 +1,100 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tracegrove",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
6
|
-
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "Verify app behavior with real requests, independent readback and inspectable evidence.",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=22.22.0 <23"
|
|
10
|
+
},
|
|
11
|
+
"bin": {
|
|
12
|
+
"tracegrove": "./dist/cli/main.js",
|
|
13
|
+
"workflow-verify": "./dist/cli/main.js"
|
|
14
|
+
},
|
|
15
|
+
"main": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
"./integrations/awr": {
|
|
19
|
+
"types": "./dist/integrations/awr/index.d.ts",
|
|
20
|
+
"default": "./dist/integrations/awr/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./authoring": {
|
|
23
|
+
"types": "./dist/authoring/index.d.ts",
|
|
24
|
+
"default": "./dist/authoring/index.js"
|
|
25
|
+
},
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"default": "./dist/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./protocol": {
|
|
31
|
+
"types": "./dist/protocol/index.d.ts",
|
|
32
|
+
"default": "./dist/protocol/index.js"
|
|
33
|
+
},
|
|
34
|
+
"./coordination": {
|
|
35
|
+
"types": "./dist/core/coordination.d.ts",
|
|
36
|
+
"default": "./dist/core/coordination.js"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist",
|
|
41
|
+
"schema",
|
|
42
|
+
"samples",
|
|
43
|
+
"docs/getting-started.md",
|
|
44
|
+
"docs/agent-guide.md",
|
|
45
|
+
"docs/local-execution-recovery.md",
|
|
46
|
+
"docs/verified-bundles.md",
|
|
47
|
+
"docs/browser-driver.md",
|
|
48
|
+
"docs/native-jobs.md",
|
|
49
|
+
"docs/mcp-driver.md",
|
|
50
|
+
"LICENSE",
|
|
51
|
+
"README.md",
|
|
52
|
+
"docs/result-sink.md",
|
|
53
|
+
"docs/git-object-proof.md"
|
|
54
|
+
],
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "tsc --project tsconfig.build.json && node scripts/copy-samples.mjs",
|
|
57
|
+
"typecheck": "tsc --project tsconfig.json --noEmit && tsc --project tsconfig.container.json --noEmit",
|
|
58
|
+
"test": "vitest run",
|
|
59
|
+
"test:conformance": "vitest run conformance/",
|
|
60
|
+
"test:django": "vitest run --config vitest.django.config.ts",
|
|
61
|
+
"test:container": "node scripts/container-conformance.mjs",
|
|
62
|
+
"schema:export": "node --import tsx scripts/export-schemas.ts",
|
|
63
|
+
"schema:check": "node --import tsx scripts/export-schemas.ts --check && node --import tsx scripts/export-environment-examples.ts --check",
|
|
64
|
+
"test:onboarding": "node scripts/readme-onboarding.mjs && node scripts/readme-onboarding-negative.mjs",
|
|
65
|
+
"verify": "npm run typecheck && npm run schema:check && npm run test"
|
|
66
|
+
},
|
|
67
|
+
"dependencies": {
|
|
68
|
+
"playwright": "1.64.1",
|
|
69
|
+
"yaml": "2.9.1",
|
|
70
|
+
"zod": "4.6.5"
|
|
71
|
+
},
|
|
72
|
+
"peerDependencies": {
|
|
73
|
+
"@modelcontextprotocol/sdk": "1.32.1",
|
|
74
|
+
"@useorgx/agent-work-receipt": "0.3.0"
|
|
75
|
+
},
|
|
76
|
+
"peerDependenciesMeta": {
|
|
77
|
+
"@modelcontextprotocol/sdk": {
|
|
78
|
+
"optional": true
|
|
79
|
+
},
|
|
80
|
+
"@useorgx/agent-work-receipt": {
|
|
81
|
+
"optional": true
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"devDependencies": {
|
|
85
|
+
"@modelcontextprotocol/sdk": "1.32.1",
|
|
86
|
+
"@useorgx/agent-work-receipt": "0.3.0",
|
|
87
|
+
"@types/node": "22.19.1",
|
|
88
|
+
"tsx": "4.23.15",
|
|
89
|
+
"typescript": "5.9.3",
|
|
90
|
+
"vitest": "5.0.3"
|
|
91
|
+
},
|
|
92
|
+
"keywords": [
|
|
93
|
+
"testing",
|
|
94
|
+
"workflow",
|
|
95
|
+
"verification",
|
|
96
|
+
"cli",
|
|
97
|
+
"evidence"
|
|
98
|
+
],
|
|
99
|
+
"homepage": "https://www.npmjs.com/package/tracegrove"
|
|
100
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""Test-mode auth: tracegrove issues one random bearer token per persona per run."""
|
|
2
|
+
import json
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
TOKENS = json.loads(os.environ.get("TRACEGROVE_TOKENS", "{}"))
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def tracegrove_auth(get_response):
|
|
9
|
+
def middleware(request):
|
|
10
|
+
header = request.headers.get("Authorization", "")
|
|
11
|
+
request.subject = TOKENS.get(header.removeprefix("Bearer "))
|
|
12
|
+
return get_response(request)
|
|
13
|
+
|
|
14
|
+
return middleware
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
initial = True
|
|
8
|
+
dependencies = []
|
|
9
|
+
operations = [
|
|
10
|
+
migrations.CreateModel(
|
|
11
|
+
name="Note",
|
|
12
|
+
fields=[
|
|
13
|
+
("id", models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
|
|
14
|
+
("owner", models.CharField(max_length=200)),
|
|
15
|
+
("title", models.CharField(max_length=200)),
|
|
16
|
+
("body", models.TextField()),
|
|
17
|
+
],
|
|
18
|
+
),
|
|
19
|
+
]
|
|
File without changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
|
|
3
|
+
from django.db import models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Note(models.Model):
|
|
7
|
+
id = models.UUIDField(primary_key=True, default=uuid.uuid4)
|
|
8
|
+
owner = models.CharField(max_length=200)
|
|
9
|
+
title = models.CharField(max_length=200)
|
|
10
|
+
body = models.TextField()
|
|
11
|
+
|
|
12
|
+
def as_json(self):
|
|
13
|
+
return {"id": str(self.id), "owner": self.owner, "title": self.title, "body": self.body}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
from django.http import HttpResponse, JsonResponse
|
|
4
|
+
|
|
5
|
+
from .models import Note
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def health(request):
|
|
9
|
+
return JsonResponse({"ok": True})
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def notes(request):
|
|
13
|
+
if not request.subject:
|
|
14
|
+
return JsonResponse({"error": "unauthorized"}, status=401)
|
|
15
|
+
if request.method == "POST":
|
|
16
|
+
data = json.loads(request.body or "{}")
|
|
17
|
+
note = Note.objects.create(owner=request.subject, title=data["title"], body=data["body"])
|
|
18
|
+
return JsonResponse({"note": note.as_json()}, status=201)
|
|
19
|
+
return JsonResponse({"notes": [n.as_json() for n in Note.objects.filter(owner=request.subject)]})
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def note(request, note_id):
|
|
23
|
+
if not request.subject:
|
|
24
|
+
return JsonResponse({"error": "unauthorized"}, status=401)
|
|
25
|
+
found = Note.objects.filter(id=note_id).first()
|
|
26
|
+
if found is None:
|
|
27
|
+
return JsonResponse({"error": "not_found"}, status=404)
|
|
28
|
+
if found.owner != request.subject:
|
|
29
|
+
return JsonResponse({"error": "forbidden"}, status=403)
|
|
30
|
+
if request.method == "DELETE":
|
|
31
|
+
found.delete()
|
|
32
|
+
return HttpResponse(status=204)
|
|
33
|
+
return JsonResponse({"note": found.as_json()})
|
|
File without changes
|