PTSIP 0.3.8a2__tar.gz → 0.3.8a4__tar.gz

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 (468) hide show
  1. ptsip-0.3.8a4/MANIFEST.in +5 -0
  2. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/PKG-INFO +80 -21
  3. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/README.md +79 -20
  4. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/pyproject.toml +21 -1
  5. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/registry/project-profile-contracts.yaml +7 -2
  6. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/setup.py +35 -22
  7. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/PTSIP.egg-info/PKG-INFO +80 -21
  8. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/PTSIP.egg-info/SOURCES.txt +188 -64
  9. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/bindings/current.yaml +4 -4
  10. ptsip-0.3.8a4/src/agent_contracts/candidate.py +383 -0
  11. ptsip-0.3.8a4/src/agent_contracts/canonicalization/ptsip-canonical-json-v1.json +81 -0
  12. ptsip-0.3.8a4/src/agent_contracts/conformance/current.json +987 -0
  13. ptsip-0.3.8a4/src/agent_contracts/contracts/current.json +3978 -0
  14. ptsip-0.3.8a4/src/agent_contracts/digests/policy-v1.json +7746 -0
  15. ptsip-0.3.8a4/src/agent_contracts/digests/projection-v1.json +7698 -0
  16. ptsip-0.3.8a4/src/agent_contracts/index.json +427 -0
  17. ptsip-0.3.8a4/src/agent_contracts/machine_resolver.py +81 -0
  18. ptsip-0.3.8a4/src/agent_contracts/promotion/current.json +50 -0
  19. ptsip-0.3.8a4/src/agent_contracts/promotion/index.json +13 -0
  20. ptsip-0.3.8a4/src/agent_contracts/promotion/specification-contract.json +49 -0
  21. ptsip-0.3.8a4/src/agent_contracts/schemas/candidate-group.schema.json +107 -0
  22. ptsip-0.3.8a4/src/agent_contracts/schemas/candidate-index.schema.json +246 -0
  23. ptsip-0.3.8a4/src/agent_contracts/schemas/candidate-vectors.schema.json +49 -0
  24. ptsip-0.3.8a4/src/agent_contracts/schemas/contracts/promotion.schema.json +81 -0
  25. ptsip-0.3.8a4/src/policy/ARCH/SFP-ARCH-0001.yaml +121 -0
  26. ptsip-0.3.8a4/src/policy/ARCH/SFP-ARCH-0002.yaml +48 -0
  27. ptsip-0.3.8a4/src/policy/ARCH/SFP-ARCH-0003.yaml +41 -0
  28. ptsip-0.3.8a4/src/policy/ASSURE/SFP-ASSURE-0001.yaml +51 -0
  29. ptsip-0.3.8a4/src/policy/ASSURE/SFP-ASSURE-0002.yaml +47 -0
  30. ptsip-0.3.8a4/src/policy/ASSURE/SFP-ASSURE-0003.yaml +48 -0
  31. ptsip-0.3.8a4/src/policy/CHANGE/SFP-CHANGE-0001.yaml +269 -0
  32. ptsip-0.3.8a4/src/policy/CNTR/SFP-CNTR-0001.yaml +265 -0
  33. ptsip-0.3.8a4/src/policy/CNTR/SFP-CNTR-0002.yaml +46 -0
  34. ptsip-0.3.8a4/src/policy/CNTR/SFP-CNTR-0003.yaml +56 -0
  35. ptsip-0.3.8a4/src/policy/CNTR/SFP-CNTR-0004.yaml +48 -0
  36. ptsip-0.3.8a4/src/policy/CTRL/SFP-CTRL-0001.yaml +110 -0
  37. ptsip-0.3.8a4/src/policy/GOV/SFP-GOV-0001.yaml +63 -0
  38. ptsip-0.3.8a4/src/policy/INFO/SFP-INFO-0001.yaml +294 -0
  39. ptsip-0.3.8a4/src/policy/INFO/SFP-INFO-0002.yaml +44 -0
  40. ptsip-0.3.8a4/src/policy/INFO/SFP-INFO-0003.yaml +43 -0
  41. ptsip-0.3.8a4/src/policy/INTENT/SFP-INTENT-0001.yaml +41 -0
  42. ptsip-0.3.8a4/src/policy/NORM/SFP-NORM-0001.yaml +50 -0
  43. ptsip-0.3.8a4/src/policy/NORM/SFP-NORM-0002.yaml +40 -0
  44. ptsip-0.3.8a4/src/policy/OPS/SFP-OPS-0001.yaml +44 -0
  45. ptsip-0.3.8a4/src/policy/REAL/SFP-REAL-0001.yaml +54 -0
  46. ptsip-0.3.8a4/src/policy/RECORD/SFP-RECORD-0001.yaml +42 -0
  47. ptsip-0.3.8a4/src/policy/RECORD/SFP-RECORD-0002.yaml +42 -0
  48. ptsip-0.3.8a4/src/policy/RISK/SFP-RISK-0001.yaml +35 -0
  49. ptsip-0.3.8a4/src/policy/SUPPLY/SFP-SUPPLY-0001.yaml +45 -0
  50. ptsip-0.3.8a4/src/policy/index.yaml +200 -0
  51. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0006.yaml +1 -1
  52. ptsip-0.3.8a4/src/policy/legacy/SFP-0022.yaml +53 -0
  53. ptsip-0.3.8a4/src/policy/legacy/SFP-0023.yaml +20 -0
  54. ptsip-0.3.8a4/src/policy/legacy/SFP-0024.yaml +118 -0
  55. {ptsip-0.3.8a2/docs/Support_policy → ptsip-0.3.8a4/src}/policy/registries/ptsip-support-authority-role-registry.yaml +158 -0
  56. ptsip-0.3.8a4/src/policy/registries/ptsip-support-authority-schema-registry.yaml +259 -0
  57. ptsip-0.3.8a4/src/policy/registries/ptsip-support-authority-subject-registry.yaml +75 -0
  58. ptsip-0.3.8a4/src/policy/registries/root-family-migration.json +3097 -0
  59. ptsip-0.3.8a4/src/policy/registries/root-family-projection-module-admission.json +23 -0
  60. ptsip-0.3.8a4/src/policy/registries/root-family-projection.module.json +201 -0
  61. {ptsip-0.3.8a2/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-authority-eligibility-result.schema.json +1 -1
  62. {ptsip-0.3.8a2/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-authority-role.schema.json +4 -1
  63. {ptsip-0.3.8a2/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-authority-semantics.schema.json +320 -0
  64. {ptsip-0.3.8a2/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-feature-policy-index.schema.json +15 -4
  65. {ptsip-0.3.8a2/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-feature-policy.schema.json +4 -4
  66. ptsip-0.3.8a4/src/policy/schemas/ptsip-support-project-authority-record.schema.json +136 -0
  67. ptsip-0.3.8a4/src/policy/schemas/ptsip-support-root-family-policy.schema.json +206 -0
  68. {ptsip-0.3.8a2/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-subject-binding.schema.json +1 -1
  69. ptsip-0.3.8a4/src/policy/schemas/root-family-migration.schema.json +240 -0
  70. ptsip-0.3.8a4/src/policy/schemas/root-family-projection-module.schema.json +276 -0
  71. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/operations/migrate-profile.yaml +6 -3
  72. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/operations/validate.yaml +1 -1
  73. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/resolution/profile_projection.py +5 -5
  74. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/cli.py +66 -1
  75. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/constants.py +1 -1
  76. ptsip-0.3.8a4/src/ptsip/context_plane.py +687 -0
  77. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/governance/authority.py +349 -7
  78. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/governance/support_assets.py +2 -2
  79. ptsip-0.3.8a4/src/ptsip/migration/__init__.py +156 -0
  80. ptsip-0.3.8a4/src/ptsip/migration/analysis/__init__.py +20 -0
  81. ptsip-0.3.8a4/src/ptsip/migration/analysis/analyzer.py +160 -0
  82. ptsip-0.3.8a4/src/ptsip/migration/analysis/direct/__init__.py +5 -0
  83. ptsip-0.3.8a4/src/ptsip/migration/analysis/direct/convergence.py +133 -0
  84. ptsip-0.3.8a4/src/ptsip/migration/analysis/direct/result.py +91 -0
  85. ptsip-0.3.8a4/src/ptsip/migration/analysis/direct/source_projection.py +42 -0
  86. ptsip-0.3.8a4/src/ptsip/migration/analysis/direct/target_projection.py +71 -0
  87. ptsip-0.3.8a4/src/ptsip/migration/analysis/findings/__init__.py +0 -0
  88. ptsip-0.3.8a4/src/ptsip/migration/analysis/findings/architecture.py +29 -0
  89. ptsip-0.3.8a4/src/ptsip/migration/analysis/findings/lifecycle.py +28 -0
  90. ptsip-0.3.8a4/src/ptsip/migration/analysis/findings/work_requirements.py +103 -0
  91. ptsip-0.3.8a4/src/ptsip/migration/analysis/issue.py +12 -0
  92. ptsip-0.3.8a4/src/ptsip/migration/analysis/result.py +69 -0
  93. ptsip-0.3.8a4/src/ptsip/migration/analysis/source/__init__.py +0 -0
  94. ptsip-0.3.8a4/src/ptsip/migration/analysis/source/binding_validation.py +43 -0
  95. ptsip-0.3.8a4/src/ptsip/migration/analysis/source/evidence_correlation.py +40 -0
  96. ptsip-0.3.8a4/src/ptsip/migration/analysis/source/projection.py +252 -0
  97. ptsip-0.3.8a4/src/ptsip/migration/analysis/source/repository_resolution.py +96 -0
  98. ptsip-0.3.8a4/src/ptsip/migration/analysis/target/__init__.py +0 -0
  99. ptsip-0.3.8a4/src/ptsip/migration/analysis/target/compatibility.py +142 -0
  100. ptsip-0.3.8a4/src/ptsip/migration/analysis/target/relationship_findings.py +20 -0
  101. ptsip-0.3.8a4/src/ptsip/migration/analysis/target/semantics.py +159 -0
  102. ptsip-0.3.8a4/src/ptsip/migration/execution/__init__.py +5 -0
  103. ptsip-0.3.8a4/src/ptsip/migration/execution/authorization/__init__.py +4 -0
  104. ptsip-0.3.8a4/src/ptsip/migration/execution/authorization/binding.py +160 -0
  105. ptsip-0.3.8a4/src/ptsip/migration/execution/authorization/preconditions.py +71 -0
  106. ptsip-0.3.8a4/src/ptsip/migration/execution/authorization/proof.py +80 -0
  107. ptsip-0.3.8a4/src/ptsip/migration/execution/direct/__init__.py +9 -0
  108. ptsip-0.3.8a4/src/ptsip/migration/execution/direct/identity_plan.py +133 -0
  109. {ptsip-0.3.8a2/src/ptsip/migration → ptsip-0.3.8a4/src/ptsip/migration/execution/direct}/identity_rewrite.py +10 -142
  110. ptsip-0.3.8a2/src/ptsip/migration/direct_execution.py → ptsip-0.3.8a4/src/ptsip/migration/execution/direct/promotion.py +14 -125
  111. ptsip-0.3.8a4/src/ptsip/migration/execution/direct/verification.py +118 -0
  112. ptsip-0.3.8a4/src/ptsip/migration/execution/error.py +2 -0
  113. ptsip-0.3.8a4/src/ptsip/migration/execution/guard/__init__.py +3 -0
  114. ptsip-0.3.8a4/src/ptsip/migration/execution/guard/mutation.py +104 -0
  115. ptsip-0.3.8a4/src/ptsip/migration/execution/guard/repository_snapshot.py +47 -0
  116. ptsip-0.3.8a4/src/ptsip/migration/execution/ledger/__init__.py +3 -0
  117. ptsip-0.3.8a2/src/ptsip/migration/execution_ledger.py → ptsip-0.3.8a4/src/ptsip/migration/execution/ledger/record.py +3 -110
  118. ptsip-0.3.8a4/src/ptsip/migration/execution/ledger/store.py +113 -0
  119. ptsip-0.3.8a4/src/ptsip/migration/execution/mutation/__init__.py +5 -0
  120. ptsip-0.3.8a4/src/ptsip/migration/execution/mutation/asynchronous.py +41 -0
  121. ptsip-0.3.8a2/src/ptsip/migration/execution_apply.py → ptsip-0.3.8a4/src/ptsip/migration/execution/mutation/delta.py +11 -176
  122. ptsip-0.3.8a4/src/ptsip/migration/execution/mutation/finalization.py +90 -0
  123. ptsip-0.3.8a4/src/ptsip/migration/execution/mutation/source.py +57 -0
  124. ptsip-0.3.8a4/src/ptsip/migration/execution/promotion/__init__.py +4 -0
  125. ptsip-0.3.8a4/src/ptsip/migration/execution/promotion/mutation.py +55 -0
  126. ptsip-0.3.8a4/src/ptsip/migration/execution/promotion/preparation.py +79 -0
  127. ptsip-0.3.8a4/src/ptsip/migration/execution/promotion/verification.py +87 -0
  128. ptsip-0.3.8a4/src/ptsip/migration/execution/recovery.py +93 -0
  129. ptsip-0.3.8a4/src/ptsip/migration/execution/state/__init__.py +3 -0
  130. ptsip-0.3.8a4/src/ptsip/migration/execution/state/phase.py +17 -0
  131. ptsip-0.3.8a4/src/ptsip/migration/execution/state/promotion.py +25 -0
  132. ptsip-0.3.8a4/src/ptsip/migration/execution/state/recovery.py +31 -0
  133. ptsip-0.3.8a4/src/ptsip/migration/execution/state/source_steps.py +78 -0
  134. ptsip-0.3.8a4/src/ptsip/migration/planning/__init__.py +12 -0
  135. ptsip-0.3.8a4/src/ptsip/migration/planning/convergence/__init__.py +0 -0
  136. ptsip-0.3.8a4/src/ptsip/migration/planning/convergence/builder.py +324 -0
  137. ptsip-0.3.8a4/src/ptsip/migration/planning/convergence/final_state.py +132 -0
  138. ptsip-0.3.8a4/src/ptsip/migration/planning/convergence/reconciliation.py +175 -0
  139. ptsip-0.3.8a4/src/ptsip/migration/planning/direct/__init__.py +3 -0
  140. ptsip-0.3.8a2/src/ptsip/migration/direct_planner.py → ptsip-0.3.8a4/src/ptsip/migration/planning/direct/builder.py +9 -37
  141. ptsip-0.3.8a4/src/ptsip/migration/planning/direct/reference.py +26 -0
  142. ptsip-0.3.8a4/src/ptsip/migration/planning/proposal_derivation.py +137 -0
  143. ptsip-0.3.8a4/src/ptsip/migration/planning/result.py +106 -0
  144. ptsip-0.3.8a4/src/ptsip/migration/proposal/__init__.py +9 -0
  145. ptsip-0.3.8a2/src/ptsip/migration/proposal.py → ptsip-0.3.8a4/src/ptsip/migration/proposal/bundle.py +4 -172
  146. ptsip-0.3.8a4/src/ptsip/migration/proposal/semantic_identity.py +40 -0
  147. ptsip-0.3.8a4/src/ptsip/migration/proposal/source_set.py +50 -0
  148. ptsip-0.3.8a4/src/ptsip/migration/proposal/target_delta.py +88 -0
  149. ptsip-0.3.8a4/src/ptsip/profiles/__init__.py +1 -0
  150. ptsip-0.3.8a2/src/ptsip/local_profile_catalog.py → ptsip-0.3.8a4/src/ptsip/profiles/catalog.py +1 -1
  151. ptsip-0.3.8a2/src/ptsip/profile_compatibility.py → ptsip-0.3.8a4/src/ptsip/profiles/compatibility.py +1 -1
  152. ptsip-0.3.8a2/src/ptsip/profile_identity.py → ptsip-0.3.8a4/src/ptsip/profiles/identity.py +1 -1
  153. {ptsip-0.3.8a2 → ptsip-0.3.8a4/src/ptsip}/profiles/index.yaml +1 -1
  154. ptsip-0.3.8a2/src/ptsip/profile_metadata.py → ptsip-0.3.8a4/src/ptsip/profiles/metadata.py +2 -2
  155. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/repository/profile_convergence.py +2 -2
  156. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/repository/profile_path.py +1 -1
  157. ptsip-0.3.8a4/src/ptsip/repository/schemas/engine-state.schema.json +1 -0
  158. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/spec_identity.py +1 -1
  159. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/specdata/project-profile-contracts.yaml +7 -2
  160. ptsip-0.3.8a4/src/ptsip/validation/handoff.py +75 -0
  161. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/validation/profile.py +2 -2
  162. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/vpms/__init__.py +14 -8
  163. ptsip-0.3.8a4/src/vpms/contract_runtime.py +124 -0
  164. ptsip-0.3.8a4/src/vpms/contracts/execution-composition.json +1 -0
  165. ptsip-0.3.8a4/src/vpms/contracts/identity-registry.json +69 -0
  166. ptsip-0.3.8a4/src/vpms/contracts/index.json +1 -0
  167. ptsip-0.3.8a4/src/vpms/contracts/invariants.json +27 -0
  168. ptsip-0.3.8a4/src/vpms/contracts/protocol.json +1 -0
  169. ptsip-0.3.8a4/src/vpms/contracts/schemas/catalog.schema.json +80 -0
  170. ptsip-0.3.8a4/src/vpms/contracts/schemas/product-contract.schema.json +572 -0
  171. ptsip-0.3.8a4/src/vpms/contracts/schemas/selection-request.schema.json +47 -0
  172. ptsip-0.3.8a4/src/vpms/contracts/schemas/selection-result.schema.json +79 -0
  173. ptsip-0.3.8a4/src/vpms/contracts/schemas/selection-rule.schema.json +31 -0
  174. ptsip-0.3.8a4/src/vpms/contracts/selection.json +1 -0
  175. ptsip-0.3.8a4/src/vpms/domain/snapshot.py +118 -0
  176. ptsip-0.3.8a4/src/vpms/execution/composition.py +58 -0
  177. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/vpms/execution/runner.py +1 -34
  178. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/vpms/integration/ptsip_bridge.py +22 -19
  179. ptsip-0.3.8a4/src/vpms/selection/__init__.py +4 -0
  180. ptsip-0.3.8a4/src/vpms/selection/resolver.py +130 -0
  181. ptsip-0.3.8a2/MANIFEST.in +0 -5
  182. ptsip-0.3.8a2/docs/Support_policy/policy/index.yaml +0 -66
  183. ptsip-0.3.8a2/docs/Support_policy/policy/registries/ptsip-support-authority-schema-registry.yaml +0 -119
  184. ptsip-0.3.8a2/docs/Support_policy/policy/registries/ptsip-support-authority-subject-registry.yaml +0 -47
  185. ptsip-0.3.8a2/docs/Support_policy/policy/schemas/ptsip-support-project-authority-record.schema.json +0 -85
  186. ptsip-0.3.8a2/src/ptsip/migration/__init__.py +0 -240
  187. ptsip-0.3.8a2/src/ptsip/migration/analyzer.py +0 -702
  188. ptsip-0.3.8a2/src/ptsip/migration/direct_convergence.py +0 -324
  189. ptsip-0.3.8a2/src/ptsip/migration/execution_binding.py +0 -417
  190. ptsip-0.3.8a2/src/ptsip/migration/execution_model.py +0 -280
  191. ptsip-0.3.8a2/src/ptsip/migration/execution_promotion.py +0 -195
  192. ptsip-0.3.8a2/src/ptsip/migration/model.py +0 -420
  193. ptsip-0.3.8a2/src/ptsip/migration/planner.py +0 -857
  194. ptsip-0.3.8a2/src/vpms/domain/selector.py +0 -41
  195. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/License-Authority/COMMERCIAL-USE.md +0 -0
  196. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/License-Authority/LICENSE-GUIDE.md +0 -0
  197. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/License-Authority/LICENSE-HISTORY.md +0 -0
  198. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/License-Authority/LICENSE.md +0 -0
  199. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/License-Authority/NOTICE.md +0 -0
  200. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/License-Authority/license-authority.yaml +0 -0
  201. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/setup.cfg +0 -0
  202. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/PTSIP.egg-info/dependency_links.txt +0 -0
  203. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/PTSIP.egg-info/entry_points.txt +0 -0
  204. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/PTSIP.egg-info/requires.txt +0 -0
  205. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/PTSIP.egg-info/top_level.txt +0 -0
  206. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/__init__.py +0 -0
  207. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/analyze-source-profile.yaml +0 -0
  208. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/apply-adoption.yaml +0 -0
  209. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/apply-profile-transition.yaml +0 -0
  210. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/build-adoption-plan.yaml +0 -0
  211. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/build-transition-plan.yaml +0 -0
  212. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/capture-repository-snapshot.yaml +0 -0
  213. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/collect-conformance-evidence.yaml +0 -0
  214. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/compare-profile-authority.yaml +0 -0
  215. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/emit-conformance-result.yaml +0 -0
  216. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/evaluate-conformance-rules.yaml +0 -0
  217. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/map-profile-target.yaml +0 -0
  218. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/project-authority-winner.yaml +0 -0
  219. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/read-relevant-authority.yaml +0 -0
  220. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/resolve-adoption-facts.yaml +0 -0
  221. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/resolve-profile-schema.yaml +0 -0
  222. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/resolve-reconciliation-state.yaml +0 -0
  223. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/validate-profile-structure.yaml +0 -0
  224. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/actions/validate-responsibility-map-semantics.yaml +0 -0
  225. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-apply-requested.yaml +0 -0
  226. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-authority-fresh.yaml +0 -0
  227. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-facts-resolved.yaml +0 -0
  228. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-profile-fresh.yaml +0 -0
  229. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-repository-fresh.yaml +0 -0
  230. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-snapshot-identified.yaml +0 -0
  231. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-write-authorized.yaml +0 -0
  232. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/authority-authority-fresh.yaml +0 -0
  233. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/authority-coordination-available.yaml +0 -0
  234. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/authority-profile-fresh.yaml +0 -0
  235. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/authority-projection-required.yaml +0 -0
  236. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/authority-semantic-conflict-absent.yaml +0 -0
  237. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/authority-write-authorized.yaml +0 -0
  238. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/conform-profile-ready.yaml +0 -0
  239. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/conform-snapshot-identified.yaml +0 -0
  240. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/migrate-apply-requested.yaml +0 -0
  241. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/migrate-source-fresh.yaml +0 -0
  242. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/migrate-source-profile-identified.yaml +0 -0
  243. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/migrate-target-contract-resolved.yaml +0 -0
  244. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/migrate-target-fresh.yaml +0 -0
  245. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/migrate-write-authorized.yaml +0 -0
  246. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/validate-contract-resolved.yaml +0 -0
  247. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/conditions/validate-profile-selected.yaml +0 -0
  248. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/gates/adoption-write.yaml +0 -0
  249. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/gates/authority-projection-write.yaml +0 -0
  250. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/gates/profile-transition-write.yaml +0 -0
  251. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/index.yaml +0 -0
  252. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/operations/adopt.yaml +0 -0
  253. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/operations/conform.yaml +0 -0
  254. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/operations/migrate-profile.yaml +0 -0
  255. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/operations/reconcile-authority.yaml +0 -0
  256. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/operations/validate.yaml +0 -0
  257. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/resolver.py +0 -0
  258. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/action.schema.json +0 -0
  259. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/binding.schema.json +0 -0
  260. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/condition.schema.json +0 -0
  261. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/index.schema.json +0 -0
  262. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/io.schema.json +0 -0
  263. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/mutation-gate.schema.json +0 -0
  264. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/operation.schema.json +0 -0
  265. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/spec.schema.json +0 -0
  266. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/vocabulary.schema.json +0 -0
  267. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/adopt-request.schema.json +0 -0
  268. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/adopt-result.schema.json +0 -0
  269. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/adopt-state.schema.json +0 -0
  270. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/authority-request.schema.json +0 -0
  271. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/authority-result.schema.json +0 -0
  272. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/authority-state.schema.json +0 -0
  273. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/conform-request.schema.json +0 -0
  274. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/conform-result.schema.json +0 -0
  275. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/conform-state.schema.json +0 -0
  276. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/migrate-request.schema.json +0 -0
  277. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/migrate-result.schema.json +0 -0
  278. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/migrate-state.schema.json +0 -0
  279. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/validate-request.schema.json +0 -0
  280. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/validate-result.schema.json +0 -0
  281. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/validate-state.schema.json +0 -0
  282. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/adoption-procedure.yaml +0 -0
  283. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/adoption.yaml +0 -0
  284. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/agent-behavior.yaml +0 -0
  285. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/authority.yaml +0 -0
  286. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/classification.yaml +0 -0
  287. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/conformance-detail.yaml +0 -0
  288. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/conformance.yaml +0 -0
  289. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/core.yaml +0 -0
  290. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/governance.yaml +0 -0
  291. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/profile-transition-detail.yaml +0 -0
  292. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/profile-transition.yaml +0 -0
  293. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/repository-boundaries.yaml +0 -0
  294. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/responsibility-map-detail.yaml +0 -0
  295. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/responsibility-map.yaml +0 -0
  296. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/spec/specification-governance.yaml +0 -0
  297. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/validator.py +0 -0
  298. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/vocabulary/authority.yaml +0 -0
  299. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/vocabulary/diagnostics.yaml +0 -0
  300. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/vocabulary/lifecycle.yaml +0 -0
  301. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/vocabulary/outcomes.yaml +0 -0
  302. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/agent_contracts/vocabulary/terminology.yaml +0 -0
  303. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0001.yaml +0 -0
  304. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0002.yaml +0 -0
  305. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0003.yaml +0 -0
  306. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0004.yaml +0 -0
  307. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0005.yaml +0 -0
  308. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0007.yaml +0 -0
  309. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0008.yaml +0 -0
  310. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0009.yaml +0 -0
  311. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0010.yaml +0 -0
  312. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0011.yaml +0 -0
  313. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0012.yaml +0 -0
  314. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0013.yaml +0 -0
  315. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0014.yaml +0 -0
  316. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0015.yaml +0 -0
  317. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0016.yaml +0 -0
  318. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0017.yaml +0 -0
  319. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0018.yaml +0 -0
  320. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0019.yaml +0 -0
  321. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0020.yaml +0 -0
  322. {ptsip-0.3.8a2/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0021.yaml +0 -0
  323. {ptsip-0.3.8a2/docs/Support_policy → ptsip-0.3.8a4/src}/policy/registries/ptsip-support-authorization-registry.yaml +0 -0
  324. {ptsip-0.3.8a2/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-governance-registry.schema.json +0 -0
  325. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/__init__.py +0 -0
  326. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/__main__.py +0 -0
  327. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/adoption.py +0 -0
  328. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/__init__.py +0 -0
  329. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/bindings/current.yaml +0 -0
  330. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/index.yaml +0 -0
  331. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/operations/adopt.yaml +0 -0
  332. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/operations/conform.yaml +0 -0
  333. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/operations/reconcile-authority.yaml +0 -0
  334. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/runtime.py +0 -0
  335. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/schemas/binding.schema.json +0 -0
  336. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/schemas/index.schema.json +0 -0
  337. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/schemas/operation.schema.json +0 -0
  338. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/schemas/spec.schema.json +0 -0
  339. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/schemas/vocabulary.schema.json +0 -0
  340. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/adoption.yaml +0 -0
  341. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/authority.yaml +0 -0
  342. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/classification.yaml +0 -0
  343. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/conformance.yaml +0 -0
  344. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/core.yaml +0 -0
  345. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/governance.yaml +0 -0
  346. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/profile-transition.yaml +0 -0
  347. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/responsibility-map.yaml +0 -0
  348. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/validator.py +0 -0
  349. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/vocabulary/authority.yaml +0 -0
  350. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/vocabulary/diagnostics.yaml +0 -0
  351. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/vocabulary/lifecycle.yaml +0 -0
  352. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/vocabulary/outcomes.yaml +0 -0
  353. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/app/__init__.py +0 -0
  354. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/app/client.py +0 -0
  355. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/app/github_authority.py +0 -0
  356. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/app/github_client.py +0 -0
  357. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/app/github_reconciliation.py +0 -0
  358. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/app/local_client.py +0 -0
  359. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/app/server.py +0 -0
  360. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/app/service.py +0 -0
  361. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/app/store.py +0 -0
  362. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/artifact_evidence.py +0 -0
  363. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/build_resolution.py +0 -0
  364. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/__init__.py +0 -0
  365. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/generator.py +0 -0
  366. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/generator_core.py +0 -0
  367. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/i18n.py +0 -0
  368. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/model.py +0 -0
  369. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/render.py +0 -0
  370. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/resolution/__init__.py +0 -0
  371. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/resolution/model.py +0 -0
  372. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/resolution/parser.py +0 -0
  373. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/resolution/resolver.py +0 -0
  374. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/transports/__init__.py +0 -0
  375. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/clarification/transports/github_issue.py +0 -0
  376. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/conformance.py +0 -0
  377. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/conformance_audit.py +0 -0
  378. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/conformance_engine.py +0 -0
  379. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/dependency_analysis.py +0 -0
  380. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/dependency_cache.py +0 -0
  381. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/dependency_reconciliation.py +0 -0
  382. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/dependency_review.py +0 -0
  383. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/dependency_validation.py +0 -0
  384. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/doctor.py +0 -0
  385. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/evidence/__init__.py +0 -0
  386. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/evidence/adapters.py +0 -0
  387. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/evidence/contract.py +0 -0
  388. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/evidence/normalization.py +0 -0
  389. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/governance/__init__.py +0 -0
  390. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/governance/authorization.py +0 -0
  391. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/governance/model.py +0 -0
  392. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/governance/subject_matching.py +0 -0
  393. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/inspection/__init__.py +0 -0
  394. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/inspection/candidate_evidence.py +0 -0
  395. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/inspection/components.py +0 -0
  396. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/inspection/dependencies.py +0 -0
  397. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/inspection/dependencies_030.py +0 -0
  398. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/inspection/dotnet.py +0 -0
  399. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/inspection/go.py +0 -0
  400. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/inspection/inventory.py +0 -0
  401. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/inspection/javascript.py +0 -0
  402. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/inspection/lexing.py +0 -0
  403. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/inspection/python_resolution.py +0 -0
  404. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/inspection/source_adapters.py +0 -0
  405. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/lifecycle_evidence.py +0 -0
  406. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/model.py +0 -0
  407. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/pilot/__init__.py +0 -0
  408. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/pilot/runner.py +0 -0
  409. /ptsip-0.3.8a2/src/ptsip/project_profile_contracts.py → /ptsip-0.3.8a4/src/ptsip/profiles/contracts.py +0 -0
  410. {ptsip-0.3.8a2 → ptsip-0.3.8a4/src/ptsip}/profiles/example.ptsip.yaml +0 -0
  411. {ptsip-0.3.8a2 → ptsip-0.3.8a4/src/ptsip}/profiles/history/pp.1.01/example.ptsip.yaml +0 -0
  412. {ptsip-0.3.8a2 → ptsip-0.3.8a4/src/ptsip}/profiles/history/pp.1.01/hybrid-python-package.ptsip.yaml +0 -0
  413. {ptsip-0.3.8a2 → ptsip-0.3.8a4/src/ptsip}/profiles/history/pp.1.01/template-python-package.ptsip.yaml +0 -0
  414. {ptsip-0.3.8a2 → ptsip-0.3.8a4/src/ptsip}/profiles/history/pp.1.02/example.ptsip.yaml +0 -0
  415. {ptsip-0.3.8a2 → ptsip-0.3.8a4/src/ptsip}/profiles/history/pp.1.02/hybrid-python-package.ptsip.yaml +0 -0
  416. {ptsip-0.3.8a2 → ptsip-0.3.8a4/src/ptsip}/profiles/history/pp.1.02/template-python-package.ptsip.yaml +0 -0
  417. {ptsip-0.3.8a2 → ptsip-0.3.8a4/src/ptsip}/profiles/hybrid-python-package.ptsip.yaml +0 -0
  418. {ptsip-0.3.8a2 → ptsip-0.3.8a4/src/ptsip}/profiles/template-python-package.ptsip.yaml +0 -0
  419. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/proposed_component.py +0 -0
  420. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/remediation/__init__.py +0 -0
  421. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/remediation/domain/__init__.py +0 -0
  422. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/remediation/domain/model.py +0 -0
  423. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/remediation/escalation/__init__.py +0 -0
  424. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/remediation/escalation/contract.py +0 -0
  425. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/remediation/escalation/engine.py +0 -0
  426. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/remediation/rules/__init__.py +0 -0
  427. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/remediation/rules/contract.py +0 -0
  428. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/remediation/solution/candidate.py +0 -0
  429. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/remediation/solution/elimination.py +0 -0
  430. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/repository/__init__.py +0 -0
  431. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/repository/discover.py +0 -0
  432. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/repository/namespace.py +0 -0
  433. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/repository/profile_transition.py +0 -0
  434. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/repository/remote.py +0 -0
  435. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/repository/schemas/repository-index.schema.json +0 -0
  436. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/repository/snapshot.py +0 -0
  437. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/review_evidence.py +0 -0
  438. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/source_compat/__init__.py +0 -0
  439. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/source_compat/integrity.py +0 -0
  440. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/source_compat/model.py +0 -0
  441. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/source_compat/reader.py +0 -0
  442. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-agent-classification.schema.json +0 -0
  443. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-artifact-evidence.schema.json +0 -0
  444. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-diagnostic.schema.json +0 -0
  445. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-normalized-evidence.schema.json +0 -0
  446. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-profile-pp-1.01.schema.json +0 -0
  447. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-profile-pp-1.02.schema.json +0 -0
  448. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-profile.schema.json +0 -0
  449. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-registry.yaml +0 -0
  450. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-source-profile-0.3.4.schema.json +0 -0
  451. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-source-profile-0.3.6.schema.json +0 -0
  452. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/specification_binding.py +0 -0
  453. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/storage/__init__.py +0 -0
  454. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/storage/local_state.py +0 -0
  455. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/topology.py +0 -0
  456. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/validation/__init__.py +0 -0
  457. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/validation/components.py +0 -0
  458. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/validation/rules.py +0 -0
  459. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/validation/specification.py +0 -0
  460. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/validation/templates.py +0 -0
  461. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/ptsip/validation_capture.py +0 -0
  462. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/vpms/domain/__init__.py +0 -0
  463. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/vpms/domain/model.py +0 -0
  464. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/vpms/domain/registry.py +0 -0
  465. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/vpms/execution/__init__.py +0 -0
  466. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/vpms/execution/adapters/__init__.py +0 -0
  467. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/vpms/execution/adapters/command.py +0 -0
  468. {ptsip-0.3.8a2 → ptsip-0.3.8a4}/src/vpms/integration/__init__.py +0 -0
@@ -0,0 +1,5 @@
1
+ prune src/tests
2
+ recursive-include src/policy *.yaml *.json
3
+ recursive-include src/ptsip/profiles *.ptsip.yaml
4
+ include src/ptsip/profiles/index.yaml
5
+ include registry/project-profile-contracts.yaml
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PTSIP
3
- Version: 0.3.8a2
3
+ Version: 0.3.8a4
4
4
  Summary: Reference tooling for primary lifecycle ownership and responsibility isolation
5
5
  Author: Kinirin
6
6
  Maintainer: Kinirin
@@ -37,13 +37,13 @@ Requires-Dist: setuptools>=77.0.3; extra == "dev"
37
37
  Dynamic: license-file
38
38
 
39
39
  <p align="right">
40
- English | <a href="README.ko.md">한국어</a>
40
+ English | <a href="docs/translated/README.ko.md">한국어</a>
41
41
  </p>
42
42
 
43
43
  # PTSIP — Primary Lifecycle Ownership and Responsibility Isolation Policy
44
44
 
45
- **Status:** Tool `0.3.8a2` repository-namespace stabilization prerelease — publication pending<br>
46
- **Tool/package version:** `0.3.8a2`<br>
45
+ **Status:** Tool `0.3.8a4` Go-native developer automation and release-verification consolidation prerelease — publication pending<br>
46
+ **Tool/package version:** `0.3.8a4`<br>
47
47
  **Project Profile contract:** `pp.1.02`<br>
48
48
  **Specification family:** `0.3.7-draft`<br>
49
49
  **Bound immutable Specification revision:** `3c47816770d194ae42f98faedc911d980db0e62a`<br>
@@ -55,11 +55,11 @@ PTSIP is a project-defined architecture policy for separating project responsibi
55
55
 
56
56
  > **Purpose precedes reuse.** Classify a coherent responsibility by why it exists and which lifecycle owns it before optimizing for code sharing.
57
57
 
58
- Tool `0.3.8a2` is a repository-namespace stabilization prerelease built on the already-published `0.3.8a1` bridge and the same frozen Specification binding. It preserves the proposed-candidate bridge while establishing `.ptsip/` as the canonical repository-local ownership boundary for PTSIP-managed contracts, registries, configuration, task/operation metadata, and execution state. Canonical repository indexes use JSON. This release reserves Task and runtime namespaces but does not claim a completed generic Task Engine, Go runtime, or Tool `0.4.0` capability-recovery implementation.
58
+ Tool `0.3.8a4` consolidates the developer control plane built after `0.3.8a3`: native Go developer automation, Root Family policy lifecycle enforcement, canonical Project Profile storage, deterministic Test Mode routing, and a single release workflow with responsibility-separated Go release verification. The `0.3.8a3` Consumer Context Plane behavior remains available. The Specification family and Project Profile contract identities remain unchanged.
59
59
 
60
60
  ## Primary lifecycle ownership
61
61
 
62
- Canonical Tool `0.3.8a2` classifications remain exactly:
62
+ Canonical Tool `0.3.8a4` classifications remain exactly:
63
63
 
64
64
  | Classification | Meaning |
65
65
  | --- | --- |
@@ -81,9 +81,9 @@ TOOLCHAIN
81
81
  NEUTRAL_CONTRACT
82
82
  ```
83
83
 
84
- Tool `0.3.8a2` preserves the five-classification model established by Tool `0.3.6`. `TOOLCHAIN` is therefore **legacy Tool `0.3.5` input**, not a current canonical alias. A legacy Toolchain responsibility may become `DEVELOPMENT_TOOLING`, `DELIVERY`, `OPERATIONS`, or require a split depending on its actual lifecycle ownership. Blind `TOOLCHAIN -> DEVELOPMENT_TOOLING` rewriting is prohibited.
84
+ Tool `0.3.8a4` preserves the five-classification model established by Tool `0.3.6`. `TOOLCHAIN` is therefore **legacy Tool `0.3.5` input**, not a current canonical alias. A legacy Toolchain responsibility may become `DEVELOPMENT_TOOLING`, `DELIVERY`, `OPERATIONS`, or require a split depending on its actual lifecycle ownership. Blind `TOOLCHAIN -> DEVELOPMENT_TOOLING` rewriting is prohibited.
85
85
 
86
- Tool `0.3.8a2` provides evidence-bound direct current-target migration for explicitly supported historical sources. Migration capability remains separate from repository adoption authority and never turns inference into project intent.
86
+ Tool `0.3.8a4` provides evidence-bound direct current-target migration for explicitly supported historical sources. Migration capability remains separate from repository adoption authority and never turns inference into project intent.
87
87
 
88
88
  ## Classification is not path or technology
89
89
 
@@ -104,7 +104,7 @@ Paths such as `tests/`, `tools/`, `deploy/`, `ops/`, or `.github/workflows/` are
104
104
 
105
105
  ## Responsibility Map v2
106
106
 
107
- Tool `0.3.8a2` uses Responsibility Map v2 as the project-owned architecture declaration model. It keeps several axes independent:
107
+ Tool `0.3.8a4` uses Responsibility Map v2 as the project-owned architecture declaration model. It keeps several axes independent:
108
108
 
109
109
  ```text
110
110
  classification
@@ -233,12 +233,12 @@ Upgrade to the latest **published** release:
233
233
  python -m pip install --upgrade PTSIP
234
234
  ```
235
235
 
236
- Tool `0.3.8a2` is a prerelease. A normal `pip install PTSIP` may continue to select the latest stable release unless prereleases are explicitly requested.
236
+ Tool `0.3.8a4` is a prerelease. A normal `pip install PTSIP` may continue to select the latest stable release unless prereleases are explicitly requested.
237
237
 
238
238
  After publication, install this prerelease explicitly with:
239
239
 
240
240
  ```powershell
241
- python -m pip install "PTSIP==0.3.8a2"
241
+ python -m pip install "PTSIP==0.3.8a4"
242
242
  ```
243
243
 
244
244
  For source development on this release line:
@@ -261,15 +261,26 @@ ptsip clarify .
261
261
  ptsip gate .
262
262
  ptsip resolve --help
263
263
  ptsip conform .
264
+ ptsip context status . --json
265
+ ptsip context check . --json
264
266
  ```
265
267
 
266
268
  New project-owned profiles are selected through `.ptsip/profiles/index.json`; the catalog's `default_profile` resolves the active `*.ptsip.yaml` resource. Repository-root `ptsip.yaml` remains a compatibility/migration input, and an explicit `--profile` path still takes precedence.
267
269
 
270
+ PTSIP developers use that same local catalog and `.ptsip/profiles/main.ptsip.yaml`.
271
+ Profile implementation modules and distributed examples live in
272
+ `src/ptsip/profiles/`. The public catalog is `src/ptsip/profiles/index.yaml`;
273
+ `registry/project-profile-contracts.yaml` explicitly binds this source layout.
274
+ Historical PP baselines under `src/ptsip/profiles/history/` are preserved in
275
+ source distributions for verification and are excluded from wheels. Moving
276
+ storage preserves PP identity and historical bytes; public profile or schema
277
+ semantic changes still require the native Go PP transition gates.
278
+
268
279
  ## Adoption and decision authority
269
280
 
270
281
  Repository evidence is not architecture authority. Candidate discovery, path names, templates, heuristics, and agent confidence can support review but cannot manufacture project intent.
271
282
 
272
- Canonical Tool `0.3.8a2` explicit adoption facts center on `classification` as lifecycle ownership authority. New canonical decisions use facts such as:
283
+ Canonical Tool `0.3.8a4` explicit adoption facts center on `classification` as lifecycle ownership authority. New canonical decisions use facts such as:
273
284
 
274
285
  ```text
275
286
  classification
@@ -279,7 +290,7 @@ runtime_required
279
290
  executable
280
291
  ```
281
292
 
282
- The historical `lifecycle_owner` field is legacy migration evidence, not a second Tool `0.3.8a2` ownership authority.
293
+ The historical `lifecycle_owner` field is legacy migration evidence, not a second Tool `0.3.8a4` ownership authority.
283
294
 
284
295
  Example dry-run:
285
296
 
@@ -344,9 +355,9 @@ PTSIP uses action-time synchronization rather than continuous background polling
344
355
 
345
356
  Artifact ownership is independent from producer ownership. A `DEVELOPMENT_TOOLING` or `DELIVERY` component may validly build a `PRODUCT` artifact, but the resulting artifact must still satisfy the Product package boundary.
346
357
 
347
- Tool `0.3.8a2` supports snapshot-bound Product Artifact evidence. Release verification checks actual built distribution content rather than treating packaging configuration as proof. Product distribution verification rejects definite non-Product implementation leakage under `PTSIP-PKG-001`.
358
+ Tool `0.3.8a4` supports snapshot-bound Product Artifact evidence. Release verification checks actual built distribution content rather than treating packaging configuration as proof. Product distribution verification rejects definite non-Product implementation leakage under `PTSIP-PKG-001`.
348
359
 
349
- ## VPMS — Verification Purpose Management System
360
+ ## VPMS — Verification Protocol Management System
350
361
 
351
362
  PTSIP and VPMS answer different questions:
352
363
 
@@ -355,12 +366,32 @@ PTSIP
355
366
  Who owns this responsibility across its lifecycle?
356
367
 
357
368
  VPMS
358
- Why does this Verification Case exist, and what does it protect?
369
+ How are explicit Verification Cases bound, executed, and reported?
359
370
  ```
360
371
 
361
- PTSIP classification and VPMS Verification Purpose remain separate axes. PTSIP core does not depend on VPMS. VPMS consumes only a narrow read-only projection of already-resolved PTSIP metadata.
372
+ PTSIP classification and the historical VPMS Verification Purpose remain separate axes. The Case `purpose` field is compatibility-only: it does not decide selection, runner binding, or PTSIP classification. PTSIP core does not depend on VPMS.
373
+
374
+ The repository's three product contracts are ACTIVE and separately own the Case/reference/runner protocol, explicit Case selection, and execution composition. The public API is:
375
+
376
+ ```python
377
+ from vpms import load_registry_snapshot, resolve_selection, run_cases
378
+
379
+ loaded = load_registry_snapshot(case_definitions, references=reference_registrations)
380
+ if not loaded.ok:
381
+ raise ValueError(loaded.diagnostics)
382
+ selection = resolve_selection(
383
+ loaded.snapshot, {"kind": "CASE_IDS", "case_ids": ["explicit.case.id"]}
384
+ )
385
+ if not selection.ok:
386
+ raise ValueError(selection.diagnostics)
387
+ results = run_cases(loaded.snapshot, selection, executors=runner_adapters)
388
+ ```
389
+
390
+ `case_definitions`, `reference_registrations`, and `runner_adapters` are explicit caller-owned inputs. Selection fails closed on invalid, duplicate, or unknown IDs. Execution accepts selection bound to the same validated snapshot and preflights every selected adapter before executing the first Case. `SelectionScope`, `select_cases`, and `run_selected_cases` are retired, not compatibility aliases.
391
+
392
+ Optional PTSIP integration uses `ptsip.validation.handoff.load_validated_effective_map` followed by `vpms.integration.ptsip_bridge.metadata_from_effective_map`. ACTIVE `SFP-0023` owns only this read-only boundary: the projection exposes exact component ID and classification from a genuinely validated immutable effective map. A raw dict, a `validated=True` assertion, and the historical `load_ptsip_metadata` compatibility reader are not canonical validation proof or implicit fallbacks. `SFP-0006` is RETIRED with its historical meaning preserved; VPMS product protocol authority resides in the separate product contracts.
362
393
 
363
- The current VPMS compatibility vocabulary may still contain `PRODUCT | TOOLCHAIN`. VPMS `TOOLCHAIN` is not a canonical Tool `0.3.8a2` PTSIP classification.
394
+ The current VPMS compatibility vocabulary may still contain `PRODUCT | TOOLCHAIN`. VPMS `TOOLCHAIN` is not a canonical Tool `0.3.8a4` PTSIP classification.
364
395
 
365
396
  VPMS verification PASS does not imply PTSIP `CONFORMANT`, and PTSIP `CONFORMANT` does not imply functional verification PASS.
366
397
 
@@ -431,6 +462,34 @@ in its Tool release note; advancing the PP contract does not rewrite that Tool h
431
462
 
432
463
  A new immutable revision is required only for a genuine normative change. Release workflow, test, planning, status, or documentation-only changes do not move `SPEC_REVISION` by themselves.
433
464
 
465
+ ## Tool 0.3.8a4 release identity
466
+
467
+ Tool `0.3.8a4` consolidates native Go developer automation, Root Family policy lifecycle enforcement, canonical Project Profile storage, Test Mode routing, and release verification without changing the bound Specification family or Project Profile contract.
468
+
469
+ ```text
470
+ Tool: 0.3.8a4
471
+ Project Profile: pp.1.02
472
+ Specification: 0.3.7-draft
473
+ SPEC_REVISION: 3c47816770d194ae42f98faedc911d980db0e62a
474
+ Release scope: Go-native developer control plane + responsibility-separated release verification
475
+ ```
476
+
477
+ Release preparation and publication use the single `.github/workflows/tooling-release.yml` surface. PREPARE and PUBLISH retain independent exact-source verification. Release readiness is owned by the Go tests under `developer/tests/release/`.
478
+
479
+ ## Tool 0.3.8a3 release identity
480
+
481
+ Tool `0.3.8a3` is an emergency Context Plane migration-semantics patch over the published `0.3.8a2` repository-namespace release.
482
+
483
+ ```text
484
+ Tool: 0.3.8a3
485
+ Project Profile: pp.1.02
486
+ Specification: 0.3.7-draft
487
+ SPEC_REVISION: 3c47816770d194ae42f98faedc911d980db0e62a
488
+ Release scope: deterministic MEMORY.md -> Context Plane migration and projection repair
489
+ ```
490
+
491
+ The canonical semantic write target is `.ptsip/context/source/context.source.json`. Generated `context.json`, `context.jsonl`, and `context.schema.json` are repaired from that source. Semantic ambiguity remains user-owned; deterministic projection repair is preauthorized for coding agents. Unlike Tool `0.3.8a2`, Tool `0.3.8a3` ships this implementation inside the Consumer Tool as `ptsip/context_plane.py`; a release build is invalid if that module or the `ptsip context` CLI surface is absent from the built wheel.
492
+
434
493
  ## Tool 0.3.8a2 release identity
435
494
 
436
495
  Tool `0.3.8a2` is a repository-namespace stabilization prerelease with a deliberately narrow compatibility goal.
@@ -465,7 +524,7 @@ This Tool release does not introduce a new Specification family or Project Profi
465
524
 
466
525
  It adds support for representing a not-yet-existing component as an explicit proposed candidate and resolving that proposal without silently materializing it as an active component. It does not claim completion of the broader Tool `0.4.0` capability-recovery architecture.
467
526
 
468
- Release scope and verification history are recorded in [`releasenote/tool/0.3.8a1.md`](releasenote/tool/0.3.8a1.md). The release gate is defined by [`planning/0.3.8/0.3.8a1-emergency-release-gate.yaml`](planning/0.3.8/0.3.8a1-emergency-release-gate.yaml).
527
+ Release scope and verification history are recorded in [`releasenote/tool/0.3.8a1.md`](releasenote/tool/0.3.8a1.md). The release gate is defined by [`developer/planning/0.3.8/0.3.8a1/0.3.8a1-emergency-release-gate.yaml`](developer/planning/0.3.8/0.3.8a1/0.3.8a1-emergency-release-gate.yaml).
469
528
 
470
529
  ## License authority
471
530
 
@@ -482,8 +541,8 @@ Read-only inspection and Pilot operations remain read-only and do not create rep
482
541
 
483
542
  Repository tooling implementations may physically live under `tools/`, `scripts/`, `src/`, or another project-owned path. Their PTSIP-owned registration, policy bindings, task/operation contracts, indexes, and lifecycle state must not establish an alternative repository-local PTSIP control-plane root.
484
543
 
485
- Canonical machine indexes under `.ptsip/` use JSON. Tool `0.3.8a2` uses `.ptsip/index.json` as the root router and `.ptsip/profiles/index.json` for local Project Profile selection. The Task and runtime namespaces are reserved; runtime persistence details remain future work. A reserved or unavailable Task capability must fail closed for the dependent operation rather than causing an agent to invent a new Task Engine elsewhere in the repository.
544
+ Canonical machine indexes under `.ptsip/` use JSON. Tool `0.3.8a4` uses `.ptsip/index.json` as the root router and `.ptsip/profiles/index.json` for local Project Profile selection. The Task and runtime namespaces are reserved; runtime persistence details remain future work. A reserved or unavailable Task capability must fail closed for the dependent operation rather than causing an agent to invent a new Task Engine elsewhere in the repository.
486
545
 
487
546
  ## Project status
488
547
 
489
- PTSIP remains experimental. Tool `0.3.8a2` is the current namespace-stabilization prerelease candidate; its publication boundary is tracked in [`releasenote/tool/0.3.8a2.md`](releasenote/tool/0.3.8a2.md). Historical Tool releases, including `0.3.8a1`, and Specification notes are preserved under [`releasenote/`](releasenote/).
548
+ PTSIP remains experimental. Tool `0.3.8a4` is the current Go-native developer automation and release-verification consolidation prerelease candidate; its publication boundary is tracked in [`releasenote/tool/0.3.8a4.md`](releasenote/tool/0.3.8a4.md). Historical Tool releases, including `0.3.8a1`, and Specification notes are preserved under [`releasenote/`](releasenote/).
@@ -1,11 +1,11 @@
1
1
  <p align="right">
2
- English | <a href="README.ko.md">한국어</a>
2
+ English | <a href="docs/translated/README.ko.md">한국어</a>
3
3
  </p>
4
4
 
5
5
  # PTSIP — Primary Lifecycle Ownership and Responsibility Isolation Policy
6
6
 
7
- **Status:** Tool `0.3.8a2` repository-namespace stabilization prerelease — publication pending<br>
8
- **Tool/package version:** `0.3.8a2`<br>
7
+ **Status:** Tool `0.3.8a4` Go-native developer automation and release-verification consolidation prerelease — publication pending<br>
8
+ **Tool/package version:** `0.3.8a4`<br>
9
9
  **Project Profile contract:** `pp.1.02`<br>
10
10
  **Specification family:** `0.3.7-draft`<br>
11
11
  **Bound immutable Specification revision:** `3c47816770d194ae42f98faedc911d980db0e62a`<br>
@@ -17,11 +17,11 @@ PTSIP is a project-defined architecture policy for separating project responsibi
17
17
 
18
18
  > **Purpose precedes reuse.** Classify a coherent responsibility by why it exists and which lifecycle owns it before optimizing for code sharing.
19
19
 
20
- Tool `0.3.8a2` is a repository-namespace stabilization prerelease built on the already-published `0.3.8a1` bridge and the same frozen Specification binding. It preserves the proposed-candidate bridge while establishing `.ptsip/` as the canonical repository-local ownership boundary for PTSIP-managed contracts, registries, configuration, task/operation metadata, and execution state. Canonical repository indexes use JSON. This release reserves Task and runtime namespaces but does not claim a completed generic Task Engine, Go runtime, or Tool `0.4.0` capability-recovery implementation.
20
+ Tool `0.3.8a4` consolidates the developer control plane built after `0.3.8a3`: native Go developer automation, Root Family policy lifecycle enforcement, canonical Project Profile storage, deterministic Test Mode routing, and a single release workflow with responsibility-separated Go release verification. The `0.3.8a3` Consumer Context Plane behavior remains available. The Specification family and Project Profile contract identities remain unchanged.
21
21
 
22
22
  ## Primary lifecycle ownership
23
23
 
24
- Canonical Tool `0.3.8a2` classifications remain exactly:
24
+ Canonical Tool `0.3.8a4` classifications remain exactly:
25
25
 
26
26
  | Classification | Meaning |
27
27
  | --- | --- |
@@ -43,9 +43,9 @@ TOOLCHAIN
43
43
  NEUTRAL_CONTRACT
44
44
  ```
45
45
 
46
- Tool `0.3.8a2` preserves the five-classification model established by Tool `0.3.6`. `TOOLCHAIN` is therefore **legacy Tool `0.3.5` input**, not a current canonical alias. A legacy Toolchain responsibility may become `DEVELOPMENT_TOOLING`, `DELIVERY`, `OPERATIONS`, or require a split depending on its actual lifecycle ownership. Blind `TOOLCHAIN -> DEVELOPMENT_TOOLING` rewriting is prohibited.
46
+ Tool `0.3.8a4` preserves the five-classification model established by Tool `0.3.6`. `TOOLCHAIN` is therefore **legacy Tool `0.3.5` input**, not a current canonical alias. A legacy Toolchain responsibility may become `DEVELOPMENT_TOOLING`, `DELIVERY`, `OPERATIONS`, or require a split depending on its actual lifecycle ownership. Blind `TOOLCHAIN -> DEVELOPMENT_TOOLING` rewriting is prohibited.
47
47
 
48
- Tool `0.3.8a2` provides evidence-bound direct current-target migration for explicitly supported historical sources. Migration capability remains separate from repository adoption authority and never turns inference into project intent.
48
+ Tool `0.3.8a4` provides evidence-bound direct current-target migration for explicitly supported historical sources. Migration capability remains separate from repository adoption authority and never turns inference into project intent.
49
49
 
50
50
  ## Classification is not path or technology
51
51
 
@@ -66,7 +66,7 @@ Paths such as `tests/`, `tools/`, `deploy/`, `ops/`, or `.github/workflows/` are
66
66
 
67
67
  ## Responsibility Map v2
68
68
 
69
- Tool `0.3.8a2` uses Responsibility Map v2 as the project-owned architecture declaration model. It keeps several axes independent:
69
+ Tool `0.3.8a4` uses Responsibility Map v2 as the project-owned architecture declaration model. It keeps several axes independent:
70
70
 
71
71
  ```text
72
72
  classification
@@ -195,12 +195,12 @@ Upgrade to the latest **published** release:
195
195
  python -m pip install --upgrade PTSIP
196
196
  ```
197
197
 
198
- Tool `0.3.8a2` is a prerelease. A normal `pip install PTSIP` may continue to select the latest stable release unless prereleases are explicitly requested.
198
+ Tool `0.3.8a4` is a prerelease. A normal `pip install PTSIP` may continue to select the latest stable release unless prereleases are explicitly requested.
199
199
 
200
200
  After publication, install this prerelease explicitly with:
201
201
 
202
202
  ```powershell
203
- python -m pip install "PTSIP==0.3.8a2"
203
+ python -m pip install "PTSIP==0.3.8a4"
204
204
  ```
205
205
 
206
206
  For source development on this release line:
@@ -223,15 +223,26 @@ ptsip clarify .
223
223
  ptsip gate .
224
224
  ptsip resolve --help
225
225
  ptsip conform .
226
+ ptsip context status . --json
227
+ ptsip context check . --json
226
228
  ```
227
229
 
228
230
  New project-owned profiles are selected through `.ptsip/profiles/index.json`; the catalog's `default_profile` resolves the active `*.ptsip.yaml` resource. Repository-root `ptsip.yaml` remains a compatibility/migration input, and an explicit `--profile` path still takes precedence.
229
231
 
232
+ PTSIP developers use that same local catalog and `.ptsip/profiles/main.ptsip.yaml`.
233
+ Profile implementation modules and distributed examples live in
234
+ `src/ptsip/profiles/`. The public catalog is `src/ptsip/profiles/index.yaml`;
235
+ `registry/project-profile-contracts.yaml` explicitly binds this source layout.
236
+ Historical PP baselines under `src/ptsip/profiles/history/` are preserved in
237
+ source distributions for verification and are excluded from wheels. Moving
238
+ storage preserves PP identity and historical bytes; public profile or schema
239
+ semantic changes still require the native Go PP transition gates.
240
+
230
241
  ## Adoption and decision authority
231
242
 
232
243
  Repository evidence is not architecture authority. Candidate discovery, path names, templates, heuristics, and agent confidence can support review but cannot manufacture project intent.
233
244
 
234
- Canonical Tool `0.3.8a2` explicit adoption facts center on `classification` as lifecycle ownership authority. New canonical decisions use facts such as:
245
+ Canonical Tool `0.3.8a4` explicit adoption facts center on `classification` as lifecycle ownership authority. New canonical decisions use facts such as:
235
246
 
236
247
  ```text
237
248
  classification
@@ -241,7 +252,7 @@ runtime_required
241
252
  executable
242
253
  ```
243
254
 
244
- The historical `lifecycle_owner` field is legacy migration evidence, not a second Tool `0.3.8a2` ownership authority.
255
+ The historical `lifecycle_owner` field is legacy migration evidence, not a second Tool `0.3.8a4` ownership authority.
245
256
 
246
257
  Example dry-run:
247
258
 
@@ -306,9 +317,9 @@ PTSIP uses action-time synchronization rather than continuous background polling
306
317
 
307
318
  Artifact ownership is independent from producer ownership. A `DEVELOPMENT_TOOLING` or `DELIVERY` component may validly build a `PRODUCT` artifact, but the resulting artifact must still satisfy the Product package boundary.
308
319
 
309
- Tool `0.3.8a2` supports snapshot-bound Product Artifact evidence. Release verification checks actual built distribution content rather than treating packaging configuration as proof. Product distribution verification rejects definite non-Product implementation leakage under `PTSIP-PKG-001`.
320
+ Tool `0.3.8a4` supports snapshot-bound Product Artifact evidence. Release verification checks actual built distribution content rather than treating packaging configuration as proof. Product distribution verification rejects definite non-Product implementation leakage under `PTSIP-PKG-001`.
310
321
 
311
- ## VPMS — Verification Purpose Management System
322
+ ## VPMS — Verification Protocol Management System
312
323
 
313
324
  PTSIP and VPMS answer different questions:
314
325
 
@@ -317,12 +328,32 @@ PTSIP
317
328
  Who owns this responsibility across its lifecycle?
318
329
 
319
330
  VPMS
320
- Why does this Verification Case exist, and what does it protect?
331
+ How are explicit Verification Cases bound, executed, and reported?
321
332
  ```
322
333
 
323
- PTSIP classification and VPMS Verification Purpose remain separate axes. PTSIP core does not depend on VPMS. VPMS consumes only a narrow read-only projection of already-resolved PTSIP metadata.
334
+ PTSIP classification and the historical VPMS Verification Purpose remain separate axes. The Case `purpose` field is compatibility-only: it does not decide selection, runner binding, or PTSIP classification. PTSIP core does not depend on VPMS.
335
+
336
+ The repository's three product contracts are ACTIVE and separately own the Case/reference/runner protocol, explicit Case selection, and execution composition. The public API is:
337
+
338
+ ```python
339
+ from vpms import load_registry_snapshot, resolve_selection, run_cases
340
+
341
+ loaded = load_registry_snapshot(case_definitions, references=reference_registrations)
342
+ if not loaded.ok:
343
+ raise ValueError(loaded.diagnostics)
344
+ selection = resolve_selection(
345
+ loaded.snapshot, {"kind": "CASE_IDS", "case_ids": ["explicit.case.id"]}
346
+ )
347
+ if not selection.ok:
348
+ raise ValueError(selection.diagnostics)
349
+ results = run_cases(loaded.snapshot, selection, executors=runner_adapters)
350
+ ```
351
+
352
+ `case_definitions`, `reference_registrations`, and `runner_adapters` are explicit caller-owned inputs. Selection fails closed on invalid, duplicate, or unknown IDs. Execution accepts selection bound to the same validated snapshot and preflights every selected adapter before executing the first Case. `SelectionScope`, `select_cases`, and `run_selected_cases` are retired, not compatibility aliases.
353
+
354
+ Optional PTSIP integration uses `ptsip.validation.handoff.load_validated_effective_map` followed by `vpms.integration.ptsip_bridge.metadata_from_effective_map`. ACTIVE `SFP-0023` owns only this read-only boundary: the projection exposes exact component ID and classification from a genuinely validated immutable effective map. A raw dict, a `validated=True` assertion, and the historical `load_ptsip_metadata` compatibility reader are not canonical validation proof or implicit fallbacks. `SFP-0006` is RETIRED with its historical meaning preserved; VPMS product protocol authority resides in the separate product contracts.
324
355
 
325
- The current VPMS compatibility vocabulary may still contain `PRODUCT | TOOLCHAIN`. VPMS `TOOLCHAIN` is not a canonical Tool `0.3.8a2` PTSIP classification.
356
+ The current VPMS compatibility vocabulary may still contain `PRODUCT | TOOLCHAIN`. VPMS `TOOLCHAIN` is not a canonical Tool `0.3.8a4` PTSIP classification.
326
357
 
327
358
  VPMS verification PASS does not imply PTSIP `CONFORMANT`, and PTSIP `CONFORMANT` does not imply functional verification PASS.
328
359
 
@@ -393,6 +424,34 @@ in its Tool release note; advancing the PP contract does not rewrite that Tool h
393
424
 
394
425
  A new immutable revision is required only for a genuine normative change. Release workflow, test, planning, status, or documentation-only changes do not move `SPEC_REVISION` by themselves.
395
426
 
427
+ ## Tool 0.3.8a4 release identity
428
+
429
+ Tool `0.3.8a4` consolidates native Go developer automation, Root Family policy lifecycle enforcement, canonical Project Profile storage, Test Mode routing, and release verification without changing the bound Specification family or Project Profile contract.
430
+
431
+ ```text
432
+ Tool: 0.3.8a4
433
+ Project Profile: pp.1.02
434
+ Specification: 0.3.7-draft
435
+ SPEC_REVISION: 3c47816770d194ae42f98faedc911d980db0e62a
436
+ Release scope: Go-native developer control plane + responsibility-separated release verification
437
+ ```
438
+
439
+ Release preparation and publication use the single `.github/workflows/tooling-release.yml` surface. PREPARE and PUBLISH retain independent exact-source verification. Release readiness is owned by the Go tests under `developer/tests/release/`.
440
+
441
+ ## Tool 0.3.8a3 release identity
442
+
443
+ Tool `0.3.8a3` is an emergency Context Plane migration-semantics patch over the published `0.3.8a2` repository-namespace release.
444
+
445
+ ```text
446
+ Tool: 0.3.8a3
447
+ Project Profile: pp.1.02
448
+ Specification: 0.3.7-draft
449
+ SPEC_REVISION: 3c47816770d194ae42f98faedc911d980db0e62a
450
+ Release scope: deterministic MEMORY.md -> Context Plane migration and projection repair
451
+ ```
452
+
453
+ The canonical semantic write target is `.ptsip/context/source/context.source.json`. Generated `context.json`, `context.jsonl`, and `context.schema.json` are repaired from that source. Semantic ambiguity remains user-owned; deterministic projection repair is preauthorized for coding agents. Unlike Tool `0.3.8a2`, Tool `0.3.8a3` ships this implementation inside the Consumer Tool as `ptsip/context_plane.py`; a release build is invalid if that module or the `ptsip context` CLI surface is absent from the built wheel.
454
+
396
455
  ## Tool 0.3.8a2 release identity
397
456
 
398
457
  Tool `0.3.8a2` is a repository-namespace stabilization prerelease with a deliberately narrow compatibility goal.
@@ -427,7 +486,7 @@ This Tool release does not introduce a new Specification family or Project Profi
427
486
 
428
487
  It adds support for representing a not-yet-existing component as an explicit proposed candidate and resolving that proposal without silently materializing it as an active component. It does not claim completion of the broader Tool `0.4.0` capability-recovery architecture.
429
488
 
430
- Release scope and verification history are recorded in [`releasenote/tool/0.3.8a1.md`](releasenote/tool/0.3.8a1.md). The release gate is defined by [`planning/0.3.8/0.3.8a1-emergency-release-gate.yaml`](planning/0.3.8/0.3.8a1-emergency-release-gate.yaml).
489
+ Release scope and verification history are recorded in [`releasenote/tool/0.3.8a1.md`](releasenote/tool/0.3.8a1.md). The release gate is defined by [`developer/planning/0.3.8/0.3.8a1/0.3.8a1-emergency-release-gate.yaml`](developer/planning/0.3.8/0.3.8a1/0.3.8a1-emergency-release-gate.yaml).
431
490
 
432
491
  ## License authority
433
492
 
@@ -444,8 +503,8 @@ Read-only inspection and Pilot operations remain read-only and do not create rep
444
503
 
445
504
  Repository tooling implementations may physically live under `tools/`, `scripts/`, `src/`, or another project-owned path. Their PTSIP-owned registration, policy bindings, task/operation contracts, indexes, and lifecycle state must not establish an alternative repository-local PTSIP control-plane root.
446
505
 
447
- Canonical machine indexes under `.ptsip/` use JSON. Tool `0.3.8a2` uses `.ptsip/index.json` as the root router and `.ptsip/profiles/index.json` for local Project Profile selection. The Task and runtime namespaces are reserved; runtime persistence details remain future work. A reserved or unavailable Task capability must fail closed for the dependent operation rather than causing an agent to invent a new Task Engine elsewhere in the repository.
506
+ Canonical machine indexes under `.ptsip/` use JSON. Tool `0.3.8a4` uses `.ptsip/index.json` as the root router and `.ptsip/profiles/index.json` for local Project Profile selection. The Task and runtime namespaces are reserved; runtime persistence details remain future work. A reserved or unavailable Task capability must fail closed for the dependent operation rather than causing an agent to invent a new Task Engine elsewhere in the repository.
448
507
 
449
508
  ## Project status
450
509
 
451
- PTSIP remains experimental. Tool `0.3.8a2` is the current namespace-stabilization prerelease candidate; its publication boundary is tracked in [`releasenote/tool/0.3.8a2.md`](releasenote/tool/0.3.8a2.md). Historical Tool releases, including `0.3.8a1`, and Specification notes are preserved under [`releasenote/`](releasenote/).
510
+ PTSIP remains experimental. Tool `0.3.8a4` is the current Go-native developer automation and release-verification consolidation prerelease candidate; its publication boundary is tracked in [`releasenote/tool/0.3.8a4.md`](releasenote/tool/0.3.8a4.md). Historical Tool releases, including `0.3.8a1`, and Specification notes are preserved under [`releasenote/`](releasenote/).
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "PTSIP"
7
- version = "0.3.8a2"
7
+ version = "0.3.8a4"
8
8
  description = "Reference tooling for primary lifecycle ownership and responsibility isolation"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -45,8 +45,14 @@ ptsip-app = "ptsip.app.server:main"
45
45
  [tool.setuptools.packages.find]
46
46
  where = ["src"]
47
47
  include = ["ptsip*", "vpms*", "agent_contracts*"]
48
+ exclude = ["tests*", "ptsip.profiles.history*"]
48
49
 
49
50
  [tool.setuptools.package-data]
51
+ "ptsip.profiles" = ["index.yaml", "*.ptsip.yaml"]
52
+ vpms = [
53
+ "contracts/*.json",
54
+ "contracts/schemas/*.json",
55
+ ]
50
56
  ptsip = [
51
57
  "specdata/*.json",
52
58
  "specdata/*.yaml",
@@ -69,6 +75,17 @@ agent_contracts = [
69
75
  "gates/*.yaml",
70
76
  "vocabulary/*.yaml",
71
77
  "bindings/*.yaml",
78
+ "index.json",
79
+ "contracts/current.json",
80
+ "conformance/current.json",
81
+ "promotion/current.json",
82
+ "promotion/index.json",
83
+ "promotion/specification-contract.json",
84
+ "canonicalization/*.json",
85
+ "digests/*.json",
86
+ "schemas/candidate-index.schema.json",
87
+ "schemas/candidate-group.schema.json",
88
+ "schemas/candidate-vectors.schema.json",
72
89
  ]
73
90
 
74
91
  [project.optional-dependencies]
@@ -80,3 +97,6 @@ dev = [
80
97
  "pytest>=8,<9",
81
98
  "setuptools>=77.0.3",
82
99
  ]
100
+
101
+ [tool.setuptools.exclude-package-data]
102
+ "ptsip.profiles" = ["history/*", "history/**"]
@@ -1,6 +1,11 @@
1
1
  schema_version: ptsip-project-profile-contract-registry/v1
2
2
  authority: PTSIP_PROJECT_PROFILE_CONTRACT_IDENTITY
3
3
  current: pp.1.02
4
+ profile_source:
5
+ root: src/ptsip/profiles
6
+ catalog: src/ptsip/profiles/index.yaml
7
+ history_root: src/ptsip/profiles/history
8
+ history_distribution: SOURCE_ONLY
4
9
  contracts:
5
10
  - version: pp.0.00
6
11
  lifecycle: LEGACY_COMPATIBILITY_ONLY
@@ -15,7 +20,7 @@ contracts:
15
20
  - ANALYZE
16
21
  - CREATE_TARGET
17
22
  schema: schemas/ptsip-profile-pp-1.01.schema.json
18
- baseline: profiles/history/pp.1.01
23
+ baseline: src/ptsip/profiles/history/pp.1.01
19
24
  - version: pp.1.02
20
25
  lifecycle: CURRENT
21
26
  operations:
@@ -24,7 +29,7 @@ contracts:
24
29
  - ANALYZE
25
30
  - CREATE_TARGET
26
31
  schema: schemas/ptsip-profile-pp-1.02.schema.json
27
- baseline: profiles/history/pp.1.02
32
+ baseline: src/ptsip/profiles/history/pp.1.02
28
33
  transitions:
29
34
  - from: pp.1.01
30
35
  to: pp.1.02
@@ -9,8 +9,8 @@ from setuptools.command.build_py import build_py as _build_py
9
9
 
10
10
 
11
11
  ROOT = Path(__file__).resolve().parent
12
- CANONICAL_SUPPORT_POLICY = ROOT / "docs" / "Support_policy" / "policy"
13
- CANONICAL_PUBLIC_PROFILES = ROOT / "profiles"
12
+ CANONICAL_SUPPORT_POLICY = ROOT / "src" / "policy"
13
+ CANONICAL_PUBLIC_PROFILES = ROOT / "src" / "ptsip" / "profiles"
14
14
  CANONICAL_PUBLIC_PROFILE_CATALOG = CANONICAL_PUBLIC_PROFILES / "index.yaml"
15
15
  CANONICAL_PP_CONTRACT_REGISTRY = ROOT / "registry" / "project-profile-contracts.yaml"
16
16
  EMBEDDED_PP_CONTRACT_REGISTRY = (
@@ -40,11 +40,14 @@ def _project_support_policy(build_lib: Path) -> None:
40
40
  policy_target.mkdir(parents=True, exist_ok=True)
41
41
  copy2(source / "index.yaml", policy_target / "index.yaml")
42
42
 
43
- sfp_files = sorted(source.glob("SFP-*.yaml"))
43
+ sfp_files = sorted(source.rglob("SFP-*.yaml"))
44
44
  if not sfp_files:
45
45
  raise RuntimeError("canonical Support Policy source contains no SFP records")
46
46
  for path in sfp_files:
47
- copy2(path, policy_target / path.name)
47
+ relative = path.relative_to(source)
48
+ destination = policy_target / relative
49
+ destination.parent.mkdir(parents=True, exist_ok=True)
50
+ copy2(path, destination)
48
51
 
49
52
  copytree(source / "schemas", target / "schemas")
50
53
  copytree(source / "registries", target / "registries")
@@ -52,8 +55,8 @@ def _project_support_policy(build_lib: Path) -> None:
52
55
 
53
56
  def _registered_public_profile_resources() -> tuple[str, ...]:
54
57
  catalog = _load_yaml(CANONICAL_PUBLIC_PROFILE_CATALOG)
55
- if catalog.get("root") != "profiles":
56
- raise RuntimeError("public Profile catalog root must be 'profiles'")
58
+ if catalog.get("root") != "src/ptsip/profiles":
59
+ raise RuntimeError("public Profile catalog root must be 'src/ptsip/profiles'")
57
60
 
58
61
  profiles = catalog.get("profiles")
59
62
  if not isinstance(profiles, list) or not profiles:
@@ -115,7 +118,7 @@ def _registered_profile_baselines() -> tuple[tuple[str, Path], ...]:
115
118
  continue
116
119
  if not isinstance(version, str) or not isinstance(baseline, str):
117
120
  raise RuntimeError("Project Profile baseline binding is invalid")
118
- expected = f"profiles/history/{version}"
121
+ expected = f"src/ptsip/profiles/history/{version}"
119
122
  if baseline != expected:
120
123
  raise RuntimeError(
121
124
  f"Project Profile baseline {baseline!r} must equal {expected!r}"
@@ -123,38 +126,48 @@ def _registered_profile_baselines() -> tuple[tuple[str, Path], ...]:
123
126
  source = ROOT / baseline
124
127
  if not source.is_dir():
125
128
  raise RuntimeError(f"registered Project Profile baseline is missing: {baseline}")
129
+ if not any(source.glob("*.ptsip.yaml")):
130
+ raise RuntimeError(f"registered Project Profile baseline is empty: {baseline}")
126
131
  baselines.append((version, source))
127
132
 
128
133
  current_baseline = current_matches[0].get("baseline")
129
- if current_baseline != f"profiles/history/{current}":
134
+ if current_baseline != f"src/ptsip/profiles/history/{current}":
130
135
  raise RuntimeError("current Project Profile contract must bind its generation baseline")
131
136
  return tuple(baselines)
132
137
 
133
138
 
134
139
  def _project_public_profiles(build_lib: Path) -> None:
135
140
  resources = _registered_public_profile_resources()
136
- baselines = _registered_profile_baselines()
141
+ _registered_profile_baselines()
137
142
 
138
143
  target = build_lib / "ptsip" / "profiles"
139
- if target.exists():
140
- rmtree(target)
141
144
  target.mkdir(parents=True, exist_ok=True)
145
+ # Preserve modules copied by build_py. History is source-only, including
146
+ # stale output left by an earlier build that shipped historical baselines.
147
+ history_target = target / "history"
148
+ if history_target.exists():
149
+ if not history_target.resolve().is_relative_to(build_lib.resolve()):
150
+ raise RuntimeError("historical build output escapes build directory")
151
+ rmtree(history_target)
152
+ for name in (
153
+ "profile_identity", "profile_metadata", "profile_compatibility",
154
+ "local_profile_catalog", "project_profile_contracts",
155
+ ):
156
+ retired = target.parent / f"{name}.py"
157
+ if retired.exists():
158
+ if not retired.resolve().is_relative_to(build_lib.resolve()):
159
+ raise RuntimeError("retired profile output escapes build directory")
160
+ retired.unlink()
161
+ for stale in target.glob("*.ptsip.yaml"):
162
+ if stale.name not in resources:
163
+ if not stale.resolve().is_relative_to(build_lib.resolve()):
164
+ raise RuntimeError("stale profile output escapes build directory")
165
+ stale.unlink()
142
166
 
143
167
  copy2(CANONICAL_PUBLIC_PROFILE_CATALOG, target / "index.yaml")
144
168
  for resource in resources:
145
169
  copy2(CANONICAL_PUBLIC_PROFILES / resource, target / resource)
146
170
 
147
- for version, source in baselines:
148
- history_target = target / "history" / version
149
- history_target.mkdir(parents=True, exist_ok=True)
150
- baseline_resources = sorted(source.glob("*.ptsip.yaml"))
151
- if not baseline_resources:
152
- raise RuntimeError(
153
- f"registered Project Profile baseline contains no profiles: {source}"
154
- )
155
- for path in baseline_resources:
156
- copy2(path, history_target / path.name)
157
-
158
171
  specdata_target = build_lib / "ptsip" / "specdata"
159
172
  specdata_target.mkdir(parents=True, exist_ok=True)
160
173
  copy2(