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,55 @@
|
|
|
1
|
+
# Local acquisition recovery gate
|
|
2
|
+
|
|
3
|
+
The executable local path records ownership in the existing fsynced, single-writer ProjectionLedger. Each new execution initializes `ownership:<executionId>` with its scope, immutable request digest, campaign, attempt and generation. Host and fixture reservations precede workspace acquisition/host startup or application-API create. Observed physical IDs are acknowledged before readback/steps, and cleanup moves through pending to removed only after the existing trusted host stop or registered deletion plus absence readback confirms it. Internal typed host and fixture acknowledgements remain separate: a fixture named `host.process` or `host.workspace` cannot borrow a successful host acknowledgement from the legacy public display-key arrays.
|
|
4
|
+
|
|
5
|
+
No credentials or fixture request/cleanup arguments are added to this inventory. Physical resource IDs and native workspace/process identities remain private operational metadata in the existing private ledger. The owner must protect that directory.
|
|
6
|
+
|
|
7
|
+
After controller interruption, redelivery of the same frozen idempotency key checks the prior inventory before admitting a new attempt. Reserved, observed or cleanup-pending entries block with `ownership_reconciliation_required`. Legacy interrupted attempts without inventory block with `ownership_inventory_missing`. Wrong request/scope/attempt/generation cannot discharge the inventory. Cleanly recorded removed inventory permits a fresh attempt through the existing admission path; an empty initialized inventory means no acquisition was reserved. Existing finalized redelivery returns its existing result without replaying effects.
|
|
8
|
+
|
|
9
|
+
This is deliberately a recovery gate, not an automatic janitor. A controller crash after a real acquisition but before its acknowledgement leaves a durable reservation even if the native supervisor subsequently cleans up. No cleanup acknowledgement is invented from supervisor exit, workspace disappearance, an old PID or elapsed lease time. There is no automatic cross-process takeover/deletion or credential reconstruction, and no operator command to discharge unresolved inventory in this slice. Such cases remain blocked pending a separately reviewed reconciliation path with independent ownership and cleanup evidence. Do not edit ledger records to bypass the gate.
|
|
10
|
+
|
|
11
|
+
The actual local supervisor still handles ordinary controller disconnect and cleanup. A persistence failure must not prevent best-effort cleanup of resources already known in memory; it does prevent a successful durable completion acknowledgement. A process/power loss during the ledger write inherits the ledger's existing uncertain-write and corrupt-tail behavior.
|
|
12
|
+
|
|
13
|
+
Tests exercise real native acquisition and application-API fixture create in subprocesses, kill the controller before the executor receives their acknowledgements, reopen the actual persisted ledger, and prove redelivery performs no second acquisition. Other tests exercise native/sample cleanup, reservation/acknowledgement ordering, invalid cleanup transitions and foreign binding rejection. They do not qualify a remote provider, shared-resource fencing, distributed leases, machine power-loss recovery, or a durable supervisor-to-controller cleanup journal. Atomic artifact publication is a separate milestone.
|
|
14
|
+
|
|
15
|
+
## Read-only recovery inspection
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
tracegrove recovery-status --state-dir <owned-state> --execution <execution-id> --json
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
This command reads an existing checkpoint without opening `LocalLedger` for writing. It creates
|
|
22
|
+
no directories, locks or credentials, does not contact a controller, and never probes or kills a
|
|
23
|
+
PID. It does not append interrupted/finalized transitions, delete resources, discharge ownership,
|
|
24
|
+
sync a commit, resume a run or admit an acquisition. The existing execution path remains the
|
|
25
|
+
authority for all recovery and admission decisions.
|
|
26
|
+
|
|
27
|
+
The strict `tracegrove.recovery-status/v1` report includes a journal sequence/content digest,
|
|
28
|
+
lock presence (not process liveness), recorded phase, counts by resource kind/state, bounded
|
|
29
|
+
evidence status, static recovery guidance and an optional verified **historical** outcome.
|
|
30
|
+
It omits raw journal records, resource keys, physical IDs, PIDs, paths, controller tokens,
|
|
31
|
+
cleanup arguments and candidate diagnostics. The checkpoint digest identifies selected local
|
|
32
|
+
bytes; it is not a signature or an admission token. The local process scope and filesystem owner
|
|
33
|
+
must already be authorized to inspect the private state directory.
|
|
34
|
+
|
|
35
|
+
The journal uses the same schema/sequence/version parser as the existing writer. Inspection is
|
|
36
|
+
bounded to 16 MiB and 100,000 records; oversized, nonregular, linked, malformed or partial inputs
|
|
37
|
+
fail closed. The directory identity, journal bytes and lock fingerprint are checked before and
|
|
38
|
+
after capture and again after evidence inspection. Concurrent changes return an explicit changed
|
|
39
|
+
checkpoint rather than a ready result. This is a checkpoint observation, not a promise that a
|
|
40
|
+
live writer cannot change state after the command returns or confinement against hostile parent
|
|
41
|
+
replacement during filesystem operations.
|
|
42
|
+
|
|
43
|
+
Ownership counts describe the journal's recorded states, not newly observed absence. The
|
|
44
|
+
committed-bundle path reuses the executor's exact ledger/request/selection/scope/attempt/generation/
|
|
45
|
+
receipt binding checks and full bounded bundle reduction. Exit 0 means either matching finalized
|
|
46
|
+
historical evidence or a recorded interrupted commit available for normal readback; exit 2 means
|
|
47
|
+
another state or unavailable/invalid evidence. Every report says `actionAuthority: none`,
|
|
48
|
+
`execution: not_started_by_inspection` and `verificationVerdict: not_evaluated`. Unknown cleanup
|
|
49
|
+
remains unresolved even when a workspace disappeared or a controller exited. A stale lock does
|
|
50
|
+
not itself record interruption; only normal trusted writer reconciliation can do that.
|
|
51
|
+
|
|
52
|
+
Automatic janitor/discharge, durable supervisor acknowledgements and provider recovery remain
|
|
53
|
+
separate gates. The supervisor's current `host.cleaned` message is ephemeral IPC. Adding cleanup
|
|
54
|
+
authority requires bound ownership/cleanup evidence admitted by the existing exclusive ledger
|
|
55
|
+
writer; this status command provides neither that evidence nor a new journal.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Durable local plan review
|
|
2
|
+
|
|
3
|
+
`LocalReviewStore` connects `editPlan` and `reviewPlan` to the existing `LocalLedger`. Construct it with an already opened ledger, editable-plan identity, exact scope and trusted host implementations of `authorize` and `validateSources`. Its `ports()` implements `PlanReviewPorts`; no permissive authority or source-check fallback is installed.
|
|
4
|
+
|
|
5
|
+
`initialize(plan)` stores an unreviewed immutable draft at edit revision one. `stage(plan)` adds another immutable revision without changing the editable revision or current review. The staged draft gains neither approval nor execution authority. `editPlan(store.ports(), token, stagedRef)` then atomically advances editable revision and clears approval. Re-staging identical bytes is a no-op; changing bytes under the same document identity/revision is refused.
|
|
6
|
+
|
|
7
|
+
Review commits recheck the current actor and policy after source checking, compare the storage version, and append the projection, review and source-validation records in one journal entry. Authorization revocation, substituted scope, missing independent validation, immutable-reference collisions and competing writers publish no losing review. Source validation is persisted with its exact plan/change-model/revision-matrix/policy bindings. Reopening the ledger recovers the review and those records together. Local collections are bounded to 500 plans, reviews and validations; exhaustion fails rather than discarding history.
|
|
8
|
+
|
|
9
|
+
The journal stores private local state behind the single-writer controller lock. Writes check ownership, serialize and validate before consuming a sequence, synchronize the journal and its directory, and cache only the serialized bytes. Reads and append results are copies. An uncertain write stops both reads and writes through that handle; close it and reconcile the persisted journal before continuing. Closed handles and replaced writer ownership also refuse current-state reads. A truncated or unterminated record is retained and refuses reopening; this change never trims or repairs evidence automatically. Recovery acquires the new writer identity before recording interrupted work.
|
|
10
|
+
|
|
11
|
+
This is a protected local-host adapter, not distributed fencing, a tenant ACL, a signed external issuer or a replacement for the shared OrgX authority decision. The host must protect the state directory from candidate processes and supply authenticated admission and the registered independent source checker. Do not accept local approval records as hosted authority merely because their hashes verify. No new database table, paid call, deployment or live database change is required by this adapter.
|
|
12
|
+
|
|
13
|
+
Tests cover actual journal bytes, reopen recovery, concurrent review arbitration, staged edits, authorization revocation, forged actor/policy fields, missing validation, caller mutation, serialization failure, failed synchronization, replaced writer ownership and unterminated records. Source authorization/checking in the persistence tests is explicitly simulated. [Source promotion](source-promotion.md) reuses its actual approved snapshot and current-review guard. [Local scenario storage](local-scenario-store.md) supports structural transitions, registered qualification execution, result retention and explicit atomic activation. Hosted coordination acceptance, CLI lifecycle commands and activated regression execution remain open.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Durable local scenario registration
|
|
2
|
+
|
|
3
|
+
`LocalScenarioStore` implements `ScenarioPorts` on the existing `LocalLedger`.
|
|
4
|
+
It persists definitions, selections, pending qualification admissions and semantic
|
|
5
|
+
invalidation together. It supplies `resolveAdmission(ref, scope)` for reading an
|
|
6
|
+
actual registered record, rather than accepting a producer document as registration.
|
|
7
|
+
|
|
8
|
+
```ts
|
|
9
|
+
const store = new LocalScenarioStore(ledger, scenarioId, scope, authority);
|
|
10
|
+
await store.initialize(definition, [qualificationMatrix, selectedRound]);
|
|
11
|
+
const admission = await registerQualificationRound(store.ports(), token, {
|
|
12
|
+
selectionManifestRef: selectedRound.ref,
|
|
13
|
+
stateLeaseRefs: provisionedStateLeaseRefs,
|
|
14
|
+
});
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The authenticated host must provide all three authority methods. There is no
|
|
18
|
+
permissive default:
|
|
19
|
+
|
|
20
|
+
- `authorize(scope, action)` checks the current owner and policy. Reads are
|
|
21
|
+
authorized too; registration/invalidation recheck authorization before publication.
|
|
22
|
+
- `validateDefinition(definition)` checks the complete reviewed source, replay,
|
|
23
|
+
policy, target and matrix closure. Initialization requires the host to have
|
|
24
|
+
already authorized promotion and structural validation. It does not create an
|
|
25
|
+
approval or turn a draft into an accepted native plan.
|
|
26
|
+
- `validateStateLeases(admission)` is a read-only check that the host actually
|
|
27
|
+
provisioned fresh state and can reserve the supplied leases for this admission.
|
|
28
|
+
The store does not provision resources, establish an issuer or infer freshness
|
|
29
|
+
from a caller-generated UUID. The host remains responsible for synchronizing its
|
|
30
|
+
external authority and physical lease checks with its controller.
|
|
31
|
+
|
|
32
|
+
Source-derived definitions additionally require `reviewStore: reviews`, the
|
|
33
|
+
`LocalReviewStore` that owns the same ledger. Its current approved source snapshot
|
|
34
|
+
and synchronous fence are composed with the three host methods. Do not substitute a
|
|
35
|
+
serialized approval object or a callback that only checks the review before an await.
|
|
36
|
+
The fence is checked again immediately before registry writes. Qualification context
|
|
37
|
+
also carries its sealed plan, review and validation into the execution bundle.
|
|
38
|
+
|
|
39
|
+
Repeated identical input documents are stored once, including when the selected
|
|
40
|
+
round is the qualification matrix itself. Different bytes under the same immutable
|
|
41
|
+
document identity are refused.
|
|
42
|
+
|
|
43
|
+
One bounded registry per scope makes lease claims atomic across scenarios sharing
|
|
44
|
+
that registry. A commit checks the scenario version, exact allowed projection
|
|
45
|
+
transition, complete selection/allocation, epoch and immutable definition bindings.
|
|
46
|
+
It then rechecks authorization and the registry version and appends the projection
|
|
47
|
+
and admission in one synced record. Competing writers publish one winner. A lease
|
|
48
|
+
identity cannot be reused by changing its revision/digest or by selecting another
|
|
49
|
+
scenario in the same scope. Other scopes and distributed resource pools need their
|
|
50
|
+
own trusted coordination owner; this is not a tenant isolation boundary.
|
|
51
|
+
|
|
52
|
+
`stage(definition, selections)` stores an immutable replacement without changing
|
|
53
|
+
the current definition, epoch, approval or coverage. Re-staging identical bytes
|
|
54
|
+
is a no-op. `invalidateScenario` must name a new revision of the same definition;
|
|
55
|
+
it retains history, advances the epoch, clears activation authority and degrades
|
|
56
|
+
the projection. Invalidation that commits while registration checks state makes
|
|
57
|
+
the older registration lose its CAS. Direct port calls cannot manufacture an
|
|
58
|
+
active projection or skip the epoch/version rules.
|
|
59
|
+
|
|
60
|
+
Reopening the ledger recovers admission and projection together. If a commit's
|
|
61
|
+
acknowledgement is lost, inspect the registered history and resolve its immutable
|
|
62
|
+
admission reference. An old token conflicts; it does not register another attempt.
|
|
63
|
+
Historical reads do not establish current execution or activation authority.
|
|
64
|
+
Caller mutations cannot rewrite returned or stored records. Closed, ownership-lost
|
|
65
|
+
or uncertain ledger handles retain the underlying ledger's refusal behavior.
|
|
66
|
+
|
|
67
|
+
The prototype permits 100 scenarios, 500 total admissions and 2,000 definition/
|
|
68
|
+
selection records in one registry. Exhaustion requires archival indexing; history
|
|
69
|
+
is never silently dropped. The state directory must stay private to the trusted
|
|
70
|
+
controller and inaccessible to candidate processes. Local hashes and projection
|
|
71
|
+
states are not signatures or hosted approval receipts.
|
|
72
|
+
|
|
73
|
+
The [terminal result index](qualification-results.md#durable-local-terminal-results)
|
|
74
|
+
retains complete rounds through the existing result sink. The
|
|
75
|
+
[activation adapter](scenario-activation.md#local-atomic-storage) publishes the active
|
|
76
|
+
projection, receipt and assessment records in one scenario-registry append.
|
|
77
|
+
`propose` and the [structural validation adapter](scenario-structure.md) separate
|
|
78
|
+
staging a proposal from compiling its frozen execution closure and entering validating
|
|
79
|
+
state. The same operation can revalidate a semantically edited, degraded definition.
|
|
80
|
+
This adapter does not install physical lease provisioning, hosted source/issuer
|
|
81
|
+
authorization or CLI lifecycle commands. [Source-plan promotion](source-promotion.md)
|
|
82
|
+
uses actual current approved review storage to register proposed scenarios.
|
|
83
|
+
[Registered qualification execution](qualification-registration.md#executing-a-registered-round)
|
|
84
|
+
requires a separate authenticated runtime owner and uses the admission's allocated
|
|
85
|
+
cell identities. Requests without that owner and all activated regression requests
|
|
86
|
+
remain refused. A registration record cannot relabel trial evidence as qualification.
|
|
87
|
+
|
|
88
|
+
Tests use real journal bytes, reopen recovery and competing operations. Host
|
|
89
|
+
authentication, structural promotion and physical lease checks are explicitly
|
|
90
|
+
simulated in those storage tests. No live database, paid model or OrgX decision is
|
|
91
|
+
created or approved by this adapter.
|
|
@@ -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 `workflow-verify/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,155 @@
|
|
|
1
|
+
# Portable environment setup — experimental foundation
|
|
2
|
+
|
|
3
|
+
Use the README's single first-run quickstart before adapting your app. This document defines a
|
|
4
|
+
profile/admission boundary; it does not install another runner. The executable scenario remains
|
|
5
|
+
the existing case/flow with its assertions, fixtures and personas. A separate execution profile
|
|
6
|
+
selects where and under what authority that same scenario runs. A host brand or a placement enum
|
|
7
|
+
is not a supported capability.
|
|
8
|
+
|
|
9
|
+
## Current versus needed configuration
|
|
10
|
+
|
|
11
|
+
| Concern | Current executable CLI | New reusable contract / remaining integration |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| Scenario versus placement | Short authoring config combines app setup and personas; low-level corpus separates cases, profiles, EnvironmentPlan and HostPlan | Reference-only PortableEnvironmentProfile plus per-attempt intent; profile never embeds scenario steps. Selection/compiler/CLI integration remains gated. |
|
|
14
|
+
| Workspace / source / build | Native launch hashes selected source files and observes the interpreter; Git resolver freezes exact base/head | Host-resolved workspace, immutable source-selection/build/config refs. Verify actual installed dependency/build closure; a launch-file hash is not a complete installed closure. |
|
|
15
|
+
| Start app alongside runner | Node, FastAPI and Django native process hosts, fresh directory/port, GET readiness; command wrapper blocked | Reuse frozen host/launch/dependency plan refs. Discover process/runtime/loopback/filesystem capabilities. No arbitrary shell execution DSL. |
|
|
16
|
+
| Existing hosted staging | Declared origins and environment classes exist; general authenticated external-host execution is not wired | Resolve exact deployment and endpoint, confirm authorized access and identity, then read readiness. Never restart or tear down a borrowed deployment. Not qualified here. |
|
|
17
|
+
| Endpoints | Native host reports/reserves loopback port; browser and HTTP use that observed origin | Host endpoint resolver refs distinguish owned launch, service discovery and external deployment. No embedded credential-bearing URLs, tunnels or assumed inbound access. |
|
|
18
|
+
| Browser / dependencies | Chromium driver; explicit Playwright binary/system libraries. Python environments separate. Docker sample harness exists | Required versioned capabilities and pinned dependency plans; unsupported/missing features block. No automatic Docker, services, root, persistent-volume or browser-library assumption. |
|
|
19
|
+
| Network | Browser/API effect envelopes constrain adapter actions; arbitrary launched app egress is not proven confined | Host-enforced policy ref, explicit allowed endpoints, inbound none/loopback. Current native host cannot attest full network containment; a strict profile must remain blocked there. No policy changes or gateway bypass. |
|
|
20
|
+
| Application persona | Sample host issues attempt-local synthetic bearer tokens; adapters consume in-memory credentials | personaRef + secretRef, resolved by that environment's authorized broker. No values in scenarios/profiles/artifacts. Declaring the ref grants no access. |
|
|
21
|
+
| Execution authority | Current local process runs with the environment's existing OS/sandbox permissions | Independent execution actor, policy ref and optional execution secret refs. App personas cannot grant workspace/service/admin authority. Host must validate scope/lease/operation permission. |
|
|
22
|
+
| Synthetic data / reset | API fixture create/readback/reverse cleanup; isolated sample data dirs | Versioned seed/generator/namespace/reset/resource policy refs. Reset only host-resolved owned isolated resources; no production reset, global prune or database integrity replay. General DB/service provisioning is not installed. |
|
|
23
|
+
| Artifacts / redaction | Local verified bundles, JSON/Markdown/JUnit, WebM and media integrity. Raw bodies/video can be private | Destination/durability/retention/redaction policy/size bound. Ephemeral hosts must prove authorized export before completion; executable redaction and general destination adapters remain unfinished. |
|
|
24
|
+
| Resource/time/spend | Existing request/action deadlines and budgets; native/Docker enforcement differs; draft provider caps differ | Explicit wall/cleanup reserve, CPU/memory/disk/request/browser/provider/agent/spend limits. Host must prove enforceability, including zero calls/spend. A number in YAML is not enforced accounting. |
|
|
25
|
+
| Ownership / cleanup | Scoped process/data/fixture inventory, acknowledged stop, unresolved cleanup retained | Lease/cleanup policy refs and per-attempt bindings; acquired resources only. Durable acquisition CAS/fencing, atomic artifacts, expired-lease recovery and real-provider crash/interleaving remain integration gates. |
|
|
26
|
+
| Replay | Verify/play existing evidence; `test` creates fresh actions; low-level rerun preserves lineage | Explicit fresh execution, evidence playback, fresh-fixture, recorded-I/O or history mode; host-supported replay plan required. Source fixture reuse is rejected by the existing lifecycle validator. No replay engine installed. |
|
|
27
|
+
| Agent output / onboarding | check/doctor/test JSON and exit codes; doctor discovers authoring projects and reports native compiled-plan provenance, dependencies and structured errors. Other top-level errors sometimes prose | SDK preflight returns typed checks, omissions, stable errors and recovery; ready is execution not started and verification not evaluated. It is not an admission token. Portable profile dispatch remains gated. |
|
|
28
|
+
|
|
29
|
+
## Reference-only profiles
|
|
30
|
+
|
|
31
|
+
Generated, schema-validated examples:
|
|
32
|
+
|
|
33
|
+
- [App alongside runner](examples/portable-environments/alongside_runner.json)
|
|
34
|
+
- [Existing staging](examples/portable-environments/external_staging.json)
|
|
35
|
+
|
|
36
|
+
Every `example.*` ref is an unresolved placeholder, including its illustrative digest. Neither
|
|
37
|
+
file registers a host, authorizes a target or can be passed to the current CLI config loader.
|
|
38
|
+
The source is `src/authoring/environmentTemplates.ts`; `node --import tsx
|
|
39
|
+
scripts/export-environment-examples.ts` regenerates them. Tests compare generated bytes/records
|
|
40
|
+
and parse them through the same Zod schemas exported to JSON Schema. Do not maintain another
|
|
41
|
+
handwritten environment DSL or copy credentials into these files.
|
|
42
|
+
|
|
43
|
+
Recommended setup is one shared scenario tree plus one small profile selection per environment:
|
|
44
|
+
`mac-local`, `coding-cloud-local`, `workflow-cloud`, and separately `authorized-staging`. Each
|
|
45
|
+
selection resolves the same logical source/build/configuration refs to that host's workspace and
|
|
46
|
+
resolves credential refs in that host. These names are recommendations, not installed adapters.
|
|
47
|
+
Start with the native no-service API sample, then Chromium, then OrgX with its isolated dependency
|
|
48
|
+
and fixture prerequisites; qualify each stage before enabling it in onboarding.
|
|
49
|
+
|
|
50
|
+
For application credentials, have the environment's existing broker bind a logical secret ref
|
|
51
|
+
to the intended test persona under an attempt-scoped lease. For execution permissions, separately
|
|
52
|
+
bind the execution actor to an existing policy and any required execution credential refs. The
|
|
53
|
+
preflight interface checks access metadata without fetching or returning secret values. Actual
|
|
54
|
+
dispatch must obtain an in-memory handle from that broker and erase/revoke it at teardown. No
|
|
55
|
+
universal environment-variable/token export, copied browser session, persistent credential setup
|
|
56
|
+
or transfer between Mac/Codex/Claude/OrgX environments is implemented or authorized.
|
|
57
|
+
|
|
58
|
+
The optional non-secret configuration ref is also host-resolved: its resolver must reject secret
|
|
59
|
+
values and must not evaluate arbitrary project code during preflight. Existing `app.env` is
|
|
60
|
+
serialized into frozen inputs; use it only for non-secret test configuration. Hashes/ref names are
|
|
61
|
+
not an automatic secret detector or evidence-content redactor.
|
|
62
|
+
|
|
63
|
+
## Read-only SDK preflight
|
|
64
|
+
|
|
65
|
+
`preflightPortableEnvironment(intent, ports, {signal, timeoutMs})` resolves a self-digested frozen
|
|
66
|
+
profile, validates scope and requested replay mode, and invokes bounded trusted read-only probes.
|
|
67
|
+
Each observation binds the exact profile, execution/attempt/generation, actor and request digest,
|
|
68
|
+
has an observed/expiry time and references host evidence. Unknown/stale/unsupported required
|
|
69
|
+
capabilities block. Optional omissions remain visible. Authorization is checked before target or
|
|
70
|
+
secret metadata. Errors returned by a port are never serialized into the report.
|
|
71
|
+
|
|
72
|
+
The host probes inspect launch/readiness capability and existing target metadata. Preflight never
|
|
73
|
+
starts a server, changes permissions, installs dependencies, issues credentials, creates fixtures,
|
|
74
|
+
resets data, creates tunnels or performs cleanup. Actual post-launch readiness, identity, actions,
|
|
75
|
+
artifact byte verification and cleanup need their own execution receipts. Ready preflight reports
|
|
76
|
+
must be re-admitted under a live lease before effects; they are not reusable permission tokens.
|
|
77
|
+
|
|
78
|
+
Examples of actionable machine output:
|
|
79
|
+
|
|
80
|
+
| Code | Meaning / recovery |
|
|
81
|
+
| --- | --- |
|
|
82
|
+
| `capability_missing` | Install through an already authorized dependency path or choose a provisioned host; do not assume Docker/root. |
|
|
83
|
+
| `persona_credential_missing` | Bind the existing logical secret reference in this host's broker. Never paste the value into a scenario. |
|
|
84
|
+
| `authorization_denied` | Stop before target/secret probing; obtain owner review or select an already authorized target. Do not change permissions automatically. |
|
|
85
|
+
| `network_unknown` | No observed enforcement for this policy; select a host/policy with proof, preserving current restrictions. |
|
|
86
|
+
| `artifacts_missing` | Select an authorized exportable destination before an ephemeral host run. |
|
|
87
|
+
| `probe_binding_mismatch` | Reject stale/cross-run, wrong actor or wrong request evidence; collect a fresh scoped observation. |
|
|
88
|
+
| `preflight_deadline` / `preflight_cancelled` | Stop bounded probes; preserve the blocked report. No execution started. |
|
|
89
|
+
|
|
90
|
+
The report uses `status: ready|blocked`, `exitCode: 0|2`, `checks[]` with request/state/required/
|
|
91
|
+
evidenceRefs/code/recovery, `errors[]`, `execution: not_started` and
|
|
92
|
+
`verificationVerdict: not_evaluated`. CLI `doctor --dir <project> --json` discovers an authoring
|
|
93
|
+
config and reuses the existing compiler and planner; low-level `--config`/`--profile` remain
|
|
94
|
+
supported. Its separate `tracegrove.doctor/v1` report includes selected host/corpus refs,
|
|
95
|
+
source/runtime digests, dependency checks and recovery actions. Compilation writes derived
|
|
96
|
+
files and interpreter version probes may run; the app never starts. Required Chromium executable
|
|
97
|
+
presence is installation metadata, not a tested engine or environment qualification. No portable
|
|
98
|
+
profile execution flag is advertised.
|
|
99
|
+
|
|
100
|
+
## Environment acceptance and rollout
|
|
101
|
+
|
|
102
|
+
1. **This slice:** frozen reference-only schemas/templates, bounded SDK probes, negative
|
|
103
|
+
conformance and README first-use checks. Synthetic probe tests establish contract behavior,
|
|
104
|
+
not host support. Independent review must challenge secret/actor separation, stale observations,
|
|
105
|
+
ignored cancellation, scope, startup-versus-staging and security/spend enforcement claims.
|
|
106
|
+
2. **Native selection/onboarding:** doctor now resolves the existing native authoring/HostPlan
|
|
107
|
+
selection and reports source/runtime/dependency inspection. General portable profile dispatch
|
|
108
|
+
and host-specific missing-ref recovery remain gated; no silent policy downgrade. Repeat the clean API/browser
|
|
109
|
+
first run independently on each actual machine. Mac remains unqualified while offline.
|
|
110
|
+
3. **External staging:** install a reviewed read-only external-host adapter and existing secret
|
|
111
|
+
broker integration. Prove deployment/endpoint identity and authorized test-persona access;
|
|
112
|
+
fixtures require separately scoped owned synthetic-resource authority. No denied staging retry
|
|
113
|
+
is part of this work. Do not infer support from local notes or Inspector/mock tests.
|
|
114
|
+
4. **OrgX-triggered/workflow cloud:** bind an actual authorized runner/workspace/lease, discover
|
|
115
|
+
capabilities and enforce budgets/export/cleanup. Reuse existing dispatch ownership; a task
|
|
116
|
+
record is not a running verifier. Add real interruption/interleaving recovery before broader
|
|
117
|
+
resource/provider integration; keep journals/atomic-publication gates open until tested.
|
|
118
|
+
|
|
119
|
+
For every claimed environment retain: clean dependency/runtime install, exact tool/source/build
|
|
120
|
+
and profile pins; setup elapsed time and manual steps (including failures); fresh capability and
|
|
121
|
+
authorization observations; the actual API/browser/client journey with positive/negative
|
|
122
|
+
assertions; verified artifacts exported before ephemeral storage expires; owned-resource cleanup
|
|
123
|
+
readback; and measured cost or explicitly unmeasured infrastructure cost. Preserve failed attempts
|
|
124
|
+
and distinguish preflight, execution, verification and business acceptance. No environment becomes
|
|
125
|
+
supported from templates, schemas, host brand, CI color or prose alone.
|
|
126
|
+
|
|
127
|
+
Current evidence is limited to this Codex Linux cloud's isolated native/API/browser fixtures and
|
|
128
|
+
the hosted Linux sample CI lanes already linked in the release audit. Actual OrgX #3620 proved a
|
|
129
|
+
settings heading, #3614 a method boundary, and #3645 failed receipt lookup with unavailable offline
|
|
130
|
+
workspace/store. None proves full OrgX workflow/client acceptance. Local Docker registry HTTPS
|
|
131
|
+
was refused; hosted CI's Docker success is separate evidence. Claude coding cloud, Hope's Mac,
|
|
132
|
+
OrgX-triggered runtime and authenticated external staging remain unqualified.
|
|
133
|
+
|
|
134
|
+
## Recorded clean-room onboarding
|
|
135
|
+
|
|
136
|
+
An independent AI reviewer followed only the README at source
|
|
137
|
+
`3894ed6e43b32c0177be03397e22df757405ed6c` in a fresh Linux x86_64 checkout, with a new toolchain,
|
|
138
|
+
dependency tree, cache and sample. Default Node 24.19.0/npm 11.9.0 required the documented optional
|
|
139
|
+
bootstrap to Node 22.23.3/npm 10.9.9. The reviewer preserved PATH/cache across stateless shell
|
|
140
|
+
calls; the README now explicitly recommends one shell session. No source/flow repair or
|
|
141
|
+
undocumented install was needed. Observed setup through bundle verification took 39 seconds,
|
|
142
|
+
including README inspection and orchestration; it is not a benchmark or measured infrastructure cost.
|
|
143
|
+
|
|
144
|
+
Doctor/check, both real notes scenarios, independent API readbacks, stranger 403/empty-list,
|
|
145
|
+
anonymous 401 and deletion 404 assertions passed. Original and copied evidence bundles verified
|
|
146
|
+
with two receipts and no problems. Fixture/process/workspace cleanup was confirmed, with independent
|
|
147
|
+
readback finding both owned process entries and workspaces absent. The private receipt and run are
|
|
148
|
+
retained privately in the saved cloud environment; they are not shipped in npm. One stale “any command” table claim was corrected after review.
|
|
149
|
+
The canonical executed quickstart is unchanged by that documentation correction.
|
|
150
|
+
|
|
151
|
+
The automated README journey separately passed using the existing build/dependencies. Its first
|
|
152
|
+
harness run misread the receipt's `critical` IDs as errors; the corrected harness requires all
|
|
153
|
+
attempted and critical IDs to be confirmed. That initial harness failure receipt is preserved.
|
|
154
|
+
Neither run exercises portable-profile dispatch, a browser, another cloud, Mac, authenticated
|
|
155
|
+
staging or an npm registry installation. Those environment acceptance gates remain open.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Qualification registration and invalidation
|
|
2
|
+
|
|
3
|
+
`registerQualificationRound` creates a sealed pending admission before execution. It requires an exact scenario revision token, a structurally validated definition, its complete frozen selection matrix and fresh leased-state refs. A new campaign and per-cell execution/attempt identities are allocated together with the next monotonic round sequence.
|
|
4
|
+
|
|
5
|
+
The prototype uses `SelectionManifest` as the qualification matrix. Its policy, required case/persona/target strata and exclusions are frozen; the round selection must match them exactly. Every scenario case must retain a required matrix cell. Changed personas/targets, empty or duplicated cells, unexplained exclusions and dropped required cases are refused. The exported `qualificationStrataDigest` uses stable code-unit ordering across hosts.
|
|
6
|
+
|
|
7
|
+
`ScenarioPorts` are trusted host ports, never candidate/plugin inputs. `validateDefinition` must resolve and validate the exact review, replay-contract, matrix, policy and target-profile closure. `compareAndSwap` must atomically verify/reserve the submitted state leases, enforce ownership/fencing/freshness, append the admission and update the projection, or publish none of them. This API does not provision physical state or grant per-cell effects. It does not install that storage adapter.
|
|
8
|
+
|
|
9
|
+
Snapshots include all registered admissions, including rounds still pending or later failed; the admission itself carries no outcome claim. The projection's latest sequence must match complete, scoped, sealed history. Reused campaign/execution/attempt/lease identities and incomplete histories are conflicts. A lease cannot become fresh by changing its revision or digest. An exhausted 500-round prototype history blocks until an authoritative archival index is supplied; it never silently drops earlier registrations.
|
|
10
|
+
|
|
11
|
+
Registration increments aggregate version and latest-round sequence without activating coverage. Any older activation snapshot must therefore conflict even before the newest round completes. Concurrent registration/invalidation uses the same aggregate-version CAS. Losing writers publish no admission and do not advance the epoch.
|
|
12
|
+
|
|
13
|
+
`invalidateScenario` requires a new immutable definition revision of the same scenario, advances the invalidation epoch, clears activation authority and moves coverage to `degraded`. It retains historical round records. Retired coverage cannot be resurrected through this operation. An observed product regression does not itself call semantic invalidation or remove its detecting case.
|
|
14
|
+
|
|
15
|
+
Terminal campaign binding is available through [qualification result reduction](qualification-results.md), followed by [read-only replay assessment](replay-assessment.md) and [explicit activation](scenario-activation.md). [LocalScenarioStore](local-scenario-store.md) supplies durable local registration/invalidation and scoped lease-identity claims on the existing ledger, with required host authority callbacks. Promotion, structural-validation transitions and hosted persistence remain open. A registration record is neither a passing round nor release coverage.
|
|
16
|
+
|
|
17
|
+
## Executing a registered round
|
|
18
|
+
|
|
19
|
+
The SDK can prepare a new qualification request from an unchanged frozen trial or
|
|
20
|
+
work-proof plan. This creates new sealed request, fidelity and fixture documents;
|
|
21
|
+
it does not read, rewrite or promote trial receipts.
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
const owner = localQualificationExecutionOwner(store, authorizeEffects);
|
|
25
|
+
const qualified = await prepareQualificationExecution(
|
|
26
|
+
frozenPlan, admission.ref, scope, ledger, owner,
|
|
27
|
+
);
|
|
28
|
+
const run = await executeBundle({
|
|
29
|
+
bundle: qualified, scope, ledger, stateDir, qualification: owner,
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The store must use this exact ledger and state directory. `authorizeEffects` is a
|
|
34
|
+
trusted host capability checked before host start, fixture creation and each
|
|
35
|
+
forward step. It must establish actual permission to affect the selected target;
|
|
36
|
+
read and registration permission alone do not suffice. The store rechecks current
|
|
37
|
+
definition, invalidation epoch, reviewed closure and physical leases around each
|
|
38
|
+
authorization await. Cleanup remains available after forward permission is revoked.
|
|
39
|
+
External authority synchronization and provider fencing remain host responsibilities.
|
|
40
|
+
|
|
41
|
+
Every cell uses its registered execution and attempt IDs. A single durable claim
|
|
42
|
+
binds the admission to the complete frozen request, independently of caller retry
|
|
43
|
+
keys. Terminal redelivery returns the recorded summary without repeating effects.
|
|
44
|
+
An incomplete claim, including a lost publication acknowledgement, requires
|
|
45
|
+
reconciliation; it never automatically replays preallocated effects. Execution
|
|
46
|
+
directories cannot overwrite existing evidence. The trusted controller must keep
|
|
47
|
+
its ledger and evidence directory inaccessible to candidate processes.
|
|
48
|
+
|
|
49
|
+
Pass resulting bundles to `reduceQualificationRound` with the persisted admission
|
|
50
|
+
resolver and independent issuer authentication. Structural bundle verification
|
|
51
|
+
alone does not establish an authentic qualification result. Local tests use real
|
|
52
|
+
native HTTP effects and durable registration, with explicitly simulated host
|
|
53
|
+
authorization, reviewed-source and physical-lease callbacks.
|
|
54
|
+
|
|
55
|
+
There is no automatic CLI qualification owner. Qualification without an explicit
|
|
56
|
+
runtime owner, a trial disguised with lifecycle refs, and activated regression
|
|
57
|
+
requests remain refused. This SDK path does not activate coverage or prove hosted
|
|
58
|
+
source, issuer, lease provisioning or release authority.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Complete terminal qualification rounds
|
|
2
|
+
|
|
3
|
+
`reduceQualificationRound(ports, { admissionRef, scope, bundleDir })` reads a single verified bundle snapshot and binds its entire campaign to an authentic previously registered admission. It returns a sealed `workflow.qualification-round/v1` document containing the exact admission, campaign and terminal receipt references. Redelivery of identical evidence produces the same result reference and digest.
|
|
4
|
+
|
|
5
|
+
Every selected cell needs exactly one terminal receipt with its preallocated execution and attempt identity. Missing cells, duplicate allocations, substituted scope/campaign/selection/policy/strata, mismatched scenario references and invalid raw evidence are rejected. The bundle reader reapplies the full saved cell and campaign guards, including assertions, identity observations, capture, cleanup and receipt bindings. No caller-supplied success count replaces those checks.
|
|
6
|
+
|
|
7
|
+
The host owns `authorize`, `resolveAdmission` and `authenticateEvidence`. The admission resolver must read authentic persisted registration and reserved state, not accept an imported producer document as registration. Evidence authentication must validate the exact definition/replay/policy/matrix/target closure and issuer/effect authority against the captured bundle manifest digest. A host without those implementations must refuse the operation. Callbacks receive separate copies so mutation cannot rewrite the result being sealed. The reducer publishes no persistence write; a host must store the result with its immutable admission binding and enforce idempotency/conflict handling.
|
|
8
|
+
|
|
9
|
+
Complete failed, blocked, cancelled, inconclusive and mock campaigns remain terminal evidence. A result has neither `qualifies` nor a live proof level. It does not activate coverage. [Replay assessment](replay-assessment.md) derives independent-round readiness, latest-round and epoch checks and policy-specific revision proof. [Explicit activation](scenario-activation.md) supplies an atomic host contract and local journal adapter. A historical terminal result can be retained after invalidation without becoming eligible for current activation.
|
|
10
|
+
|
|
11
|
+
[Registered SDK execution](qualification-registration.md#executing-a-registered-round)
|
|
12
|
+
uses actual persisted admissions and allocated cell identities with an explicit runtime
|
|
13
|
+
owner. Qualification without that owner and activated regression execution remain blocked.
|
|
14
|
+
Older consumer fixtures simulate registration around real observations; they do not prove
|
|
15
|
+
authentic hosted qualification.
|
|
16
|
+
|
|
17
|
+
## Durable local terminal results
|
|
18
|
+
|
|
19
|
+
`LocalQualificationResults` connects this reducer to the existing `LocalResultSink` and
|
|
20
|
+
`LocalLedger`. It retains a complete immutable bundle before atomically publishing the
|
|
21
|
+
admission-to-round index. It does not create a second archive, database or readiness flag.
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
const results = new LocalQualificationResults(ledger, scope, {
|
|
25
|
+
authorize: authorizeResultRead,
|
|
26
|
+
authorizeRetention: authorizeResultRetention,
|
|
27
|
+
resolveAdmission: (ref, scope) => store.resolveAdmission(ref, scope),
|
|
28
|
+
authenticateEvidence,
|
|
29
|
+
});
|
|
30
|
+
const saved = await results.retain({ admissionRef: admission.ref, scope, bundleDir });
|
|
31
|
+
// Supply this resolver to ReplayAssessmentPorts:
|
|
32
|
+
const resolveRound = (admission) => results.resolveRound(admission);
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
All authority callbacks are required. Read permission, retention permission and issuer
|
|
36
|
+
authentication are distinct. Registration must come from an authoritative owner; the
|
|
37
|
+
result sink's integrity check does not authenticate a producer. Every historical lookup
|
|
38
|
+
rechecks permission, persisted admission, raw bundle integrity, issuer authentication,
|
|
39
|
+
manifest digest and exact terminal round bindings. Pending work returns null only after
|
|
40
|
+
checking authentic registration. Broken or inaccessible retained evidence raises an error.
|
|
41
|
+
|
|
42
|
+
Both outcomes and raw bytes remain available after the producer's directory is deleted.
|
|
43
|
+
Duplicate and concurrent retention of the same admission/manifest converge on one index
|
|
44
|
+
record. Different bytes under an existing round conflict. The sink accepts an expected
|
|
45
|
+
manifest digest, so bytes changed after issuer authentication cannot claim the campaign
|
|
46
|
+
in the generic index. A crash before index publication
|
|
47
|
+
can leave an integrity-checked generic result, which stays pending as a qualification round;
|
|
48
|
+
retry reconciles it. A lost acknowledgement after publication recovers the original round
|
|
49
|
+
after reopening the ledger. Neither recovery path executes the candidate again.
|
|
50
|
+
|
|
51
|
+
The bounded index permits 500 rounds per scope and requires archival indexing at capacity;
|
|
52
|
+
it never drops failures or pending admissions to make coverage pass. The controller must
|
|
53
|
+
protect the state directory from candidate writes. This is local single-writer storage,
|
|
54
|
+
not distributed fencing, hosted IAM, physical lease provisioning or atomic activation.
|
|
55
|
+
Tests include real registration and native HTTP effects, producer deletion, journal reopen,
|
|
56
|
+
lost publication acknowledgements, concurrent retention, permission/issuer revocation and
|
|
57
|
+
byte replacement across authorization awaits. Two independent real registered campaigns
|
|
58
|
+
feed replay assessment through this index. Host, source, physical-lease and issuer authority
|
|
59
|
+
are explicitly simulated; hosted qualification and release coverage remain unproven.
|