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,115 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { GitSourceSnapshot, GIT_COMMIT_PROOF_LIMITS, GIT_SNAPSHOT_LIMITS, digestOfBytes, digestOfValue, sameDigest, verifySelfDigest } from "../protocol/index.js";
|
|
3
|
+
import { Conflict } from "../core/errors.js";
|
|
4
|
+
import { assertSnapshotPaths } from "./snapshotPaths.js";
|
|
5
|
+
export function gitObjectId(type, bytes, algorithm) {
|
|
6
|
+
return createHash(algorithm).update(`${type} ${bytes.byteLength}\0`).update(bytes).digest('hex');
|
|
7
|
+
}
|
|
8
|
+
function decode(value, bound) {
|
|
9
|
+
const bytes = Buffer.from(value, 'base64');
|
|
10
|
+
if (bytes.length > bound || bytes.toString('base64') !== value)
|
|
11
|
+
throw new Conflict('Git object proof has noncanonical or oversized bytes');
|
|
12
|
+
return bytes;
|
|
13
|
+
}
|
|
14
|
+
function verify(input, actual) {
|
|
15
|
+
const snapshot = GitSourceSnapshot.parse(input);
|
|
16
|
+
if (!verifySelfDigest(snapshot) || !snapshot.commitProof)
|
|
17
|
+
throw new Conflict('Git commit proof is missing or its snapshot seal changed');
|
|
18
|
+
if (snapshot.files.reduce((sum, file) => sum + file.bytes, 0) > GIT_SNAPSHOT_LIMITS.totalBytes)
|
|
19
|
+
throw new Conflict('Git proof snapshot exceeds the total file byte bound');
|
|
20
|
+
const proof = snapshot.commitProof;
|
|
21
|
+
const algorithm = snapshot.commit.length === 40 ? 'sha1' : 'sha256';
|
|
22
|
+
const oidBytes = algorithm === 'sha1' ? 20 : 32;
|
|
23
|
+
const commit = decode(proof.commitBase64, GIT_COMMIT_PROOF_LIMITS.commitBytes);
|
|
24
|
+
const observedCommit = gitObjectId('commit', commit, algorithm);
|
|
25
|
+
if (observedCommit !== snapshot.commit)
|
|
26
|
+
throw new Conflict('Git commit object disagrees with selected snapshot commit');
|
|
27
|
+
const root = /^tree ([a-f0-9]{40}|[a-f0-9]{64})\n/.exec(commit.toString('utf8'))?.[1];
|
|
28
|
+
if (!root || root.length !== snapshot.commit.length)
|
|
29
|
+
throw new Conflict('Git commit proof has no valid root tree');
|
|
30
|
+
const trees = new Map();
|
|
31
|
+
let total = 0;
|
|
32
|
+
for (const entry of proof.trees) {
|
|
33
|
+
const bytes = decode(entry.base64, GIT_COMMIT_PROOF_LIMITS.treeBytes);
|
|
34
|
+
total += bytes.length;
|
|
35
|
+
if (total > GIT_COMMIT_PROOF_LIMITS.totalTreeBytes || trees.has(entry.objectId) ||
|
|
36
|
+
gitObjectId('tree', bytes, algorithm) !== entry.objectId)
|
|
37
|
+
throw new Conflict('Git tree object proof is duplicated, oversized or changed');
|
|
38
|
+
trees.set(entry.objectId, bytes);
|
|
39
|
+
}
|
|
40
|
+
assertSnapshotPaths(snapshot.files.map(file => file.path));
|
|
41
|
+
const declared = new Map(snapshot.files.map(file => [file.path, file]));
|
|
42
|
+
if (actual && actual.length !== declared.size)
|
|
43
|
+
throw new Conflict('Git proof needs the complete actual snapshot file closure');
|
|
44
|
+
const files = actual ? new Map(actual.map(file => {
|
|
45
|
+
const path = file.path;
|
|
46
|
+
const mode = file.mode;
|
|
47
|
+
const source = file.bytes;
|
|
48
|
+
const expected = declared.get(path);
|
|
49
|
+
if (!expected || mode !== expected.mode || !(source instanceof Uint8Array) || source.byteLength !== expected.bytes)
|
|
50
|
+
throw new Conflict('Actual snapshot bytes disagree with the declared file closure');
|
|
51
|
+
return [path, { path, mode, bytes: Buffer.from(source) }];
|
|
52
|
+
})) : null;
|
|
53
|
+
if (files && (files.size !== actual.length || files.size !== declared.size))
|
|
54
|
+
throw new Conflict('Git proof needs the complete actual snapshot file closure');
|
|
55
|
+
const visited = new Set();
|
|
56
|
+
const paths = new Set();
|
|
57
|
+
const pending = [{ id: root, prefix: '' }];
|
|
58
|
+
let nodes = 0;
|
|
59
|
+
while (pending.length) {
|
|
60
|
+
const selected = pending.pop();
|
|
61
|
+
const bytes = trees.get(selected.id);
|
|
62
|
+
if (!bytes)
|
|
63
|
+
throw new Conflict('Git tree object closure is incomplete');
|
|
64
|
+
if (!bytes.length)
|
|
65
|
+
throw new Conflict('Git snapshot cannot materialize empty Git directories');
|
|
66
|
+
visited.add(selected.id);
|
|
67
|
+
let offset = 0;
|
|
68
|
+
const names = new Set();
|
|
69
|
+
while (offset < bytes.length) {
|
|
70
|
+
if (++nodes > GIT_COMMIT_PROOF_LIMITS.nodes)
|
|
71
|
+
throw new Conflict('Git object proof exceeds the complete traversal bound');
|
|
72
|
+
const space = bytes.indexOf(32, offset);
|
|
73
|
+
const nul = bytes.indexOf(0, space + 1);
|
|
74
|
+
if (space < offset || nul <= space + 1 || nul + 1 + oidBytes > bytes.length)
|
|
75
|
+
throw new Conflict('Git tree object record is truncated');
|
|
76
|
+
const mode = bytes.subarray(offset, space).toString('ascii');
|
|
77
|
+
const name = new TextDecoder('utf-8', { fatal: true }).decode(bytes.subarray(space + 1, nul));
|
|
78
|
+
if (names.has(name) || name.includes('/') || name === '.' || name === '..' || !name)
|
|
79
|
+
throw new Conflict('Git tree object has an ambiguous path');
|
|
80
|
+
names.add(name);
|
|
81
|
+
const path = selected.prefix ? `${selected.prefix}/${name}` : name;
|
|
82
|
+
assertSnapshotPaths([path]);
|
|
83
|
+
const id = bytes.subarray(nul + 1, nul + 1 + oidBytes).toString('hex');
|
|
84
|
+
offset = nul + 1 + oidBytes;
|
|
85
|
+
if (mode === '40000') {
|
|
86
|
+
pending.push({ id, prefix: path });
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const entry = declared.get(path);
|
|
90
|
+
if (!['100644', '100755'].includes(mode) || !entry || entry.mode !== mode || entry.objectId !== id || paths.has(path))
|
|
91
|
+
throw new Conflict('Git object tree differs from the declared snapshot files');
|
|
92
|
+
paths.add(path);
|
|
93
|
+
if (files) {
|
|
94
|
+
const file = files.get(path);
|
|
95
|
+
if (!file || file.mode !== entry.mode || file.bytes.length !== entry.bytes || !sameDigest(digestOfBytes(file.bytes), entry.digest) ||
|
|
96
|
+
gitObjectId('blob', file.bytes, algorithm) !== id)
|
|
97
|
+
throw new Conflict('Actual snapshot bytes disagree with the Git commit tree');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (paths.size !== declared.size || visited.size !== trees.size)
|
|
102
|
+
throw new Conflict('Git object proof has omitted files or unrelated trees');
|
|
103
|
+
return { algorithm, commit: observedCommit, tree: root, proofDigest: digestOfValue(proof) };
|
|
104
|
+
}
|
|
105
|
+
/** Structural object/manifest links only: cannot certify SHA-256 file bytes without reading them. */
|
|
106
|
+
export function verifyGitSnapshotProofMetadata(snapshot) {
|
|
107
|
+
return { verification: 'object_links_only', binding: verify(snapshot) };
|
|
108
|
+
}
|
|
109
|
+
/** Hashes every actual file through its Git blob identity and the full tree/commit object closure. */
|
|
110
|
+
export function verifyGitSnapshotCommit(snapshot, files) {
|
|
111
|
+
if (!Array.isArray(files))
|
|
112
|
+
throw new Conflict('actual Git source files are required');
|
|
113
|
+
return { ...verify(snapshot, files), verification: 'actual_file_bytes' };
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=gitObjectProof.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitObjectProof.js","sourceRoot":"","sources":["../../src/source/gitObjectProof.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { RepositoryPath } from "../protocol/primitives.js";
|
|
2
|
+
import { Conflict } from "../core/errors.js";
|
|
3
|
+
/** Shared Git/transport path rules; prevent aliases before any filesystem write. */
|
|
4
|
+
export function assertSnapshotPaths(paths) {
|
|
5
|
+
const seen = new Set();
|
|
6
|
+
const spellings = new Map();
|
|
7
|
+
for (const raw of paths) {
|
|
8
|
+
const path = RepositoryPath.parse(raw);
|
|
9
|
+
const canonical = path.normalize('NFC').toLowerCase();
|
|
10
|
+
const parts = path.split('/');
|
|
11
|
+
if (seen.has(canonical) || parts.some(part => /^(?:\.git|con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i.test(part) || /[. ]$/.test(part) || /[<>"|?*]/.test(part))) {
|
|
12
|
+
throw new Conflict('Git snapshot path is not portable or is duplicated');
|
|
13
|
+
}
|
|
14
|
+
seen.add(canonical);
|
|
15
|
+
for (let length = 1; length <= parts.length; length++) {
|
|
16
|
+
const prefix = parts.slice(0, length).join('/');
|
|
17
|
+
const key = prefix.normalize('NFC').toLowerCase();
|
|
18
|
+
if (spellings.has(key) && spellings.get(key) !== prefix)
|
|
19
|
+
throw new Conflict('Git snapshot contains aliased directory names');
|
|
20
|
+
spellings.set(key, prefix);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=snapshotPaths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshotPaths.js","sourceRoot":"","sources":["../../src/source/snapshotPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,oFAAoF;AACpF,MAAM,UAAU,mBAAmB,CAAC,KAAe;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAAC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5E,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACjK,MAAM,IAAI,QAAQ,CAAC,oDAAoD,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;YACtD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACnG,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM;gBAAE,MAAM,IAAI,QAAQ,CAAC,+CAA+C,CAAC,CAAC;YAC7H,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { GitSourceSnapshot, type GitCommitObservation } from '../protocol/schemas/gitSources.ts';
|
|
2
|
+
export type SnapshotFile = {
|
|
3
|
+
path: string;
|
|
4
|
+
mode: '100644' | '100755';
|
|
5
|
+
bytes: Buffer;
|
|
6
|
+
};
|
|
7
|
+
export declare function readGitSnapshotManifest(path: string): GitSourceSnapshot;
|
|
8
|
+
/** Read every pinned regular file, ignoring untracked inputs that will never enter the launch copy. */
|
|
9
|
+
export declare function readGitSnapshotTree(input: unknown, sourceRoot: string): SnapshotFile[];
|
|
10
|
+
export declare function readGitSnapshotSource(input: unknown, sourceRoot: string): {
|
|
11
|
+
files: SnapshotFile[];
|
|
12
|
+
gitSource: GitCommitObservation | null;
|
|
13
|
+
};
|
|
14
|
+
/** Exclusively create a private tree; a failed write removes only this owned directory. */
|
|
15
|
+
export declare function writeGitSnapshotTree(files: SnapshotFile[], destination: string): void;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { lstatSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { GitSourceSnapshot, GIT_SNAPSHOT_LIMITS } from "../protocol/schemas/gitSources.js";
|
|
4
|
+
import { digestOfBytes, sameDigest, verifySelfDigest } from "../protocol/canonical.js";
|
|
5
|
+
import { Conflict } from "../core/errors.js";
|
|
6
|
+
import { readBoundedFile } from "../core/boundedFile.js";
|
|
7
|
+
import { assertSnapshotPaths } from "./snapshotPaths.js";
|
|
8
|
+
import { verifyGitSnapshotCommit, verifyGitSnapshotProofMetadata } from "./gitObjectProof.js";
|
|
9
|
+
export function readGitSnapshotManifest(path) {
|
|
10
|
+
let snapshot;
|
|
11
|
+
try {
|
|
12
|
+
snapshot = GitSourceSnapshot.parse(JSON.parse(readBoundedFile(path, 32 * 1024 * 1024).toString('utf8')));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
throw new Conflict('Choose a bounded, regular source snapshot manifest with valid metadata');
|
|
16
|
+
}
|
|
17
|
+
if (!verifySelfDigest(snapshot))
|
|
18
|
+
throw new Conflict('Git snapshot manifest digest mismatch');
|
|
19
|
+
if (snapshot.commitProof)
|
|
20
|
+
verifyGitSnapshotProofMetadata(snapshot);
|
|
21
|
+
return snapshot;
|
|
22
|
+
}
|
|
23
|
+
/** Read every pinned regular file, ignoring untracked inputs that will never enter the launch copy. */
|
|
24
|
+
export function readGitSnapshotTree(input, sourceRoot) {
|
|
25
|
+
return readGitSnapshotSource(input, sourceRoot).files;
|
|
26
|
+
}
|
|
27
|
+
export function readGitSnapshotSource(input, sourceRoot) {
|
|
28
|
+
const snapshot = GitSourceSnapshot.parse(input);
|
|
29
|
+
if (!verifySelfDigest(snapshot))
|
|
30
|
+
throw new Conflict('Git snapshot manifest digest mismatch');
|
|
31
|
+
assertSnapshotPaths(snapshot.files.map(file => file.path));
|
|
32
|
+
if (snapshot.files.reduce((sum, file) => sum + file.bytes, 0) > GIT_SNAPSHOT_LIMITS.totalBytes)
|
|
33
|
+
throw new Conflict('Git snapshot exceeds the total byte bound');
|
|
34
|
+
const root = resolve(sourceRoot);
|
|
35
|
+
const checked = new Set();
|
|
36
|
+
const directory = (path) => {
|
|
37
|
+
if (checked.has(path))
|
|
38
|
+
return;
|
|
39
|
+
const stat = lstatSync(path);
|
|
40
|
+
if (stat.isSymbolicLink() || !stat.isDirectory())
|
|
41
|
+
throw new Conflict('Git snapshot refuses linked or non-directory parents');
|
|
42
|
+
checked.add(path);
|
|
43
|
+
};
|
|
44
|
+
directory(root);
|
|
45
|
+
const files = snapshot.files.map(file => {
|
|
46
|
+
let parent = root;
|
|
47
|
+
for (const segment of file.path.split('/').slice(0, -1)) {
|
|
48
|
+
parent = join(parent, segment);
|
|
49
|
+
directory(parent);
|
|
50
|
+
}
|
|
51
|
+
const bytes = readBoundedFile(join(root, file.path), file.bytes, file.bytes);
|
|
52
|
+
if (!sameDigest(digestOfBytes(bytes), file.digest))
|
|
53
|
+
throw new Conflict('Git snapshot file digest mismatch');
|
|
54
|
+
return { path: file.path, mode: file.mode, bytes };
|
|
55
|
+
});
|
|
56
|
+
return { files, gitSource: snapshot.commitProof ? verifyGitSnapshotCommit(snapshot, files) : null };
|
|
57
|
+
}
|
|
58
|
+
/** Exclusively create a private tree; a failed write removes only this owned directory. */
|
|
59
|
+
export function writeGitSnapshotTree(files, destination) {
|
|
60
|
+
if (!files.length || files.length > GIT_SNAPSHOT_LIMITS.files || files.some(file => file.bytes.length > GIT_SNAPSHOT_LIMITS.fileBytes) ||
|
|
61
|
+
files.reduce((sum, file) => sum + file.bytes.length, 0) > GIT_SNAPSHOT_LIMITS.totalBytes)
|
|
62
|
+
throw new Conflict('Git snapshot tree exceeds complete-coverage bounds');
|
|
63
|
+
assertSnapshotPaths(files.map(file => file.path));
|
|
64
|
+
mkdirSync(destination, { mode: 0o700 });
|
|
65
|
+
try {
|
|
66
|
+
for (const file of files) {
|
|
67
|
+
const path = join(destination, file.path);
|
|
68
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
69
|
+
writeFileSync(path, file.bytes, { flag: 'wx', mode: file.mode === '100755' ? 0o700 : 0o600 });
|
|
70
|
+
if (!readBoundedFile(path, file.bytes.length, file.bytes.length).equals(file.bytes))
|
|
71
|
+
throw new Conflict('snapshot bytes changed while writing');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
rmSync(destination, { recursive: true, force: true });
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=snapshotTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshotTree.js","sourceRoot":"","sources":["../../src/source/snapshotTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Tracegrove: architecture, current UX flow, and adapter gaps
|
|
2
|
+
|
|
3
|
+
Status as of 2026-10-16, for this repository. "Intended" means what the protocol schemas already declare (enums for surfaces, lanes, boundaries, hosts) and what the README lists as not implemented yet.
|
|
4
|
+
|
|
5
|
+
## 1. High-level architecture
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
you write compiled (derived) kernel (unchanged) evidence
|
|
9
|
+
───────── ────────────────── ────────────────── ────────
|
|
10
|
+
tracegrove.config.yaml ─┐
|
|
11
|
+
tracegrove/**/*.flow.yaml ├─► authoring compiler ─► .tracegrove/compiled/ ─► corpus loader (freeze + sha256 refs)
|
|
12
|
+
tracegrove/fixtures/*.yaml┘ (src/authoring) workflow.yaml, cases, ─► planner (side-effect free, blockers w/ owner+action)
|
|
13
|
+
host, persona, recipe… ─► admission + local ledger (single writer, idempotent)
|
|
14
|
+
─► executor
|
|
15
|
+
host adapter: local_process │ mock_loopback
|
|
16
|
+
fixtures: registered API actions, readback, cleanup
|
|
17
|
+
surface driver: http │ Chromium browser
|
|
18
|
+
─► trusted reducer (outcome from observations)
|
|
19
|
+
─► bundle writer ─► verify-bundle ───────► .tracegrove/runs/<run>/
|
|
20
|
+
summary.md/json, junit.xml,
|
|
21
|
+
request.json, bundle/
|
|
22
|
+
tracegrove ui ─► reads config, flows, runs, git; runs `test`; scans routes for discovery
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The [Chromium browser runner](browser-driver.md) supports short flows and the low-level corpus, with typed UI steps, DOM assertions, authenticated local personas, and sealed recordings in Grove. Supporting modules that exist but aren't wired into the everyday flow yet include shared coordination, signed cleanup follow-ups, source citations, and the plan review API.
|
|
26
|
+
|
|
27
|
+
## 2. The current UX flow, end to end
|
|
28
|
+
|
|
29
|
+
| Step | Today (this branch) | Intended |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| Install | Private package; install a packed archive | `npm i -D tracegrove`, `pipx`/`uvx` shim for Python repos |
|
|
32
|
+
| Set up | `tracegrove init` detects FastAPI, Django or Node and writes config + example flow | Same, plus discovery proposes the first flows |
|
|
33
|
+
| Discover what to test | `tracegrove ui` scans routes (FastAPI, Django, Express/Fastify/Hono) and shows which have no flow, at a folder or a git branch | Source-selection resolver: diff-aware selection, coverage policy, AI-drafted flows reviewed through the plan review API |
|
|
34
|
+
| Write tests | YAML/TypeScript flows with HTTP, browser, native job and local MCP steps, personas, saved values, fixtures | Hosted integration steps and widget-host qualification |
|
|
35
|
+
| Run | `tracegrove test` (local process host, real lane) | Lanes: mock contract, recorded replay, hybrid, full live sandbox, canary; hosts: container, CI, cloud sandbox |
|
|
36
|
+
| Read results | Terminal table, run folder, JUnit, `tracegrove show`, UI run history | Trace/video media, flaky-history, PR comments |
|
|
37
|
+
| Prove it | `verify-bundle` re-derives the verdict from sealed evidence | Importer with issuer trust; hosted qualification lifecycle |
|
|
38
|
+
|
|
39
|
+
## 3. Gaps versus intended, by layer
|
|
40
|
+
|
|
41
|
+
| Layer | Supported now | Declared but not implemented |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| Surfaces (step kinds) | HTTP, Chromium UI, local `mcp.call` through the optional SDK, and `job.submit`/`job.observe`/`job.cancel` through an opted-in local Node IPC bridge | Hosted MCP/job providers, `integration.action`, `widget.action`, native desktop and computer-use |
|
|
44
|
+
| Hosts | `local_process` (POSIX), `mock_loopback` | container, managed sandbox, cloud VM, customer CI, device service; Windows process trees |
|
|
45
|
+
| Fidelity lanes | `full_live_sandbox`, `mock_contract` | `recorded_replay`, `hybrid_live_product`, `full_live_canary` |
|
|
46
|
+
| Boundaries | `application`, `storage` observed as real/stubbed | per-provider boundaries with interceptors and readback oracles |
|
|
47
|
+
| Auth | host-issued bearer tokens per persona | `env_credential` recipes, login flows (form/cookie/OAuth), account bindings and persona leases in use |
|
|
48
|
+
| Fixtures/seeding | API-created entities with readback and confirmed 404/410 cleanup; deterministic generators | DB-level seeding, snapshots/restore, factories, datasets, relation bindings in use, `update` lifecycle |
|
|
49
|
+
| Oracles | HTTP status/JSON path, native job observations with real worker/store sample, browser DOM, step result | Generic DB readback, hosted queue/job state, email/webhook capture, visual baseline, LLM judge (policy exists, all stages disabled) |
|
|
50
|
+
| Environments | `isolated_candidate` | deployed preview, canary, production observation |
|
|
51
|
+
| Discovery | Route scan in `tracegrove ui` (heuristic) | source selection resolver, intelligence-policy-gated drafting |
|
|
52
|
+
| Media | step events, network metadata | trace and video capture (`required` currently unsatisfiable) |
|
|
53
|
+
|
|
54
|
+
### Integration with the verified core
|
|
55
|
+
|
|
56
|
+
The integration branch also includes the immutable Git pair resolver, source citation
|
|
57
|
+
validation, durable local plan review, qualification reduction and activation contracts.
|
|
58
|
+
Those APIs do not make heuristic route discovery independent source confirmation or
|
|
59
|
+
hosted qualification. The workbench remains a local authoring and replay interface.
|
|
60
|
+
|
|
61
|
+
Node and Python presets use the same bounded interpreter observation during compilation
|
|
62
|
+
and launch. Django runs migrations and starts its server through that Python executable.
|
|
63
|
+
Generic shell wrappers remain blocked until a qualified host can observe their actual
|
|
64
|
+
application runtime. A corrupt exported evidence bundle marks the overall run inconclusive,
|
|
65
|
+
uses an inconclusive run directory and adds an evidence-integrity JUnit error, even when
|
|
66
|
+
individual HTTP checks passed.
|
|
67
|
+
|
|
68
|
+
## 4. Adapter gap analysis for full-stack and data-engineering work
|
|
69
|
+
|
|
70
|
+
"Adapter" here means anything tracegrove needs to start, seed, fake, observe or clean up. Priority is what blocks the most real repos first.
|
|
71
|
+
|
|
72
|
+
### Seeding
|
|
73
|
+
|
|
74
|
+
| Need | Now | Gap and proposed adapter | Priority |
|
|
75
|
+
| --- | --- | --- | --- |
|
|
76
|
+
| Create records through the app's API | Yes (fixtures) | — | — |
|
|
77
|
+
| Seed straight into the database (fast, bypasses API) | No | `seed.sql` adapter: run SQL/fixtures against a per-run DB, readback by SELECT, cleanup by transaction rollback or DB drop | P0 |
|
|
78
|
+
| Framework factories (factory_boy, Django fixtures, Prisma seed) | No | `seed.command` adapter: run a repo command with `{dataDir}`/`DATABASE_URL`, capture emitted ids as JSON | P0 |
|
|
79
|
+
| Snapshot and restore a known state | No | `seed.snapshot`: SQLite file copy / `pg_dump` template DB / `CREATE DATABASE … TEMPLATE` | P1 |
|
|
80
|
+
| Large synthetic datasets for data pipelines | Generators only (words, slug, uuid, int) | dataset recipes: CSV/Parquet generators with seeds, row counts, schemas; `datasetRef` is already in the case schema | P1 |
|
|
81
|
+
|
|
82
|
+
### Databases
|
|
83
|
+
|
|
84
|
+
| Need | Now | Gap and proposed adapter | Priority |
|
|
85
|
+
| --- | --- | --- | --- |
|
|
86
|
+
| SQLite per run | Works if the app reads `TRACEGROVE_DATA_DIR` (Django/FastAPI samples) | Built-in `db: sqlite` that sets `DATABASE_URL` | P0 |
|
|
87
|
+
| Postgres/MySQL per run | No | `db: postgres` service adapter: start a container or use a local server, create a throwaway database per run, inject `DATABASE_URL`, drop it on cleanup, record server version in identity | P0 |
|
|
88
|
+
| Migrations | Django preset runs `migrate` | `app.setup:` commands (alembic upgrade, prisma migrate, knex) run before readiness | P0 |
|
|
89
|
+
| Assert on DB state | No | `observe: { sql: "select … ", expect: … }` read-only oracle with a separate read-only connection | P1 |
|
|
90
|
+
| Redis, Mongo, Elasticsearch | No | generic `services:` block with per-service health + isolation recipe | P1 |
|
|
91
|
+
|
|
92
|
+
### Asynchronous jobs
|
|
93
|
+
|
|
94
|
+
| Need | Now | Gap and proposed adapter | Priority |
|
|
95
|
+
| --- | --- | --- | --- |
|
|
96
|
+
| Start workers next to the app | `report-jobs` app starts a separate local worker; aggregate source identity includes its code | `components:` list in config: app + `celery worker`, RQ, Sidekiq, BullMQ, Dramatiq, Temporal worker; each its own supervised process, attested identity, health check | P0 |
|
|
97
|
+
| Broker | No | `services: redis/rabbitmq` with per-run vhost/db index | P0 |
|
|
98
|
+
| Wait for a job to finish | HTTP polling qualified against a persisted queue and separate worker; independent report readback catches false success, with cancellation, idempotency and failure controls | `job.submit` + `observe: { job: id, state: SUCCESS }` via Celery result backend / Flower API, BullMQ queue API; eager mode is explicitly not a real boundary | P1 |
|
|
99
|
+
| Scheduled jobs (beat, cron) | No | logical clock control (`clockProfileRef` exists in the schema) plus a "tick" step | P2 |
|
|
100
|
+
|
|
101
|
+
### Third-party services and mocks
|
|
102
|
+
|
|
103
|
+
| Need | Now | Gap and proposed adapter | Priority |
|
|
104
|
+
| --- | --- | --- | --- |
|
|
105
|
+
| Whole-app mock (contract lane) | `mock_loopback` host with declared routes, not in the authoring layer yet | `lanes: { mock: { from: recordings/ } }` in config | P1 |
|
|
106
|
+
| Fake one dependency while the app is real (Stripe, SendGrid, S3, OpenAI) | No | outbound interceptor proxy: app gets `HTTPS_PROXY`/base URL env; routes are stubbed, recorded or passed through per boundary; observations sealed as boundary evidence (`interceptorRef` exists) | P0 |
|
|
107
|
+
| Record once, replay in CI | No | `recorded_replay` lane: record real calls in a sandbox account, redact, replay deterministically | P1 |
|
|
108
|
+
| Provider sandboxes (Stripe test mode, etc.) | No | `env_credential` auth + `test_sandbox` account class + provider cleanup actions with signed follow-ups (verifier exists) | P2 |
|
|
109
|
+
| Email/webhook capture | No | built-in inbox (SMTP sink) and webhook catcher with assertions | P1 |
|
|
110
|
+
| Object storage | No | MinIO/localstack service adapter | P2 |
|
|
111
|
+
|
|
112
|
+
### Data engineering
|
|
113
|
+
|
|
114
|
+
| Need | Now | Gap and proposed adapter | Priority |
|
|
115
|
+
| --- | --- | --- | --- |
|
|
116
|
+
| Run a pipeline (Airflow DAG, Dagster job, dbt run, Spark job) | No | `job` surface with a `runner: command` that runs the pipeline against seeded inputs and records exit state and logs | P1 |
|
|
117
|
+
| Assert on outputs | No | table oracles: row counts, schema, uniqueness, not-null, freshness, golden-file diff on CSV/Parquet | P1 |
|
|
118
|
+
| Warehouses (BigQuery, Snowflake, DuckDB) | No | DuckDB local first; warehouse adapters with per-run schema/dataset and cleanup | P2 |
|
|
119
|
+
|
|
120
|
+
## 5. Suggested order
|
|
121
|
+
|
|
122
|
+
1. **P0 for full-stack repos:** `app.setup` commands, `services:` (Postgres, Redis), `components:` (workers), `db: sqlite|postgres` that injects `DATABASE_URL`, SQL and command seeding, and the outbound interceptor for third parties.
|
|
123
|
+
2. **P1 for coverage:** job observe, DB-state oracle, mock lane in the authoring layer, record/replay, email/webhook capture, data-pipeline job surface with table oracles.
|
|
124
|
+
3. **Qualify browser execution beyond local runs**, including staging personas, controller-death cleanup, trace/redaction collectors, and host network confinement.
|
|
125
|
+
|
|
126
|
+
Each adapter keeps the kernel's rules: launched or reserved per run, identity attested, effects inside the declared envelope, cleanup confirmed by an independent read, and evidence sealed in the bundle.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Retained evidence to Agent Work Receipt
|
|
2
|
+
|
|
3
|
+
This optional adapter exports a retained result as redacted AWR v0.2 and saves
|
|
4
|
+
an immutable delivery intent in the existing local ledger. Delivery uses OrgX's
|
|
5
|
+
existing workspace-scoped AWR importer. Import does not execute a campaign,
|
|
6
|
+
complete work, qualify scenarios, or observe native outcomes. The separate
|
|
7
|
+
[work-report attachment stage](work-report-attachment.md) links the imported
|
|
8
|
+
report to its original work target and preserves its own retry state.
|
|
9
|
+
|
|
10
|
+
Install the optional peer only when using this integration:
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
npm install --save-exact @useorgx/agent-work-receipt@0.3.0
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Core SDK and ordinary CLI startup do not import that package. The optional adapter
|
|
17
|
+
uses its canonical validator and content-hash helpers, without copying AWR schemas
|
|
18
|
+
or implementing a competing canonicalizer.
|
|
19
|
+
|
|
20
|
+
After `result-ingest`, create a protected operator-owned destination file:
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{"origin":"https://useorgx.com","workspaceId":"00000000-0000-4000-8000-000000000001"}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Replace the example UUID with your authorized workspace. The HTTPS origin must
|
|
27
|
+
have no path, query, fragment, credentials, or trailing slash. The bundle cannot
|
|
28
|
+
choose its destination.
|
|
29
|
+
|
|
30
|
+
```sh
|
|
31
|
+
tracegrove awr-prepare --sink ./retained-results --id <result-id> --destination ./destination.json --json
|
|
32
|
+
tracegrove awr-inspect --sink ./retained-results --id <result-id> --json
|
|
33
|
+
tracegrove awr-deliver --sink ./retained-results --id <result-id> --json
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Preparation and inspection make no network requests. Supply the credential through
|
|
37
|
+
a protected `TRACEGROVE_ORGX_TOKEN` environment variable. `--credential-env` selects
|
|
38
|
+
a different variable name; never pass a credential as an argument. Tokens are not
|
|
39
|
+
included in prepared records, journal entries, or transport diagnostics. Redirects
|
|
40
|
+
are refused. Responses have a 32 KiB bound and 15-second deadline.
|
|
41
|
+
|
|
42
|
+
The local operator controls configuration. The authenticated importer independently
|
|
43
|
+
checks workspace access and admission. SDK hosts must implement
|
|
44
|
+
`AwrDeliveryAuthority` against actual consumer-to-workspace policy. Local owner
|
|
45
|
+
labels and no-op callbacks do not authenticate a remote tenant or grant approval.
|
|
46
|
+
|
|
47
|
+
## Evidence and acceptance
|
|
48
|
+
|
|
49
|
+
The receipt describes export effort. A successful export of a failing campaign is
|
|
50
|
+
successful export work; the original product verdict remains visible in its summary
|
|
51
|
+
and `extensions["org.tracegrove.workflow"]`. A target regression is not assigned to
|
|
52
|
+
the evidence exporter as an operational failure.
|
|
53
|
+
|
|
54
|
+
The shared `workflow.evidence-projection/v1` schema preserves exact request,
|
|
55
|
+
selection, campaign and attempt refs, separate expected/observed target digests,
|
|
56
|
+
actual recorded provenance, planned lanes, and the frozen work binding. An unbound
|
|
57
|
+
run stays unbound. Raw observations, excerpts, local paths, media locations and
|
|
58
|
+
credentials are withheld. Refs/digests remain potentially sensitive metadata; use
|
|
59
|
+
authorized destinations. Full evidence stays in the private result archive.
|
|
60
|
+
Oversize exports fail rather than silently omitting attempts.
|
|
61
|
+
|
|
62
|
+
Verification remains `unverified`; acceptance remains `pending`; qualification is
|
|
63
|
+
not evaluated; native outcomes are not observed. The runtime is `tracegrove`, never
|
|
64
|
+
the reserved `orgx-verify`. The adapter cannot manufacture native proof, a second
|
|
65
|
+
verifier lens, task acceptance, or outcome attribution.
|
|
66
|
+
|
|
67
|
+
Per-attempt estimates, reconciled costs and unknown-charge counts remain in the
|
|
68
|
+
projection. AWR v0.2 requires a numeric total even when unknown. The export uses
|
|
69
|
+
zero with `estimated: true` and explicit `status: unknown` /
|
|
70
|
+
`zero_is_schema_placeholder: true` metadata. It is not a measured zero, campaign
|
|
71
|
+
total, invoice cap, or authoritative economic observation.
|
|
72
|
+
|
|
73
|
+
## Recovery
|
|
74
|
+
|
|
75
|
+
One retained result has one immutable destination and receipt. Preparing again
|
|
76
|
+
returns the same envelope. Changing workspace or origin conflicts; editing the
|
|
77
|
+
configuration cannot redirect a saved delivery. A new effort requires a new result.
|
|
78
|
+
|
|
79
|
+
Before network I/O, the outbox syncs an attempt record. Missing or invalid responses
|
|
80
|
+
leave `acknowledgement_unknown`. Retry with the same result ID: it reuses the exact
|
|
81
|
+
receipt, destination, and digest-bound key. Receiver admission followed by connection
|
|
82
|
+
loss reconciles one import. The same recovery covers a successful response followed
|
|
83
|
+
by failed local acknowledgement publication. No retry path calls a runner, seeds
|
|
84
|
+
data, or reruns product actions. Corrupt retained evidence blocks fresh delivery.
|
|
85
|
+
|
|
86
|
+
A validated response records `imported_unverified`. Repeating delivery returns the
|
|
87
|
+
saved acknowledgement without another network call; it does not renew archive
|
|
88
|
+
integrity or permission. Use `results --id` for a fresh archive check. The prototype
|
|
89
|
+
blocks at 1,000 attempts without evicting history. It inherits protected filesystem
|
|
90
|
+
and single-writer requirements, not distributed fencing.
|
|
91
|
+
|
|
92
|
+
The SDK subpath `workflow-verify/integrations/awr` exports `LocalAwrOutbox`, typed
|
|
93
|
+
destination/envelope/acknowledgement contracts, `AwrDeliveryAuthority`,
|
|
94
|
+
`AwrTransport`, and `OrgxAwrHttpTransport`. Supply the sink's same fenced ledger and
|
|
95
|
+
scope. Credentials are retrieved only for network delivery. Trusted hosts may
|
|
96
|
+
inject a transport; producers cannot select one through evidence.
|
|
97
|
+
|
|
98
|
+
Conformance uses real loopback HTTP with simulated authority and admission. The
|
|
99
|
+
receiver destroys the first connection after admission; reopen/retry must retain
|
|
100
|
+
one receiver record, identical request bytes, and no credentials in the journal.
|
|
101
|
+
This does not establish live OrgX import or native-work attachment; those require
|
|
102
|
+
their own authenticated provider receipts.
|