engineering-process 0.8.0__tar.gz → 0.9.0__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 (211) hide show
  1. {engineering_process-0.8.0/engineering_process.egg-info → engineering_process-0.9.0}/PKG-INFO +82 -8
  2. {engineering_process-0.8.0 → engineering_process-0.9.0}/PROCESS_IMPROVEMENT.md +8 -0
  3. {engineering_process-0.8.0 → engineering_process-0.9.0}/PRODUCTION_STANDARD.md +40 -0
  4. {engineering_process-0.8.0 → engineering_process-0.9.0}/README.md +81 -7
  5. {engineering_process-0.8.0 → engineering_process-0.9.0}/VERSIONING.md +63 -0
  6. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/__init__.py +1 -1
  7. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/adoption.py +5 -0
  8. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/artifact_attestation.py +20 -2
  9. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/cli.py +312 -4
  10. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/command_catalog.py +5 -0
  11. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/contracts.py +769 -48
  12. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/distribution_verify.py +11 -0
  13. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/evidence.py +273 -5
  14. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/lifecycle.py +926 -30
  15. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/process_graph.py +5 -0
  16. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/release.py +23 -3
  17. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/release_candidate.py +86 -18
  18. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/remote_verification.py +18 -5
  19. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/supplemental.py +14 -4
  20. engineering_process-0.9.0/engineering_process/transition.py +2606 -0
  21. {engineering_process-0.8.0 → engineering_process-0.9.0/engineering_process.egg-info}/PKG-INFO +82 -8
  22. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process.egg-info/SOURCES.txt +16 -0
  23. engineering_process-0.9.0/examples/authority-transition-evidence.json +42 -0
  24. engineering_process-0.9.0/examples/authority-transition-request.json +43 -0
  25. engineering_process-0.9.0/examples/bootstrap-adoption-consumption.json +17 -0
  26. engineering_process-0.9.0/examples/bootstrap-adoption-intent.json +34 -0
  27. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/change.json +29 -1
  28. engineering_process-0.9.0/examples/protected-transition-policy.json +16 -0
  29. engineering_process-0.9.0/examples/release-authority-transition.json +32 -0
  30. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/review.json +4 -0
  31. {engineering_process-0.8.0 → engineering_process-0.9.0}/improvement-catalog.json +14 -0
  32. {engineering_process-0.8.0 → engineering_process-0.9.0}/process-graph.json +2 -2
  33. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/define-change-contract/SKILL.md +7 -0
  34. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/evolve-process/SKILL.md +13 -2
  35. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/finish-change/SKILL.md +4 -0
  36. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/implement-change/SKILL.md +10 -0
  37. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/publish-change/SKILL.md +6 -0
  38. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/review-change/SKILL.md +16 -0
  39. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/run-change/SKILL.md +14 -0
  40. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/run-change/references/execution.md +45 -0
  41. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/verify-change/SKILL.md +5 -0
  42. {engineering_process-0.8.0 → engineering_process-0.9.0}/pyproject.toml +12 -1
  43. engineering_process-0.9.0/release.json +87 -0
  44. engineering_process-0.9.0/schemas/authority-transition-evidence.schema.json +53 -0
  45. engineering_process-0.9.0/schemas/authority-transition-request.schema.json +67 -0
  46. engineering_process-0.9.0/schemas/bootstrap-adoption-consumption.schema.json +23 -0
  47. engineering_process-0.9.0/schemas/bootstrap-adoption-intent.schema.json +32 -0
  48. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/change.schema.json +97 -2
  49. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/evidence-receipt.schema.json +43 -2
  50. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/lifecycle.schema.json +156 -2
  51. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/plan-decision-review-assignment.schema.json +25 -0
  52. engineering_process-0.9.0/schemas/protected-transition-policy.schema.json +23 -0
  53. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/recommendation.schema.json +1 -0
  54. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/release.schema.json +50 -4
  55. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/remote-verification-evidence.schema.json +31 -2
  56. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/remote-verification-request.schema.json +32 -3
  57. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/review.schema.json +82 -2
  58. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/supplemental-verification.schema.json +41 -2
  59. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/verification.schema.json +65 -1
  60. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_adoption.py +31 -0
  61. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_contracts.py +546 -0
  62. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_lifecycle.py +925 -0
  63. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_release_candidate.py +71 -0
  64. engineering_process-0.9.0/tests/test_release_plan_continuation.py +115 -0
  65. engineering_process-0.9.0/tests/test_release_plan_review_dispatch.py +170 -0
  66. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_release_qualification.py +4 -1
  67. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_remote_verification_adapter.py +42 -0
  68. engineering_process-0.9.0/tests/test_review_context_handoff.py +150 -0
  69. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_runner.py +95 -0
  70. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_self_hosting.py +223 -0
  71. engineering_process-0.9.0/tests/test_test_suite.py +496 -0
  72. engineering_process-0.9.0/tests/test_transition.py +1090 -0
  73. engineering_process-0.8.0/release.json +0 -53
  74. engineering_process-0.8.0/tests/test_test_suite.py +0 -62
  75. {engineering_process-0.8.0 → engineering_process-0.9.0}/LICENSE +0 -0
  76. {engineering_process-0.8.0 → engineering_process-0.9.0}/MANIFEST.in +0 -0
  77. {engineering_process-0.8.0 → engineering_process-0.9.0}/bundles.json +0 -0
  78. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/__main__.py +0 -0
  79. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/_download_worker.py +0 -0
  80. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/_supervisor_posix.py +0 -0
  81. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/_supervisor_windows.py +0 -0
  82. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/_windows_job.py +0 -0
  83. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/bootstrap.py +0 -0
  84. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/bounded_process.py +0 -0
  85. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/bundles.py +0 -0
  86. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/diagnostics.py +0 -0
  87. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/distribution.py +0 -0
  88. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/environment.py +0 -0
  89. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/evidence_transport.py +0 -0
  90. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/git.py +0 -0
  91. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/git_attributes.py +0 -0
  92. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/helper_launch.py +0 -0
  93. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/impact.py +0 -0
  94. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/improvement.py +0 -0
  95. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/lifecycle_routes.py +0 -0
  96. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/managed.py +0 -0
  97. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/markdown.py +0 -0
  98. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/publication.py +0 -0
  99. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/recommendation.py +0 -0
  100. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/requirements-build.txt +0 -0
  101. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/requirements-dev.txt +0 -0
  102. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/requirements-release.txt +0 -0
  103. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/requirements-runtime.txt +0 -0
  104. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/runner.py +0 -0
  105. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/runtime.py +0 -0
  106. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/skills.py +0 -0
  107. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/supervision.py +0 -0
  108. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/syncing.py +0 -0
  109. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process/tooling.py +0 -0
  110. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process.egg-info/dependency_links.txt +0 -0
  111. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process.egg-info/entry_points.txt +0 -0
  112. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process.egg-info/requires.txt +0 -0
  113. {engineering_process-0.8.0 → engineering_process-0.9.0}/engineering_process.egg-info/top_level.txt +0 -0
  114. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/adoption-migration.json +0 -0
  115. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/automation-policy.json +0 -0
  116. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/automation-process-adoption-policy.json +0 -0
  117. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/automation-process-adoption-proposal.json +0 -0
  118. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/automation-proposal-policy.json +0 -0
  119. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/automation-proposal.json +0 -0
  120. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/improvement-catalog.json +0 -0
  121. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/improvement-disposition.json +0 -0
  122. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/improvement-reproduction.json +0 -0
  123. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/improvement-resolution.json +0 -0
  124. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/improvement-signal.json +0 -0
  125. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/plan-decision-review-assignment.json +0 -0
  126. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/plan-decision-review.json +0 -0
  127. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/plan.json +0 -0
  128. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/project.json +0 -0
  129. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/recommendation-resolution.json +0 -0
  130. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/recommendation-review-assignment.json +0 -0
  131. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/recommendation-review.json +0 -0
  132. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/recommendation.json +0 -0
  133. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/release-change.json +0 -0
  134. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/release.json +0 -0
  135. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/remote-verification-evidence.json +0 -0
  136. {engineering_process-0.8.0 → engineering_process-0.9.0}/examples/remote-verification-request.json +0 -0
  137. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/assess-design/SKILL.md +0 -0
  138. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/build-frontend/SKILL.md +0 -0
  139. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/build-frontend-foundation/SKILL.md +0 -0
  140. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/change-api/SKILL.md +0 -0
  141. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/cross-repo-change/SKILL.md +0 -0
  142. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/design-module/SKILL.md +0 -0
  143. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/govern-ui/SKILL.md +0 -0
  144. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/implement-module/SKILL.md +0 -0
  145. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/implement-use-case/SKILL.md +0 -0
  146. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/integrate-mcp/SKILL.md +0 -0
  147. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/maintain-docs/SKILL.md +0 -0
  148. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/plan-change/SKILL.md +0 -0
  149. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/run-project-command/SKILL.md +0 -0
  150. {engineering_process-0.8.0 → engineering_process-0.9.0}/process_assets/skills/specify-use-case/SKILL.md +0 -0
  151. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/adoption-migration.schema.json +0 -0
  152. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/automation-policy.schema.json +0 -0
  153. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/automation-proposal-policy.schema.json +0 -0
  154. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/automation-proposal.schema.json +0 -0
  155. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/improvement-catalog.schema.json +0 -0
  156. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/improvement-disposition.schema.json +0 -0
  157. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/improvement-reproduction.schema.json +0 -0
  158. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/improvement-resolution.schema.json +0 -0
  159. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/improvement-signal.schema.json +0 -0
  160. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/plan-decision-review.schema.json +0 -0
  161. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/plan.schema.json +0 -0
  162. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/process-graph.schema.json +0 -0
  163. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/process-lock.schema.json +0 -0
  164. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/project.schema.json +0 -0
  165. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/recommendation-resolution.schema.json +0 -0
  166. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/recommendation-review-assignment.schema.json +0 -0
  167. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/recommendation-review.schema.json +0 -0
  168. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/release-change.schema.json +0 -0
  169. {engineering_process-0.8.0 → engineering_process-0.9.0}/schemas/reviewer-attestation.schema.json +0 -0
  170. {engineering_process-0.8.0 → engineering_process-0.9.0}/setup.cfg +0 -0
  171. {engineering_process-0.8.0 → engineering_process-0.9.0}/templates/AGENTS.process.md +0 -0
  172. {engineering_process-0.8.0 → engineering_process-0.9.0}/templates/PULL_REQUEST_TEMPLATE.md +0 -0
  173. {engineering_process-0.8.0 → engineering_process-0.9.0}/templates/adopt-process-windows-job.py +0 -0
  174. {engineering_process-0.8.0 → engineering_process-0.9.0}/templates/adopt-process.py +0 -0
  175. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_adoption_runner.py +0 -0
  176. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_artifact_attestation.py +0 -0
  177. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_bootstrap.py +0 -0
  178. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_bounded_process.py +0 -0
  179. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_bundles.py +0 -0
  180. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_cli.py +0 -0
  181. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_completed_release_dispatch.py +0 -0
  182. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_completion_evidence_transport.py +0 -0
  183. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_diagnostics.py +0 -0
  184. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_distribution.py +0 -0
  185. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_distribution_verify.py +0 -0
  186. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_environment.py +0 -0
  187. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_evals.py +0 -0
  188. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_impact.py +0 -0
  189. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_improvement.py +0 -0
  190. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_process_graph.py +0 -0
  191. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_process_install.py +0 -0
  192. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_publication.py +0 -0
  193. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_publish_event.py +0 -0
  194. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_pypi_publication.py +0 -0
  195. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_recommendation.py +0 -0
  196. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_release.py +0 -0
  197. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_release_candidate_boundary.py +0 -0
  198. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_release_completion_identity.py +0 -0
  199. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_release_evidence_restore.py +0 -0
  200. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_release_evidence_selection.py +0 -0
  201. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_release_preparation.py +0 -0
  202. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_remote_verification.py +0 -0
  203. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_runtime.py +0 -0
  204. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_schemas.py +0 -0
  205. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_skills.py +0 -0
  206. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_source_checkout.py +0 -0
  207. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_supervision.py +0 -0
  208. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_supplemental.py +0 -0
  209. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_syncing.py +0 -0
  210. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_tooling.py +0 -0
  211. {engineering_process-0.8.0 → engineering_process-0.9.0}/tests/test_windows_job.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: engineering-process
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: Agent-neutral end-to-end engineering lifecycle and deterministic process CLI
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/phuongnse/engineering-process
@@ -464,8 +464,13 @@ processctl change review submit --change-id issue-123 --report review.json
464
464
  ~~~
465
465
 
466
466
  `changes-requested` returns to `change implement`, which starts a new cycle and
467
- invalidates prior verification and approval. `approved` can advance only while the
468
- source still matches:
467
+ invalidates prior verification and approval. Under the bounded-loop authority this
468
+ is finite: the third changes-requested final-review cycle in one decision window
469
+ records an owner-decision escalation and blocks a fourth autonomous implementation
470
+ cycle. Finding renames, splits, paths, severities and invariant labels do not reset
471
+ the count. The existing decision-required assessment, challenged recommendation and
472
+ owner resolution may open one fresh three-cycle window; they never approve or remove
473
+ findings. `approved` can advance only while the source still matches:
469
474
 
470
475
  ~~~text
471
476
  processctl change finish --change-id issue-123 \
@@ -473,6 +478,43 @@ processctl change finish --change-id issue-123 \
473
478
  processctl change status --change-id issue-123
474
479
  ~~~
475
480
 
481
+ ### Process authority transition
482
+
483
+ A trust-root adoption uses a clean N-1 control checkout and a separate N+1 candidate
484
+ checkout. Register the exact transition before the target changes any candidate file,
485
+ then let the installed target emit only non-authoritative evidence:
486
+
487
+ ~~~text
488
+ processctl change transition register --project-root control \
489
+ --change-id adopt-process-0-9-0 --request transition-request.json \
490
+ --target-checkout target-tag-checkout --artifact-root target-artifacts \
491
+ --release-receipt target-evidence.json --artifact-attestation target-artifacts.json \
492
+ --actor worker --context worker-session --actor-kind agent
493
+
494
+ processctl authority-transition candidate-evidence \
495
+ --candidate-root candidate --target-process-root /installed/target \
496
+ --request transition-request.json --output candidate-evidence.json \
497
+ --actor candidate-materializer --context candidate-session --actor-kind agent
498
+
499
+ processctl change transition ingest --project-root control \
500
+ --change-id adopt-process-0-9-0 --candidate-root candidate \
501
+ --target-process-root /installed/target --evidence candidate-evidence.json \
502
+ --actor worker --context worker-session --actor-kind agent
503
+ ~~~
504
+
505
+ Every later `change verify`, `change remote`, `change review`, `change finish`, and
506
+ `change status` command supplies the same `--candidate-root`; lifecycle state and the
507
+ CLI authority remain in `control`. The target lock never becomes an ordinary bypass.
508
+ Transition verification, review, completion, remote evidence and receipt use their
509
+ transition-only schema majors.
510
+
511
+ The initial producer bootstrap is separate. Public 0.7.0 completes an exact intent
512
+ and protected-transition policy. A verifier checked out from the policy's fixed
513
+ protected-base feature commit validates the 0.7.0 bundle, immutable target release,
514
+ complete candidate and current base. Only its fixed
515
+ `authority-transition-completion` check may feed the policy-bound exact-head merge;
516
+ the successful merge consumes the authorization and activates the target.
517
+
476
518
  One worker owning specification, planning, implementation, and verification is the
477
519
  default topology. Bounded helpers are optional optimizations, not required roles;
478
520
  only review requires a separate actor and context.
@@ -580,7 +622,22 @@ drift repeats the assessment with a newly reserved reviewer context bound to the
580
622
  source checkpoint. Earlier assignment, assessment, and owner-decision artifacts stay
581
623
  historical and cannot authorize the new cycle.
582
624
 
583
- When a schema-3 change selects a project-owned `requiredEvidence` id, local profiles
625
+ New finite-boundary changes use change schema 4. Their `reviewBoundary` is a closed
626
+ set of trust boundaries and fault rows; every row names its trigger or injection
627
+ boundary, expected outcome, criteria, proving profiles/evidence, and stop condition.
628
+ Every review finding is exactly `covered` or `contract-gap`. Covered findings bind
629
+ one declared row and carry that identity unchanged. Contract gaps bind no row, remain
630
+ open, and trigger owner decision on the first review. The registered contract is
631
+ never extended in place: after owner decision the current lifecycle stays
632
+ superseded, and a new contract must explicitly own the expanded boundary.
633
+
634
+ Review-loop decision windows start prospectively under the adopted authority; older
635
+ lifecycle artifacts are not replayed into a new counter. Resolved escalation chains
636
+ are retained separately from the mutable current plan-decision slot and are included
637
+ in completion and exported receipt evidence. This reuses existing reviewers and
638
+ recommendation authority; it adds no loop arbiter or reviewer-of-reviewer.
639
+
640
+ When a schema-3 or schema-4 change selects a project-owned `requiredEvidence` id, local profiles
584
641
  alone do not advance it to review. Create the exact no-authority request, run the
585
642
  project adapter, and ingest the complete supplemental set first:
586
643
 
@@ -824,10 +881,27 @@ carried findings; the attesting host or human boundary, not local process state,
824
881
  authenticates who produced it.
825
882
 
826
883
  The producer release workflows implement the same host-neutral chain with explicit
827
- artifacts and callbacks: `release-pr.yml` creates only an unpublished Git bundle;
828
- `release-candidate.yml` restores it and runs `change start`, `change plan`,
829
- `change implement`, and every required `change verify`; the resulting
830
- `engineering-process-review-required` event names the exact artifact and checkpoint.
884
+ artifacts and callbacks: `release-pr.yml` creates only an unpublished Git bundle.
885
+ For an ordinary governed Release, `release-candidate.yml` restores it and runs
886
+ `change start`, `change plan`, `change implement`, and every required `change verify`;
887
+ the resulting `engineering-process-review-required` event names the exact artifact
888
+ and checkpoint. The one `authority-transition-bootstrap` Release instead contains an
889
+ authored schema-3 plan readable by immutable public 0.7. The initial workflow runs
890
+ `change start`, `change plan`, and `change decision start`, then emits
891
+ `engineering-process-plan-review-required` without implementing the candidate. A
892
+ fresh read-only plan reviewer returns the exact assigned report to
893
+ `release-plan-approval.yml`; that protected-main callback authenticates the producing
894
+ workflow path, protected-base SHA, run id and attempt before restoring the same source
895
+ and lifecycle. The provider handoff carries the id and attempt together as the
896
+ required `plannedRun` object so every identity remains explicit without exceeding
897
+ GitHub's ten-property `client_payload` limit. A protected-base adapter renders and
898
+ validates that bounded event before the provider call. It submits the report,
899
+ implements, verifies, and emits the ordinary
900
+ source-review handoff. A separate bounded `needs: continue`, `always()` cleanup job
901
+ runs on another runner after primary-job success, failure, timeout, or interruption;
902
+ after artifact resolution it preserves bounded diagnostics, consumes and reconciles
903
+ the single-use planned artifact, and makes a retry require a fresh planned run and
904
+ assignment. It cannot finish, publish, or merge the Release.
831
905
  The consumer-selected host restores that lifecycle, chooses an agent or human,
832
906
  registers the assignment, submits the exact report, resolves any finding loop, runs
833
907
  `change finish`, and exports completion evidence. It sends only that bounded
@@ -97,6 +97,14 @@ with the same reusable class and `activeChangeId` as the selected lifecycle. Rel
97
97
  PR materialization resolves only entries whose active change is in the exact release
98
98
  change set.
99
99
 
100
+ Repeated friction is also counted at the lifecycle boundary. Three
101
+ changes-requested final-review cycles in one prospective decision window are one
102
+ owner-escalation class even when findings are renamed, split, moved, or assigned new
103
+ local invariant ids. Core blocks the next implementation cycle and preserves the
104
+ complete chain. For a finite-boundary contract, an observed failure outside every
105
+ declared row is a contract gap on its first review and requires a superseding change;
106
+ it cannot be closed through another local-fix label.
107
+
100
108
  ## Release and adoption
101
109
 
102
110
  Producer completion, producer release, consumer adoption, and consumer reproduction
@@ -143,6 +143,22 @@ evidence. Reviewer-of-reviewer, meta-assessment, assessment-of-assessment,
143
143
  policy-for-policy, dynamically generated approval chains, and generic workflow
144
144
  engines are outside the portable contract.
145
145
 
146
+ Correction autonomy is finite. Under the adopted bounded-loop authority, three
147
+ distinct final-review cycles with changes-requested in one decision window trigger a
148
+ durable owner-decision escalation and block a fourth implementation cycle. Counting
149
+ is independent of finding names, invariant labels, paths, severities and splits. The
150
+ stop preserves every finding and failed quality assessment; it never creates
151
+ approval. Recovery reuses the existing decision-required plan assessment,
152
+ independently challenged recommendation and explicit owner resolution. A resolved
153
+ covered-boundary decision opens one fresh window; a contract-gap decision supersedes
154
+ the lifecycle and requires a new immutable contract.
155
+
156
+ New finite-boundary contracts enumerate closed fault rows with trigger or injection
157
+ boundary, expected outcome, criteria, proof and stop condition. Every finding is
158
+ exactly covered by one row or is a contract gap. Review does not expand the model by
159
+ inventing adjacent instruction-level injection points, and it never hides an observed
160
+ gap as out of scope. Historical artifacts are not retroactively counted.
161
+
146
162
  A material owner decision derives recommendation eligibility before optimization.
147
163
  Every option assesses every governing hard invariant and references only proven or
148
164
  explicitly unproven assumptions. Any violated invariant makes the option invalid; any
@@ -186,6 +202,30 @@ authority, and shares one rollback boundary with the process lock and managed as
186
202
  Optional capabilities are never inferred, while configuration required by the target
187
203
  authority blocks adoption when it is missing or invalid.
188
204
 
205
+ A self-hosted authority transition keeps the governing and candidate workspaces
206
+ separate. N-1 owns lifecycle state and every authoritative decision; N+1 output is
207
+ bounded untrusted input. The pre-registered request fixes source and target authority,
208
+ release provenance, base, paths, migration, selected assets and expiry. Transition
209
+ verification recomputes the clean candidate commit, tree, workspace, lock, hash graph,
210
+ managed distribution and action-pin set. A protected-transition policy is a separate
211
+ schema-1 mutation grant: it fixes the source-owned verifier commit, protected workflow,
212
+ check context and App identity, exact current base and head, target, required checks, no post-merge
213
+ mutation, and one-use protected auto-merge. Target or candidate code can never
214
+ interpret the authorization that activates itself.
215
+
216
+ Transition artifact schemas and portable contract validation share one serialized
217
+ shape boundary. Operational entrypoints additionally enforce cross-field relations
218
+ that standard JSON Schema cannot represent. Those semantic checks are mandatory at
219
+ registration, evidence ingestion, protected validation and terminal consumption; a
220
+ shape-only validation never grants authority. Candidate evidence includes observed
221
+ apply/check/idempotence trees and an after-write rollback probe executed in disposable
222
+ worktrees under a bounded target process.
223
+ Repository identity comes from deterministic provider service evidence resolved by
224
+ the existing project adapter: repository/release/tag/asset ids and URLs, immutable
225
+ release state, peeled tag commit and artifact digests are pre-bound by canonical
226
+ digest. Mutable local Git remote configuration is never repository provenance, and
227
+ the provider adapter gains no acceptance authority.
228
+
189
229
  Proposal merge authority derives from proposal origin and publication state. An
190
230
  agent-host review object created only after full lifecycle completion may use standing
191
231
  policy auto-merge for its exact approved head. A Renovate `process-adoption` proposal
@@ -428,8 +428,13 @@ processctl change review submit --change-id issue-123 --report review.json
428
428
  ~~~
429
429
 
430
430
  `changes-requested` returns to `change implement`, which starts a new cycle and
431
- invalidates prior verification and approval. `approved` can advance only while the
432
- source still matches:
431
+ invalidates prior verification and approval. Under the bounded-loop authority this
432
+ is finite: the third changes-requested final-review cycle in one decision window
433
+ records an owner-decision escalation and blocks a fourth autonomous implementation
434
+ cycle. Finding renames, splits, paths, severities and invariant labels do not reset
435
+ the count. The existing decision-required assessment, challenged recommendation and
436
+ owner resolution may open one fresh three-cycle window; they never approve or remove
437
+ findings. `approved` can advance only while the source still matches:
433
438
 
434
439
  ~~~text
435
440
  processctl change finish --change-id issue-123 \
@@ -437,6 +442,43 @@ processctl change finish --change-id issue-123 \
437
442
  processctl change status --change-id issue-123
438
443
  ~~~
439
444
 
445
+ ### Process authority transition
446
+
447
+ A trust-root adoption uses a clean N-1 control checkout and a separate N+1 candidate
448
+ checkout. Register the exact transition before the target changes any candidate file,
449
+ then let the installed target emit only non-authoritative evidence:
450
+
451
+ ~~~text
452
+ processctl change transition register --project-root control \
453
+ --change-id adopt-process-0-9-0 --request transition-request.json \
454
+ --target-checkout target-tag-checkout --artifact-root target-artifacts \
455
+ --release-receipt target-evidence.json --artifact-attestation target-artifacts.json \
456
+ --actor worker --context worker-session --actor-kind agent
457
+
458
+ processctl authority-transition candidate-evidence \
459
+ --candidate-root candidate --target-process-root /installed/target \
460
+ --request transition-request.json --output candidate-evidence.json \
461
+ --actor candidate-materializer --context candidate-session --actor-kind agent
462
+
463
+ processctl change transition ingest --project-root control \
464
+ --change-id adopt-process-0-9-0 --candidate-root candidate \
465
+ --target-process-root /installed/target --evidence candidate-evidence.json \
466
+ --actor worker --context worker-session --actor-kind agent
467
+ ~~~
468
+
469
+ Every later `change verify`, `change remote`, `change review`, `change finish`, and
470
+ `change status` command supplies the same `--candidate-root`; lifecycle state and the
471
+ CLI authority remain in `control`. The target lock never becomes an ordinary bypass.
472
+ Transition verification, review, completion, remote evidence and receipt use their
473
+ transition-only schema majors.
474
+
475
+ The initial producer bootstrap is separate. Public 0.7.0 completes an exact intent
476
+ and protected-transition policy. A verifier checked out from the policy's fixed
477
+ protected-base feature commit validates the 0.7.0 bundle, immutable target release,
478
+ complete candidate and current base. Only its fixed
479
+ `authority-transition-completion` check may feed the policy-bound exact-head merge;
480
+ the successful merge consumes the authorization and activates the target.
481
+
440
482
  One worker owning specification, planning, implementation, and verification is the
441
483
  default topology. Bounded helpers are optional optimizations, not required roles;
442
484
  only review requires a separate actor and context.
@@ -544,7 +586,22 @@ drift repeats the assessment with a newly reserved reviewer context bound to the
544
586
  source checkpoint. Earlier assignment, assessment, and owner-decision artifacts stay
545
587
  historical and cannot authorize the new cycle.
546
588
 
547
- When a schema-3 change selects a project-owned `requiredEvidence` id, local profiles
589
+ New finite-boundary changes use change schema 4. Their `reviewBoundary` is a closed
590
+ set of trust boundaries and fault rows; every row names its trigger or injection
591
+ boundary, expected outcome, criteria, proving profiles/evidence, and stop condition.
592
+ Every review finding is exactly `covered` or `contract-gap`. Covered findings bind
593
+ one declared row and carry that identity unchanged. Contract gaps bind no row, remain
594
+ open, and trigger owner decision on the first review. The registered contract is
595
+ never extended in place: after owner decision the current lifecycle stays
596
+ superseded, and a new contract must explicitly own the expanded boundary.
597
+
598
+ Review-loop decision windows start prospectively under the adopted authority; older
599
+ lifecycle artifacts are not replayed into a new counter. Resolved escalation chains
600
+ are retained separately from the mutable current plan-decision slot and are included
601
+ in completion and exported receipt evidence. This reuses existing reviewers and
602
+ recommendation authority; it adds no loop arbiter or reviewer-of-reviewer.
603
+
604
+ When a schema-3 or schema-4 change selects a project-owned `requiredEvidence` id, local profiles
548
605
  alone do not advance it to review. Create the exact no-authority request, run the
549
606
  project adapter, and ingest the complete supplemental set first:
550
607
 
@@ -788,10 +845,27 @@ carried findings; the attesting host or human boundary, not local process state,
788
845
  authenticates who produced it.
789
846
 
790
847
  The producer release workflows implement the same host-neutral chain with explicit
791
- artifacts and callbacks: `release-pr.yml` creates only an unpublished Git bundle;
792
- `release-candidate.yml` restores it and runs `change start`, `change plan`,
793
- `change implement`, and every required `change verify`; the resulting
794
- `engineering-process-review-required` event names the exact artifact and checkpoint.
848
+ artifacts and callbacks: `release-pr.yml` creates only an unpublished Git bundle.
849
+ For an ordinary governed Release, `release-candidate.yml` restores it and runs
850
+ `change start`, `change plan`, `change implement`, and every required `change verify`;
851
+ the resulting `engineering-process-review-required` event names the exact artifact
852
+ and checkpoint. The one `authority-transition-bootstrap` Release instead contains an
853
+ authored schema-3 plan readable by immutable public 0.7. The initial workflow runs
854
+ `change start`, `change plan`, and `change decision start`, then emits
855
+ `engineering-process-plan-review-required` without implementing the candidate. A
856
+ fresh read-only plan reviewer returns the exact assigned report to
857
+ `release-plan-approval.yml`; that protected-main callback authenticates the producing
858
+ workflow path, protected-base SHA, run id and attempt before restoring the same source
859
+ and lifecycle. The provider handoff carries the id and attempt together as the
860
+ required `plannedRun` object so every identity remains explicit without exceeding
861
+ GitHub's ten-property `client_payload` limit. A protected-base adapter renders and
862
+ validates that bounded event before the provider call. It submits the report,
863
+ implements, verifies, and emits the ordinary
864
+ source-review handoff. A separate bounded `needs: continue`, `always()` cleanup job
865
+ runs on another runner after primary-job success, failure, timeout, or interruption;
866
+ after artifact resolution it preserves bounded diagnostics, consumes and reconciles
867
+ the single-use planned artifact, and makes a retry require a fresh planned run and
868
+ assignment. It cannot finish, publish, or merge the Release.
795
869
  The consumer-selected host restores that lifecycle, chooses an agent or human,
796
870
  registers the assignment, submits the exact report, resolves any finding loop, runs
797
871
  `change finish`, and exports completion evidence. It sends only that bounded
@@ -54,6 +54,17 @@ typed authorization bundle is not a lifecycle receipt. Self-adoption must pin th
54
54
  public version before another release can be prepared; every later release is
55
55
  `governed` by a receipt from its public N-1 authority.
56
56
 
57
+ One producer-lineage exception exists for the immutable 0.7.0/0.8.0 authority
58
+ deadlock. A release containing the permanent authority-transition protocol uses
59
+ release schema 4 mode `authority-transition-bootstrap`. The source generator accepts
60
+ that mode only while the producer lock is exactly 0.7.0, the latest public release is
61
+ exactly 0.8.0, and the governed release set contains
62
+ `authority-transition-protocol`. Public 0.7.0 supplies the lifecycle receipt and the
63
+ source-owned verifier; 0.8.0 remains immutable public history but never becomes the
64
+ producer authority. The version is still derived from the reviewed change set. After
65
+ that one release is prepared, its new previous-version and source-lock predicates make
66
+ a second use invalid.
67
+
57
68
  ## Serialized-contract versions
58
69
 
59
70
  Each artifact owns an independent integer `schemaVersion`. Package SemVer and schema
@@ -93,6 +104,15 @@ Package `schemaImpact` is `unchanged`, `additive`, or `breaking` for the combine
93
104
  release. Additive schema capability requires at least a capability release; a
94
105
  breaking schema requires an incompatible release.
95
106
 
107
+ Authority transitions do not reinterpret the one-workspace artifacts already
108
+ published. Transition-only generation uses release schema 4, distribution-attestation
109
+ schema 2, lifecycle schema 3, verification schema 4, supplemental-verification schema
110
+ 3, review schema 4, completion schema 2, evidence-receipt schema 2, and remote request
111
+ and evidence schema 2. Authority-transition request, candidate evidence,
112
+ bootstrap-adoption intent, bootstrap consumption, and protected-transition policy
113
+ start at schema 1. Every historical reader and generator retains its published
114
+ meaning.
115
+
96
116
  ## Controlled dependency-proposal capability
97
117
 
98
118
  The strict default remains completion before any branch or PR publication. A consumer
@@ -232,6 +252,25 @@ matrix is not a compatibility substitute. Provider transport remains project-own
232
252
  while request expansion, ingestion, invalidation, and terminal ordering are portable
233
253
  process semantics.
234
254
 
255
+ ## Bounded review-correction authority
256
+
257
+ Change schema 4 adds the finite review-boundary contract. Review, plan-decision
258
+ assignment, lifecycle, completion, recommendation, and evidence-receipt schemas gain
259
+ additive fields or references while preserving every released document's meaning.
260
+ The adopted authority nevertheless changes workflow semantics: after three
261
+ changes-requested final-review cycles, another implementation cycle is blocked until
262
+ the existing reviewed owner-decision chain resolves it. Before 1.0 this is a breaking
263
+ package change and therefore requires the next minor version, migration guidance,
264
+ immutable publication, and separate self-adoption.
265
+
266
+ Decision windows start prospectively. Historical states without `reviewLoop` remain
267
+ unchanged and are never backfilled from old review events. New finite-boundary
268
+ findings are either covered by one closed fault row or are contract gaps. Contract
269
+ gaps keep their finding open and require a superseding change; no in-place extension
270
+ or old evidence conversion is supported. Resolved loop decisions are retained in
271
+ completion and receipt artifacts even after the mutable current plan assessment is
272
+ refreshed.
273
+
235
274
  ## Release and adoption boundary
236
275
 
237
276
  Release, self-adoption, and consumer adoption are separate changes. The numbered
@@ -254,6 +293,30 @@ sequence below is the default agent-host completion-first route:
254
293
  checks; there is no post-merge synchronization.
255
294
  5. N+1 governs only changes that begin after the merged adoption checkpoint.
256
295
 
296
+ For an explicit authority transition, steps 3-4 use two isolated workspaces. The
297
+ control workspace stays clean, pinned, and synchronized to public N-1 and owns the
298
+ lifecycle ledger. Before any candidate mutation, N-1 registers the exact source
299
+ authority, target release provenance, control checkpoint, candidate base, selected
300
+ assets, migration input, expected paths, and expiry. Installed N+1 may materialize
301
+ and check only a separate candidate workspace and emit schema-1 evidence. N-1
302
+ independently ingests that evidence, runs profiles against the exact candidate,
303
+ assigns review, closes findings, completes, and publishes the candidate checkpoint.
304
+ There is no `--ignore-lock` route and no lifecycle transition executed by N+1.
305
+
306
+ The first producer cutover additionally uses a separately completed 0.7.0 bootstrap
307
+ intent and a project-owner-installed protected-transition policy. The validated 0.7.0
308
+ bootstrap bundle checkpoint Git-binds both artifacts. A verifier fixed to the exact
309
+ 0.7.0-governed protected-base feature commit runs outside target and candidate
310
+ checkouts, resolves the target tag, receipt, attestation, artifacts and distribution,
311
+ recomputes complete materialization, and compares the exact candidate. The policy
312
+ fixes that verifier, workflow, check context, current base, target, exact head and
313
+ protected auto-merge grant. Successful current-base merge is the atomic one-time
314
+ consumption event; afterward the base and source lock no longer satisfy the policy.
315
+ The tracked policy does not embed its own commit id. Instead the validated 0.7.0
316
+ bundle supplies the reviewed checkpoint, and the adapter requires its Git tree to be
317
+ byte-identical to the independently resolved current protected-base tree. This avoids
318
+ a self-referential commit field while preserving an exact base binding.
319
+
257
320
  An opted-in schema-3 Renovate `process-adoption` proposal is the explicit exception to
258
321
  steps 3-4: after complete materialization and protected-base proposal validation,
259
322
  Renovate may publish it before consumer-owner review. It never receives agent-host
@@ -1,3 +1,3 @@
1
1
  """Agent-neutral engineering process."""
2
2
 
3
- VERSION = "0.8.0"
3
+ VERSION = "0.9.0"
@@ -775,6 +775,7 @@ def apply_adoption(
775
775
  *,
776
776
  requirements_source: Path | None = None,
777
777
  expected_requirements_digest: str | None = None,
778
+ rollback_probe: bool = False,
778
779
  ) -> dict[str, object]:
779
780
  project_root = Path(os.path.abspath(os.fspath(project_root)))
780
781
  process_root = process_root.resolve()
@@ -890,6 +891,10 @@ def apply_adoption(
890
891
  project_root / ".process" / "project.json",
891
892
  migration.target_content,
892
893
  )
894
+ if rollback_probe:
895
+ raise ContractError(
896
+ "controlled authority-transition rollback probe"
897
+ )
893
898
  issues = sync_skills(project_root, process_root, check=False)
894
899
  if issues:
895
900
  raise ContractError("\n".join(issues))
@@ -131,7 +131,10 @@ def _receipt_identity(
131
131
  *,
132
132
  checkpoint: str,
133
133
  ) -> dict[str, Any] | None:
134
- if release.provenance_mode == "governed":
134
+ if release.provenance_mode in {
135
+ "governed",
136
+ "authority-transition-bootstrap",
137
+ }:
135
138
  if receipt_path is None:
136
139
  raise ContractError("governed artifact attestation requires a lifecycle receipt")
137
140
  if receipt_path.name != release.receipt_asset:
@@ -311,8 +314,9 @@ def _expected_attestation(
311
314
  limit=1_000_000,
312
315
  label="artifact attestation release contract",
313
316
  )
317
+ transition = release.provenance_mode == "authority-transition-bootstrap"
314
318
  return {
315
- "schemaVersion": 1,
319
+ "schemaVersion": 2 if transition else 1,
316
320
  "kind": ATTESTATION_KIND,
317
321
  "checkpoint": checkpoint,
318
322
  "release": {
@@ -332,6 +336,20 @@ def _expected_attestation(
332
336
  authorization_path,
333
337
  checkpoint=checkpoint,
334
338
  ),
339
+ **(
340
+ {
341
+ "authorityTransition": {
342
+ "sourceAuthority": {
343
+ "version": release.transition_source_version,
344
+ "digest": release.transition_source_digest,
345
+ },
346
+ "skippedRelease": release.transition_skipped_version,
347
+ "bootstrapChangeId": release.transition_change_id,
348
+ }
349
+ }
350
+ if transition
351
+ else {}
352
+ ),
335
353
  "artifacts": _artifact_entries(artifact_root, release),
336
354
  }
337
355