engineering-process 0.7.0__tar.gz → 0.8.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 (200) hide show
  1. {engineering_process-0.7.0/engineering_process.egg-info → engineering_process-0.8.0}/PKG-INFO +73 -20
  2. {engineering_process-0.7.0 → engineering_process-0.8.0}/PRODUCTION_STANDARD.md +33 -0
  3. {engineering_process-0.7.0 → engineering_process-0.8.0}/README.md +71 -19
  4. {engineering_process-0.7.0 → engineering_process-0.8.0}/VERSIONING.md +63 -14
  5. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/__init__.py +1 -1
  6. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/bundles.py +21 -3
  7. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/cli.py +43 -0
  8. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/contracts.py +671 -60
  9. engineering_process-0.8.0/engineering_process/distribution.py +261 -0
  10. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/process_graph.py +10 -2
  11. engineering_process-0.8.0/engineering_process/publication.py +1981 -0
  12. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/requirements-release.txt +2 -0
  13. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/requirements-runtime.txt +1 -0
  14. engineering_process-0.8.0/engineering_process/skills.py +225 -0
  15. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/syncing.py +191 -16
  16. {engineering_process-0.7.0 → engineering_process-0.8.0/engineering_process.egg-info}/PKG-INFO +73 -20
  17. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process.egg-info/SOURCES.txt +2 -0
  18. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process.egg-info/requires.txt +1 -0
  19. engineering_process-0.8.0/examples/automation-process-adoption-policy.json +36 -0
  20. engineering_process-0.8.0/examples/automation-process-adoption-proposal.json +174 -0
  21. {engineering_process-0.7.0 → engineering_process-0.8.0}/improvement-catalog.json +15 -0
  22. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/evolve-process/SKILL.md +6 -0
  23. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/implement-change/SKILL.md +8 -0
  24. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/publish-change/SKILL.md +42 -16
  25. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/run-change/SKILL.md +5 -2
  26. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/run-change/references/execution.md +25 -2
  27. {engineering_process-0.7.0 → engineering_process-0.8.0}/pyproject.toml +3 -1
  28. engineering_process-0.8.0/release.json +53 -0
  29. engineering_process-0.8.0/schemas/automation-proposal-policy.schema.json +193 -0
  30. engineering_process-0.8.0/schemas/automation-proposal.schema.json +432 -0
  31. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_cli.py +1 -0
  32. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_contracts.py +154 -1
  33. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_distribution.py +62 -0
  34. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_evals.py +20 -0
  35. engineering_process-0.8.0/tests/test_publication.py +2232 -0
  36. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_runtime.py +13 -0
  37. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_schemas.py +10 -0
  38. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_skills.py +66 -1
  39. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_syncing.py +54 -0
  40. engineering_process-0.7.0/engineering_process/distribution.py +0 -113
  41. engineering_process-0.7.0/engineering_process/publication.py +0 -871
  42. engineering_process-0.7.0/engineering_process/skills.py +0 -118
  43. engineering_process-0.7.0/release.json +0 -50
  44. engineering_process-0.7.0/schemas/automation-proposal-policy.schema.json +0 -117
  45. engineering_process-0.7.0/schemas/automation-proposal.schema.json +0 -223
  46. engineering_process-0.7.0/tests/test_publication.py +0 -976
  47. {engineering_process-0.7.0 → engineering_process-0.8.0}/LICENSE +0 -0
  48. {engineering_process-0.7.0 → engineering_process-0.8.0}/MANIFEST.in +0 -0
  49. {engineering_process-0.7.0 → engineering_process-0.8.0}/PROCESS_IMPROVEMENT.md +0 -0
  50. {engineering_process-0.7.0 → engineering_process-0.8.0}/bundles.json +0 -0
  51. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/__main__.py +0 -0
  52. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/_download_worker.py +0 -0
  53. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/_supervisor_posix.py +0 -0
  54. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/_supervisor_windows.py +0 -0
  55. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/_windows_job.py +0 -0
  56. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/adoption.py +0 -0
  57. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/artifact_attestation.py +0 -0
  58. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/bootstrap.py +0 -0
  59. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/bounded_process.py +0 -0
  60. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/command_catalog.py +0 -0
  61. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/diagnostics.py +0 -0
  62. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/distribution_verify.py +0 -0
  63. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/environment.py +0 -0
  64. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/evidence.py +0 -0
  65. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/evidence_transport.py +0 -0
  66. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/git.py +0 -0
  67. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/git_attributes.py +0 -0
  68. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/helper_launch.py +0 -0
  69. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/impact.py +0 -0
  70. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/improvement.py +0 -0
  71. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/lifecycle.py +0 -0
  72. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/lifecycle_routes.py +0 -0
  73. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/managed.py +0 -0
  74. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/markdown.py +0 -0
  75. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/recommendation.py +0 -0
  76. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/release.py +0 -0
  77. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/release_candidate.py +0 -0
  78. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/remote_verification.py +0 -0
  79. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/requirements-build.txt +0 -0
  80. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/requirements-dev.txt +0 -0
  81. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/runner.py +0 -0
  82. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/runtime.py +0 -0
  83. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/supervision.py +0 -0
  84. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/supplemental.py +0 -0
  85. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process/tooling.py +0 -0
  86. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process.egg-info/dependency_links.txt +0 -0
  87. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process.egg-info/entry_points.txt +0 -0
  88. {engineering_process-0.7.0 → engineering_process-0.8.0}/engineering_process.egg-info/top_level.txt +0 -0
  89. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/adoption-migration.json +0 -0
  90. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/automation-policy.json +0 -0
  91. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/automation-proposal-policy.json +0 -0
  92. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/automation-proposal.json +0 -0
  93. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/change.json +0 -0
  94. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/improvement-catalog.json +0 -0
  95. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/improvement-disposition.json +0 -0
  96. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/improvement-reproduction.json +0 -0
  97. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/improvement-resolution.json +0 -0
  98. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/improvement-signal.json +0 -0
  99. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/plan-decision-review-assignment.json +0 -0
  100. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/plan-decision-review.json +0 -0
  101. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/plan.json +0 -0
  102. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/project.json +0 -0
  103. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/recommendation-resolution.json +0 -0
  104. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/recommendation-review-assignment.json +0 -0
  105. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/recommendation-review.json +0 -0
  106. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/recommendation.json +0 -0
  107. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/release-change.json +0 -0
  108. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/release.json +0 -0
  109. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/remote-verification-evidence.json +0 -0
  110. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/remote-verification-request.json +0 -0
  111. {engineering_process-0.7.0 → engineering_process-0.8.0}/examples/review.json +0 -0
  112. {engineering_process-0.7.0 → engineering_process-0.8.0}/process-graph.json +0 -0
  113. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/assess-design/SKILL.md +0 -0
  114. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/build-frontend/SKILL.md +0 -0
  115. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/build-frontend-foundation/SKILL.md +0 -0
  116. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/change-api/SKILL.md +0 -0
  117. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/cross-repo-change/SKILL.md +0 -0
  118. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/define-change-contract/SKILL.md +0 -0
  119. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/design-module/SKILL.md +0 -0
  120. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/finish-change/SKILL.md +0 -0
  121. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/govern-ui/SKILL.md +0 -0
  122. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/implement-module/SKILL.md +0 -0
  123. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/implement-use-case/SKILL.md +0 -0
  124. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/integrate-mcp/SKILL.md +0 -0
  125. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/maintain-docs/SKILL.md +0 -0
  126. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/plan-change/SKILL.md +0 -0
  127. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/review-change/SKILL.md +0 -0
  128. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/run-project-command/SKILL.md +0 -0
  129. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/specify-use-case/SKILL.md +0 -0
  130. {engineering_process-0.7.0 → engineering_process-0.8.0}/process_assets/skills/verify-change/SKILL.md +0 -0
  131. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/adoption-migration.schema.json +0 -0
  132. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/automation-policy.schema.json +0 -0
  133. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/change.schema.json +0 -0
  134. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/evidence-receipt.schema.json +0 -0
  135. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/improvement-catalog.schema.json +0 -0
  136. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/improvement-disposition.schema.json +0 -0
  137. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/improvement-reproduction.schema.json +0 -0
  138. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/improvement-resolution.schema.json +0 -0
  139. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/improvement-signal.schema.json +0 -0
  140. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/lifecycle.schema.json +0 -0
  141. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/plan-decision-review-assignment.schema.json +0 -0
  142. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/plan-decision-review.schema.json +0 -0
  143. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/plan.schema.json +0 -0
  144. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/process-graph.schema.json +0 -0
  145. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/process-lock.schema.json +0 -0
  146. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/project.schema.json +0 -0
  147. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/recommendation-resolution.schema.json +0 -0
  148. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/recommendation-review-assignment.schema.json +0 -0
  149. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/recommendation-review.schema.json +0 -0
  150. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/recommendation.schema.json +0 -0
  151. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/release-change.schema.json +0 -0
  152. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/release.schema.json +0 -0
  153. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/remote-verification-evidence.schema.json +0 -0
  154. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/remote-verification-request.schema.json +0 -0
  155. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/review.schema.json +0 -0
  156. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/reviewer-attestation.schema.json +0 -0
  157. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/supplemental-verification.schema.json +0 -0
  158. {engineering_process-0.7.0 → engineering_process-0.8.0}/schemas/verification.schema.json +0 -0
  159. {engineering_process-0.7.0 → engineering_process-0.8.0}/setup.cfg +0 -0
  160. {engineering_process-0.7.0 → engineering_process-0.8.0}/templates/AGENTS.process.md +0 -0
  161. {engineering_process-0.7.0 → engineering_process-0.8.0}/templates/PULL_REQUEST_TEMPLATE.md +0 -0
  162. {engineering_process-0.7.0 → engineering_process-0.8.0}/templates/adopt-process-windows-job.py +0 -0
  163. {engineering_process-0.7.0 → engineering_process-0.8.0}/templates/adopt-process.py +0 -0
  164. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_adoption.py +0 -0
  165. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_adoption_runner.py +0 -0
  166. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_artifact_attestation.py +0 -0
  167. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_bootstrap.py +0 -0
  168. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_bounded_process.py +0 -0
  169. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_bundles.py +0 -0
  170. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_completed_release_dispatch.py +0 -0
  171. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_completion_evidence_transport.py +0 -0
  172. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_diagnostics.py +0 -0
  173. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_distribution_verify.py +0 -0
  174. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_environment.py +0 -0
  175. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_impact.py +0 -0
  176. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_improvement.py +0 -0
  177. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_lifecycle.py +0 -0
  178. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_process_graph.py +0 -0
  179. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_process_install.py +0 -0
  180. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_publish_event.py +0 -0
  181. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_pypi_publication.py +0 -0
  182. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_recommendation.py +0 -0
  183. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_release.py +0 -0
  184. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_release_candidate.py +0 -0
  185. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_release_candidate_boundary.py +0 -0
  186. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_release_completion_identity.py +0 -0
  187. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_release_evidence_restore.py +0 -0
  188. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_release_evidence_selection.py +0 -0
  189. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_release_preparation.py +0 -0
  190. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_release_qualification.py +0 -0
  191. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_remote_verification.py +0 -0
  192. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_remote_verification_adapter.py +0 -0
  193. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_runner.py +0 -0
  194. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_self_hosting.py +0 -0
  195. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_source_checkout.py +0 -0
  196. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_supervision.py +0 -0
  197. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_supplemental.py +0 -0
  198. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_test_suite.py +0 -0
  199. {engineering_process-0.7.0 → engineering_process-0.8.0}/tests/test_tooling.py +0 -0
  200. {engineering_process-0.7.0 → engineering_process-0.8.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.7.0
3
+ Version: 0.8.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
@@ -19,6 +19,7 @@ Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
20
  Requires-Dist: markdown-it-py==4.2.0
21
21
  Requires-Dist: mdurl==0.1.2
22
+ Requires-Dist: pyyaml==6.0.3
22
23
  Requires-Dist: regex==2026.7.19
23
24
  Provides-Extra: dev
24
25
  Requires-Dist: attrs==26.1.0; extra == "dev"
@@ -175,17 +176,18 @@ Renovate must install and verify a target authority before that target exists in
175
176
  checkout, and `processctl sync --check` compares those bytes with the pinned
176
177
  distribution.
177
178
 
178
- For an existing consumer, automation may prepare one unpublished adoption candidate,
179
- but the normal Renovate PR-first route is excluded from process-authority updates.
180
- The managed runner installs the target authority from the complete hash lock outside
181
- the checkout and atomically updates the process lock and managed assets before the
182
- lifecycle host publishes the completed candidate. If the consumer chooses or requires
183
- new project configuration, it adds
179
+ For an existing opted-in consumer, Renovate may prepare and publish one complete
180
+ process-adoption proposal before consumer-owner review. The managed runner installs
181
+ the target authority from the complete hash lock outside the checkout and atomically
182
+ updates the process lock and managed assets before PR creation. If the consumer
183
+ chooses or requires new project configuration, it adds
184
184
  `.process/adoption-migrations/<target-version>.json`; the installed target authority
185
185
  binds the source and target manifest digests, validates the complete target manifest,
186
186
  and updates `.process/project.json` in the same rollback transaction. Optional
187
- capabilities are never inferred. CI and a fresh isolated review context approve the
188
- fully materialized checkpoint; merge completes adoption and no post-merge sync runs.
187
+ capabilities are never inferred. Consumer CI and its chosen review approve the fully
188
+ materialized checkpoint. Renovate cannot auto-merge it; consumer-owner merge completes
189
+ adoption and no post-merge sync runs. Separately, an agent-host candidate created only
190
+ after lifecycle completion retains normal standing-policy auto-merge.
189
191
 
190
192
  The engineering-process producer repository separately owns its root
191
193
  `.gitattributes` policy so tracked text sources and distribution inputs are LF and
@@ -600,7 +602,7 @@ to the explicit durable failure location before cleanup. Remote artifacts and th
600
602
  service ids remain lifecycle evidence, not merge, release, deployment, or adoption
601
603
  authority.
602
604
 
603
- The canonical publication order is stricter than a PR-first workflow: implementation
605
+ The default agent-host publication order is stricter than a PR-first workflow: implementation
604
606
  and every required local and remote profile pass on a clean checkpoint; a consumer-selected independent
605
607
  agent or human semantically reviews that checkpoint; findings repeat implementation,
606
608
  complete verification, and fresh review until approved; `change finish` records
@@ -608,6 +610,9 @@ completion; only then may automation push and create the PR. Static policy/secre
608
610
  checks supplement this review and cannot generate a semantic verdict. With a valid
609
611
  standing policy, automation then waits for exact-head/current-base required checks and
610
612
  performs the configured merge without a separate human step.
613
+ An opted-in schema-3 Renovate process-adoption proposal is the explicit pre-review
614
+ publication exception; its complete candidate passes protected-base proposal
615
+ validation first, then consumer-owner review and manual terminal merge.
611
616
 
612
617
  Completed local evidence can be moved across machines or attached to a release as a
613
618
  bounded receipt. Export and validate it before any explicit prune:
@@ -686,13 +691,14 @@ without per-action confirmation.
686
691
  ### Controlled automation proposals
687
692
 
688
693
  Completion-before-publication remains the default. A consumer may enable an untrusted
689
- dependency proposal before completion only through a policy file already present on
690
- the protected base at `.process/automation-proposals.json`. The policy uses the
691
- shape in `examples/automation-proposal-policy.json`: current policy uses schema 2,
692
- selects the target and automation prefix, allows only `dependency-update`,
693
- requires the canonical `lifecycle-completion` check, and fixes every dangerous control
694
- to its fail-closed value. Absence, disablement, a branch-only policy, or a policy digest
695
- mismatch blocks the route.
694
+ automation proposal before completion only through a policy file already present on
695
+ the protected base at `.process/automation-proposals.json`. Schema 1 and schema 2 use
696
+ the shape in `examples/automation-proposal-policy.json`, allow only
697
+ `dependency-update`, require the canonical `lifecycle-completion` check, and retain
698
+ their released human-only and completion-gated meanings. Schema 3 uses
699
+ `examples/automation-process-adoption-policy.json` for the distinct
700
+ `process-adoption` route. Absence, disablement, a branch-only policy, or a policy
701
+ digest mismatch blocks every route.
696
702
 
697
703
  The immutable provider verifier emits one bounded
698
704
  `engineering-process-controlled-automation-proposal` report for the exact repository,
@@ -717,9 +723,9 @@ processctl publication validate-proposal --project-root . \
717
723
 
718
724
  This pass proves only that the proposal is safe to expose as untrusted input. It is
719
725
  not verification, semantic review, completion, or merge authority. Proposal checks
720
- remain read-only and receive no secrets; automerge, scripts, plugins, shell execution,
721
- privileged CI, process-authority, workflow, release, deployment, security-policy, and
722
- trust-root changes are excluded.
726
+ remain read-only and receive no secrets. Dependency proposals exclude automerge,
727
+ scripts, plugins, shell execution, privileged CI, process-authority, workflow,
728
+ release, deployment, security-policy, and trust-root changes.
723
729
 
724
730
  The required completion check is absent on every new proposal head. After the exact
725
731
  head completes the lifecycle, export its receipt, finalize the managed PR requirements,
@@ -747,6 +753,53 @@ after the protected base's standing automation policy and exact completion gate
747
753
  Provider tokens, check APIs, branch protection, retries, and repository selection
748
754
  remain consumer-owned adapter behavior.
749
755
 
756
+ Schema-3 process adoption has a different merge boundary. Renovate may create the PR
757
+ only after its allowlisted managed runner has materialized the complete target: direct
758
+ pin, cross-platform hash lock, process lock, managed files, any declared project
759
+ migration, and every immutable action pin. A protected-base immutable verifier is
760
+ fixed by repository and commit in the opt-in policy. Its evidence binds the producer
761
+ release/tag/commit/attestation, source and target authority versions and digests,
762
+ requirements bytes, exact base/head/path set, migration result, complete managed-file
763
+ set, and exact verifier identity. Workflow changes must be only the declared full-SHA
764
+ action-pin replacements with their release annotations.
765
+
766
+ The protected-base policy also fixes the producer repository. The report binds bounded
767
+ raw release-contract and distribution-attestation bytes, their digests, lifecycle
768
+ receipt identity, complete artifact hashes, and the verifier's exact target
769
+ materialization result. The adapter independently supplies a clean producer checkout
770
+ with the exact tag and origin plus downloaded release artifacts, lifecycle receipt,
771
+ and attestation; report bytes alone never pass. Existing release and
772
+ artifact-attestation validators resolve those objects before the target distribution
773
+ is compared with the complete consumer materialization. Validation also requires the
774
+ target wheel hash in the committed requirements lock and every use of that producer action
775
+ across the complete regular-workflow tree; the protected base must be an ancestor and
776
+ workflow mode may not change. Workflow semantics are read with the pinned maintained
777
+ PyYAML safe loader; the process does not maintain a substitute YAML scanner.
778
+
779
+ For schema 3, add these independently resolved inputs to `validate-proposal`:
780
+
781
+ ~~~text
782
+ --producer-root <clean-release-checkout> \
783
+ --producer-artifact-root <downloaded-release-artifacts> \
784
+ --producer-receipt <release-lifecycle-receipt> \
785
+ --producer-attestation <distribution-attestation>
786
+ ~~~
787
+
788
+ The schema fixes `automerge` to false, `consumerOwnerMergeRequired` to true, and
789
+ `postMergeMutation` to false. `publication validate-proposal-completion` always rejects
790
+ this kind: lifecycle completion, standing automation, provider state, and a successful
791
+ proposal check cannot convert it to automatic merge. The consumer chooses project
792
+ configuration, commands, verification, review method, and whether to merge. Its owner
793
+ manually merges the reviewed PR; that merge is the terminal adoption cutover and no
794
+ post-merge synchronization runs.
795
+
796
+ This does not alter the ordinary agent-host route. When an agent host completes the
797
+ full lifecycle before it creates a source or adoption PR, the completed exact head may
798
+ still auto-merge under the protected base's standing policy. Origin and publication
799
+ state select the route: an agent-host completed PR is not reclassified as a Renovate
800
+ proposal, and a Renovate process-adoption proposal never inherits completed-source
801
+ auto-merge authority.
802
+
750
803
  ## Trust boundary
751
804
 
752
805
  The CLI proves structural separation: reviewer actor id and context id must both be
@@ -164,6 +164,15 @@ release, deployment, or adoption authority.
164
164
 
165
165
  ## Resource and generated-state policy
166
166
 
167
+ Before implementing a standard format, protocol, parser, serializer, cryptographic
168
+ primitive, or platform integration, evaluate maintained dependencies and supported
169
+ tools at the owning boundary. Prefer a mature dependency when it materially reduces
170
+ custom semantics and satisfies compatibility, licensing, supply-chain, portability,
171
+ and resource-bound requirements; add it through the project's managed dependency and
172
+ lock flow. A custom implementation requires concrete evidence that available
173
+ dependencies cannot meet the accepted contract. Do not recreate a mature standard
174
+ merely to avoid proposing or installing a useful dependency.
175
+
167
176
  Every operation over repository-controlled or remote input has explicit limits for
168
177
  time, count, individual item size, aggregate size, output, and process descendants.
169
178
  Limits fail closed and have regression coverage for success, failure, timeout, and
@@ -177,6 +186,30 @@ authority, and shares one rollback boundary with the process lock and managed as
177
186
  Optional capabilities are never inferred, while configuration required by the target
178
187
  authority blocks adoption when it is missing or invalid.
179
188
 
189
+ Proposal merge authority derives from proposal origin and publication state. An
190
+ agent-host review object created only after full lifecycle completion may use standing
191
+ policy auto-merge for its exact approved head. A Renovate `process-adoption` proposal
192
+ is created before consumer-owner review and must instead fix automerge false,
193
+ `consumerOwnerMergeRequired` true, and post-merge mutation false. Lifecycle
194
+ completion, standing policy, provider state, and successful static checks never move
195
+ that proposal onto the agent-host route. The consumer owns review and manually
196
+ authorizes merge; merge is the terminal cutover.
197
+
198
+ Before candidate-owned commands, a protected-base immutable verifier independently
199
+ binds the actual base and exact head, producer release/tag/commit/attestation, source
200
+ and target process identities, requirements bytes, process lock, migration result,
201
+ complete selected managed-file set, grouped full-SHA action-pin-only workflow delta,
202
+ and verifier identity. Producer and verifier repositories are protected-base owned;
203
+ report-controlled release claims never authenticate themselves. A separately supplied
204
+ clean tagged producer checkout, artifacts, receipt, and attestation pass the existing
205
+ release/attestation validators and exact target synchronization. Base must be
206
+ an ancestor of head, and every producer use in the regular-workflow tree moves as one
207
+ unchanged-mode pin group. Partial, stale, inferred, unauthorized, or post-merge-dependent
208
+ candidates fail closed. This portable boundary reuses ordinary Renovate generation,
209
+ managed adoption, consumer CI, review and branch protection. It does not introduce a
210
+ reviewer host, daemon, scheduler, generic workflow engine, dynamically generated
211
+ approval chain, meta-assessment, or reviewer-of-reviewer layer.
212
+
180
213
  Released serialized contracts are never tightened in place. A new resource bound or
181
214
  meaning-changing requirement uses a new integer schema major with explicit migration;
182
215
  historical readers retain their published behavior. A new optional capability may
@@ -140,17 +140,18 @@ Renovate must install and verify a target authority before that target exists in
140
140
  checkout, and `processctl sync --check` compares those bytes with the pinned
141
141
  distribution.
142
142
 
143
- For an existing consumer, automation may prepare one unpublished adoption candidate,
144
- but the normal Renovate PR-first route is excluded from process-authority updates.
145
- The managed runner installs the target authority from the complete hash lock outside
146
- the checkout and atomically updates the process lock and managed assets before the
147
- lifecycle host publishes the completed candidate. If the consumer chooses or requires
148
- new project configuration, it adds
143
+ For an existing opted-in consumer, Renovate may prepare and publish one complete
144
+ process-adoption proposal before consumer-owner review. The managed runner installs
145
+ the target authority from the complete hash lock outside the checkout and atomically
146
+ updates the process lock and managed assets before PR creation. If the consumer
147
+ chooses or requires new project configuration, it adds
149
148
  `.process/adoption-migrations/<target-version>.json`; the installed target authority
150
149
  binds the source and target manifest digests, validates the complete target manifest,
151
150
  and updates `.process/project.json` in the same rollback transaction. Optional
152
- capabilities are never inferred. CI and a fresh isolated review context approve the
153
- fully materialized checkpoint; merge completes adoption and no post-merge sync runs.
151
+ capabilities are never inferred. Consumer CI and its chosen review approve the fully
152
+ materialized checkpoint. Renovate cannot auto-merge it; consumer-owner merge completes
153
+ adoption and no post-merge sync runs. Separately, an agent-host candidate created only
154
+ after lifecycle completion retains normal standing-policy auto-merge.
154
155
 
155
156
  The engineering-process producer repository separately owns its root
156
157
  `.gitattributes` policy so tracked text sources and distribution inputs are LF and
@@ -565,7 +566,7 @@ to the explicit durable failure location before cleanup. Remote artifacts and th
565
566
  service ids remain lifecycle evidence, not merge, release, deployment, or adoption
566
567
  authority.
567
568
 
568
- The canonical publication order is stricter than a PR-first workflow: implementation
569
+ The default agent-host publication order is stricter than a PR-first workflow: implementation
569
570
  and every required local and remote profile pass on a clean checkpoint; a consumer-selected independent
570
571
  agent or human semantically reviews that checkpoint; findings repeat implementation,
571
572
  complete verification, and fresh review until approved; `change finish` records
@@ -573,6 +574,9 @@ completion; only then may automation push and create the PR. Static policy/secre
573
574
  checks supplement this review and cannot generate a semantic verdict. With a valid
574
575
  standing policy, automation then waits for exact-head/current-base required checks and
575
576
  performs the configured merge without a separate human step.
577
+ An opted-in schema-3 Renovate process-adoption proposal is the explicit pre-review
578
+ publication exception; its complete candidate passes protected-base proposal
579
+ validation first, then consumer-owner review and manual terminal merge.
576
580
 
577
581
  Completed local evidence can be moved across machines or attached to a release as a
578
582
  bounded receipt. Export and validate it before any explicit prune:
@@ -651,13 +655,14 @@ without per-action confirmation.
651
655
  ### Controlled automation proposals
652
656
 
653
657
  Completion-before-publication remains the default. A consumer may enable an untrusted
654
- dependency proposal before completion only through a policy file already present on
655
- the protected base at `.process/automation-proposals.json`. The policy uses the
656
- shape in `examples/automation-proposal-policy.json`: current policy uses schema 2,
657
- selects the target and automation prefix, allows only `dependency-update`,
658
- requires the canonical `lifecycle-completion` check, and fixes every dangerous control
659
- to its fail-closed value. Absence, disablement, a branch-only policy, or a policy digest
660
- mismatch blocks the route.
658
+ automation proposal before completion only through a policy file already present on
659
+ the protected base at `.process/automation-proposals.json`. Schema 1 and schema 2 use
660
+ the shape in `examples/automation-proposal-policy.json`, allow only
661
+ `dependency-update`, require the canonical `lifecycle-completion` check, and retain
662
+ their released human-only and completion-gated meanings. Schema 3 uses
663
+ `examples/automation-process-adoption-policy.json` for the distinct
664
+ `process-adoption` route. Absence, disablement, a branch-only policy, or a policy
665
+ digest mismatch blocks every route.
661
666
 
662
667
  The immutable provider verifier emits one bounded
663
668
  `engineering-process-controlled-automation-proposal` report for the exact repository,
@@ -682,9 +687,9 @@ processctl publication validate-proposal --project-root . \
682
687
 
683
688
  This pass proves only that the proposal is safe to expose as untrusted input. It is
684
689
  not verification, semantic review, completion, or merge authority. Proposal checks
685
- remain read-only and receive no secrets; automerge, scripts, plugins, shell execution,
686
- privileged CI, process-authority, workflow, release, deployment, security-policy, and
687
- trust-root changes are excluded.
690
+ remain read-only and receive no secrets. Dependency proposals exclude automerge,
691
+ scripts, plugins, shell execution, privileged CI, process-authority, workflow,
692
+ release, deployment, security-policy, and trust-root changes.
688
693
 
689
694
  The required completion check is absent on every new proposal head. After the exact
690
695
  head completes the lifecycle, export its receipt, finalize the managed PR requirements,
@@ -712,6 +717,53 @@ after the protected base's standing automation policy and exact completion gate
712
717
  Provider tokens, check APIs, branch protection, retries, and repository selection
713
718
  remain consumer-owned adapter behavior.
714
719
 
720
+ Schema-3 process adoption has a different merge boundary. Renovate may create the PR
721
+ only after its allowlisted managed runner has materialized the complete target: direct
722
+ pin, cross-platform hash lock, process lock, managed files, any declared project
723
+ migration, and every immutable action pin. A protected-base immutable verifier is
724
+ fixed by repository and commit in the opt-in policy. Its evidence binds the producer
725
+ release/tag/commit/attestation, source and target authority versions and digests,
726
+ requirements bytes, exact base/head/path set, migration result, complete managed-file
727
+ set, and exact verifier identity. Workflow changes must be only the declared full-SHA
728
+ action-pin replacements with their release annotations.
729
+
730
+ The protected-base policy also fixes the producer repository. The report binds bounded
731
+ raw release-contract and distribution-attestation bytes, their digests, lifecycle
732
+ receipt identity, complete artifact hashes, and the verifier's exact target
733
+ materialization result. The adapter independently supplies a clean producer checkout
734
+ with the exact tag and origin plus downloaded release artifacts, lifecycle receipt,
735
+ and attestation; report bytes alone never pass. Existing release and
736
+ artifact-attestation validators resolve those objects before the target distribution
737
+ is compared with the complete consumer materialization. Validation also requires the
738
+ target wheel hash in the committed requirements lock and every use of that producer action
739
+ across the complete regular-workflow tree; the protected base must be an ancestor and
740
+ workflow mode may not change. Workflow semantics are read with the pinned maintained
741
+ PyYAML safe loader; the process does not maintain a substitute YAML scanner.
742
+
743
+ For schema 3, add these independently resolved inputs to `validate-proposal`:
744
+
745
+ ~~~text
746
+ --producer-root <clean-release-checkout> \
747
+ --producer-artifact-root <downloaded-release-artifacts> \
748
+ --producer-receipt <release-lifecycle-receipt> \
749
+ --producer-attestation <distribution-attestation>
750
+ ~~~
751
+
752
+ The schema fixes `automerge` to false, `consumerOwnerMergeRequired` to true, and
753
+ `postMergeMutation` to false. `publication validate-proposal-completion` always rejects
754
+ this kind: lifecycle completion, standing automation, provider state, and a successful
755
+ proposal check cannot convert it to automatic merge. The consumer chooses project
756
+ configuration, commands, verification, review method, and whether to merge. Its owner
757
+ manually merges the reviewed PR; that merge is the terminal adoption cutover and no
758
+ post-merge synchronization runs.
759
+
760
+ This does not alter the ordinary agent-host route. When an agent host completes the
761
+ full lifecycle before it creates a source or adoption PR, the completed exact head may
762
+ still auto-merge under the protected base's standing policy. Origin and publication
763
+ state select the route: an agent-host completed PR is not reclassified as a Renovate
764
+ proposal, and a Renovate process-adoption proposal never inherits completed-source
765
+ auto-merge authority.
766
+
715
767
  ## Trust boundary
716
768
 
717
769
  The CLI proves structural separation: reviewer actor id and context id must both be
@@ -118,6 +118,49 @@ base, so a base advance forces a new head and invalidates the old completion che
118
118
  The producer capability must be released immutably before a consumer pins and enables
119
119
  it; no consumer may depend on the producer working tree.
120
120
 
121
+ ## Process-adoption proposal capability
122
+
123
+ Automation-proposal schema 3 is a separate `process-adoption` contract. The consumer
124
+ must first merge a completed opt-in policy that fixes Renovate as the proposal owner,
125
+ fixes an immutable protected-base verifier repository and commit, requires
126
+ `consumer-owner-merge`, and structurally sets `automerge` false,
127
+ `consumerOwnerMergeRequired` true, and `postMergeMutation` false. Schema 1 and schema
128
+ 2 dependency proposals retain their released fields and completion routes.
129
+
130
+ The protected-base policy fixes both producer and verifier repositories. The verifier
131
+ binds one complete candidate to the immutable producer release, tag,
132
+ commit and attestation; source and target authority identities; exact requirements
133
+ input and complete hash lock bytes; target process lock; complete selected managed
134
+ distribution; declared project migration; grouped full-SHA action-pin replacements;
135
+ and exact repository, protected base, head, path set, metadata and verifier identity.
136
+ The actual protected base is supplied independently of Renovate evidence. The report
137
+ binds bounded raw release-contract and distribution-attestation bytes, the lifecycle
138
+ receipt identity, complete artifact hashes, and exact target materialization. Those
139
+ report-controlled bytes grant no authority alone. The protected-base adapter supplies
140
+ a separate clean exact-tag producer checkout, release artifacts, receipt, and
141
+ attestation; existing release/attestation validators resolve tag ancestry, receipt,
142
+ artifact bytes, process digest, and complete consumer synchronization. The
143
+ independently resolved base must be an ancestor of the head;
144
+ every producer action use in the bounded regular-workflow tree must move as one group
145
+ with unchanged mode, and the verified wheel hash must occur in the lock. Missing or
146
+ stale identity, a partial pin, an omitted lock or managed file, an inferred migration,
147
+ an unrelated workflow/path change, or a post-merge action fails closed before
148
+ candidate-owned project commands run.
149
+
150
+ Renovate creates this complete PR before consumer-owner review and never merges it.
151
+ The consumer owns its project migration, commands, checks, review choice and merge
152
+ decision. Manual consumer-owner merge is the terminal adoption cutover; neither
153
+ proposal validation, lifecycle completion, standing automation nor provider state can
154
+ escalate it to automatic merge, and no synchronization follows merge. This boundary
155
+ does not affect an agent-host PR created only after full lifecycle completion: that
156
+ exact head retains standing-policy auto-merge.
157
+
158
+ The producer ships and self-adopts this capability before any repository enables
159
+ schema 3 or before Renovate operations allow its exact post-upgrade command. Capability
160
+ release, consumer opt-in and Renovate operations activation are separate reviewed
161
+ changes; same-release activation and dependence on a producer working tree are
162
+ forbidden.
163
+
121
164
  ## Federated process-improvement capability
122
165
 
123
166
  Improvement signals, dispositions, resolutions, reproductions, and the producer
@@ -191,25 +234,31 @@ process semantics.
191
234
 
192
235
  ## Release and adoption boundary
193
236
 
194
- Release, self-adoption, and consumer adoption are separate changes:
237
+ Release, self-adoption, and consumer adoption are separate changes. The numbered
238
+ sequence below is the default agent-host completion-first route:
195
239
 
196
240
  1. Release N governs and verifies the source of N+1.
197
241
  2. N+1 is published as an immutable release and its public hashes are verified.
198
242
  3. Consumer-owned automation prepares an unpublished local candidate artifact,
199
243
  updates the direct pin, regenerates the hash-locked dependency graph, and runs the
200
- managed adoption runner. Renovate must not publish a process-authority branch or
201
- PR because its normal PR-first execution cannot satisfy this lifecycle boundary.
244
+ managed adoption runner. On this agent-host route, no process-authority branch or
245
+ PR is published before lifecycle completion.
202
246
  4. Required profiles validate the immutable candidate. The consumer-selected host
203
247
  supplies an independent semantic agent or human review; findings repeat candidate
204
248
  generation and full verification until lifecycle completion. Each
205
249
  platform/runtime job publishes a bounded supplemental evidence bundle bound to the
206
250
  source checkpoint, workflow checkpoint, run identity, and profile-report hashes.
207
- Only after completion may automation push the candidate branch and create the PR
251
+ Only after completion may the agent host push the candidate branch and create the PR
208
252
  containing the process lock and every selected managed asset. A valid consumer
209
253
  standing policy may merge that exact checkpoint automatically after required
210
254
  checks; there is no post-merge synchronization.
211
255
  5. N+1 governs only changes that begin after the merged adoption checkpoint.
212
256
 
257
+ An opted-in schema-3 Renovate `process-adoption` proposal is the explicit exception to
258
+ steps 3-4: after complete materialization and protected-base proposal validation,
259
+ Renovate may publish it before consumer-owner review. It never receives agent-host
260
+ completion or standing auto-merge authority; consumer-owner manual merge is terminal.
261
+
213
262
  The repository-root GitHub Action and Python package are two surfaces of the same
214
263
  governed release checkpoint. A consumer invocation pins the action by the release
215
264
  commit's full object id and keeps the `v<SemVer>` annotation; Renovate groups that
@@ -224,13 +273,12 @@ and managed bootstrap snapshots required before a target version is installed. A
224
273
  clean-cutover PR may delete an obsolete local helper only after it pins an immutable
225
274
  public action checkpoint; no compatibility shim or dual execution path is retained.
226
275
 
227
- Process-authority adoption candidates are not controlled dependency proposals and
228
- cannot use that exception. PR creation is blocked until the adoption candidate has
229
- current completion evidence.
230
- Provider automerge before completion is forbidden for process-authority updates. A
231
- completed exact adoption candidate may merge automatically only under the consumer's
232
- standing policy. A PR that changes only a requirement pin, omits generated hashes or
233
- managed assets, or requires a post-merge step must fail closed.
276
+ Process-authority adoption is not a controlled dependency proposal. An opted-in
277
+ schema-3 consumer may receive a complete Renovate `process-adoption` PR before review,
278
+ but it is permanently excluded from provider automerge. A separate agent-host
279
+ candidate created after exact lifecycle completion remains on the standing-policy
280
+ auto-merge route. A PR that changes only a requirement pin, omits generated hashes or
281
+ managed assets, or requires a post-merge step fails closed on either route.
234
282
 
235
283
  `requirements/process.in` owns the direct public pin and `requirements/process.txt`
236
284
  is its pip-compile hash lock. The lock generator is pinned, and the committed lock must
@@ -281,9 +329,10 @@ falling back to a partial proposal.
281
329
  derived identity surface without writing protected `main` directly.
282
330
  - `processctl` derives and validates classification, compatibility, identity, reviewed
283
331
  tree equivalence, and authorization evidence.
284
- - Consumer automation may prepare complete unpublished adoption candidates before
285
- completion; the lifecycle host publishes and, under standing policy, merges them
286
- only after exact completion and protected checks.
332
+ - Renovate may publish a complete schema-3 process-adoption proposal before owner
333
+ review, but only the consumer owner may merge it and merge is terminal. Agent-host
334
+ candidates published after exact lifecycle completion retain standing-policy
335
+ auto-merge.
287
336
  - Independent review verifies the exact Release PR classification, migration,
288
337
  verification, and evidence checkpoint.
289
338
  - The repository's standing policy authorizes the exact completed Release PR and each
@@ -1,3 +1,3 @@
1
1
  """Agent-neutral engineering process."""
2
2
 
3
- VERSION = "0.7.0"
3
+ VERSION = "0.8.0"
@@ -20,7 +20,12 @@ def bundles_path(process_root: Path) -> Path:
20
20
  raise ContractError(f"{process_root}: cannot locate bundles.json")
21
21
 
22
22
 
23
- def load_bundles(process_root: Path, skills_root: Path) -> dict[str, tuple[str, ...]]:
23
+ def load_bundles(
24
+ process_root: Path,
25
+ skills_root: Path,
26
+ *,
27
+ selected_skills: tuple[str, ...] | None = None,
28
+ ) -> dict[str, tuple[str, ...]]:
24
29
  path = bundles_path(process_root)
25
30
  document = read_json(path)
26
31
  if (
@@ -32,7 +37,16 @@ def load_bundles(process_root: Path, skills_root: Path) -> dict[str, tuple[str,
32
37
  ):
33
38
  raise ContractError(f"{path}: invalid bundle contract")
34
39
 
35
- available = {directory.name for directory in skill_directories(skills_root)}
40
+ available = (
41
+ {directory.name for directory in skill_directories(skills_root)}
42
+ if selected_skills is None
43
+ else {
44
+ skill
45
+ for skill in selected_skills
46
+ if (skills_root / skill / "SKILL.md").is_file()
47
+ and not (skills_root / skill).is_symlink()
48
+ }
49
+ )
36
50
  result: dict[str, tuple[str, ...]] = {}
37
51
  owned: dict[str, str] = {}
38
52
  for name, raw_skills in document["bundles"].items():
@@ -48,7 +62,11 @@ def load_bundles(process_root: Path, skills_root: Path) -> dict[str, tuple[str,
48
62
  or raw_skills != sorted(set(raw_skills))
49
63
  ):
50
64
  raise ContractError(f"{path}: bundle {name} must be a sorted unique skill list")
51
- missing = sorted(set(raw_skills) - available)
65
+ missing = sorted(
66
+ (set(raw_skills) - available)
67
+ if selected_skills is None
68
+ else (set(raw_skills) & set(selected_skills)) - available
69
+ )
52
70
  if missing:
53
71
  raise ContractError(
54
72
  f"{path}: bundle {name} references missing skills: {', '.join(missing)}"
@@ -1341,8 +1341,34 @@ def _proposal_policy_evidence(args: argparse.Namespace):
1341
1341
  )
1342
1342
 
1343
1343
 
1344
+ def _proposal_producer_inputs(
1345
+ args: argparse.Namespace, proposal: object
1346
+ ) -> dict[str, Path] | None:
1347
+ values = {
1348
+ "root": args.producer_root,
1349
+ "artifacts": args.producer_artifact_root,
1350
+ "receipt": args.producer_receipt,
1351
+ "attestation": args.producer_attestation,
1352
+ }
1353
+ supplied = [value is not None for value in values.values()]
1354
+ if getattr(proposal, "proposal_kind", "dependency-update") == "process-adoption":
1355
+ if not all(supplied):
1356
+ raise ContractError(
1357
+ "process-adoption validation requires --producer-root, "
1358
+ "--producer-artifact-root, --producer-receipt, and "
1359
+ "--producer-attestation"
1360
+ )
1361
+ return {name: value for name, value in values.items() if value is not None}
1362
+ if any(supplied):
1363
+ raise ContractError(
1364
+ "producer release inputs apply only to process-adoption proposals"
1365
+ )
1366
+ return None
1367
+
1368
+
1344
1369
  def command_publication_validate_proposal(args: argparse.Namespace) -> int:
1345
1370
  proposal = _proposal_policy_evidence(args)
1371
+ producer_inputs = _proposal_producer_inputs(args, proposal)
1346
1372
  source = source_state(args.project_root)
1347
1373
  issues = validate_controlled_automation_proposal(
1348
1374
  args.project_root,
@@ -1358,6 +1384,7 @@ def command_publication_validate_proposal(args: argparse.Namespace) -> int:
1358
1384
  verifier_commit=args.verifier_commit,
1359
1385
  proposal=proposal,
1360
1386
  source=source,
1387
+ producer_inputs=producer_inputs,
1361
1388
  )
1362
1389
  return _publication_result(
1363
1390
  args,
@@ -1368,6 +1395,7 @@ def command_publication_validate_proposal(args: argparse.Namespace) -> int:
1368
1395
  branch=args.branch,
1369
1396
  commit=args.commit,
1370
1397
  completionCheck=proposal.completion_check,
1398
+ consumerOwnerMergeRequired=proposal.consumer_owner_merge_required,
1371
1399
  proposalKind=proposal.proposal_kind,
1372
1400
  policySha256=proposal.opt_in_sha256,
1373
1401
  repository=args.repository,
@@ -1382,6 +1410,7 @@ def command_publication_validate_proposal_completion(
1382
1410
  args: argparse.Namespace,
1383
1411
  ) -> int:
1384
1412
  proposal = _proposal_policy_evidence(args)
1413
+ producer_inputs = _proposal_producer_inputs(args, proposal)
1385
1414
  evidence = validate_receipt(args.evidence)
1386
1415
  project_path = args.project_root / ".process" / "project.json"
1387
1416
  project = validate_project(read_json(project_path), str(project_path))
@@ -1402,6 +1431,7 @@ def command_publication_validate_proposal_completion(
1402
1431
  proposal=proposal,
1403
1432
  evidence=evidence,
1404
1433
  source=source,
1434
+ producer_inputs=producer_inputs,
1405
1435
  )
1406
1436
  return _publication_result(
1407
1437
  args,
@@ -1412,6 +1442,7 @@ def command_publication_validate_proposal_completion(
1412
1442
  changeId=evidence["changeId"],
1413
1443
  commit=args.commit,
1414
1444
  completionCheck=proposal.completion_check,
1445
+ consumerOwnerMergeRequired=proposal.consumer_owner_merge_required,
1415
1446
  evidenceKind=args.evidence_kind,
1416
1447
  evidenceSha256=evidence["sha256"],
1417
1448
  policySha256=proposal.opt_in_sha256,
@@ -2026,6 +2057,10 @@ def build_parser() -> argparse.ArgumentParser:
2026
2057
  publication_proposal.add_argument("--body-file", type=Path)
2027
2058
  publication_proposal.add_argument("--verifier-repository", required=True)
2028
2059
  publication_proposal.add_argument("--verifier-commit", required=True)
2060
+ publication_proposal.add_argument("--producer-root", type=Path)
2061
+ publication_proposal.add_argument("--producer-artifact-root", type=Path)
2062
+ publication_proposal.add_argument("--producer-receipt", type=Path)
2063
+ publication_proposal.add_argument("--producer-attestation", type=Path)
2029
2064
  _add_json(publication_proposal)
2030
2065
  publication_proposal.set_defaults(
2031
2066
  handler=command_publication_validate_proposal
@@ -2058,6 +2093,14 @@ def build_parser() -> argparse.ArgumentParser:
2058
2093
  "--verifier-repository", required=True
2059
2094
  )
2060
2095
  publication_proposal_completion.add_argument("--verifier-commit", required=True)
2096
+ publication_proposal_completion.add_argument("--producer-root", type=Path)
2097
+ publication_proposal_completion.add_argument(
2098
+ "--producer-artifact-root", type=Path
2099
+ )
2100
+ publication_proposal_completion.add_argument("--producer-receipt", type=Path)
2101
+ publication_proposal_completion.add_argument(
2102
+ "--producer-attestation", type=Path
2103
+ )
2061
2104
  _add_json(publication_proposal_completion)
2062
2105
  publication_proposal_completion.set_defaults(
2063
2106
  handler=command_publication_validate_proposal_completion