PTSIP 0.3.8a3__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 (467) hide show
  1. ptsip-0.3.8a4/MANIFEST.in +5 -0
  2. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/PKG-INFO +64 -21
  3. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/README.md +63 -20
  4. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/pyproject.toml +21 -1
  5. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/registry/project-profile-contracts.yaml +7 -2
  6. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/setup.py +35 -22
  7. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/PTSIP.egg-info/PKG-INFO +64 -21
  8. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/PTSIP.egg-info/SOURCES.txt +187 -65
  9. {ptsip-0.3.8a3 → 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.8a3/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-0023.yaml +20 -0
  53. ptsip-0.3.8a4/src/policy/legacy/SFP-0024.yaml +118 -0
  54. {ptsip-0.3.8a3/docs/Support_policy → ptsip-0.3.8a4/src}/policy/registries/ptsip-support-authority-role-registry.yaml +146 -0
  55. {ptsip-0.3.8a3/docs/Support_policy → ptsip-0.3.8a4/src}/policy/registries/ptsip-support-authority-schema-registry.yaml +135 -0
  56. ptsip-0.3.8a4/src/policy/registries/ptsip-support-authority-subject-registry.yaml +75 -0
  57. ptsip-0.3.8a4/src/policy/registries/root-family-migration.json +3097 -0
  58. ptsip-0.3.8a4/src/policy/registries/root-family-projection-module-admission.json +23 -0
  59. ptsip-0.3.8a4/src/policy/registries/root-family-projection.module.json +201 -0
  60. {ptsip-0.3.8a3/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-authority-eligibility-result.schema.json +1 -1
  61. {ptsip-0.3.8a3/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-authority-role.schema.json +4 -1
  62. {ptsip-0.3.8a3/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-authority-semantics.schema.json +276 -0
  63. {ptsip-0.3.8a3/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-feature-policy-index.schema.json +15 -4
  64. {ptsip-0.3.8a3/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-feature-policy.schema.json +4 -4
  65. ptsip-0.3.8a4/src/policy/schemas/ptsip-support-project-authority-record.schema.json +136 -0
  66. ptsip-0.3.8a4/src/policy/schemas/ptsip-support-root-family-policy.schema.json +206 -0
  67. {ptsip-0.3.8a3/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-subject-binding.schema.json +1 -1
  68. ptsip-0.3.8a4/src/policy/schemas/root-family-migration.schema.json +240 -0
  69. ptsip-0.3.8a4/src/policy/schemas/root-family-projection-module.schema.json +276 -0
  70. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/operations/migrate-profile.yaml +6 -3
  71. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/operations/validate.yaml +1 -1
  72. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/resolution/profile_projection.py +5 -5
  73. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/cli.py +1 -1
  74. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/constants.py +1 -1
  75. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/governance/authority.py +349 -7
  76. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/governance/support_assets.py +2 -2
  77. ptsip-0.3.8a4/src/ptsip/migration/__init__.py +156 -0
  78. ptsip-0.3.8a4/src/ptsip/migration/analysis/__init__.py +20 -0
  79. ptsip-0.3.8a4/src/ptsip/migration/analysis/analyzer.py +160 -0
  80. ptsip-0.3.8a4/src/ptsip/migration/analysis/direct/__init__.py +5 -0
  81. ptsip-0.3.8a4/src/ptsip/migration/analysis/direct/convergence.py +133 -0
  82. ptsip-0.3.8a4/src/ptsip/migration/analysis/direct/result.py +91 -0
  83. ptsip-0.3.8a4/src/ptsip/migration/analysis/direct/source_projection.py +42 -0
  84. ptsip-0.3.8a4/src/ptsip/migration/analysis/direct/target_projection.py +71 -0
  85. ptsip-0.3.8a4/src/ptsip/migration/analysis/findings/__init__.py +0 -0
  86. ptsip-0.3.8a4/src/ptsip/migration/analysis/findings/architecture.py +29 -0
  87. ptsip-0.3.8a4/src/ptsip/migration/analysis/findings/lifecycle.py +28 -0
  88. ptsip-0.3.8a4/src/ptsip/migration/analysis/findings/work_requirements.py +103 -0
  89. ptsip-0.3.8a4/src/ptsip/migration/analysis/issue.py +12 -0
  90. ptsip-0.3.8a4/src/ptsip/migration/analysis/result.py +69 -0
  91. ptsip-0.3.8a4/src/ptsip/migration/analysis/source/__init__.py +0 -0
  92. ptsip-0.3.8a4/src/ptsip/migration/analysis/source/binding_validation.py +43 -0
  93. ptsip-0.3.8a4/src/ptsip/migration/analysis/source/evidence_correlation.py +40 -0
  94. ptsip-0.3.8a4/src/ptsip/migration/analysis/source/projection.py +252 -0
  95. ptsip-0.3.8a4/src/ptsip/migration/analysis/source/repository_resolution.py +96 -0
  96. ptsip-0.3.8a4/src/ptsip/migration/analysis/target/__init__.py +0 -0
  97. ptsip-0.3.8a4/src/ptsip/migration/analysis/target/compatibility.py +142 -0
  98. ptsip-0.3.8a4/src/ptsip/migration/analysis/target/relationship_findings.py +20 -0
  99. ptsip-0.3.8a4/src/ptsip/migration/analysis/target/semantics.py +159 -0
  100. ptsip-0.3.8a4/src/ptsip/migration/execution/__init__.py +5 -0
  101. ptsip-0.3.8a4/src/ptsip/migration/execution/authorization/__init__.py +4 -0
  102. ptsip-0.3.8a4/src/ptsip/migration/execution/authorization/binding.py +160 -0
  103. ptsip-0.3.8a4/src/ptsip/migration/execution/authorization/preconditions.py +71 -0
  104. ptsip-0.3.8a4/src/ptsip/migration/execution/authorization/proof.py +80 -0
  105. ptsip-0.3.8a4/src/ptsip/migration/execution/direct/__init__.py +9 -0
  106. ptsip-0.3.8a4/src/ptsip/migration/execution/direct/identity_plan.py +133 -0
  107. {ptsip-0.3.8a3/src/ptsip/migration → ptsip-0.3.8a4/src/ptsip/migration/execution/direct}/identity_rewrite.py +10 -142
  108. ptsip-0.3.8a3/src/ptsip/migration/direct_execution.py → ptsip-0.3.8a4/src/ptsip/migration/execution/direct/promotion.py +14 -125
  109. ptsip-0.3.8a4/src/ptsip/migration/execution/direct/verification.py +118 -0
  110. ptsip-0.3.8a4/src/ptsip/migration/execution/error.py +2 -0
  111. ptsip-0.3.8a4/src/ptsip/migration/execution/guard/__init__.py +3 -0
  112. ptsip-0.3.8a4/src/ptsip/migration/execution/guard/mutation.py +104 -0
  113. ptsip-0.3.8a4/src/ptsip/migration/execution/guard/repository_snapshot.py +47 -0
  114. ptsip-0.3.8a4/src/ptsip/migration/execution/ledger/__init__.py +3 -0
  115. ptsip-0.3.8a3/src/ptsip/migration/execution_ledger.py → ptsip-0.3.8a4/src/ptsip/migration/execution/ledger/record.py +3 -110
  116. ptsip-0.3.8a4/src/ptsip/migration/execution/ledger/store.py +113 -0
  117. ptsip-0.3.8a4/src/ptsip/migration/execution/mutation/__init__.py +5 -0
  118. ptsip-0.3.8a4/src/ptsip/migration/execution/mutation/asynchronous.py +41 -0
  119. ptsip-0.3.8a3/src/ptsip/migration/execution_apply.py → ptsip-0.3.8a4/src/ptsip/migration/execution/mutation/delta.py +11 -176
  120. ptsip-0.3.8a4/src/ptsip/migration/execution/mutation/finalization.py +90 -0
  121. ptsip-0.3.8a4/src/ptsip/migration/execution/mutation/source.py +57 -0
  122. ptsip-0.3.8a4/src/ptsip/migration/execution/promotion/__init__.py +4 -0
  123. ptsip-0.3.8a4/src/ptsip/migration/execution/promotion/mutation.py +55 -0
  124. ptsip-0.3.8a4/src/ptsip/migration/execution/promotion/preparation.py +79 -0
  125. ptsip-0.3.8a4/src/ptsip/migration/execution/promotion/verification.py +87 -0
  126. ptsip-0.3.8a4/src/ptsip/migration/execution/recovery.py +93 -0
  127. ptsip-0.3.8a4/src/ptsip/migration/execution/state/__init__.py +3 -0
  128. ptsip-0.3.8a4/src/ptsip/migration/execution/state/phase.py +17 -0
  129. ptsip-0.3.8a4/src/ptsip/migration/execution/state/promotion.py +25 -0
  130. ptsip-0.3.8a4/src/ptsip/migration/execution/state/recovery.py +31 -0
  131. ptsip-0.3.8a4/src/ptsip/migration/execution/state/source_steps.py +78 -0
  132. ptsip-0.3.8a4/src/ptsip/migration/planning/__init__.py +12 -0
  133. ptsip-0.3.8a4/src/ptsip/migration/planning/convergence/__init__.py +0 -0
  134. ptsip-0.3.8a4/src/ptsip/migration/planning/convergence/builder.py +324 -0
  135. ptsip-0.3.8a4/src/ptsip/migration/planning/convergence/final_state.py +132 -0
  136. ptsip-0.3.8a4/src/ptsip/migration/planning/convergence/reconciliation.py +175 -0
  137. ptsip-0.3.8a4/src/ptsip/migration/planning/direct/__init__.py +3 -0
  138. ptsip-0.3.8a3/src/ptsip/migration/direct_planner.py → ptsip-0.3.8a4/src/ptsip/migration/planning/direct/builder.py +9 -37
  139. ptsip-0.3.8a4/src/ptsip/migration/planning/direct/reference.py +26 -0
  140. ptsip-0.3.8a4/src/ptsip/migration/planning/proposal_derivation.py +137 -0
  141. ptsip-0.3.8a4/src/ptsip/migration/planning/result.py +106 -0
  142. ptsip-0.3.8a4/src/ptsip/migration/proposal/__init__.py +9 -0
  143. ptsip-0.3.8a3/src/ptsip/migration/proposal.py → ptsip-0.3.8a4/src/ptsip/migration/proposal/bundle.py +4 -172
  144. ptsip-0.3.8a4/src/ptsip/migration/proposal/semantic_identity.py +40 -0
  145. ptsip-0.3.8a4/src/ptsip/migration/proposal/source_set.py +50 -0
  146. ptsip-0.3.8a4/src/ptsip/migration/proposal/target_delta.py +88 -0
  147. ptsip-0.3.8a4/src/ptsip/profiles/__init__.py +1 -0
  148. ptsip-0.3.8a3/src/ptsip/local_profile_catalog.py → ptsip-0.3.8a4/src/ptsip/profiles/catalog.py +1 -1
  149. ptsip-0.3.8a3/src/ptsip/profile_compatibility.py → ptsip-0.3.8a4/src/ptsip/profiles/compatibility.py +1 -1
  150. ptsip-0.3.8a3/src/ptsip/profile_identity.py → ptsip-0.3.8a4/src/ptsip/profiles/identity.py +1 -1
  151. {ptsip-0.3.8a3 → ptsip-0.3.8a4/src/ptsip}/profiles/index.yaml +1 -1
  152. ptsip-0.3.8a3/src/ptsip/profile_metadata.py → ptsip-0.3.8a4/src/ptsip/profiles/metadata.py +2 -2
  153. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/repository/profile_convergence.py +2 -2
  154. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/repository/profile_path.py +1 -1
  155. ptsip-0.3.8a4/src/ptsip/repository/schemas/engine-state.schema.json +1 -0
  156. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/spec_identity.py +1 -1
  157. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/specdata/project-profile-contracts.yaml +7 -2
  158. ptsip-0.3.8a4/src/ptsip/validation/handoff.py +75 -0
  159. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/validation/profile.py +2 -2
  160. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/vpms/__init__.py +14 -8
  161. ptsip-0.3.8a4/src/vpms/contract_runtime.py +124 -0
  162. ptsip-0.3.8a4/src/vpms/contracts/execution-composition.json +1 -0
  163. ptsip-0.3.8a4/src/vpms/contracts/identity-registry.json +69 -0
  164. ptsip-0.3.8a4/src/vpms/contracts/index.json +1 -0
  165. ptsip-0.3.8a4/src/vpms/contracts/invariants.json +27 -0
  166. ptsip-0.3.8a4/src/vpms/contracts/protocol.json +1 -0
  167. ptsip-0.3.8a4/src/vpms/contracts/schemas/catalog.schema.json +80 -0
  168. ptsip-0.3.8a4/src/vpms/contracts/schemas/product-contract.schema.json +572 -0
  169. ptsip-0.3.8a4/src/vpms/contracts/schemas/selection-request.schema.json +47 -0
  170. ptsip-0.3.8a4/src/vpms/contracts/schemas/selection-result.schema.json +79 -0
  171. ptsip-0.3.8a4/src/vpms/contracts/schemas/selection-rule.schema.json +31 -0
  172. ptsip-0.3.8a4/src/vpms/contracts/selection.json +1 -0
  173. ptsip-0.3.8a4/src/vpms/domain/snapshot.py +118 -0
  174. ptsip-0.3.8a4/src/vpms/execution/composition.py +58 -0
  175. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/vpms/execution/runner.py +1 -34
  176. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/vpms/integration/ptsip_bridge.py +22 -19
  177. ptsip-0.3.8a4/src/vpms/selection/__init__.py +4 -0
  178. ptsip-0.3.8a4/src/vpms/selection/resolver.py +130 -0
  179. ptsip-0.3.8a3/MANIFEST.in +0 -5
  180. ptsip-0.3.8a3/docs/Support_policy/policy/index.yaml +0 -69
  181. ptsip-0.3.8a3/docs/Support_policy/policy/registries/ptsip-support-authority-subject-registry.yaml +0 -48
  182. ptsip-0.3.8a3/docs/Support_policy/policy/schemas/ptsip-support-project-authority-record.schema.json +0 -85
  183. ptsip-0.3.8a3/src/ptsip/migration/__init__.py +0 -240
  184. ptsip-0.3.8a3/src/ptsip/migration/analyzer.py +0 -702
  185. ptsip-0.3.8a3/src/ptsip/migration/direct_convergence.py +0 -324
  186. ptsip-0.3.8a3/src/ptsip/migration/execution_binding.py +0 -417
  187. ptsip-0.3.8a3/src/ptsip/migration/execution_model.py +0 -280
  188. ptsip-0.3.8a3/src/ptsip/migration/execution_promotion.py +0 -195
  189. ptsip-0.3.8a3/src/ptsip/migration/model.py +0 -420
  190. ptsip-0.3.8a3/src/ptsip/migration/planner.py +0 -857
  191. ptsip-0.3.8a3/src/vpms/domain/selector.py +0 -41
  192. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/License-Authority/COMMERCIAL-USE.md +0 -0
  193. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/License-Authority/LICENSE-GUIDE.md +0 -0
  194. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/License-Authority/LICENSE-HISTORY.md +0 -0
  195. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/License-Authority/LICENSE.md +0 -0
  196. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/License-Authority/NOTICE.md +0 -0
  197. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/License-Authority/license-authority.yaml +0 -0
  198. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/setup.cfg +0 -0
  199. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/PTSIP.egg-info/dependency_links.txt +0 -0
  200. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/PTSIP.egg-info/entry_points.txt +0 -0
  201. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/PTSIP.egg-info/requires.txt +0 -0
  202. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/PTSIP.egg-info/top_level.txt +0 -0
  203. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/__init__.py +0 -0
  204. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/analyze-source-profile.yaml +0 -0
  205. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/apply-adoption.yaml +0 -0
  206. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/apply-profile-transition.yaml +0 -0
  207. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/build-adoption-plan.yaml +0 -0
  208. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/build-transition-plan.yaml +0 -0
  209. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/capture-repository-snapshot.yaml +0 -0
  210. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/collect-conformance-evidence.yaml +0 -0
  211. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/compare-profile-authority.yaml +0 -0
  212. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/emit-conformance-result.yaml +0 -0
  213. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/evaluate-conformance-rules.yaml +0 -0
  214. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/map-profile-target.yaml +0 -0
  215. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/project-authority-winner.yaml +0 -0
  216. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/read-relevant-authority.yaml +0 -0
  217. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/resolve-adoption-facts.yaml +0 -0
  218. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/resolve-profile-schema.yaml +0 -0
  219. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/resolve-reconciliation-state.yaml +0 -0
  220. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/validate-profile-structure.yaml +0 -0
  221. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/actions/validate-responsibility-map-semantics.yaml +0 -0
  222. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-apply-requested.yaml +0 -0
  223. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-authority-fresh.yaml +0 -0
  224. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-facts-resolved.yaml +0 -0
  225. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-profile-fresh.yaml +0 -0
  226. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-repository-fresh.yaml +0 -0
  227. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-snapshot-identified.yaml +0 -0
  228. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/adopt-write-authorized.yaml +0 -0
  229. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/authority-authority-fresh.yaml +0 -0
  230. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/authority-coordination-available.yaml +0 -0
  231. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/authority-profile-fresh.yaml +0 -0
  232. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/authority-projection-required.yaml +0 -0
  233. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/authority-semantic-conflict-absent.yaml +0 -0
  234. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/authority-write-authorized.yaml +0 -0
  235. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/conform-profile-ready.yaml +0 -0
  236. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/conform-snapshot-identified.yaml +0 -0
  237. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/migrate-apply-requested.yaml +0 -0
  238. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/migrate-source-fresh.yaml +0 -0
  239. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/migrate-source-profile-identified.yaml +0 -0
  240. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/migrate-target-contract-resolved.yaml +0 -0
  241. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/migrate-target-fresh.yaml +0 -0
  242. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/migrate-write-authorized.yaml +0 -0
  243. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/validate-contract-resolved.yaml +0 -0
  244. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/conditions/validate-profile-selected.yaml +0 -0
  245. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/gates/adoption-write.yaml +0 -0
  246. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/gates/authority-projection-write.yaml +0 -0
  247. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/gates/profile-transition-write.yaml +0 -0
  248. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/index.yaml +0 -0
  249. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/operations/adopt.yaml +0 -0
  250. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/operations/conform.yaml +0 -0
  251. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/operations/migrate-profile.yaml +0 -0
  252. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/operations/reconcile-authority.yaml +0 -0
  253. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/operations/validate.yaml +0 -0
  254. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/resolver.py +0 -0
  255. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/action.schema.json +0 -0
  256. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/binding.schema.json +0 -0
  257. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/condition.schema.json +0 -0
  258. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/index.schema.json +0 -0
  259. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/io.schema.json +0 -0
  260. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/mutation-gate.schema.json +0 -0
  261. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/operation.schema.json +0 -0
  262. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/spec.schema.json +0 -0
  263. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/contracts/vocabulary.schema.json +0 -0
  264. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/adopt-request.schema.json +0 -0
  265. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/adopt-result.schema.json +0 -0
  266. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/adopt-state.schema.json +0 -0
  267. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/authority-request.schema.json +0 -0
  268. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/authority-result.schema.json +0 -0
  269. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/authority-state.schema.json +0 -0
  270. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/conform-request.schema.json +0 -0
  271. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/conform-result.schema.json +0 -0
  272. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/conform-state.schema.json +0 -0
  273. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/migrate-request.schema.json +0 -0
  274. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/migrate-result.schema.json +0 -0
  275. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/migrate-state.schema.json +0 -0
  276. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/validate-request.schema.json +0 -0
  277. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/validate-result.schema.json +0 -0
  278. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/schemas/io/validate-state.schema.json +0 -0
  279. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/adoption-procedure.yaml +0 -0
  280. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/adoption.yaml +0 -0
  281. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/agent-behavior.yaml +0 -0
  282. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/authority.yaml +0 -0
  283. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/classification.yaml +0 -0
  284. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/conformance-detail.yaml +0 -0
  285. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/conformance.yaml +0 -0
  286. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/core.yaml +0 -0
  287. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/governance.yaml +0 -0
  288. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/profile-transition-detail.yaml +0 -0
  289. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/profile-transition.yaml +0 -0
  290. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/repository-boundaries.yaml +0 -0
  291. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/responsibility-map-detail.yaml +0 -0
  292. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/responsibility-map.yaml +0 -0
  293. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/spec/specification-governance.yaml +0 -0
  294. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/validator.py +0 -0
  295. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/vocabulary/authority.yaml +0 -0
  296. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/vocabulary/diagnostics.yaml +0 -0
  297. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/vocabulary/lifecycle.yaml +0 -0
  298. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/vocabulary/outcomes.yaml +0 -0
  299. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/agent_contracts/vocabulary/terminology.yaml +0 -0
  300. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0001.yaml +0 -0
  301. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0002.yaml +0 -0
  302. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0003.yaml +0 -0
  303. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0004.yaml +0 -0
  304. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0005.yaml +0 -0
  305. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0007.yaml +0 -0
  306. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0008.yaml +0 -0
  307. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0009.yaml +0 -0
  308. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0010.yaml +0 -0
  309. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0011.yaml +0 -0
  310. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0012.yaml +0 -0
  311. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0013.yaml +0 -0
  312. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0014.yaml +0 -0
  313. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0015.yaml +0 -0
  314. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0016.yaml +0 -0
  315. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0017.yaml +0 -0
  316. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0018.yaml +0 -0
  317. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0019.yaml +0 -0
  318. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0020.yaml +0 -0
  319. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0021.yaml +0 -0
  320. {ptsip-0.3.8a3/docs/Support_policy/policy → ptsip-0.3.8a4/src/policy/legacy}/SFP-0022.yaml +0 -0
  321. {ptsip-0.3.8a3/docs/Support_policy → ptsip-0.3.8a4/src}/policy/registries/ptsip-support-authorization-registry.yaml +0 -0
  322. {ptsip-0.3.8a3/docs/Support_policy → ptsip-0.3.8a4/src}/policy/schemas/ptsip-support-governance-registry.schema.json +0 -0
  323. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/__init__.py +0 -0
  324. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/__main__.py +0 -0
  325. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/adoption.py +0 -0
  326. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/__init__.py +0 -0
  327. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/bindings/current.yaml +0 -0
  328. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/index.yaml +0 -0
  329. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/operations/adopt.yaml +0 -0
  330. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/operations/conform.yaml +0 -0
  331. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/operations/reconcile-authority.yaml +0 -0
  332. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/runtime.py +0 -0
  333. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/schemas/binding.schema.json +0 -0
  334. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/schemas/index.schema.json +0 -0
  335. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/schemas/operation.schema.json +0 -0
  336. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/schemas/spec.schema.json +0 -0
  337. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/schemas/vocabulary.schema.json +0 -0
  338. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/adoption.yaml +0 -0
  339. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/authority.yaml +0 -0
  340. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/classification.yaml +0 -0
  341. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/conformance.yaml +0 -0
  342. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/core.yaml +0 -0
  343. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/governance.yaml +0 -0
  344. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/profile-transition.yaml +0 -0
  345. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/spec/responsibility-map.yaml +0 -0
  346. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/validator.py +0 -0
  347. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/vocabulary/authority.yaml +0 -0
  348. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/vocabulary/diagnostics.yaml +0 -0
  349. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/vocabulary/lifecycle.yaml +0 -0
  350. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/agent_contracts/vocabulary/outcomes.yaml +0 -0
  351. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/app/__init__.py +0 -0
  352. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/app/client.py +0 -0
  353. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/app/github_authority.py +0 -0
  354. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/app/github_client.py +0 -0
  355. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/app/github_reconciliation.py +0 -0
  356. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/app/local_client.py +0 -0
  357. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/app/server.py +0 -0
  358. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/app/service.py +0 -0
  359. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/app/store.py +0 -0
  360. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/artifact_evidence.py +0 -0
  361. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/build_resolution.py +0 -0
  362. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/__init__.py +0 -0
  363. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/generator.py +0 -0
  364. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/generator_core.py +0 -0
  365. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/i18n.py +0 -0
  366. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/model.py +0 -0
  367. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/render.py +0 -0
  368. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/resolution/__init__.py +0 -0
  369. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/resolution/model.py +0 -0
  370. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/resolution/parser.py +0 -0
  371. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/resolution/resolver.py +0 -0
  372. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/transports/__init__.py +0 -0
  373. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/clarification/transports/github_issue.py +0 -0
  374. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/conformance.py +0 -0
  375. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/conformance_audit.py +0 -0
  376. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/conformance_engine.py +0 -0
  377. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/context_plane.py +0 -0
  378. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/dependency_analysis.py +0 -0
  379. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/dependency_cache.py +0 -0
  380. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/dependency_reconciliation.py +0 -0
  381. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/dependency_review.py +0 -0
  382. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/dependency_validation.py +0 -0
  383. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/doctor.py +0 -0
  384. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/evidence/__init__.py +0 -0
  385. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/evidence/adapters.py +0 -0
  386. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/evidence/contract.py +0 -0
  387. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/evidence/normalization.py +0 -0
  388. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/governance/__init__.py +0 -0
  389. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/governance/authorization.py +0 -0
  390. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/governance/model.py +0 -0
  391. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/governance/subject_matching.py +0 -0
  392. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/inspection/__init__.py +0 -0
  393. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/inspection/candidate_evidence.py +0 -0
  394. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/inspection/components.py +0 -0
  395. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/inspection/dependencies.py +0 -0
  396. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/inspection/dependencies_030.py +0 -0
  397. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/inspection/dotnet.py +0 -0
  398. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/inspection/go.py +0 -0
  399. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/inspection/inventory.py +0 -0
  400. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/inspection/javascript.py +0 -0
  401. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/inspection/lexing.py +0 -0
  402. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/inspection/python_resolution.py +0 -0
  403. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/inspection/source_adapters.py +0 -0
  404. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/lifecycle_evidence.py +0 -0
  405. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/model.py +0 -0
  406. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/pilot/__init__.py +0 -0
  407. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/pilot/runner.py +0 -0
  408. /ptsip-0.3.8a3/src/ptsip/project_profile_contracts.py → /ptsip-0.3.8a4/src/ptsip/profiles/contracts.py +0 -0
  409. {ptsip-0.3.8a3 → ptsip-0.3.8a4/src/ptsip}/profiles/example.ptsip.yaml +0 -0
  410. {ptsip-0.3.8a3 → ptsip-0.3.8a4/src/ptsip}/profiles/history/pp.1.01/example.ptsip.yaml +0 -0
  411. {ptsip-0.3.8a3 → ptsip-0.3.8a4/src/ptsip}/profiles/history/pp.1.01/hybrid-python-package.ptsip.yaml +0 -0
  412. {ptsip-0.3.8a3 → ptsip-0.3.8a4/src/ptsip}/profiles/history/pp.1.01/template-python-package.ptsip.yaml +0 -0
  413. {ptsip-0.3.8a3 → ptsip-0.3.8a4/src/ptsip}/profiles/history/pp.1.02/example.ptsip.yaml +0 -0
  414. {ptsip-0.3.8a3 → ptsip-0.3.8a4/src/ptsip}/profiles/history/pp.1.02/hybrid-python-package.ptsip.yaml +0 -0
  415. {ptsip-0.3.8a3 → ptsip-0.3.8a4/src/ptsip}/profiles/history/pp.1.02/template-python-package.ptsip.yaml +0 -0
  416. {ptsip-0.3.8a3 → ptsip-0.3.8a4/src/ptsip}/profiles/hybrid-python-package.ptsip.yaml +0 -0
  417. {ptsip-0.3.8a3 → ptsip-0.3.8a4/src/ptsip}/profiles/template-python-package.ptsip.yaml +0 -0
  418. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/proposed_component.py +0 -0
  419. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/remediation/__init__.py +0 -0
  420. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/remediation/domain/__init__.py +0 -0
  421. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/remediation/domain/model.py +0 -0
  422. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/remediation/escalation/__init__.py +0 -0
  423. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/remediation/escalation/contract.py +0 -0
  424. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/remediation/escalation/engine.py +0 -0
  425. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/remediation/rules/__init__.py +0 -0
  426. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/remediation/rules/contract.py +0 -0
  427. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/remediation/solution/candidate.py +0 -0
  428. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/remediation/solution/elimination.py +0 -0
  429. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/repository/__init__.py +0 -0
  430. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/repository/discover.py +0 -0
  431. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/repository/namespace.py +0 -0
  432. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/repository/profile_transition.py +0 -0
  433. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/repository/remote.py +0 -0
  434. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/repository/schemas/repository-index.schema.json +0 -0
  435. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/repository/snapshot.py +0 -0
  436. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/review_evidence.py +0 -0
  437. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/source_compat/__init__.py +0 -0
  438. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/source_compat/integrity.py +0 -0
  439. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/source_compat/model.py +0 -0
  440. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/source_compat/reader.py +0 -0
  441. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-agent-classification.schema.json +0 -0
  442. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-artifact-evidence.schema.json +0 -0
  443. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-diagnostic.schema.json +0 -0
  444. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-normalized-evidence.schema.json +0 -0
  445. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-profile-pp-1.01.schema.json +0 -0
  446. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-profile-pp-1.02.schema.json +0 -0
  447. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-profile.schema.json +0 -0
  448. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-registry.yaml +0 -0
  449. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-source-profile-0.3.4.schema.json +0 -0
  450. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/specdata/ptsip-source-profile-0.3.6.schema.json +0 -0
  451. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/specification_binding.py +0 -0
  452. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/storage/__init__.py +0 -0
  453. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/storage/local_state.py +0 -0
  454. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/topology.py +0 -0
  455. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/validation/__init__.py +0 -0
  456. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/validation/components.py +0 -0
  457. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/validation/rules.py +0 -0
  458. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/validation/specification.py +0 -0
  459. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/validation/templates.py +0 -0
  460. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/ptsip/validation_capture.py +0 -0
  461. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/vpms/domain/__init__.py +0 -0
  462. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/vpms/domain/model.py +0 -0
  463. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/vpms/domain/registry.py +0 -0
  464. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/vpms/execution/__init__.py +0 -0
  465. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/vpms/execution/adapters/__init__.py +0 -0
  466. {ptsip-0.3.8a3 → ptsip-0.3.8a4}/src/vpms/execution/adapters/command.py +0 -0
  467. {ptsip-0.3.8a3 → 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.8a3
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.8a3` Context Plane migration-semantics emergency prerelease — publication pending<br>
46
- **Tool/package version:** `0.3.8a3`<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.8a3` is an emergency corrective prerelease over the published `0.3.8a2` repository-namespace release. Tool `0.3.8a2` established `.ptsip/` and the provider-neutral Context Plane at repository level, but its Context Projection implementation remained under `developer/automation/` and therefore was not shipped in the installed Consumer Tool. Tool `0.3.8a3` closes that packaging and migration gap by shipping the canonical Context Plane implementation as `ptsip.context_plane`, exposing `ptsip context status|migrate|repair|check`, and binding release verification to the installed wheel. The Specification and Project Profile identities remain unchanged.
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.8a3` 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.8a3` 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.8a3` 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.8a3` 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.8a3` 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.8a3"
241
+ python -m pip install "PTSIP==0.3.8a4"
242
242
  ```
243
243
 
244
244
  For source development on this release line:
@@ -267,11 +267,20 @@ ptsip context check . --json
267
267
 
268
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.
269
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
+
270
279
  ## Adoption and decision authority
271
280
 
272
281
  Repository evidence is not architecture authority. Candidate discovery, path names, templates, heuristics, and agent confidence can support review but cannot manufacture project intent.
273
282
 
274
- Canonical Tool `0.3.8a3` 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:
275
284
 
276
285
  ```text
277
286
  classification
@@ -281,7 +290,7 @@ runtime_required
281
290
  executable
282
291
  ```
283
292
 
284
- The historical `lifecycle_owner` field is legacy migration evidence, not a second Tool `0.3.8a3` ownership authority.
293
+ The historical `lifecycle_owner` field is legacy migration evidence, not a second Tool `0.3.8a4` ownership authority.
285
294
 
286
295
  Example dry-run:
287
296
 
@@ -346,9 +355,9 @@ PTSIP uses action-time synchronization rather than continuous background polling
346
355
 
347
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.
348
357
 
349
- Tool `0.3.8a3` 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`.
350
359
 
351
- ## VPMS — Verification Purpose Management System
360
+ ## VPMS — Verification Protocol Management System
352
361
 
353
362
  PTSIP and VPMS answer different questions:
354
363
 
@@ -357,12 +366,32 @@ PTSIP
357
366
  Who owns this responsibility across its lifecycle?
358
367
 
359
368
  VPMS
360
- Why does this Verification Case exist, and what does it protect?
369
+ How are explicit Verification Cases bound, executed, and reported?
370
+ ```
371
+
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)
361
388
  ```
362
389
 
363
- 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.
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.
364
391
 
365
- The current VPMS compatibility vocabulary may still contain `PRODUCT | TOOLCHAIN`. VPMS `TOOLCHAIN` is not a canonical Tool `0.3.8a3` PTSIP classification.
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.
393
+
394
+ The current VPMS compatibility vocabulary may still contain `PRODUCT | TOOLCHAIN`. VPMS `TOOLCHAIN` is not a canonical Tool `0.3.8a4` PTSIP classification.
366
395
 
367
396
  VPMS verification PASS does not imply PTSIP `CONFORMANT`, and PTSIP `CONFORMANT` does not imply functional verification PASS.
368
397
 
@@ -433,6 +462,20 @@ in its Tool release note; advancing the PP contract does not rewrite that Tool h
433
462
 
434
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.
435
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
+
436
479
  ## Tool 0.3.8a3 release identity
437
480
 
438
481
  Tool `0.3.8a3` is an emergency Context Plane migration-semantics patch over the published `0.3.8a2` repository-namespace release.
@@ -481,7 +524,7 @@ This Tool release does not introduce a new Specification family or Project Profi
481
524
 
482
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.
483
526
 
484
- 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).
485
528
 
486
529
  ## License authority
487
530
 
@@ -498,8 +541,8 @@ Read-only inspection and Pilot operations remain read-only and do not create rep
498
541
 
499
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.
500
543
 
501
- Canonical machine indexes under `.ptsip/` use JSON. Tool `0.3.8a3` 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.
502
545
 
503
546
  ## Project status
504
547
 
505
- PTSIP remains experimental. Tool `0.3.8a3` is the current namespace-stabilization prerelease candidate; its publication boundary is tracked in [`releasenote/tool/0.3.8a3.md`](releasenote/tool/0.3.8a3.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.8a3` Context Plane migration-semantics emergency prerelease — publication pending<br>
8
- **Tool/package version:** `0.3.8a3`<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.8a3` is an emergency corrective prerelease over the published `0.3.8a2` repository-namespace release. Tool `0.3.8a2` established `.ptsip/` and the provider-neutral Context Plane at repository level, but its Context Projection implementation remained under `developer/automation/` and therefore was not shipped in the installed Consumer Tool. Tool `0.3.8a3` closes that packaging and migration gap by shipping the canonical Context Plane implementation as `ptsip.context_plane`, exposing `ptsip context status|migrate|repair|check`, and binding release verification to the installed wheel. The Specification and Project Profile identities remain unchanged.
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.8a3` 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.8a3` 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.8a3` 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.8a3` 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.8a3` 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.8a3"
203
+ python -m pip install "PTSIP==0.3.8a4"
204
204
  ```
205
205
 
206
206
  For source development on this release line:
@@ -229,11 +229,20 @@ ptsip context check . --json
229
229
 
230
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.
231
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
+
232
241
  ## Adoption and decision authority
233
242
 
234
243
  Repository evidence is not architecture authority. Candidate discovery, path names, templates, heuristics, and agent confidence can support review but cannot manufacture project intent.
235
244
 
236
- Canonical Tool `0.3.8a3` 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:
237
246
 
238
247
  ```text
239
248
  classification
@@ -243,7 +252,7 @@ runtime_required
243
252
  executable
244
253
  ```
245
254
 
246
- The historical `lifecycle_owner` field is legacy migration evidence, not a second Tool `0.3.8a3` ownership authority.
255
+ The historical `lifecycle_owner` field is legacy migration evidence, not a second Tool `0.3.8a4` ownership authority.
247
256
 
248
257
  Example dry-run:
249
258
 
@@ -308,9 +317,9 @@ PTSIP uses action-time synchronization rather than continuous background polling
308
317
 
309
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.
310
319
 
311
- Tool `0.3.8a3` 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`.
312
321
 
313
- ## VPMS — Verification Purpose Management System
322
+ ## VPMS — Verification Protocol Management System
314
323
 
315
324
  PTSIP and VPMS answer different questions:
316
325
 
@@ -319,12 +328,32 @@ PTSIP
319
328
  Who owns this responsibility across its lifecycle?
320
329
 
321
330
  VPMS
322
- Why does this Verification Case exist, and what does it protect?
331
+ How are explicit Verification Cases bound, executed, and reported?
332
+ ```
333
+
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)
323
350
  ```
324
351
 
325
- 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.
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.
326
353
 
327
- The current VPMS compatibility vocabulary may still contain `PRODUCT | TOOLCHAIN`. VPMS `TOOLCHAIN` is not a canonical Tool `0.3.8a3` PTSIP classification.
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.
355
+
356
+ The current VPMS compatibility vocabulary may still contain `PRODUCT | TOOLCHAIN`. VPMS `TOOLCHAIN` is not a canonical Tool `0.3.8a4` PTSIP classification.
328
357
 
329
358
  VPMS verification PASS does not imply PTSIP `CONFORMANT`, and PTSIP `CONFORMANT` does not imply functional verification PASS.
330
359
 
@@ -395,6 +424,20 @@ in its Tool release note; advancing the PP contract does not rewrite that Tool h
395
424
 
396
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.
397
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
+
398
441
  ## Tool 0.3.8a3 release identity
399
442
 
400
443
  Tool `0.3.8a3` is an emergency Context Plane migration-semantics patch over the published `0.3.8a2` repository-namespace release.
@@ -443,7 +486,7 @@ This Tool release does not introduce a new Specification family or Project Profi
443
486
 
444
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.
445
488
 
446
- 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).
447
490
 
448
491
  ## License authority
449
492
 
@@ -460,8 +503,8 @@ Read-only inspection and Pilot operations remain read-only and do not create rep
460
503
 
461
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.
462
505
 
463
- Canonical machine indexes under `.ptsip/` use JSON. Tool `0.3.8a3` 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.
464
507
 
465
508
  ## Project status
466
509
 
467
- PTSIP remains experimental. Tool `0.3.8a3` is the current namespace-stabilization prerelease candidate; its publication boundary is tracked in [`releasenote/tool/0.3.8a3.md`](releasenote/tool/0.3.8a3.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.8a3"
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(