PTSIP 0.3.8b3__py3-none-win_amd64.whl
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.
- agent_contracts/__init__.py +5 -0
- agent_contracts/actions/analyze-source-profile.yaml +13 -0
- agent_contracts/actions/apply-adoption.yaml +12 -0
- agent_contracts/actions/apply-profile-transition.yaml +11 -0
- agent_contracts/actions/build-adoption-plan.yaml +10 -0
- agent_contracts/actions/build-transition-plan.yaml +10 -0
- agent_contracts/actions/capture-repository-snapshot.yaml +13 -0
- agent_contracts/actions/collect-conformance-evidence.yaml +13 -0
- agent_contracts/actions/compare-profile-authority.yaml +10 -0
- agent_contracts/actions/emit-conformance-result.yaml +10 -0
- agent_contracts/actions/evaluate-conformance-rules.yaml +10 -0
- agent_contracts/actions/map-profile-target.yaml +10 -0
- agent_contracts/actions/project-authority-winner.yaml +13 -0
- agent_contracts/actions/read-relevant-authority.yaml +13 -0
- agent_contracts/actions/resolve-adoption-facts.yaml +11 -0
- agent_contracts/actions/resolve-profile-schema.yaml +14 -0
- agent_contracts/actions/resolve-reconciliation-state.yaml +10 -0
- agent_contracts/actions/validate-profile-structure.yaml +10 -0
- agent_contracts/actions/validate-responsibility-map-semantics.yaml +10 -0
- agent_contracts/bindings/current.yaml +125 -0
- agent_contracts/candidate.py +383 -0
- agent_contracts/canonicalization/ptsip-canonical-json-v1.json +81 -0
- agent_contracts/conditions/adopt-apply-requested.yaml +10 -0
- agent_contracts/conditions/adopt-authority-fresh.yaml +10 -0
- agent_contracts/conditions/adopt-facts-resolved.yaml +10 -0
- agent_contracts/conditions/adopt-profile-fresh.yaml +10 -0
- agent_contracts/conditions/adopt-repository-fresh.yaml +10 -0
- agent_contracts/conditions/adopt-snapshot-identified.yaml +10 -0
- agent_contracts/conditions/adopt-write-authorized.yaml +10 -0
- agent_contracts/conditions/authority-authority-fresh.yaml +10 -0
- agent_contracts/conditions/authority-coordination-available.yaml +10 -0
- agent_contracts/conditions/authority-profile-fresh.yaml +10 -0
- agent_contracts/conditions/authority-projection-required.yaml +10 -0
- agent_contracts/conditions/authority-semantic-conflict-absent.yaml +10 -0
- agent_contracts/conditions/authority-write-authorized.yaml +10 -0
- agent_contracts/conditions/conform-profile-ready.yaml +10 -0
- agent_contracts/conditions/conform-snapshot-identified.yaml +10 -0
- agent_contracts/conditions/migrate-apply-requested.yaml +10 -0
- agent_contracts/conditions/migrate-source-fresh.yaml +10 -0
- agent_contracts/conditions/migrate-source-profile-identified.yaml +10 -0
- agent_contracts/conditions/migrate-target-contract-resolved.yaml +10 -0
- agent_contracts/conditions/migrate-target-fresh.yaml +10 -0
- agent_contracts/conditions/migrate-write-authorized.yaml +10 -0
- agent_contracts/conditions/validate-contract-resolved.yaml +10 -0
- agent_contracts/conditions/validate-profile-selected.yaml +10 -0
- agent_contracts/conformance/current.json +987 -0
- agent_contracts/contracts/current.json +3978 -0
- agent_contracts/digests/policy-v1.json +7746 -0
- agent_contracts/digests/projection-v1.json +7698 -0
- agent_contracts/gates/adoption-write.yaml +18 -0
- agent_contracts/gates/authority-projection-write.yaml +18 -0
- agent_contracts/gates/profile-transition-write.yaml +15 -0
- agent_contracts/index.json +427 -0
- agent_contracts/index.yaml +113 -0
- agent_contracts/machine_resolver.py +81 -0
- agent_contracts/operations/adopt.yaml +99 -0
- agent_contracts/operations/conform.yaml +57 -0
- agent_contracts/operations/migrate-profile.yaml +85 -0
- agent_contracts/operations/reconcile-authority.yaml +87 -0
- agent_contracts/operations/validate.yaml +53 -0
- agent_contracts/promotion/current.json +50 -0
- agent_contracts/promotion/index.json +13 -0
- agent_contracts/promotion/specification-contract.json +49 -0
- agent_contracts/resolver.py +253 -0
- agent_contracts/schemas/candidate-group.schema.json +107 -0
- agent_contracts/schemas/candidate-index.schema.json +246 -0
- agent_contracts/schemas/candidate-vectors.schema.json +49 -0
- agent_contracts/schemas/contracts/action.schema.json +21 -0
- agent_contracts/schemas/contracts/binding.schema.json +32 -0
- agent_contracts/schemas/contracts/condition.schema.json +25 -0
- agent_contracts/schemas/contracts/index.schema.json +27 -0
- agent_contracts/schemas/contracts/io.schema.json +12 -0
- agent_contracts/schemas/contracts/mutation-gate.schema.json +17 -0
- agent_contracts/schemas/contracts/operation.schema.json +259 -0
- agent_contracts/schemas/contracts/promotion.schema.json +81 -0
- agent_contracts/schemas/contracts/spec.schema.json +13 -0
- agent_contracts/schemas/contracts/vocabulary.schema.json +11 -0
- agent_contracts/schemas/io/adopt-request.schema.json +8 -0
- agent_contracts/schemas/io/adopt-result.schema.json +6 -0
- agent_contracts/schemas/io/adopt-state.schema.json +12 -0
- agent_contracts/schemas/io/authority-request.schema.json +8 -0
- agent_contracts/schemas/io/authority-result.schema.json +6 -0
- agent_contracts/schemas/io/authority-state.schema.json +13 -0
- agent_contracts/schemas/io/conform-request.schema.json +6 -0
- agent_contracts/schemas/io/conform-result.schema.json +6 -0
- agent_contracts/schemas/io/conform-state.schema.json +6 -0
- agent_contracts/schemas/io/migrate-request.schema.json +11 -0
- agent_contracts/schemas/io/migrate-result.schema.json +6 -0
- agent_contracts/schemas/io/migrate-state.schema.json +11 -0
- agent_contracts/schemas/io/validate-request.schema.json +6 -0
- agent_contracts/schemas/io/validate-result.schema.json +6 -0
- agent_contracts/schemas/io/validate-state.schema.json +6 -0
- agent_contracts/spec/adoption-procedure.yaml +148 -0
- agent_contracts/spec/adoption.yaml +33 -0
- agent_contracts/spec/agent-behavior.yaml +148 -0
- agent_contracts/spec/authority.yaml +40 -0
- agent_contracts/spec/classification.yaml +64 -0
- agent_contracts/spec/conformance-detail.yaml +120 -0
- agent_contracts/spec/conformance.yaml +43 -0
- agent_contracts/spec/core.yaml +29 -0
- agent_contracts/spec/governance.yaml +30 -0
- agent_contracts/spec/profile-transition-detail.yaml +78 -0
- agent_contracts/spec/profile-transition.yaml +30 -0
- agent_contracts/spec/repository-boundaries.yaml +148 -0
- agent_contracts/spec/responsibility-map-detail.yaml +92 -0
- agent_contracts/spec/responsibility-map.yaml +36 -0
- agent_contracts/spec/specification-governance.yaml +91 -0
- agent_contracts/validator.py +723 -0
- agent_contracts/vocabulary/authority.yaml +20 -0
- agent_contracts/vocabulary/diagnostics.yaml +23 -0
- agent_contracts/vocabulary/lifecycle.yaml +20 -0
- agent_contracts/vocabulary/outcomes.yaml +26 -0
- agent_contracts/vocabulary/terminology.yaml +428 -0
- ptsip/__init__.py +5 -0
- ptsip/__main__.py +4 -0
- ptsip/adoption.py +225 -0
- ptsip/agent_contracts/__init__.py +12 -0
- ptsip/agent_contracts/bindings/current.yaml +38 -0
- ptsip/agent_contracts/index.yaml +53 -0
- ptsip/agent_contracts/operations/adopt.yaml +49 -0
- ptsip/agent_contracts/operations/conform.yaml +42 -0
- ptsip/agent_contracts/operations/migrate-profile.yaml +45 -0
- ptsip/agent_contracts/operations/reconcile-authority.yaml +40 -0
- ptsip/agent_contracts/operations/validate.yaml +36 -0
- ptsip/agent_contracts/runtime.py +102 -0
- ptsip/agent_contracts/schemas/binding.schema.json +151 -0
- ptsip/agent_contracts/schemas/index.schema.json +51 -0
- ptsip/agent_contracts/schemas/operation.schema.json +122 -0
- ptsip/agent_contracts/schemas/spec.schema.json +96 -0
- ptsip/agent_contracts/schemas/vocabulary.schema.json +50 -0
- ptsip/agent_contracts/spec/adoption.yaml +23 -0
- ptsip/agent_contracts/spec/authority.yaml +32 -0
- ptsip/agent_contracts/spec/classification.yaml +31 -0
- ptsip/agent_contracts/spec/conformance.yaml +27 -0
- ptsip/agent_contracts/spec/core.yaml +21 -0
- ptsip/agent_contracts/spec/governance.yaml +17 -0
- ptsip/agent_contracts/spec/profile-transition.yaml +27 -0
- ptsip/agent_contracts/spec/responsibility-map.yaml +26 -0
- ptsip/agent_contracts/validator.py +195 -0
- ptsip/agent_contracts/vocabulary/authority.yaml +8 -0
- ptsip/agent_contracts/vocabulary/diagnostics.yaml +7 -0
- ptsip/agent_contracts/vocabulary/lifecycle.yaml +9 -0
- ptsip/agent_contracts/vocabulary/outcomes.yaml +8 -0
- ptsip/app/__init__.py +5 -0
- ptsip/app/client.py +53 -0
- ptsip/app/github_authority.py +659 -0
- ptsip/app/github_client.py +200 -0
- ptsip/app/github_reconciliation.py +405 -0
- ptsip/app/local_client.py +129 -0
- ptsip/app/server.py +130 -0
- ptsip/app/service.py +345 -0
- ptsip/app/store.py +283 -0
- ptsip/artifact_evidence.py +150 -0
- ptsip/build_resolution.py +315 -0
- ptsip/clarification/__init__.py +6 -0
- ptsip/clarification/generator.py +345 -0
- ptsip/clarification/generator_core.py +87 -0
- ptsip/clarification/i18n.py +110 -0
- ptsip/clarification/model.py +32 -0
- ptsip/clarification/render.py +79 -0
- ptsip/clarification/resolution/__init__.py +34 -0
- ptsip/clarification/resolution/model.py +90 -0
- ptsip/clarification/resolution/parser.py +97 -0
- ptsip/clarification/resolution/profile_projection.py +467 -0
- ptsip/clarification/resolution/resolver.py +72 -0
- ptsip/clarification/transports/__init__.py +1 -0
- ptsip/clarification/transports/github_issue.py +162 -0
- ptsip/cli.py +1181 -0
- ptsip/conformance.py +627 -0
- ptsip/conformance_audit.py +143 -0
- ptsip/conformance_engine.py +409 -0
- ptsip/constants.py +9 -0
- ptsip/context_plane.py +687 -0
- ptsip/dependency_analysis.py +232 -0
- ptsip/dependency_cache.py +110 -0
- ptsip/dependency_reconciliation.py +248 -0
- ptsip/dependency_review.py +174 -0
- ptsip/dependency_validation.py +106 -0
- ptsip/doctor.py +33 -0
- ptsip/engine_installation.py +191 -0
- ptsip/engines/context/Cargo.lock +792 -0
- ptsip/engines/context/Cargo.toml +16 -0
- ptsip/engines/context/contract.json +218 -0
- ptsip/engines/context/contracts/1.0.0.json +86 -0
- ptsip/engines/context/execution-bindings.json +19 -0
- ptsip/engines/context/manifest.json +22 -0
- ptsip/engines/context/runtime-contracts.json +34 -0
- ptsip/engines/context/src/loading.rs +15 -0
- ptsip/engines/context/src/main.rs +126 -0
- ptsip/engines/context/src/source.rs +185 -0
- ptsip/engines/context/transport.json +113 -0
- ptsip/engines/context/version.yaml +3 -0
- ptsip/engines/contracts/capability-owner-map.json +94 -0
- ptsip/engines/contracts/context-projection-handoff.json +12 -0
- ptsip/engines/contracts/dependency-graph.json +47 -0
- ptsip/engines/contracts/installation-plan.json +126 -0
- ptsip/engines/contracts/native-runtime.json +21 -0
- ptsip/engines/contracts/schemas/attempt-result.schema.json +87 -0
- ptsip/engines/contracts/schemas/capability-contract.schema.json +100 -0
- ptsip/engines/contracts/schemas/consumer-handoff.schema.json +135 -0
- ptsip/engines/contracts/schemas/contract-relation.schema.json +123 -0
- ptsip/engines/contracts/schemas/core-manifest.schema.json +148 -0
- ptsip/engines/contracts/schemas/dependency-graph.schema.json +130 -0
- ptsip/engines/contracts/schemas/derived-state.schema.json +64 -0
- ptsip/engines/contracts/schemas/effect-evidence.schema.json +58 -0
- ptsip/engines/contracts/schemas/execution-binding.schema.json +73 -0
- ptsip/engines/contracts/schemas/federated-source.schema.json +97 -0
- ptsip/engines/contracts/schemas/impact-result.schema.json +60 -0
- ptsip/engines/contracts/schemas/native-invocation-registry.schema.json +206 -0
- ptsip/engines/contracts/schemas/registry-snapshot.schema.json +163 -0
- ptsip/engines/contracts/schemas/registry-verification-input.schema.json +32 -0
- ptsip/engines/contracts/schemas/runtime-authority-consumption.schema.json +120 -0
- ptsip/engines/contracts/schemas/stop-ack.schema.json +28 -0
- ptsip/engines/contracts/schemas/stop-request.schema.json +25 -0
- ptsip/engines/contracts/schemas/stop-result.schema.json +61 -0
- ptsip/engines/contracts/schemas/storage-mediation.schema.json +73 -0
- ptsip/engines/contracts/schemas/transport-binding.schema.json +49 -0
- ptsip/engines/contracts/stdio-transport.json +113 -0
- ptsip/engines/contracts/vpms-caller-transition-plan.json +224 -0
- ptsip/engines/contracts/vpms-handoff.json +84 -0
- ptsip/engines/contracts/vpms-scope-mapping.json +116 -0
- ptsip/engines/contracts/work-item-bindings.json +292 -0
- ptsip/engines/discovery/Cargo.lock +792 -0
- ptsip/engines/discovery/Cargo.toml +16 -0
- ptsip/engines/discovery/contract.json +611 -0
- ptsip/engines/discovery/contracts/1.0.0.json +172 -0
- ptsip/engines/discovery/contracts/2.0.0.json +481 -0
- ptsip/engines/discovery/execution-bindings.json +19 -0
- ptsip/engines/discovery/manifest.json +22 -0
- ptsip/engines/discovery/runtime-contracts.json +232 -0
- ptsip/engines/discovery/src/invocation.rs +17 -0
- ptsip/engines/discovery/src/main.rs +129 -0
- ptsip/engines/discovery/src/registry.rs +358 -0
- ptsip/engines/discovery/src/source.rs +305 -0
- ptsip/engines/discovery/transport.json +113 -0
- ptsip/engines/discovery/version.yaml +3 -0
- ptsip/engines/execution/Cargo.lock +792 -0
- ptsip/engines/execution/Cargo.toml +16 -0
- ptsip/engines/execution/contract.json +607 -0
- ptsip/engines/execution/contracts/1.0.0.json +356 -0
- ptsip/engines/execution/contracts/2.0.0.json +361 -0
- ptsip/engines/execution/execution-bindings.json +19 -0
- ptsip/engines/execution/manifest.json +22 -0
- ptsip/engines/execution/runtime-contracts.json +428 -0
- ptsip/engines/execution/src/authority.rs +99 -0
- ptsip/engines/execution/src/effect.rs +66 -0
- ptsip/engines/execution/src/invocation.rs +163 -0
- ptsip/engines/execution/src/main.rs +185 -0
- ptsip/engines/execution/src/source.rs +305 -0
- ptsip/engines/execution/transport.json +113 -0
- ptsip/engines/execution/version.yaml +3 -0
- ptsip/engines/index.json +178 -0
- ptsip/engines/planning/Cargo.lock +792 -0
- ptsip/engines/planning/Cargo.toml +16 -0
- ptsip/engines/planning/contract.json +535 -0
- ptsip/engines/planning/contracts/1.0.0.json +95 -0
- ptsip/engines/planning/contracts/2.0.0.json +346 -0
- ptsip/engines/planning/execution-bindings.json +19 -0
- ptsip/engines/planning/manifest.json +22 -0
- ptsip/engines/planning/runtime-contracts.json +282 -0
- ptsip/engines/planning/src/impact.rs +217 -0
- ptsip/engines/planning/src/installation.rs +195 -0
- ptsip/engines/planning/src/main.rs +179 -0
- ptsip/engines/planning/src/preparation.rs +58 -0
- ptsip/engines/planning/src/source.rs +302 -0
- ptsip/engines/planning/transport.json +113 -0
- ptsip/engines/planning/version.yaml +3 -0
- ptsip/engines/projection/Cargo.lock +792 -0
- ptsip/engines/projection/Cargo.toml +16 -0
- ptsip/engines/projection/contract.json +226 -0
- ptsip/engines/projection/contracts/1.0.0.json +92 -0
- ptsip/engines/projection/execution-bindings.json +19 -0
- ptsip/engines/projection/manifest.json +22 -0
- ptsip/engines/projection/runtime-contracts.json +62 -0
- ptsip/engines/projection/src/main.rs +149 -0
- ptsip/engines/projection/src/rendering.rs +70 -0
- ptsip/engines/projection/src/source.rs +185 -0
- ptsip/engines/projection/transport.json +113 -0
- ptsip/engines/projection/version.yaml +3 -0
- ptsip/engines/registries/derived-snapshot.json +135 -0
- ptsip/engines/registries/official-execution.json +34 -0
- ptsip/engines/registries/official-static.json +35 -0
- ptsip/engines/storage/Cargo.lock +792 -0
- ptsip/engines/storage/Cargo.toml +16 -0
- ptsip/engines/storage/contract.json +382 -0
- ptsip/engines/storage/contracts/1.0.0.json +138 -0
- ptsip/engines/storage/contracts/2.0.0.json +116 -0
- ptsip/engines/storage/execution-bindings.json +19 -0
- ptsip/engines/storage/manifest.json +22 -0
- ptsip/engines/storage/provider-registry.json +8 -0
- ptsip/engines/storage/runtime-contracts.json +282 -0
- ptsip/engines/storage/src/main.rs +123 -0
- ptsip/engines/storage/src/native.rs +233 -0
- ptsip/engines/storage/src/provider.rs +145 -0
- ptsip/engines/storage/src/source.rs +198 -0
- ptsip/engines/storage/transport.json +113 -0
- ptsip/engines/storage/version.yaml +3 -0
- ptsip/engines/validation/Cargo.lock +792 -0
- ptsip/engines/validation/Cargo.toml +16 -0
- ptsip/engines/validation/contract.json +1241 -0
- ptsip/engines/validation/contracts/1.0.0.json +356 -0
- ptsip/engines/validation/contracts/2.0.0.json +683 -0
- ptsip/engines/validation/execution-bindings.json +19 -0
- ptsip/engines/validation/manifest.json +22 -0
- ptsip/engines/validation/runtime-contracts.json +216 -0
- ptsip/engines/validation/src/cases.rs +102 -0
- ptsip/engines/validation/src/composition.rs +104 -0
- ptsip/engines/validation/src/handoff.rs +215 -0
- ptsip/engines/validation/src/main.rs +201 -0
- ptsip/engines/validation/src/source.rs +185 -0
- ptsip/engines/validation/transport.json +113 -0
- ptsip/engines/validation/version.yaml +3 -0
- ptsip/evidence/__init__.py +33 -0
- ptsip/evidence/adapters.py +486 -0
- ptsip/evidence/contract.py +230 -0
- ptsip/evidence/normalization.py +173 -0
- ptsip/governance/__init__.py +45 -0
- ptsip/governance/authority.py +714 -0
- ptsip/governance/authorization.py +55 -0
- ptsip/governance/model.py +232 -0
- ptsip/governance/subject_matching.py +78 -0
- ptsip/governance/support_assets.py +91 -0
- ptsip/inspection/__init__.py +1 -0
- ptsip/inspection/candidate_evidence.py +537 -0
- ptsip/inspection/components.py +74 -0
- ptsip/inspection/dependencies.py +502 -0
- ptsip/inspection/dependencies_030.py +69 -0
- ptsip/inspection/dotnet.py +188 -0
- ptsip/inspection/go.py +157 -0
- ptsip/inspection/inventory.py +161 -0
- ptsip/inspection/javascript.py +376 -0
- ptsip/inspection/lexing.py +121 -0
- ptsip/inspection/python_resolution.py +164 -0
- ptsip/inspection/source_adapters.py +60 -0
- ptsip/lifecycle_evidence.py +310 -0
- ptsip/migration/__init__.py +156 -0
- ptsip/migration/analysis/__init__.py +20 -0
- ptsip/migration/analysis/analyzer.py +160 -0
- ptsip/migration/analysis/direct/__init__.py +5 -0
- ptsip/migration/analysis/direct/convergence.py +133 -0
- ptsip/migration/analysis/direct/result.py +91 -0
- ptsip/migration/analysis/direct/source_projection.py +42 -0
- ptsip/migration/analysis/direct/target_projection.py +71 -0
- ptsip/migration/analysis/findings/__init__.py +0 -0
- ptsip/migration/analysis/findings/architecture.py +29 -0
- ptsip/migration/analysis/findings/lifecycle.py +28 -0
- ptsip/migration/analysis/findings/work_requirements.py +103 -0
- ptsip/migration/analysis/issue.py +12 -0
- ptsip/migration/analysis/result.py +69 -0
- ptsip/migration/analysis/source/__init__.py +0 -0
- ptsip/migration/analysis/source/binding_validation.py +43 -0
- ptsip/migration/analysis/source/evidence_correlation.py +40 -0
- ptsip/migration/analysis/source/projection.py +252 -0
- ptsip/migration/analysis/source/repository_resolution.py +96 -0
- ptsip/migration/analysis/target/__init__.py +0 -0
- ptsip/migration/analysis/target/compatibility.py +142 -0
- ptsip/migration/analysis/target/relationship_findings.py +20 -0
- ptsip/migration/analysis/target/semantics.py +159 -0
- ptsip/migration/execution/__init__.py +5 -0
- ptsip/migration/execution/authorization/__init__.py +4 -0
- ptsip/migration/execution/authorization/binding.py +160 -0
- ptsip/migration/execution/authorization/preconditions.py +71 -0
- ptsip/migration/execution/authorization/proof.py +80 -0
- ptsip/migration/execution/direct/__init__.py +9 -0
- ptsip/migration/execution/direct/identity_plan.py +133 -0
- ptsip/migration/execution/direct/identity_rewrite.py +322 -0
- ptsip/migration/execution/direct/promotion.py +180 -0
- ptsip/migration/execution/direct/verification.py +118 -0
- ptsip/migration/execution/error.py +2 -0
- ptsip/migration/execution/guard/__init__.py +3 -0
- ptsip/migration/execution/guard/mutation.py +104 -0
- ptsip/migration/execution/guard/repository_snapshot.py +47 -0
- ptsip/migration/execution/ledger/__init__.py +3 -0
- ptsip/migration/execution/ledger/record.py +149 -0
- ptsip/migration/execution/ledger/store.py +113 -0
- ptsip/migration/execution/mutation/__init__.py +5 -0
- ptsip/migration/execution/mutation/asynchronous.py +41 -0
- ptsip/migration/execution/mutation/delta.py +243 -0
- ptsip/migration/execution/mutation/finalization.py +90 -0
- ptsip/migration/execution/mutation/source.py +57 -0
- ptsip/migration/execution/promotion/__init__.py +4 -0
- ptsip/migration/execution/promotion/mutation.py +55 -0
- ptsip/migration/execution/promotion/preparation.py +79 -0
- ptsip/migration/execution/promotion/verification.py +87 -0
- ptsip/migration/execution/recovery.py +93 -0
- ptsip/migration/execution/state/__init__.py +3 -0
- ptsip/migration/execution/state/phase.py +17 -0
- ptsip/migration/execution/state/promotion.py +25 -0
- ptsip/migration/execution/state/recovery.py +31 -0
- ptsip/migration/execution/state/source_steps.py +78 -0
- ptsip/migration/planning/__init__.py +12 -0
- ptsip/migration/planning/convergence/__init__.py +0 -0
- ptsip/migration/planning/convergence/builder.py +324 -0
- ptsip/migration/planning/convergence/final_state.py +132 -0
- ptsip/migration/planning/convergence/reconciliation.py +175 -0
- ptsip/migration/planning/direct/__init__.py +3 -0
- ptsip/migration/planning/direct/builder.py +346 -0
- ptsip/migration/planning/direct/reference.py +26 -0
- ptsip/migration/planning/proposal_derivation.py +137 -0
- ptsip/migration/planning/result.py +106 -0
- ptsip/migration/proposal/__init__.py +9 -0
- ptsip/migration/proposal/bundle.py +207 -0
- ptsip/migration/proposal/semantic_identity.py +40 -0
- ptsip/migration/proposal/source_set.py +50 -0
- ptsip/migration/proposal/target_delta.py +88 -0
- ptsip/model.py +165 -0
- ptsip/package-composition.json +266 -0
- ptsip/package-distribution.json +16 -0
- ptsip/pilot/__init__.py +1 -0
- ptsip/pilot/runner.py +170 -0
- ptsip/profiles/__init__.py +1 -0
- ptsip/profiles/catalog.py +157 -0
- ptsip/profiles/compatibility.py +184 -0
- ptsip/profiles/contracts.py +100 -0
- ptsip/profiles/example.ptsip.yaml +149 -0
- ptsip/profiles/hybrid-python-package.ptsip.yaml +40 -0
- ptsip/profiles/identity.py +314 -0
- ptsip/profiles/index.yaml +22 -0
- ptsip/profiles/metadata.py +61 -0
- ptsip/profiles/template-python-package.ptsip.yaml +18 -0
- ptsip/proposed_component.py +128 -0
- ptsip/remediation/__init__.py +77 -0
- ptsip/remediation/domain/__init__.py +39 -0
- ptsip/remediation/domain/model.py +417 -0
- ptsip/remediation/escalation/__init__.py +37 -0
- ptsip/remediation/escalation/contract.py +388 -0
- ptsip/remediation/escalation/engine.py +212 -0
- ptsip/remediation/rules/__init__.py +23 -0
- ptsip/remediation/rules/contract.py +276 -0
- ptsip/repository/__init__.py +1 -0
- ptsip/repository/discover.py +68 -0
- ptsip/repository/namespace.py +86 -0
- ptsip/repository/profile_convergence.py +409 -0
- ptsip/repository/profile_path.py +97 -0
- ptsip/repository/profile_transition.py +377 -0
- ptsip/repository/remote.py +54 -0
- ptsip/repository/schemas/engine-state.schema.json +1 -0
- ptsip/repository/schemas/repository-index.schema.json +104 -0
- ptsip/repository/snapshot.py +173 -0
- ptsip/review_evidence.py +406 -0
- ptsip/source_compat/__init__.py +56 -0
- ptsip/source_compat/integrity.py +131 -0
- ptsip/source_compat/model.py +260 -0
- ptsip/source_compat/reader.py +336 -0
- ptsip/spec_identity.py +24 -0
- ptsip/specdata/project-profile-contracts.yaml +36 -0
- ptsip/specdata/ptsip-agent-classification.schema.json +57 -0
- ptsip/specdata/ptsip-artifact-evidence.schema.json +68 -0
- ptsip/specdata/ptsip-diagnostic.schema.json +58 -0
- ptsip/specdata/ptsip-normalized-evidence.schema.json +126 -0
- ptsip/specdata/ptsip-profile-pp-1.01.schema.json +309 -0
- ptsip/specdata/ptsip-profile-pp-1.02.schema.json +604 -0
- ptsip/specdata/ptsip-profile.schema.json +296 -0
- ptsip/specdata/ptsip-registry.yaml +333 -0
- ptsip/specdata/ptsip-source-profile-0.3.4.schema.json +55 -0
- ptsip/specdata/ptsip-source-profile-0.3.6.schema.json +35 -0
- ptsip/specification_binding.py +246 -0
- ptsip/storage/__init__.py +1 -0
- ptsip/storage/local_state.py +40 -0
- ptsip/support/policy/ARCH/SFP-ARCH-0001.yaml +131 -0
- ptsip/support/policy/ARCH/SFP-ARCH-0002.yaml +46 -0
- ptsip/support/policy/ARCH/SFP-ARCH-0003.yaml +39 -0
- ptsip/support/policy/ARCH/SFP-ARCH-0004.yaml +1215 -0
- ptsip/support/policy/ARCH/SFP-ARCH-0005.yaml +76 -0
- ptsip/support/policy/ASSURE/SFP-ASSURE-0001.yaml +45 -0
- ptsip/support/policy/ASSURE/SFP-ASSURE-0002.yaml +45 -0
- ptsip/support/policy/ASSURE/SFP-ASSURE-0003.yaml +46 -0
- ptsip/support/policy/ASSURE/SFP-ASSURE-0004.yaml +148 -0
- ptsip/support/policy/ASSURE/SFP-ASSURE-0005.yaml +115 -0
- ptsip/support/policy/CHANGE/SFP-CHANGE-0001.yaml +256 -0
- ptsip/support/policy/CNTR/SFP-CNTR-0001.yaml +242 -0
- ptsip/support/policy/CNTR/SFP-CNTR-0002.yaml +44 -0
- ptsip/support/policy/CNTR/SFP-CNTR-0003.yaml +54 -0
- ptsip/support/policy/CNTR/SFP-CNTR-0004.yaml +47 -0
- ptsip/support/policy/CNTR/SFP-CNTR-0005.yaml +1772 -0
- ptsip/support/policy/CNTR/SFP-CNTR-0006.yaml +131 -0
- ptsip/support/policy/CNTR/SFP-CNTR-0007.yaml +146 -0
- ptsip/support/policy/CNTR/SFP-CNTR-0008.yaml +57 -0
- ptsip/support/policy/CTRL/SFP-CTRL-0001.yaml +95 -0
- ptsip/support/policy/CTRL/SFP-CTRL-0002.yaml +415 -0
- ptsip/support/policy/CTRL/SFP-CTRL-0003.yaml +715 -0
- ptsip/support/policy/GOV/SFP-GOV-0001.yaml +55 -0
- ptsip/support/policy/GOV/SFP-GOV-0002.yaml +93 -0
- ptsip/support/policy/INFO/SFP-INFO-0001.yaml +271 -0
- ptsip/support/policy/INFO/SFP-INFO-0002.yaml +42 -0
- ptsip/support/policy/INFO/SFP-INFO-0003.yaml +41 -0
- ptsip/support/policy/INFO/SFP-INFO-0004.yaml +133 -0
- ptsip/support/policy/INFO/SFP-INFO-0005.yaml +135 -0
- ptsip/support/policy/INFO/SFP-INFO-0006.yaml +67 -0
- ptsip/support/policy/INFO/SFP-INFO-0007.yaml +256 -0
- ptsip/support/policy/INFO/SFP-INFO-0008.yaml +99 -0
- ptsip/support/policy/INFO/SFP-INFO-0009.yaml +56 -0
- ptsip/support/policy/INTENT/SFP-INTENT-0001.yaml +39 -0
- ptsip/support/policy/NORM/SFP-NORM-0001.yaml +45 -0
- ptsip/support/policy/NORM/SFP-NORM-0002.yaml +38 -0
- ptsip/support/policy/OPS/SFP-OPS-0001.yaml +40 -0
- ptsip/support/policy/OPS/SFP-OPS-0002.yaml +270 -0
- ptsip/support/policy/REAL/SFP-REAL-0001.yaml +47 -0
- ptsip/support/policy/RECORD/SFP-RECORD-0001.yaml +39 -0
- ptsip/support/policy/RECORD/SFP-RECORD-0002.yaml +40 -0
- ptsip/support/policy/RECORD/SFP-RECORD-0003.yaml +403 -0
- ptsip/support/policy/RECORD/SFP-RECORD-0004.yaml +186 -0
- ptsip/support/policy/RISK/SFP-RISK-0001.yaml +34 -0
- ptsip/support/policy/SUPPLY/SFP-SUPPLY-0001.yaml +43 -0
- ptsip/support/policy/index.yaml +183 -0
- ptsip/support/policy/legacy/SFP-0001.yaml +28 -0
- ptsip/support/policy/legacy/SFP-0002.yaml +28 -0
- ptsip/support/policy/legacy/SFP-0003.yaml +27 -0
- ptsip/support/policy/legacy/SFP-0004.yaml +53 -0
- ptsip/support/policy/legacy/SFP-0005.yaml +32 -0
- ptsip/support/policy/legacy/SFP-0006.yaml +43 -0
- ptsip/support/policy/legacy/SFP-0007.yaml +52 -0
- ptsip/support/policy/legacy/SFP-0008.yaml +66 -0
- ptsip/support/policy/legacy/SFP-0009.yaml +54 -0
- ptsip/support/policy/legacy/SFP-0010.yaml +40 -0
- ptsip/support/policy/legacy/SFP-0011.yaml +42 -0
- ptsip/support/policy/legacy/SFP-0012.yaml +38 -0
- ptsip/support/policy/legacy/SFP-0013.yaml +38 -0
- ptsip/support/policy/legacy/SFP-0014.yaml +46 -0
- ptsip/support/policy/legacy/SFP-0015.yaml +52 -0
- ptsip/support/policy/legacy/SFP-0016.yaml +52 -0
- ptsip/support/policy/legacy/SFP-0017.yaml +23 -0
- ptsip/support/policy/legacy/SFP-0018.yaml +41 -0
- ptsip/support/policy/legacy/SFP-0019.yaml +40 -0
- ptsip/support/policy/legacy/SFP-0020.yaml +34 -0
- ptsip/support/policy/legacy/SFP-0021.yaml +44 -0
- ptsip/support/policy/legacy/SFP-0022.yaml +53 -0
- ptsip/support/policy/legacy/SFP-0023.yaml +20 -0
- ptsip/support/policy/legacy/SFP-0024.yaml +118 -0
- ptsip/support/registries/ptsip-support-authority-role-registry.yaml +319 -0
- ptsip/support/registries/ptsip-support-authority-schema-registry.yaml +239 -0
- ptsip/support/registries/ptsip-support-authority-subject-registry.yaml +68 -0
- ptsip/support/registries/ptsip-support-authorization-registry.yaml +14 -0
- ptsip/support/registries/root-family-migration.json +3097 -0
- ptsip/support/registries/root-family-projection-module-admission.json +23 -0
- ptsip/support/registries/root-family-projection.module.json +201 -0
- ptsip/support/schemas/ptsip-support-authority-eligibility-result.schema.json +114 -0
- ptsip/support/schemas/ptsip-support-authority-role.schema.json +126 -0
- ptsip/support/schemas/ptsip-support-authority-semantics.schema.json +378 -0
- ptsip/support/schemas/ptsip-support-feature-policy-index.schema.json +57 -0
- ptsip/support/schemas/ptsip-support-feature-policy.schema.json +186 -0
- ptsip/support/schemas/ptsip-support-governance-registry.schema.json +28 -0
- ptsip/support/schemas/ptsip-support-project-authority-record.schema.json +136 -0
- ptsip/support/schemas/ptsip-support-root-family-policy.schema.json +206 -0
- ptsip/support/schemas/ptsip-support-subject-binding.schema.json +60 -0
- ptsip/support/schemas/root-family-migration.schema.json +240 -0
- ptsip/support/schemas/root-family-projection-module.schema.json +276 -0
- ptsip/topology.py +747 -0
- ptsip/validation/__init__.py +1 -0
- ptsip/validation/components.py +357 -0
- ptsip/validation/handoff.py +75 -0
- ptsip/validation/profile.py +514 -0
- ptsip/validation/rules.py +186 -0
- ptsip/validation/specification.py +60 -0
- ptsip/validation/templates.py +767 -0
- ptsip/validation_capture.py +168 -0
- ptsip-0.3.8b3.data/scripts/ptsip-engine-context.exe +0 -0
- ptsip-0.3.8b3.data/scripts/ptsip-engine-discovery.exe +0 -0
- ptsip-0.3.8b3.data/scripts/ptsip-engine-execution.exe +0 -0
- ptsip-0.3.8b3.data/scripts/ptsip-engine-planning.exe +0 -0
- ptsip-0.3.8b3.data/scripts/ptsip-engine-projection.exe +0 -0
- ptsip-0.3.8b3.data/scripts/ptsip-engine-storage.exe +0 -0
- ptsip-0.3.8b3.data/scripts/ptsip-engine-validation.exe +0 -0
- ptsip-0.3.8b3.dist-info/METADATA +361 -0
- ptsip-0.3.8b3.dist-info/RECORD +600 -0
- ptsip-0.3.8b3.dist-info/WHEEL +4 -0
- ptsip-0.3.8b3.dist-info/entry_points.txt +3 -0
- ptsip-0.3.8b3.dist-info/licenses/License-Authority/COMMERCIAL-USE.md +301 -0
- ptsip-0.3.8b3.dist-info/licenses/License-Authority/LICENSE-GUIDE.md +159 -0
- ptsip-0.3.8b3.dist-info/licenses/License-Authority/LICENSE-HISTORY.md +15 -0
- ptsip-0.3.8b3.dist-info/licenses/License-Authority/LICENSE.md +414 -0
- ptsip-0.3.8b3.dist-info/licenses/License-Authority/NOTICE.md +22 -0
- ptsip-0.3.8b3.dist-info/licenses/License-Authority/license-authority.yaml +133 -0
- ptsip-0.3.8b3.dist-info/ptsip-engines.json +78 -0
- vpms/__init__.py +70 -0
- vpms/contract_runtime.py +124 -0
- vpms/contracts/execution-composition.json +1 -0
- vpms/contracts/identity-registry.json +69 -0
- vpms/contracts/index.json +1 -0
- vpms/contracts/invariants.json +27 -0
- vpms/contracts/protocol.json +1 -0
- vpms/contracts/schemas/catalog.schema.json +80 -0
- vpms/contracts/schemas/product-contract.schema.json +572 -0
- vpms/contracts/schemas/selection-request.schema.json +47 -0
- vpms/contracts/schemas/selection-result.schema.json +79 -0
- vpms/contracts/schemas/selection-rule.schema.json +31 -0
- vpms/contracts/selection.json +1 -0
- vpms/domain/__init__.py +1 -0
- vpms/domain/model.py +88 -0
- vpms/domain/registry.py +350 -0
- vpms/domain/snapshot.py +118 -0
- vpms/execution/__init__.py +1 -0
- vpms/execution/adapters/__init__.py +1 -0
- vpms/execution/adapters/command.py +67 -0
- vpms/execution/composition.py +58 -0
- vpms/execution/runner.py +69 -0
- vpms/integration/__init__.py +1 -0
- vpms/integration/ptsip_bridge.py +156 -0
- vpms/selection/__init__.py +4 -0
- vpms/selection/resolver.py +130 -0
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
"""Mechanical migration projections; these candidates never activate authority."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import json
|
|
5
|
+
from importlib.resources import files
|
|
6
|
+
from pathlib import Path, PurePosixPath
|
|
7
|
+
|
|
8
|
+
import yaml
|
|
9
|
+
from jsonschema import Draft202012Validator
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CandidateValidationError(ValueError):
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
KINDS = {
|
|
17
|
+
"specs": ("spec", "id"),
|
|
18
|
+
"operations": ("operation", "operation_id"),
|
|
19
|
+
"actions": ("action", "action_id"),
|
|
20
|
+
"conditions": ("condition", "condition_id"),
|
|
21
|
+
"gates": ("gate", "gate_id"),
|
|
22
|
+
"io_schemas": ("io", "x-ptsip-io-id"),
|
|
23
|
+
"vocabularies": ("vocabulary", "vocabulary_id"),
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
# These fields have exact bindings in the current candidate index schema.
|
|
27
|
+
# Materialization copies those decisions; it does not choose digest semantics.
|
|
28
|
+
INDEX_METADATA_FIELDS = (
|
|
29
|
+
"canonical_serialization",
|
|
30
|
+
"canonical_serialization_status",
|
|
31
|
+
"canonicalization_ref",
|
|
32
|
+
"canonical_digest_management",
|
|
33
|
+
"canonical_digest_policy_ref",
|
|
34
|
+
"normative_semantic_projection_ref",
|
|
35
|
+
"selected_hash_algorithm",
|
|
36
|
+
"selected_digest_output_encoding",
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def resource(root, ref: str):
|
|
41
|
+
path = PurePosixPath(ref)
|
|
42
|
+
if not ref or path.is_absolute() or ".." in path.parts or "\\" in ref or ":" in ref:
|
|
43
|
+
raise CandidateValidationError(f"unsafe resource ref: {ref!r}")
|
|
44
|
+
return root.joinpath(*path.parts)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _unique_object(pairs):
|
|
48
|
+
result = {}
|
|
49
|
+
for key, value in pairs:
|
|
50
|
+
if key in result:
|
|
51
|
+
raise CandidateValidationError(f"duplicate JSON key: {key}")
|
|
52
|
+
result[key] = value
|
|
53
|
+
return result
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def read_json(root, ref: str):
|
|
57
|
+
return json.loads(resource(root, ref).read_text(encoding="utf-8"), object_pairs_hook=_unique_object)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def pointer(document, value: str):
|
|
61
|
+
if value == "":
|
|
62
|
+
return document
|
|
63
|
+
if not value.startswith("/"):
|
|
64
|
+
raise CandidateValidationError(f"invalid pointer: {value}")
|
|
65
|
+
try:
|
|
66
|
+
for token in value[1:].split("/"):
|
|
67
|
+
token = token.replace("~1", "/").replace("~0", "~")
|
|
68
|
+
document = document[int(token)] if isinstance(document, list) else document[token]
|
|
69
|
+
return document
|
|
70
|
+
except (KeyError, IndexError, TypeError, ValueError) as exc:
|
|
71
|
+
raise CandidateValidationError(f"unresolved pointer: {value}") from exc
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _load_source(root, ref):
|
|
75
|
+
return yaml.safe_load(resource(root, ref).read_text(encoding="utf-8"))
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _index_metadata(root):
|
|
79
|
+
schema = read_json(root, "schemas/candidate-index.schema.json")
|
|
80
|
+
properties = schema.get("properties", {})
|
|
81
|
+
if not isinstance(properties, dict):
|
|
82
|
+
raise CandidateValidationError("candidate index metadata bindings must be a mapping")
|
|
83
|
+
metadata = {}
|
|
84
|
+
for field in INDEX_METADATA_FIELDS:
|
|
85
|
+
binding = properties.get(field)
|
|
86
|
+
if not isinstance(binding, dict) or not isinstance(binding.get("const"), str):
|
|
87
|
+
raise CandidateValidationError(f"unresolved required index metadata binding: {field}")
|
|
88
|
+
metadata[field] = binding["const"]
|
|
89
|
+
return metadata
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def validate_projection_bindings(root=None) -> dict[str, int]:
|
|
93
|
+
"""Validate exact candidate bindings, without hashing or activating authority."""
|
|
94
|
+
root = root or files("agent_contracts")
|
|
95
|
+
try:
|
|
96
|
+
projection = read_json(root, "digests/projection-v1.json")
|
|
97
|
+
policy = read_json(root, "digests/policy-v1.json")
|
|
98
|
+
scope = projection["binding_scope"]
|
|
99
|
+
if (scope["status"] != "BOUND_PENDING_REQUIRED_SEMANTIC_VERIFICATION"
|
|
100
|
+
or projection["unresolved"] != [] or policy["active_scheme"] != "UNRESOLVED"):
|
|
101
|
+
raise CandidateValidationError("unresolved binding or unverified digest scheme activation")
|
|
102
|
+
for document in (projection, policy):
|
|
103
|
+
if document["normative_authority"] is not False or document["status"] != "CANDIDATE":
|
|
104
|
+
raise CandidateValidationError("unverified digest authority activation")
|
|
105
|
+
expected_policy = {
|
|
106
|
+
"projection_id": projection["id"], "status": scope["status"],
|
|
107
|
+
"field_governance": projection["field_governance"],
|
|
108
|
+
"collection_semantics": projection["collection_semantics"],
|
|
109
|
+
"binding_scope": scope,
|
|
110
|
+
}
|
|
111
|
+
if policy["projection_policy"] != expected_policy:
|
|
112
|
+
raise CandidateValidationError("digest/projection binding mismatch")
|
|
113
|
+
asset_refs = scope["asset_refs"]
|
|
114
|
+
if not isinstance(asset_refs, list) or len(asset_refs) != len(set(asset_refs)):
|
|
115
|
+
raise CandidateValidationError("invalid binding asset registry")
|
|
116
|
+
documents = {ref: read_json(root, ref) for ref in asset_refs}
|
|
117
|
+
for ref, schema_kind in (("index.json", "index"), ("contracts/current.json", "group"),
|
|
118
|
+
("conformance/current.json", "vectors")):
|
|
119
|
+
Draft202012Validator(read_json(root, f"schemas/candidate-{schema_kind}.schema.json")).validate(documents[ref])
|
|
120
|
+
payloads = documents["contracts/current.json"]["payloads"]
|
|
121
|
+
if set(payloads) != set(scope["registered_records"]) or set(payloads) != set(KINDS):
|
|
122
|
+
raise CandidateValidationError("unregistered payload kind")
|
|
123
|
+
for kind, records in payloads.items():
|
|
124
|
+
registered = scope["registered_records"][kind]
|
|
125
|
+
if len(registered) != len(set(registered)) or set(records) != set(registered):
|
|
126
|
+
raise CandidateValidationError(f"unregistered payload identity: {kind}")
|
|
127
|
+
identity_field = scope["record_identity_fields"][kind]
|
|
128
|
+
if identity_field != KINDS[kind][1]:
|
|
129
|
+
raise CandidateValidationError(f"identity binding mismatch: {kind}")
|
|
130
|
+
for identity, record in records.items():
|
|
131
|
+
schema = documents[documents["index.json"]["schemas"][kind]]
|
|
132
|
+
Draft202012Validator(schema).validate(record)
|
|
133
|
+
if record[identity_field] != identity:
|
|
134
|
+
raise CandidateValidationError(f"registry/record identity mismatch: {identity}")
|
|
135
|
+
for vectors in documents["conformance/current.json"]["operations"].values():
|
|
136
|
+
for vector in vectors:
|
|
137
|
+
if pointer(documents["contracts/current.json"], vector["ref"]) != vector["expected"]:
|
|
138
|
+
raise CandidateValidationError("excluded migration expectation differs from included meaning")
|
|
139
|
+
|
|
140
|
+
governance = projection["field_governance"]
|
|
141
|
+
included = governance["exact_inclusion_list"]["exact_role_bindings"]
|
|
142
|
+
excluded = governance["exact_exclusion_list"]["exact_role_bindings"]
|
|
143
|
+
required = set(governance["binding_record_contract"]["required_fields"])
|
|
144
|
+
seen = set()
|
|
145
|
+
for mode, bindings in (("inclusion", included), ("exclusion", excluded)):
|
|
146
|
+
roles = governance[f"exact_{mode}_list"]["exact_semantic_roles"]
|
|
147
|
+
if not isinstance(bindings, list) or (mode == "inclusion" and not bindings):
|
|
148
|
+
raise CandidateValidationError(f"unresolved {mode} bindings")
|
|
149
|
+
for binding in bindings:
|
|
150
|
+
if set(binding) != required or binding["semantic_role"] not in roles:
|
|
151
|
+
raise CandidateValidationError("invalid field role binding")
|
|
152
|
+
if (binding["extraction_condition"] != "PRESENT_IN_VALIDATED_REGISTERED_ASSET"
|
|
153
|
+
or binding["required_cardinality"] != {"minimum": 1, "maximum": 1}):
|
|
154
|
+
raise CandidateValidationError("unsupported extraction/cardinality binding")
|
|
155
|
+
key = binding["asset_ref"], binding["json_pointer"]
|
|
156
|
+
if key in seen or key[0] not in documents:
|
|
157
|
+
raise CandidateValidationError("duplicate or unregistered field binding")
|
|
158
|
+
pointer(documents[key[0]], key[1])
|
|
159
|
+
seen.add(key)
|
|
160
|
+
|
|
161
|
+
def covers(binding, asset, path):
|
|
162
|
+
declared = binding["json_pointer"]
|
|
163
|
+
return binding["asset_ref"] == asset and (
|
|
164
|
+
declared == "" or path == declared or path.startswith(declared + "/")
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
for admitted in included:
|
|
168
|
+
for veto in excluded:
|
|
169
|
+
if covers(admitted, veto["asset_ref"], veto["json_pointer"]) or covers(
|
|
170
|
+
veto, admitted["asset_ref"], admitted["json_pointer"]
|
|
171
|
+
):
|
|
172
|
+
raise CandidateValidationError("include/exclude overlap: policy conflict")
|
|
173
|
+
|
|
174
|
+
leaves, actual_arrays = [], set()
|
|
175
|
+
|
|
176
|
+
def walk(value, asset, path):
|
|
177
|
+
if isinstance(value, dict) and value:
|
|
178
|
+
for key, child in value.items():
|
|
179
|
+
escaped = key.replace("~", "~0").replace("/", "~1")
|
|
180
|
+
walk(child, asset, path + "/" + escaped)
|
|
181
|
+
elif isinstance(value, list):
|
|
182
|
+
if not any(covers(b, asset, path) for b in excluded):
|
|
183
|
+
actual_arrays.add((asset, path))
|
|
184
|
+
if value:
|
|
185
|
+
for position, child in enumerate(value):
|
|
186
|
+
walk(child, asset, path + "/" + str(position))
|
|
187
|
+
else:
|
|
188
|
+
leaves.append((asset, path))
|
|
189
|
+
else:
|
|
190
|
+
leaves.append((asset, path))
|
|
191
|
+
|
|
192
|
+
for asset, document in documents.items():
|
|
193
|
+
walk(document, asset, "")
|
|
194
|
+
for asset, path in leaves:
|
|
195
|
+
if not any(covers(b, asset, path) for b in included + excluded):
|
|
196
|
+
raise CandidateValidationError(f"unclassified field: {asset}#{path}")
|
|
197
|
+
|
|
198
|
+
collections = projection["collection_semantics"]["exact_collection_bindings"]
|
|
199
|
+
if projection["collection_semantics"]["set_like"]["exception"]["exact_exception_bindings"] != []:
|
|
200
|
+
raise CandidateValidationError("unsupported collection exception binding")
|
|
201
|
+
resolved_arrays = set()
|
|
202
|
+
for binding in collections:
|
|
203
|
+
expected_keys = {"asset_ref", "json_pointer", "collection_type"}
|
|
204
|
+
if "member_identity" in binding:
|
|
205
|
+
expected_keys |= {"member_identity", "member_json_pointer"}
|
|
206
|
+
if binding["collection_type"] == "SET_LIKE":
|
|
207
|
+
expected_keys.add("identity")
|
|
208
|
+
if set(binding) != expected_keys:
|
|
209
|
+
raise CandidateValidationError("undeclared collection binding field")
|
|
210
|
+
asset, path = binding["asset_ref"], binding["json_pointer"]
|
|
211
|
+
value = pointer(documents[asset], path)
|
|
212
|
+
if "member_identity" in binding:
|
|
213
|
+
member = binding["member_identity"]
|
|
214
|
+
if scope["collection_identity_fields"].get(member["record_kind"]) != member["logical_id_pointer"]:
|
|
215
|
+
raise CandidateValidationError("invalid collection member identity binding")
|
|
216
|
+
parents = [b for b in collections if b["asset_ref"] == asset
|
|
217
|
+
and b["json_pointer"] == path and "member_identity" not in b]
|
|
218
|
+
if len(parents) != 1 or parents[0].get("identity") != {
|
|
219
|
+
"record_kind": member["record_kind"],
|
|
220
|
+
"logical_id_pointer": member["logical_id_pointer"],
|
|
221
|
+
} or parents[0]["collection_type"] != "SET_LIKE":
|
|
222
|
+
raise CandidateValidationError("unregistered set member selection")
|
|
223
|
+
matches = [(i, item) for i, item in enumerate(value)
|
|
224
|
+
if pointer(item, member["logical_id_pointer"]) == member["logical_id"]]
|
|
225
|
+
if len(matches) != 1:
|
|
226
|
+
raise CandidateValidationError("unresolved collection member identity")
|
|
227
|
+
position, value = matches[0]
|
|
228
|
+
member_path = binding["member_json_pointer"]
|
|
229
|
+
value = pointer(value, member_path)
|
|
230
|
+
path += "/" + str(position) + member_path
|
|
231
|
+
if not isinstance(value, list) or (asset, path) in resolved_arrays:
|
|
232
|
+
raise CandidateValidationError("invalid or duplicate collection binding")
|
|
233
|
+
collection_type = binding["collection_type"]
|
|
234
|
+
if collection_type == "SET_LIKE":
|
|
235
|
+
identity = binding["identity"]
|
|
236
|
+
if scope["collection_identity_fields"].get(identity["record_kind"]) != identity["logical_id_pointer"]:
|
|
237
|
+
raise CandidateValidationError("invalid set-like identity binding")
|
|
238
|
+
identities = [pointer(item, identity["logical_id_pointer"]) for item in value]
|
|
239
|
+
if any(not isinstance(item, str) or not item for item in identities):
|
|
240
|
+
raise CandidateValidationError("missing set-like logical identity")
|
|
241
|
+
if len(identities) != len(set(identities)):
|
|
242
|
+
raise CandidateValidationError("duplicate set-like logical identity")
|
|
243
|
+
elif collection_type != "ORDERED":
|
|
244
|
+
raise CandidateValidationError("unclassified collection type")
|
|
245
|
+
resolved_arrays.add((asset, path))
|
|
246
|
+
if resolved_arrays != actual_arrays:
|
|
247
|
+
raise CandidateValidationError("unclassified or stale collection binding")
|
|
248
|
+
return {"included": len(included), "excluded": len(excluded),
|
|
249
|
+
"collections": len(collections), "assets": len(documents)}
|
|
250
|
+
except (OSError, KeyError, TypeError, IndexError) as exc:
|
|
251
|
+
raise CandidateValidationError(f"unresolved required projection binding: {exc}") from exc
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def build_candidate_assets(root=None) -> dict[str, dict]:
|
|
255
|
+
"""Retain source values exactly, adding only non-authoritative routing metadata."""
|
|
256
|
+
root = root or files("agent_contracts")
|
|
257
|
+
metadata = _index_metadata(root)
|
|
258
|
+
source_index = _load_source(root, "index.yaml")
|
|
259
|
+
payloads, sources, schemas = {}, {}, {}
|
|
260
|
+
for kind, (schema_kind, identity_field) in KINDS.items():
|
|
261
|
+
payloads[kind], sources[kind] = {}, {}
|
|
262
|
+
schemas[kind] = source_index["schemas"][schema_kind]
|
|
263
|
+
for entry in source_index[kind]:
|
|
264
|
+
identity, ref = entry["id"], entry["ref"]
|
|
265
|
+
if identity in payloads[kind]:
|
|
266
|
+
raise CandidateValidationError(f"duplicate {kind} identity: {identity}")
|
|
267
|
+
payload = read_json(root, ref) if kind == "io_schemas" else _load_source(root, ref)
|
|
268
|
+
if payload[identity_field] != identity:
|
|
269
|
+
raise CandidateValidationError(f"source identity mismatch: {ref}")
|
|
270
|
+
payloads[kind][identity] = payload
|
|
271
|
+
sources[kind][identity] = ref
|
|
272
|
+
|
|
273
|
+
failures, primitives, vectors = {}, {}, {}
|
|
274
|
+
for identity, operation in payloads["operations"].items():
|
|
275
|
+
# No inference about which outcome is a success: retain declared failure
|
|
276
|
+
# routes and the entire condition branch table exactly as the source does.
|
|
277
|
+
action_ids = [s["action_ref"] for s in operation["steps"] if s["type"] == "ACTION"]
|
|
278
|
+
gate_ids = [s["mutation_gate_ref"] for s in operation["steps"] if "mutation_gate_ref" in s]
|
|
279
|
+
failures[identity] = {
|
|
280
|
+
"preconditions": operation["preconditions"],
|
|
281
|
+
"actions": {a: {key: payloads["actions"][a][key]
|
|
282
|
+
for key in ("preconditions", "postconditions", "failure_outcomes")}
|
|
283
|
+
for a in action_ids},
|
|
284
|
+
"gates": {g: payloads["gates"][g]["requirements"] for g in gate_ids},
|
|
285
|
+
"condition_branches": {s["step_id"]: s["branches"] for s in operation["steps"]
|
|
286
|
+
if s["type"] == "CONDITION"},
|
|
287
|
+
}
|
|
288
|
+
primitives[identity] = {
|
|
289
|
+
"primitive_id": identity,
|
|
290
|
+
"input_schema_ref": operation["input_schema_ref"],
|
|
291
|
+
"output_schema_ref": operation["output_schema_ref"],
|
|
292
|
+
"operation_semantics_ref": f"contracts/current.json#/payloads/operations/{identity}",
|
|
293
|
+
"failure_semantics_ref": f"contracts/current.json#/failures/{identity}",
|
|
294
|
+
"conformance_vectors_ref": f"conformance/current.json#/operations/{identity}",
|
|
295
|
+
}
|
|
296
|
+
checks = []
|
|
297
|
+
for key in ("input_schema_ref", "output_schema_ref", "preconditions", "entry_step", "steps", "outcomes"):
|
|
298
|
+
checks.append({"ref": f"/payloads/operations/{identity}/{key}", "expected": operation[key]})
|
|
299
|
+
for a in action_ids:
|
|
300
|
+
for key in ("effect", "preconditions", "postconditions", "failure_outcomes"):
|
|
301
|
+
checks.append({"ref": f"/payloads/actions/{a}/{key}", "expected": payloads["actions"][a][key]})
|
|
302
|
+
for g in gate_ids:
|
|
303
|
+
checks.append({"ref": f"/payloads/gates/{g}", "expected": payloads["gates"][g]})
|
|
304
|
+
vectors[identity] = checks
|
|
305
|
+
|
|
306
|
+
# Capability declarations are the existing active identity sets. Python
|
|
307
|
+
# locators, CLI commands and package/resource adapters are not copied here.
|
|
308
|
+
binding = _load_source(root, source_index["binding"]["current_ref"])
|
|
309
|
+
capabilities = {key: value for key, value in binding.items() if key.startswith("active_")}
|
|
310
|
+
rule_index = {}
|
|
311
|
+
for spec_id, spec in payloads["specs"].items():
|
|
312
|
+
for position, rule in enumerate(spec["rules"]):
|
|
313
|
+
if rule["rule_id"] in rule_index:
|
|
314
|
+
raise CandidateValidationError(f"duplicate rule: {rule['rule_id']}")
|
|
315
|
+
rule_index[rule["rule_id"]] = f"/payloads/specs/{spec_id}/rules/{position}"
|
|
316
|
+
return {
|
|
317
|
+
"index.json": {
|
|
318
|
+
"format": "ptsip-machine-contract-candidate-index/v1",
|
|
319
|
+
"status": "CANDIDATE", "normative_authority": False,
|
|
320
|
+
"contract_set_id": source_index["contract_set"]["id"],
|
|
321
|
+
"activation": "REQUIRES_VERIFIED_CUTOVER",
|
|
322
|
+
**metadata, "canonical_digest": "UNRESOLVED",
|
|
323
|
+
"schemas": schemas, "migration_sources": sources,
|
|
324
|
+
"capabilities": capabilities, "primitives": primitives, "rule_index": rule_index,
|
|
325
|
+
"contract_ref": "contracts/current.json", "conformance_ref": "conformance/current.json",
|
|
326
|
+
},
|
|
327
|
+
"contracts/current.json": {
|
|
328
|
+
"format": "ptsip-machine-contract-candidate-group/v1",
|
|
329
|
+
"status": "CANDIDATE", "normative_authority": False,
|
|
330
|
+
"payloads": payloads, "failures": failures,
|
|
331
|
+
},
|
|
332
|
+
"conformance/current.json": {
|
|
333
|
+
"format": "ptsip-machine-contract-candidate-vectors/v1",
|
|
334
|
+
"status": "CANDIDATE", "normative_authority": False,
|
|
335
|
+
"purpose": "MIGRATION_PARITY", "operations": vectors,
|
|
336
|
+
},
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def validate_candidate_assets(root=None, *, compare_migration_source=True) -> dict[str, int]:
|
|
341
|
+
root = root or files("agent_contracts")
|
|
342
|
+
assets = {ref: read_json(root, ref) for ref in
|
|
343
|
+
("index.json", "contracts/current.json", "conformance/current.json")}
|
|
344
|
+
for ref, schema in (("index.json", "index"), ("contracts/current.json", "group"),
|
|
345
|
+
("conformance/current.json", "vectors")):
|
|
346
|
+
Draft202012Validator(read_json(root, f"schemas/candidate-{schema}.schema.json")).validate(assets[ref])
|
|
347
|
+
index, group, vectors = (assets[r] for r in ("index.json", "contracts/current.json", "conformance/current.json"))
|
|
348
|
+
counts = {}
|
|
349
|
+
for kind, (_, identity_field) in KINDS.items():
|
|
350
|
+
schema = read_json(root, index["schemas"][kind])
|
|
351
|
+
Draft202012Validator.check_schema(schema)
|
|
352
|
+
for identity, payload in group["payloads"][kind].items():
|
|
353
|
+
Draft202012Validator(schema).validate(payload)
|
|
354
|
+
if payload[identity_field] != identity:
|
|
355
|
+
raise CandidateValidationError(f"candidate identity mismatch: {identity}")
|
|
356
|
+
counts[kind] = len(group["payloads"][kind])
|
|
357
|
+
operations = group["payloads"]["operations"]
|
|
358
|
+
if set(index["primitives"]) != set(operations) or set(vectors["operations"]) != set(operations):
|
|
359
|
+
raise CandidateValidationError("primitive/conformance coverage mismatch")
|
|
360
|
+
for identity, primitive in index["primitives"].items():
|
|
361
|
+
if primitive["primitive_id"] != identity:
|
|
362
|
+
raise CandidateValidationError(f"primitive identity mismatch: {identity}")
|
|
363
|
+
for field in ("input_schema_ref", "output_schema_ref"):
|
|
364
|
+
if primitive[field] != operations[identity][field] or primitive[field] not in group["payloads"]["io_schemas"]:
|
|
365
|
+
raise CandidateValidationError(f"unresolved primitive I/O: {identity}")
|
|
366
|
+
for field in ("operation_semantics_ref", "failure_semantics_ref", "conformance_vectors_ref"):
|
|
367
|
+
ref, fragment = primitive[field].split("#", 1)
|
|
368
|
+
pointer(assets[ref], fragment)
|
|
369
|
+
for vector in vectors["operations"][identity]:
|
|
370
|
+
if pointer(group, vector["ref"]) != vector["expected"]:
|
|
371
|
+
raise CandidateValidationError(f"conformance mismatch: {vector['ref']}")
|
|
372
|
+
if compare_migration_source and assets != build_candidate_assets(root):
|
|
373
|
+
raise CandidateValidationError("candidate differs from current migration source; revalidation required")
|
|
374
|
+
validate_projection_bindings(root)
|
|
375
|
+
return counts
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
def write_candidate_assets(root: Path) -> None:
|
|
379
|
+
for ref, payload in build_candidate_assets(root).items():
|
|
380
|
+
target = resource(root, ref)
|
|
381
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
382
|
+
# This is reproducible file formatting, not an approved canonical digest.
|
|
383
|
+
target.write_text(json.dumps(payload, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "ptsip-canonical-json/v1",
|
|
3
|
+
"id": "PTSIP-CANONICAL-JSON-V1",
|
|
4
|
+
"status": "CANDIDATE",
|
|
5
|
+
"normative_authority": false,
|
|
6
|
+
"activation": "REQUIRES_VERIFIED_CUTOVER",
|
|
7
|
+
"encoding": {
|
|
8
|
+
"charset": "UTF-8",
|
|
9
|
+
"bom": "FORBIDDEN"
|
|
10
|
+
},
|
|
11
|
+
"structural_rules": {
|
|
12
|
+
"duplicate_object_keys": "FORBIDDEN",
|
|
13
|
+
"object_member_order": "DETERMINISTIC",
|
|
14
|
+
"array_element_order": "PRESERVE_DECLARED_ORDER",
|
|
15
|
+
"insignificant_whitespace_in_canonical_output": "FORBIDDEN",
|
|
16
|
+
"ambiguous_or_unsupported_input": "FAIL_CLOSED"
|
|
17
|
+
},
|
|
18
|
+
"number": {
|
|
19
|
+
"option": "N2",
|
|
20
|
+
"semantic_model": "EXACT_DECIMAL_VALUE",
|
|
21
|
+
"binary_floating_point_conversion_for_canonicalization": "FORBIDDEN",
|
|
22
|
+
"negative_zero": "NORMALIZE_TO_ZERO",
|
|
23
|
+
"nan": "FORBIDDEN",
|
|
24
|
+
"infinity": "FORBIDDEN",
|
|
25
|
+
"leading_plus": "FORBIDDEN",
|
|
26
|
+
"ambiguous_or_unrepresentable_value": "FAIL_CLOSED",
|
|
27
|
+
"canonical_decimal_lexical_form": {
|
|
28
|
+
"option": "L2",
|
|
29
|
+
"model": "NORMALIZED_EXACT_SCIENTIFIC",
|
|
30
|
+
"zero": "0",
|
|
31
|
+
"nonzero_coefficient": {
|
|
32
|
+
"exactly_one_nonzero_digit_before_decimal_point": true,
|
|
33
|
+
"leading_zeroes": "FORBIDDEN",
|
|
34
|
+
"trailing_fractional_zeroes": "FORBIDDEN",
|
|
35
|
+
"decimal_point_when_fraction_absent": "FORBIDDEN"
|
|
36
|
+
},
|
|
37
|
+
"exponent": {
|
|
38
|
+
"marker": "e",
|
|
39
|
+
"positive_plus_sign": "FORBIDDEN",
|
|
40
|
+
"leading_zeroes": "FORBIDDEN",
|
|
41
|
+
"zero_exponent_for_nonzero_value": "ALLOWED"
|
|
42
|
+
},
|
|
43
|
+
"rounding": "FORBIDDEN"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"unicode": {
|
|
47
|
+
"option": "U2",
|
|
48
|
+
"normalization": "NFC",
|
|
49
|
+
"applies_to": [
|
|
50
|
+
"OBJECT_MEMBER_NAMES",
|
|
51
|
+
"STRING_VALUES"
|
|
52
|
+
],
|
|
53
|
+
"compatibility_normalization": "FORBIDDEN",
|
|
54
|
+
"invalid_unicode": "FAIL_CLOSED",
|
|
55
|
+
"post_normalization_object_key_collision": "FAIL_CLOSED"
|
|
56
|
+
},
|
|
57
|
+
"string_escape": {
|
|
58
|
+
"option": "E1",
|
|
59
|
+
"model": "MINIMAL_UTF8_ESCAPE",
|
|
60
|
+
"quote": "ESCAPE",
|
|
61
|
+
"reverse_solidus": "ESCAPE",
|
|
62
|
+
"short_control_escapes": {
|
|
63
|
+
"backspace": "\\b",
|
|
64
|
+
"tab": "\\t",
|
|
65
|
+
"line_feed": "\\n",
|
|
66
|
+
"form_feed": "\\f",
|
|
67
|
+
"carriage_return": "\\r"
|
|
68
|
+
},
|
|
69
|
+
"other_u0000_to_u001f": {
|
|
70
|
+
"form": "\\u00xx",
|
|
71
|
+
"hex_case": "lowercase"
|
|
72
|
+
},
|
|
73
|
+
"non_control_unicode": "EMIT_UTF8",
|
|
74
|
+
"solidus_escape": "FORBIDDEN",
|
|
75
|
+
"unnecessary_unicode_escape": "FORBIDDEN",
|
|
76
|
+
"lone_surrogate": "FAIL_CLOSED"
|
|
77
|
+
},
|
|
78
|
+
"unresolved": [
|
|
79
|
+
"CANONICAL_DIGEST"
|
|
80
|
+
]
|
|
81
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-ADOPT-APPLY-REQUESTED-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-ADOPT-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /context/apply_requested
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-ADOPT-AUTHORITY-FRESH-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-ADOPT-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /authority_fresh
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-ADOPT-FACTS-RESOLVED-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-ADOPT-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /facts_resolved
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-ADOPT-PROFILE-FRESH-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-ADOPT-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /profile_fresh
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-ADOPT-REPOSITORY-FRESH-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-ADOPT-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /repository_fresh
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-ADOPT-SNAPSHOT-IDENTIFIED-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-ADOPT-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /snapshot_identified
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-ADOPT-WRITE-AUTHORIZED-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-ADOPT-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /context/write_authorized
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-AUTH-AUTHORITY-FRESH-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-AUTHORITY-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /authority_fresh
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-AUTH-COORDINATION-AVAILABLE-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-AUTHORITY-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /coordination_available
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-AUTH-PROFILE-FRESH-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-AUTHORITY-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /profile_fresh
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-AUTH-PROJECTION-REQUIRED-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-AUTHORITY-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /projection_required
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-AUTH-SEMANTIC-CONFLICT-ABSENT-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-AUTHORITY-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /semantic_conflict_absent
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-AUTH-WRITE-AUTHORIZED-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-AUTHORITY-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /context/write_authorized
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-CONFORM-PROFILE-READY-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-CONFORM-REQUEST-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /profile_ready
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-CONFORM-SNAPSHOT-IDENTIFIED-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-CONFORM-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /snapshot_identified
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
format: ptsip-agent-condition/v2
|
|
2
|
+
condition_id: PTSIP-COND-MIG-APPLY-REQUESTED-001
|
|
3
|
+
status: CURRENT
|
|
4
|
+
input_schema_ref: PTSIP-IO-MIGRATE-STATE-001
|
|
5
|
+
evaluation:
|
|
6
|
+
type: FIELD_COMPARE
|
|
7
|
+
pointer: /context/apply_requested
|
|
8
|
+
operator: EQ
|
|
9
|
+
expected: true
|
|
10
|
+
missing_result: UNKNOWN
|