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.
Files changed (600) hide show
  1. agent_contracts/__init__.py +5 -0
  2. agent_contracts/actions/analyze-source-profile.yaml +13 -0
  3. agent_contracts/actions/apply-adoption.yaml +12 -0
  4. agent_contracts/actions/apply-profile-transition.yaml +11 -0
  5. agent_contracts/actions/build-adoption-plan.yaml +10 -0
  6. agent_contracts/actions/build-transition-plan.yaml +10 -0
  7. agent_contracts/actions/capture-repository-snapshot.yaml +13 -0
  8. agent_contracts/actions/collect-conformance-evidence.yaml +13 -0
  9. agent_contracts/actions/compare-profile-authority.yaml +10 -0
  10. agent_contracts/actions/emit-conformance-result.yaml +10 -0
  11. agent_contracts/actions/evaluate-conformance-rules.yaml +10 -0
  12. agent_contracts/actions/map-profile-target.yaml +10 -0
  13. agent_contracts/actions/project-authority-winner.yaml +13 -0
  14. agent_contracts/actions/read-relevant-authority.yaml +13 -0
  15. agent_contracts/actions/resolve-adoption-facts.yaml +11 -0
  16. agent_contracts/actions/resolve-profile-schema.yaml +14 -0
  17. agent_contracts/actions/resolve-reconciliation-state.yaml +10 -0
  18. agent_contracts/actions/validate-profile-structure.yaml +10 -0
  19. agent_contracts/actions/validate-responsibility-map-semantics.yaml +10 -0
  20. agent_contracts/bindings/current.yaml +125 -0
  21. agent_contracts/candidate.py +383 -0
  22. agent_contracts/canonicalization/ptsip-canonical-json-v1.json +81 -0
  23. agent_contracts/conditions/adopt-apply-requested.yaml +10 -0
  24. agent_contracts/conditions/adopt-authority-fresh.yaml +10 -0
  25. agent_contracts/conditions/adopt-facts-resolved.yaml +10 -0
  26. agent_contracts/conditions/adopt-profile-fresh.yaml +10 -0
  27. agent_contracts/conditions/adopt-repository-fresh.yaml +10 -0
  28. agent_contracts/conditions/adopt-snapshot-identified.yaml +10 -0
  29. agent_contracts/conditions/adopt-write-authorized.yaml +10 -0
  30. agent_contracts/conditions/authority-authority-fresh.yaml +10 -0
  31. agent_contracts/conditions/authority-coordination-available.yaml +10 -0
  32. agent_contracts/conditions/authority-profile-fresh.yaml +10 -0
  33. agent_contracts/conditions/authority-projection-required.yaml +10 -0
  34. agent_contracts/conditions/authority-semantic-conflict-absent.yaml +10 -0
  35. agent_contracts/conditions/authority-write-authorized.yaml +10 -0
  36. agent_contracts/conditions/conform-profile-ready.yaml +10 -0
  37. agent_contracts/conditions/conform-snapshot-identified.yaml +10 -0
  38. agent_contracts/conditions/migrate-apply-requested.yaml +10 -0
  39. agent_contracts/conditions/migrate-source-fresh.yaml +10 -0
  40. agent_contracts/conditions/migrate-source-profile-identified.yaml +10 -0
  41. agent_contracts/conditions/migrate-target-contract-resolved.yaml +10 -0
  42. agent_contracts/conditions/migrate-target-fresh.yaml +10 -0
  43. agent_contracts/conditions/migrate-write-authorized.yaml +10 -0
  44. agent_contracts/conditions/validate-contract-resolved.yaml +10 -0
  45. agent_contracts/conditions/validate-profile-selected.yaml +10 -0
  46. agent_contracts/conformance/current.json +987 -0
  47. agent_contracts/contracts/current.json +3978 -0
  48. agent_contracts/digests/policy-v1.json +7746 -0
  49. agent_contracts/digests/projection-v1.json +7698 -0
  50. agent_contracts/gates/adoption-write.yaml +18 -0
  51. agent_contracts/gates/authority-projection-write.yaml +18 -0
  52. agent_contracts/gates/profile-transition-write.yaml +15 -0
  53. agent_contracts/index.json +427 -0
  54. agent_contracts/index.yaml +113 -0
  55. agent_contracts/machine_resolver.py +81 -0
  56. agent_contracts/operations/adopt.yaml +99 -0
  57. agent_contracts/operations/conform.yaml +57 -0
  58. agent_contracts/operations/migrate-profile.yaml +85 -0
  59. agent_contracts/operations/reconcile-authority.yaml +87 -0
  60. agent_contracts/operations/validate.yaml +53 -0
  61. agent_contracts/promotion/current.json +50 -0
  62. agent_contracts/promotion/index.json +13 -0
  63. agent_contracts/promotion/specification-contract.json +49 -0
  64. agent_contracts/resolver.py +253 -0
  65. agent_contracts/schemas/candidate-group.schema.json +107 -0
  66. agent_contracts/schemas/candidate-index.schema.json +246 -0
  67. agent_contracts/schemas/candidate-vectors.schema.json +49 -0
  68. agent_contracts/schemas/contracts/action.schema.json +21 -0
  69. agent_contracts/schemas/contracts/binding.schema.json +32 -0
  70. agent_contracts/schemas/contracts/condition.schema.json +25 -0
  71. agent_contracts/schemas/contracts/index.schema.json +27 -0
  72. agent_contracts/schemas/contracts/io.schema.json +12 -0
  73. agent_contracts/schemas/contracts/mutation-gate.schema.json +17 -0
  74. agent_contracts/schemas/contracts/operation.schema.json +259 -0
  75. agent_contracts/schemas/contracts/promotion.schema.json +81 -0
  76. agent_contracts/schemas/contracts/spec.schema.json +13 -0
  77. agent_contracts/schemas/contracts/vocabulary.schema.json +11 -0
  78. agent_contracts/schemas/io/adopt-request.schema.json +8 -0
  79. agent_contracts/schemas/io/adopt-result.schema.json +6 -0
  80. agent_contracts/schemas/io/adopt-state.schema.json +12 -0
  81. agent_contracts/schemas/io/authority-request.schema.json +8 -0
  82. agent_contracts/schemas/io/authority-result.schema.json +6 -0
  83. agent_contracts/schemas/io/authority-state.schema.json +13 -0
  84. agent_contracts/schemas/io/conform-request.schema.json +6 -0
  85. agent_contracts/schemas/io/conform-result.schema.json +6 -0
  86. agent_contracts/schemas/io/conform-state.schema.json +6 -0
  87. agent_contracts/schemas/io/migrate-request.schema.json +11 -0
  88. agent_contracts/schemas/io/migrate-result.schema.json +6 -0
  89. agent_contracts/schemas/io/migrate-state.schema.json +11 -0
  90. agent_contracts/schemas/io/validate-request.schema.json +6 -0
  91. agent_contracts/schemas/io/validate-result.schema.json +6 -0
  92. agent_contracts/schemas/io/validate-state.schema.json +6 -0
  93. agent_contracts/spec/adoption-procedure.yaml +148 -0
  94. agent_contracts/spec/adoption.yaml +33 -0
  95. agent_contracts/spec/agent-behavior.yaml +148 -0
  96. agent_contracts/spec/authority.yaml +40 -0
  97. agent_contracts/spec/classification.yaml +64 -0
  98. agent_contracts/spec/conformance-detail.yaml +120 -0
  99. agent_contracts/spec/conformance.yaml +43 -0
  100. agent_contracts/spec/core.yaml +29 -0
  101. agent_contracts/spec/governance.yaml +30 -0
  102. agent_contracts/spec/profile-transition-detail.yaml +78 -0
  103. agent_contracts/spec/profile-transition.yaml +30 -0
  104. agent_contracts/spec/repository-boundaries.yaml +148 -0
  105. agent_contracts/spec/responsibility-map-detail.yaml +92 -0
  106. agent_contracts/spec/responsibility-map.yaml +36 -0
  107. agent_contracts/spec/specification-governance.yaml +91 -0
  108. agent_contracts/validator.py +723 -0
  109. agent_contracts/vocabulary/authority.yaml +20 -0
  110. agent_contracts/vocabulary/diagnostics.yaml +23 -0
  111. agent_contracts/vocabulary/lifecycle.yaml +20 -0
  112. agent_contracts/vocabulary/outcomes.yaml +26 -0
  113. agent_contracts/vocabulary/terminology.yaml +428 -0
  114. ptsip/__init__.py +5 -0
  115. ptsip/__main__.py +4 -0
  116. ptsip/adoption.py +225 -0
  117. ptsip/agent_contracts/__init__.py +12 -0
  118. ptsip/agent_contracts/bindings/current.yaml +38 -0
  119. ptsip/agent_contracts/index.yaml +53 -0
  120. ptsip/agent_contracts/operations/adopt.yaml +49 -0
  121. ptsip/agent_contracts/operations/conform.yaml +42 -0
  122. ptsip/agent_contracts/operations/migrate-profile.yaml +45 -0
  123. ptsip/agent_contracts/operations/reconcile-authority.yaml +40 -0
  124. ptsip/agent_contracts/operations/validate.yaml +36 -0
  125. ptsip/agent_contracts/runtime.py +102 -0
  126. ptsip/agent_contracts/schemas/binding.schema.json +151 -0
  127. ptsip/agent_contracts/schemas/index.schema.json +51 -0
  128. ptsip/agent_contracts/schemas/operation.schema.json +122 -0
  129. ptsip/agent_contracts/schemas/spec.schema.json +96 -0
  130. ptsip/agent_contracts/schemas/vocabulary.schema.json +50 -0
  131. ptsip/agent_contracts/spec/adoption.yaml +23 -0
  132. ptsip/agent_contracts/spec/authority.yaml +32 -0
  133. ptsip/agent_contracts/spec/classification.yaml +31 -0
  134. ptsip/agent_contracts/spec/conformance.yaml +27 -0
  135. ptsip/agent_contracts/spec/core.yaml +21 -0
  136. ptsip/agent_contracts/spec/governance.yaml +17 -0
  137. ptsip/agent_contracts/spec/profile-transition.yaml +27 -0
  138. ptsip/agent_contracts/spec/responsibility-map.yaml +26 -0
  139. ptsip/agent_contracts/validator.py +195 -0
  140. ptsip/agent_contracts/vocabulary/authority.yaml +8 -0
  141. ptsip/agent_contracts/vocabulary/diagnostics.yaml +7 -0
  142. ptsip/agent_contracts/vocabulary/lifecycle.yaml +9 -0
  143. ptsip/agent_contracts/vocabulary/outcomes.yaml +8 -0
  144. ptsip/app/__init__.py +5 -0
  145. ptsip/app/client.py +53 -0
  146. ptsip/app/github_authority.py +659 -0
  147. ptsip/app/github_client.py +200 -0
  148. ptsip/app/github_reconciliation.py +405 -0
  149. ptsip/app/local_client.py +129 -0
  150. ptsip/app/server.py +130 -0
  151. ptsip/app/service.py +345 -0
  152. ptsip/app/store.py +283 -0
  153. ptsip/artifact_evidence.py +150 -0
  154. ptsip/build_resolution.py +315 -0
  155. ptsip/clarification/__init__.py +6 -0
  156. ptsip/clarification/generator.py +345 -0
  157. ptsip/clarification/generator_core.py +87 -0
  158. ptsip/clarification/i18n.py +110 -0
  159. ptsip/clarification/model.py +32 -0
  160. ptsip/clarification/render.py +79 -0
  161. ptsip/clarification/resolution/__init__.py +34 -0
  162. ptsip/clarification/resolution/model.py +90 -0
  163. ptsip/clarification/resolution/parser.py +97 -0
  164. ptsip/clarification/resolution/profile_projection.py +467 -0
  165. ptsip/clarification/resolution/resolver.py +72 -0
  166. ptsip/clarification/transports/__init__.py +1 -0
  167. ptsip/clarification/transports/github_issue.py +162 -0
  168. ptsip/cli.py +1181 -0
  169. ptsip/conformance.py +627 -0
  170. ptsip/conformance_audit.py +143 -0
  171. ptsip/conformance_engine.py +409 -0
  172. ptsip/constants.py +9 -0
  173. ptsip/context_plane.py +687 -0
  174. ptsip/dependency_analysis.py +232 -0
  175. ptsip/dependency_cache.py +110 -0
  176. ptsip/dependency_reconciliation.py +248 -0
  177. ptsip/dependency_review.py +174 -0
  178. ptsip/dependency_validation.py +106 -0
  179. ptsip/doctor.py +33 -0
  180. ptsip/engine_installation.py +191 -0
  181. ptsip/engines/context/Cargo.lock +792 -0
  182. ptsip/engines/context/Cargo.toml +16 -0
  183. ptsip/engines/context/contract.json +218 -0
  184. ptsip/engines/context/contracts/1.0.0.json +86 -0
  185. ptsip/engines/context/execution-bindings.json +19 -0
  186. ptsip/engines/context/manifest.json +22 -0
  187. ptsip/engines/context/runtime-contracts.json +34 -0
  188. ptsip/engines/context/src/loading.rs +15 -0
  189. ptsip/engines/context/src/main.rs +126 -0
  190. ptsip/engines/context/src/source.rs +185 -0
  191. ptsip/engines/context/transport.json +113 -0
  192. ptsip/engines/context/version.yaml +3 -0
  193. ptsip/engines/contracts/capability-owner-map.json +94 -0
  194. ptsip/engines/contracts/context-projection-handoff.json +12 -0
  195. ptsip/engines/contracts/dependency-graph.json +47 -0
  196. ptsip/engines/contracts/installation-plan.json +126 -0
  197. ptsip/engines/contracts/native-runtime.json +21 -0
  198. ptsip/engines/contracts/schemas/attempt-result.schema.json +87 -0
  199. ptsip/engines/contracts/schemas/capability-contract.schema.json +100 -0
  200. ptsip/engines/contracts/schemas/consumer-handoff.schema.json +135 -0
  201. ptsip/engines/contracts/schemas/contract-relation.schema.json +123 -0
  202. ptsip/engines/contracts/schemas/core-manifest.schema.json +148 -0
  203. ptsip/engines/contracts/schemas/dependency-graph.schema.json +130 -0
  204. ptsip/engines/contracts/schemas/derived-state.schema.json +64 -0
  205. ptsip/engines/contracts/schemas/effect-evidence.schema.json +58 -0
  206. ptsip/engines/contracts/schemas/execution-binding.schema.json +73 -0
  207. ptsip/engines/contracts/schemas/federated-source.schema.json +97 -0
  208. ptsip/engines/contracts/schemas/impact-result.schema.json +60 -0
  209. ptsip/engines/contracts/schemas/native-invocation-registry.schema.json +206 -0
  210. ptsip/engines/contracts/schemas/registry-snapshot.schema.json +163 -0
  211. ptsip/engines/contracts/schemas/registry-verification-input.schema.json +32 -0
  212. ptsip/engines/contracts/schemas/runtime-authority-consumption.schema.json +120 -0
  213. ptsip/engines/contracts/schemas/stop-ack.schema.json +28 -0
  214. ptsip/engines/contracts/schemas/stop-request.schema.json +25 -0
  215. ptsip/engines/contracts/schemas/stop-result.schema.json +61 -0
  216. ptsip/engines/contracts/schemas/storage-mediation.schema.json +73 -0
  217. ptsip/engines/contracts/schemas/transport-binding.schema.json +49 -0
  218. ptsip/engines/contracts/stdio-transport.json +113 -0
  219. ptsip/engines/contracts/vpms-caller-transition-plan.json +224 -0
  220. ptsip/engines/contracts/vpms-handoff.json +84 -0
  221. ptsip/engines/contracts/vpms-scope-mapping.json +116 -0
  222. ptsip/engines/contracts/work-item-bindings.json +292 -0
  223. ptsip/engines/discovery/Cargo.lock +792 -0
  224. ptsip/engines/discovery/Cargo.toml +16 -0
  225. ptsip/engines/discovery/contract.json +611 -0
  226. ptsip/engines/discovery/contracts/1.0.0.json +172 -0
  227. ptsip/engines/discovery/contracts/2.0.0.json +481 -0
  228. ptsip/engines/discovery/execution-bindings.json +19 -0
  229. ptsip/engines/discovery/manifest.json +22 -0
  230. ptsip/engines/discovery/runtime-contracts.json +232 -0
  231. ptsip/engines/discovery/src/invocation.rs +17 -0
  232. ptsip/engines/discovery/src/main.rs +129 -0
  233. ptsip/engines/discovery/src/registry.rs +358 -0
  234. ptsip/engines/discovery/src/source.rs +305 -0
  235. ptsip/engines/discovery/transport.json +113 -0
  236. ptsip/engines/discovery/version.yaml +3 -0
  237. ptsip/engines/execution/Cargo.lock +792 -0
  238. ptsip/engines/execution/Cargo.toml +16 -0
  239. ptsip/engines/execution/contract.json +607 -0
  240. ptsip/engines/execution/contracts/1.0.0.json +356 -0
  241. ptsip/engines/execution/contracts/2.0.0.json +361 -0
  242. ptsip/engines/execution/execution-bindings.json +19 -0
  243. ptsip/engines/execution/manifest.json +22 -0
  244. ptsip/engines/execution/runtime-contracts.json +428 -0
  245. ptsip/engines/execution/src/authority.rs +99 -0
  246. ptsip/engines/execution/src/effect.rs +66 -0
  247. ptsip/engines/execution/src/invocation.rs +163 -0
  248. ptsip/engines/execution/src/main.rs +185 -0
  249. ptsip/engines/execution/src/source.rs +305 -0
  250. ptsip/engines/execution/transport.json +113 -0
  251. ptsip/engines/execution/version.yaml +3 -0
  252. ptsip/engines/index.json +178 -0
  253. ptsip/engines/planning/Cargo.lock +792 -0
  254. ptsip/engines/planning/Cargo.toml +16 -0
  255. ptsip/engines/planning/contract.json +535 -0
  256. ptsip/engines/planning/contracts/1.0.0.json +95 -0
  257. ptsip/engines/planning/contracts/2.0.0.json +346 -0
  258. ptsip/engines/planning/execution-bindings.json +19 -0
  259. ptsip/engines/planning/manifest.json +22 -0
  260. ptsip/engines/planning/runtime-contracts.json +282 -0
  261. ptsip/engines/planning/src/impact.rs +217 -0
  262. ptsip/engines/planning/src/installation.rs +195 -0
  263. ptsip/engines/planning/src/main.rs +179 -0
  264. ptsip/engines/planning/src/preparation.rs +58 -0
  265. ptsip/engines/planning/src/source.rs +302 -0
  266. ptsip/engines/planning/transport.json +113 -0
  267. ptsip/engines/planning/version.yaml +3 -0
  268. ptsip/engines/projection/Cargo.lock +792 -0
  269. ptsip/engines/projection/Cargo.toml +16 -0
  270. ptsip/engines/projection/contract.json +226 -0
  271. ptsip/engines/projection/contracts/1.0.0.json +92 -0
  272. ptsip/engines/projection/execution-bindings.json +19 -0
  273. ptsip/engines/projection/manifest.json +22 -0
  274. ptsip/engines/projection/runtime-contracts.json +62 -0
  275. ptsip/engines/projection/src/main.rs +149 -0
  276. ptsip/engines/projection/src/rendering.rs +70 -0
  277. ptsip/engines/projection/src/source.rs +185 -0
  278. ptsip/engines/projection/transport.json +113 -0
  279. ptsip/engines/projection/version.yaml +3 -0
  280. ptsip/engines/registries/derived-snapshot.json +135 -0
  281. ptsip/engines/registries/official-execution.json +34 -0
  282. ptsip/engines/registries/official-static.json +35 -0
  283. ptsip/engines/storage/Cargo.lock +792 -0
  284. ptsip/engines/storage/Cargo.toml +16 -0
  285. ptsip/engines/storage/contract.json +382 -0
  286. ptsip/engines/storage/contracts/1.0.0.json +138 -0
  287. ptsip/engines/storage/contracts/2.0.0.json +116 -0
  288. ptsip/engines/storage/execution-bindings.json +19 -0
  289. ptsip/engines/storage/manifest.json +22 -0
  290. ptsip/engines/storage/provider-registry.json +8 -0
  291. ptsip/engines/storage/runtime-contracts.json +282 -0
  292. ptsip/engines/storage/src/main.rs +123 -0
  293. ptsip/engines/storage/src/native.rs +233 -0
  294. ptsip/engines/storage/src/provider.rs +145 -0
  295. ptsip/engines/storage/src/source.rs +198 -0
  296. ptsip/engines/storage/transport.json +113 -0
  297. ptsip/engines/storage/version.yaml +3 -0
  298. ptsip/engines/validation/Cargo.lock +792 -0
  299. ptsip/engines/validation/Cargo.toml +16 -0
  300. ptsip/engines/validation/contract.json +1241 -0
  301. ptsip/engines/validation/contracts/1.0.0.json +356 -0
  302. ptsip/engines/validation/contracts/2.0.0.json +683 -0
  303. ptsip/engines/validation/execution-bindings.json +19 -0
  304. ptsip/engines/validation/manifest.json +22 -0
  305. ptsip/engines/validation/runtime-contracts.json +216 -0
  306. ptsip/engines/validation/src/cases.rs +102 -0
  307. ptsip/engines/validation/src/composition.rs +104 -0
  308. ptsip/engines/validation/src/handoff.rs +215 -0
  309. ptsip/engines/validation/src/main.rs +201 -0
  310. ptsip/engines/validation/src/source.rs +185 -0
  311. ptsip/engines/validation/transport.json +113 -0
  312. ptsip/engines/validation/version.yaml +3 -0
  313. ptsip/evidence/__init__.py +33 -0
  314. ptsip/evidence/adapters.py +486 -0
  315. ptsip/evidence/contract.py +230 -0
  316. ptsip/evidence/normalization.py +173 -0
  317. ptsip/governance/__init__.py +45 -0
  318. ptsip/governance/authority.py +714 -0
  319. ptsip/governance/authorization.py +55 -0
  320. ptsip/governance/model.py +232 -0
  321. ptsip/governance/subject_matching.py +78 -0
  322. ptsip/governance/support_assets.py +91 -0
  323. ptsip/inspection/__init__.py +1 -0
  324. ptsip/inspection/candidate_evidence.py +537 -0
  325. ptsip/inspection/components.py +74 -0
  326. ptsip/inspection/dependencies.py +502 -0
  327. ptsip/inspection/dependencies_030.py +69 -0
  328. ptsip/inspection/dotnet.py +188 -0
  329. ptsip/inspection/go.py +157 -0
  330. ptsip/inspection/inventory.py +161 -0
  331. ptsip/inspection/javascript.py +376 -0
  332. ptsip/inspection/lexing.py +121 -0
  333. ptsip/inspection/python_resolution.py +164 -0
  334. ptsip/inspection/source_adapters.py +60 -0
  335. ptsip/lifecycle_evidence.py +310 -0
  336. ptsip/migration/__init__.py +156 -0
  337. ptsip/migration/analysis/__init__.py +20 -0
  338. ptsip/migration/analysis/analyzer.py +160 -0
  339. ptsip/migration/analysis/direct/__init__.py +5 -0
  340. ptsip/migration/analysis/direct/convergence.py +133 -0
  341. ptsip/migration/analysis/direct/result.py +91 -0
  342. ptsip/migration/analysis/direct/source_projection.py +42 -0
  343. ptsip/migration/analysis/direct/target_projection.py +71 -0
  344. ptsip/migration/analysis/findings/__init__.py +0 -0
  345. ptsip/migration/analysis/findings/architecture.py +29 -0
  346. ptsip/migration/analysis/findings/lifecycle.py +28 -0
  347. ptsip/migration/analysis/findings/work_requirements.py +103 -0
  348. ptsip/migration/analysis/issue.py +12 -0
  349. ptsip/migration/analysis/result.py +69 -0
  350. ptsip/migration/analysis/source/__init__.py +0 -0
  351. ptsip/migration/analysis/source/binding_validation.py +43 -0
  352. ptsip/migration/analysis/source/evidence_correlation.py +40 -0
  353. ptsip/migration/analysis/source/projection.py +252 -0
  354. ptsip/migration/analysis/source/repository_resolution.py +96 -0
  355. ptsip/migration/analysis/target/__init__.py +0 -0
  356. ptsip/migration/analysis/target/compatibility.py +142 -0
  357. ptsip/migration/analysis/target/relationship_findings.py +20 -0
  358. ptsip/migration/analysis/target/semantics.py +159 -0
  359. ptsip/migration/execution/__init__.py +5 -0
  360. ptsip/migration/execution/authorization/__init__.py +4 -0
  361. ptsip/migration/execution/authorization/binding.py +160 -0
  362. ptsip/migration/execution/authorization/preconditions.py +71 -0
  363. ptsip/migration/execution/authorization/proof.py +80 -0
  364. ptsip/migration/execution/direct/__init__.py +9 -0
  365. ptsip/migration/execution/direct/identity_plan.py +133 -0
  366. ptsip/migration/execution/direct/identity_rewrite.py +322 -0
  367. ptsip/migration/execution/direct/promotion.py +180 -0
  368. ptsip/migration/execution/direct/verification.py +118 -0
  369. ptsip/migration/execution/error.py +2 -0
  370. ptsip/migration/execution/guard/__init__.py +3 -0
  371. ptsip/migration/execution/guard/mutation.py +104 -0
  372. ptsip/migration/execution/guard/repository_snapshot.py +47 -0
  373. ptsip/migration/execution/ledger/__init__.py +3 -0
  374. ptsip/migration/execution/ledger/record.py +149 -0
  375. ptsip/migration/execution/ledger/store.py +113 -0
  376. ptsip/migration/execution/mutation/__init__.py +5 -0
  377. ptsip/migration/execution/mutation/asynchronous.py +41 -0
  378. ptsip/migration/execution/mutation/delta.py +243 -0
  379. ptsip/migration/execution/mutation/finalization.py +90 -0
  380. ptsip/migration/execution/mutation/source.py +57 -0
  381. ptsip/migration/execution/promotion/__init__.py +4 -0
  382. ptsip/migration/execution/promotion/mutation.py +55 -0
  383. ptsip/migration/execution/promotion/preparation.py +79 -0
  384. ptsip/migration/execution/promotion/verification.py +87 -0
  385. ptsip/migration/execution/recovery.py +93 -0
  386. ptsip/migration/execution/state/__init__.py +3 -0
  387. ptsip/migration/execution/state/phase.py +17 -0
  388. ptsip/migration/execution/state/promotion.py +25 -0
  389. ptsip/migration/execution/state/recovery.py +31 -0
  390. ptsip/migration/execution/state/source_steps.py +78 -0
  391. ptsip/migration/planning/__init__.py +12 -0
  392. ptsip/migration/planning/convergence/__init__.py +0 -0
  393. ptsip/migration/planning/convergence/builder.py +324 -0
  394. ptsip/migration/planning/convergence/final_state.py +132 -0
  395. ptsip/migration/planning/convergence/reconciliation.py +175 -0
  396. ptsip/migration/planning/direct/__init__.py +3 -0
  397. ptsip/migration/planning/direct/builder.py +346 -0
  398. ptsip/migration/planning/direct/reference.py +26 -0
  399. ptsip/migration/planning/proposal_derivation.py +137 -0
  400. ptsip/migration/planning/result.py +106 -0
  401. ptsip/migration/proposal/__init__.py +9 -0
  402. ptsip/migration/proposal/bundle.py +207 -0
  403. ptsip/migration/proposal/semantic_identity.py +40 -0
  404. ptsip/migration/proposal/source_set.py +50 -0
  405. ptsip/migration/proposal/target_delta.py +88 -0
  406. ptsip/model.py +165 -0
  407. ptsip/package-composition.json +266 -0
  408. ptsip/package-distribution.json +16 -0
  409. ptsip/pilot/__init__.py +1 -0
  410. ptsip/pilot/runner.py +170 -0
  411. ptsip/profiles/__init__.py +1 -0
  412. ptsip/profiles/catalog.py +157 -0
  413. ptsip/profiles/compatibility.py +184 -0
  414. ptsip/profiles/contracts.py +100 -0
  415. ptsip/profiles/example.ptsip.yaml +149 -0
  416. ptsip/profiles/hybrid-python-package.ptsip.yaml +40 -0
  417. ptsip/profiles/identity.py +314 -0
  418. ptsip/profiles/index.yaml +22 -0
  419. ptsip/profiles/metadata.py +61 -0
  420. ptsip/profiles/template-python-package.ptsip.yaml +18 -0
  421. ptsip/proposed_component.py +128 -0
  422. ptsip/remediation/__init__.py +77 -0
  423. ptsip/remediation/domain/__init__.py +39 -0
  424. ptsip/remediation/domain/model.py +417 -0
  425. ptsip/remediation/escalation/__init__.py +37 -0
  426. ptsip/remediation/escalation/contract.py +388 -0
  427. ptsip/remediation/escalation/engine.py +212 -0
  428. ptsip/remediation/rules/__init__.py +23 -0
  429. ptsip/remediation/rules/contract.py +276 -0
  430. ptsip/repository/__init__.py +1 -0
  431. ptsip/repository/discover.py +68 -0
  432. ptsip/repository/namespace.py +86 -0
  433. ptsip/repository/profile_convergence.py +409 -0
  434. ptsip/repository/profile_path.py +97 -0
  435. ptsip/repository/profile_transition.py +377 -0
  436. ptsip/repository/remote.py +54 -0
  437. ptsip/repository/schemas/engine-state.schema.json +1 -0
  438. ptsip/repository/schemas/repository-index.schema.json +104 -0
  439. ptsip/repository/snapshot.py +173 -0
  440. ptsip/review_evidence.py +406 -0
  441. ptsip/source_compat/__init__.py +56 -0
  442. ptsip/source_compat/integrity.py +131 -0
  443. ptsip/source_compat/model.py +260 -0
  444. ptsip/source_compat/reader.py +336 -0
  445. ptsip/spec_identity.py +24 -0
  446. ptsip/specdata/project-profile-contracts.yaml +36 -0
  447. ptsip/specdata/ptsip-agent-classification.schema.json +57 -0
  448. ptsip/specdata/ptsip-artifact-evidence.schema.json +68 -0
  449. ptsip/specdata/ptsip-diagnostic.schema.json +58 -0
  450. ptsip/specdata/ptsip-normalized-evidence.schema.json +126 -0
  451. ptsip/specdata/ptsip-profile-pp-1.01.schema.json +309 -0
  452. ptsip/specdata/ptsip-profile-pp-1.02.schema.json +604 -0
  453. ptsip/specdata/ptsip-profile.schema.json +296 -0
  454. ptsip/specdata/ptsip-registry.yaml +333 -0
  455. ptsip/specdata/ptsip-source-profile-0.3.4.schema.json +55 -0
  456. ptsip/specdata/ptsip-source-profile-0.3.6.schema.json +35 -0
  457. ptsip/specification_binding.py +246 -0
  458. ptsip/storage/__init__.py +1 -0
  459. ptsip/storage/local_state.py +40 -0
  460. ptsip/support/policy/ARCH/SFP-ARCH-0001.yaml +131 -0
  461. ptsip/support/policy/ARCH/SFP-ARCH-0002.yaml +46 -0
  462. ptsip/support/policy/ARCH/SFP-ARCH-0003.yaml +39 -0
  463. ptsip/support/policy/ARCH/SFP-ARCH-0004.yaml +1215 -0
  464. ptsip/support/policy/ARCH/SFP-ARCH-0005.yaml +76 -0
  465. ptsip/support/policy/ASSURE/SFP-ASSURE-0001.yaml +45 -0
  466. ptsip/support/policy/ASSURE/SFP-ASSURE-0002.yaml +45 -0
  467. ptsip/support/policy/ASSURE/SFP-ASSURE-0003.yaml +46 -0
  468. ptsip/support/policy/ASSURE/SFP-ASSURE-0004.yaml +148 -0
  469. ptsip/support/policy/ASSURE/SFP-ASSURE-0005.yaml +115 -0
  470. ptsip/support/policy/CHANGE/SFP-CHANGE-0001.yaml +256 -0
  471. ptsip/support/policy/CNTR/SFP-CNTR-0001.yaml +242 -0
  472. ptsip/support/policy/CNTR/SFP-CNTR-0002.yaml +44 -0
  473. ptsip/support/policy/CNTR/SFP-CNTR-0003.yaml +54 -0
  474. ptsip/support/policy/CNTR/SFP-CNTR-0004.yaml +47 -0
  475. ptsip/support/policy/CNTR/SFP-CNTR-0005.yaml +1772 -0
  476. ptsip/support/policy/CNTR/SFP-CNTR-0006.yaml +131 -0
  477. ptsip/support/policy/CNTR/SFP-CNTR-0007.yaml +146 -0
  478. ptsip/support/policy/CNTR/SFP-CNTR-0008.yaml +57 -0
  479. ptsip/support/policy/CTRL/SFP-CTRL-0001.yaml +95 -0
  480. ptsip/support/policy/CTRL/SFP-CTRL-0002.yaml +415 -0
  481. ptsip/support/policy/CTRL/SFP-CTRL-0003.yaml +715 -0
  482. ptsip/support/policy/GOV/SFP-GOV-0001.yaml +55 -0
  483. ptsip/support/policy/GOV/SFP-GOV-0002.yaml +93 -0
  484. ptsip/support/policy/INFO/SFP-INFO-0001.yaml +271 -0
  485. ptsip/support/policy/INFO/SFP-INFO-0002.yaml +42 -0
  486. ptsip/support/policy/INFO/SFP-INFO-0003.yaml +41 -0
  487. ptsip/support/policy/INFO/SFP-INFO-0004.yaml +133 -0
  488. ptsip/support/policy/INFO/SFP-INFO-0005.yaml +135 -0
  489. ptsip/support/policy/INFO/SFP-INFO-0006.yaml +67 -0
  490. ptsip/support/policy/INFO/SFP-INFO-0007.yaml +256 -0
  491. ptsip/support/policy/INFO/SFP-INFO-0008.yaml +99 -0
  492. ptsip/support/policy/INFO/SFP-INFO-0009.yaml +56 -0
  493. ptsip/support/policy/INTENT/SFP-INTENT-0001.yaml +39 -0
  494. ptsip/support/policy/NORM/SFP-NORM-0001.yaml +45 -0
  495. ptsip/support/policy/NORM/SFP-NORM-0002.yaml +38 -0
  496. ptsip/support/policy/OPS/SFP-OPS-0001.yaml +40 -0
  497. ptsip/support/policy/OPS/SFP-OPS-0002.yaml +270 -0
  498. ptsip/support/policy/REAL/SFP-REAL-0001.yaml +47 -0
  499. ptsip/support/policy/RECORD/SFP-RECORD-0001.yaml +39 -0
  500. ptsip/support/policy/RECORD/SFP-RECORD-0002.yaml +40 -0
  501. ptsip/support/policy/RECORD/SFP-RECORD-0003.yaml +403 -0
  502. ptsip/support/policy/RECORD/SFP-RECORD-0004.yaml +186 -0
  503. ptsip/support/policy/RISK/SFP-RISK-0001.yaml +34 -0
  504. ptsip/support/policy/SUPPLY/SFP-SUPPLY-0001.yaml +43 -0
  505. ptsip/support/policy/index.yaml +183 -0
  506. ptsip/support/policy/legacy/SFP-0001.yaml +28 -0
  507. ptsip/support/policy/legacy/SFP-0002.yaml +28 -0
  508. ptsip/support/policy/legacy/SFP-0003.yaml +27 -0
  509. ptsip/support/policy/legacy/SFP-0004.yaml +53 -0
  510. ptsip/support/policy/legacy/SFP-0005.yaml +32 -0
  511. ptsip/support/policy/legacy/SFP-0006.yaml +43 -0
  512. ptsip/support/policy/legacy/SFP-0007.yaml +52 -0
  513. ptsip/support/policy/legacy/SFP-0008.yaml +66 -0
  514. ptsip/support/policy/legacy/SFP-0009.yaml +54 -0
  515. ptsip/support/policy/legacy/SFP-0010.yaml +40 -0
  516. ptsip/support/policy/legacy/SFP-0011.yaml +42 -0
  517. ptsip/support/policy/legacy/SFP-0012.yaml +38 -0
  518. ptsip/support/policy/legacy/SFP-0013.yaml +38 -0
  519. ptsip/support/policy/legacy/SFP-0014.yaml +46 -0
  520. ptsip/support/policy/legacy/SFP-0015.yaml +52 -0
  521. ptsip/support/policy/legacy/SFP-0016.yaml +52 -0
  522. ptsip/support/policy/legacy/SFP-0017.yaml +23 -0
  523. ptsip/support/policy/legacy/SFP-0018.yaml +41 -0
  524. ptsip/support/policy/legacy/SFP-0019.yaml +40 -0
  525. ptsip/support/policy/legacy/SFP-0020.yaml +34 -0
  526. ptsip/support/policy/legacy/SFP-0021.yaml +44 -0
  527. ptsip/support/policy/legacy/SFP-0022.yaml +53 -0
  528. ptsip/support/policy/legacy/SFP-0023.yaml +20 -0
  529. ptsip/support/policy/legacy/SFP-0024.yaml +118 -0
  530. ptsip/support/registries/ptsip-support-authority-role-registry.yaml +319 -0
  531. ptsip/support/registries/ptsip-support-authority-schema-registry.yaml +239 -0
  532. ptsip/support/registries/ptsip-support-authority-subject-registry.yaml +68 -0
  533. ptsip/support/registries/ptsip-support-authorization-registry.yaml +14 -0
  534. ptsip/support/registries/root-family-migration.json +3097 -0
  535. ptsip/support/registries/root-family-projection-module-admission.json +23 -0
  536. ptsip/support/registries/root-family-projection.module.json +201 -0
  537. ptsip/support/schemas/ptsip-support-authority-eligibility-result.schema.json +114 -0
  538. ptsip/support/schemas/ptsip-support-authority-role.schema.json +126 -0
  539. ptsip/support/schemas/ptsip-support-authority-semantics.schema.json +378 -0
  540. ptsip/support/schemas/ptsip-support-feature-policy-index.schema.json +57 -0
  541. ptsip/support/schemas/ptsip-support-feature-policy.schema.json +186 -0
  542. ptsip/support/schemas/ptsip-support-governance-registry.schema.json +28 -0
  543. ptsip/support/schemas/ptsip-support-project-authority-record.schema.json +136 -0
  544. ptsip/support/schemas/ptsip-support-root-family-policy.schema.json +206 -0
  545. ptsip/support/schemas/ptsip-support-subject-binding.schema.json +60 -0
  546. ptsip/support/schemas/root-family-migration.schema.json +240 -0
  547. ptsip/support/schemas/root-family-projection-module.schema.json +276 -0
  548. ptsip/topology.py +747 -0
  549. ptsip/validation/__init__.py +1 -0
  550. ptsip/validation/components.py +357 -0
  551. ptsip/validation/handoff.py +75 -0
  552. ptsip/validation/profile.py +514 -0
  553. ptsip/validation/rules.py +186 -0
  554. ptsip/validation/specification.py +60 -0
  555. ptsip/validation/templates.py +767 -0
  556. ptsip/validation_capture.py +168 -0
  557. ptsip-0.3.8b3.data/scripts/ptsip-engine-context.exe +0 -0
  558. ptsip-0.3.8b3.data/scripts/ptsip-engine-discovery.exe +0 -0
  559. ptsip-0.3.8b3.data/scripts/ptsip-engine-execution.exe +0 -0
  560. ptsip-0.3.8b3.data/scripts/ptsip-engine-planning.exe +0 -0
  561. ptsip-0.3.8b3.data/scripts/ptsip-engine-projection.exe +0 -0
  562. ptsip-0.3.8b3.data/scripts/ptsip-engine-storage.exe +0 -0
  563. ptsip-0.3.8b3.data/scripts/ptsip-engine-validation.exe +0 -0
  564. ptsip-0.3.8b3.dist-info/METADATA +361 -0
  565. ptsip-0.3.8b3.dist-info/RECORD +600 -0
  566. ptsip-0.3.8b3.dist-info/WHEEL +4 -0
  567. ptsip-0.3.8b3.dist-info/entry_points.txt +3 -0
  568. ptsip-0.3.8b3.dist-info/licenses/License-Authority/COMMERCIAL-USE.md +301 -0
  569. ptsip-0.3.8b3.dist-info/licenses/License-Authority/LICENSE-GUIDE.md +159 -0
  570. ptsip-0.3.8b3.dist-info/licenses/License-Authority/LICENSE-HISTORY.md +15 -0
  571. ptsip-0.3.8b3.dist-info/licenses/License-Authority/LICENSE.md +414 -0
  572. ptsip-0.3.8b3.dist-info/licenses/License-Authority/NOTICE.md +22 -0
  573. ptsip-0.3.8b3.dist-info/licenses/License-Authority/license-authority.yaml +133 -0
  574. ptsip-0.3.8b3.dist-info/ptsip-engines.json +78 -0
  575. vpms/__init__.py +70 -0
  576. vpms/contract_runtime.py +124 -0
  577. vpms/contracts/execution-composition.json +1 -0
  578. vpms/contracts/identity-registry.json +69 -0
  579. vpms/contracts/index.json +1 -0
  580. vpms/contracts/invariants.json +27 -0
  581. vpms/contracts/protocol.json +1 -0
  582. vpms/contracts/schemas/catalog.schema.json +80 -0
  583. vpms/contracts/schemas/product-contract.schema.json +572 -0
  584. vpms/contracts/schemas/selection-request.schema.json +47 -0
  585. vpms/contracts/schemas/selection-result.schema.json +79 -0
  586. vpms/contracts/schemas/selection-rule.schema.json +31 -0
  587. vpms/contracts/selection.json +1 -0
  588. vpms/domain/__init__.py +1 -0
  589. vpms/domain/model.py +88 -0
  590. vpms/domain/registry.py +350 -0
  591. vpms/domain/snapshot.py +118 -0
  592. vpms/execution/__init__.py +1 -0
  593. vpms/execution/adapters/__init__.py +1 -0
  594. vpms/execution/adapters/command.py +67 -0
  595. vpms/execution/composition.py +58 -0
  596. vpms/execution/runner.py +69 -0
  597. vpms/integration/__init__.py +1 -0
  598. vpms/integration/ptsip_bridge.py +156 -0
  599. vpms/selection/__init__.py +4 -0
  600. 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