engineering-process 0.6.0__tar.gz → 0.7.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 (192) hide show
  1. {engineering_process-0.6.0/engineering_process.egg-info → engineering_process-0.7.0}/PKG-INFO +61 -8
  2. {engineering_process-0.6.0 → engineering_process-0.7.0}/PRODUCTION_STANDARD.md +34 -0
  3. {engineering_process-0.6.0 → engineering_process-0.7.0}/README.md +60 -7
  4. {engineering_process-0.6.0 → engineering_process-0.7.0}/VERSIONING.md +26 -0
  5. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/__init__.py +1 -1
  6. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/cli.py +120 -1
  7. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/command_catalog.py +3 -0
  8. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/contracts.py +388 -6
  9. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/distribution_verify.py +4 -0
  10. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/environment.py +34 -5
  11. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/evidence.py +324 -2
  12. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/lifecycle.py +733 -24
  13. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/process_graph.py +18 -3
  14. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/release_candidate.py +193 -3
  15. {engineering_process-0.6.0 → engineering_process-0.7.0/engineering_process.egg-info}/PKG-INFO +61 -8
  16. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process.egg-info/SOURCES.txt +4 -0
  17. engineering_process-0.7.0/examples/plan-decision-review-assignment.json +45 -0
  18. engineering_process-0.7.0/examples/plan-decision-review.json +26 -0
  19. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/plan.json +14 -2
  20. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/project.json +15 -1
  21. {engineering_process-0.6.0 → engineering_process-0.7.0}/improvement-catalog.json +18 -2
  22. {engineering_process-0.6.0 → engineering_process-0.7.0}/process-graph.json +18 -3
  23. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/assess-design/SKILL.md +3 -0
  24. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/implement-change/SKILL.md +10 -2
  25. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/plan-change/SKILL.md +15 -3
  26. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/run-change/SKILL.md +5 -2
  27. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/run-change/references/execution.md +39 -0
  28. {engineering_process-0.6.0 → engineering_process-0.7.0}/pyproject.toml +5 -1
  29. engineering_process-0.7.0/release.json +50 -0
  30. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/evidence-receipt.schema.json +48 -0
  31. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/lifecycle.schema.json +27 -0
  32. engineering_process-0.7.0/schemas/plan-decision-review-assignment.schema.json +99 -0
  33. engineering_process-0.7.0/schemas/plan-decision-review.schema.json +81 -0
  34. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/plan.schema.json +88 -3
  35. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/project.schema.json +42 -3
  36. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_contracts.py +62 -0
  37. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_environment.py +85 -5
  38. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_lifecycle.py +747 -0
  39. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_release_candidate.py +244 -0
  40. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_runner.py +29 -0
  41. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_schemas.py +2 -0
  42. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_skills.py +24 -0
  43. engineering_process-0.6.0/release.json +0 -51
  44. {engineering_process-0.6.0 → engineering_process-0.7.0}/LICENSE +0 -0
  45. {engineering_process-0.6.0 → engineering_process-0.7.0}/MANIFEST.in +0 -0
  46. {engineering_process-0.6.0 → engineering_process-0.7.0}/PROCESS_IMPROVEMENT.md +0 -0
  47. {engineering_process-0.6.0 → engineering_process-0.7.0}/bundles.json +0 -0
  48. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/__main__.py +0 -0
  49. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/_download_worker.py +0 -0
  50. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/_supervisor_posix.py +0 -0
  51. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/_supervisor_windows.py +0 -0
  52. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/_windows_job.py +0 -0
  53. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/adoption.py +0 -0
  54. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/artifact_attestation.py +0 -0
  55. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/bootstrap.py +0 -0
  56. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/bounded_process.py +0 -0
  57. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/bundles.py +0 -0
  58. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/diagnostics.py +0 -0
  59. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/distribution.py +0 -0
  60. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/evidence_transport.py +0 -0
  61. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/git.py +0 -0
  62. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/git_attributes.py +0 -0
  63. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/helper_launch.py +0 -0
  64. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/impact.py +0 -0
  65. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/improvement.py +0 -0
  66. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/lifecycle_routes.py +0 -0
  67. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/managed.py +0 -0
  68. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/markdown.py +0 -0
  69. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/publication.py +0 -0
  70. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/recommendation.py +0 -0
  71. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/release.py +0 -0
  72. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/remote_verification.py +0 -0
  73. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/requirements-build.txt +0 -0
  74. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/requirements-dev.txt +0 -0
  75. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/requirements-release.txt +0 -0
  76. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/requirements-runtime.txt +0 -0
  77. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/runner.py +0 -0
  78. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/runtime.py +0 -0
  79. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/skills.py +0 -0
  80. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/supervision.py +0 -0
  81. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/supplemental.py +0 -0
  82. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/syncing.py +0 -0
  83. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process/tooling.py +0 -0
  84. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process.egg-info/dependency_links.txt +0 -0
  85. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process.egg-info/entry_points.txt +0 -0
  86. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process.egg-info/requires.txt +0 -0
  87. {engineering_process-0.6.0 → engineering_process-0.7.0}/engineering_process.egg-info/top_level.txt +0 -0
  88. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/adoption-migration.json +0 -0
  89. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/automation-policy.json +0 -0
  90. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/automation-proposal-policy.json +0 -0
  91. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/automation-proposal.json +0 -0
  92. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/change.json +0 -0
  93. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/improvement-catalog.json +0 -0
  94. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/improvement-disposition.json +0 -0
  95. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/improvement-reproduction.json +0 -0
  96. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/improvement-resolution.json +0 -0
  97. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/improvement-signal.json +0 -0
  98. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/recommendation-resolution.json +0 -0
  99. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/recommendation-review-assignment.json +0 -0
  100. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/recommendation-review.json +0 -0
  101. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/recommendation.json +0 -0
  102. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/release-change.json +0 -0
  103. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/release.json +0 -0
  104. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/remote-verification-evidence.json +0 -0
  105. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/remote-verification-request.json +0 -0
  106. {engineering_process-0.6.0 → engineering_process-0.7.0}/examples/review.json +0 -0
  107. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/build-frontend/SKILL.md +0 -0
  108. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/build-frontend-foundation/SKILL.md +0 -0
  109. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/change-api/SKILL.md +0 -0
  110. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/cross-repo-change/SKILL.md +0 -0
  111. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/define-change-contract/SKILL.md +0 -0
  112. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/design-module/SKILL.md +0 -0
  113. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/evolve-process/SKILL.md +0 -0
  114. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/finish-change/SKILL.md +0 -0
  115. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/govern-ui/SKILL.md +0 -0
  116. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/implement-module/SKILL.md +0 -0
  117. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/implement-use-case/SKILL.md +0 -0
  118. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/integrate-mcp/SKILL.md +0 -0
  119. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/maintain-docs/SKILL.md +0 -0
  120. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/publish-change/SKILL.md +0 -0
  121. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/review-change/SKILL.md +0 -0
  122. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/run-project-command/SKILL.md +0 -0
  123. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/specify-use-case/SKILL.md +0 -0
  124. {engineering_process-0.6.0 → engineering_process-0.7.0}/process_assets/skills/verify-change/SKILL.md +0 -0
  125. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/adoption-migration.schema.json +0 -0
  126. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/automation-policy.schema.json +0 -0
  127. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/automation-proposal-policy.schema.json +0 -0
  128. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/automation-proposal.schema.json +0 -0
  129. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/change.schema.json +0 -0
  130. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/improvement-catalog.schema.json +0 -0
  131. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/improvement-disposition.schema.json +0 -0
  132. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/improvement-reproduction.schema.json +0 -0
  133. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/improvement-resolution.schema.json +0 -0
  134. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/improvement-signal.schema.json +0 -0
  135. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/process-graph.schema.json +0 -0
  136. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/process-lock.schema.json +0 -0
  137. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/recommendation-resolution.schema.json +0 -0
  138. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/recommendation-review-assignment.schema.json +0 -0
  139. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/recommendation-review.schema.json +0 -0
  140. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/recommendation.schema.json +0 -0
  141. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/release-change.schema.json +0 -0
  142. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/release.schema.json +0 -0
  143. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/remote-verification-evidence.schema.json +0 -0
  144. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/remote-verification-request.schema.json +0 -0
  145. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/review.schema.json +0 -0
  146. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/reviewer-attestation.schema.json +0 -0
  147. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/supplemental-verification.schema.json +0 -0
  148. {engineering_process-0.6.0 → engineering_process-0.7.0}/schemas/verification.schema.json +0 -0
  149. {engineering_process-0.6.0 → engineering_process-0.7.0}/setup.cfg +0 -0
  150. {engineering_process-0.6.0 → engineering_process-0.7.0}/templates/AGENTS.process.md +0 -0
  151. {engineering_process-0.6.0 → engineering_process-0.7.0}/templates/PULL_REQUEST_TEMPLATE.md +0 -0
  152. {engineering_process-0.6.0 → engineering_process-0.7.0}/templates/adopt-process-windows-job.py +0 -0
  153. {engineering_process-0.6.0 → engineering_process-0.7.0}/templates/adopt-process.py +0 -0
  154. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_adoption.py +0 -0
  155. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_adoption_runner.py +0 -0
  156. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_artifact_attestation.py +0 -0
  157. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_bootstrap.py +0 -0
  158. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_bounded_process.py +0 -0
  159. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_bundles.py +0 -0
  160. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_cli.py +0 -0
  161. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_completed_release_dispatch.py +0 -0
  162. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_completion_evidence_transport.py +0 -0
  163. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_diagnostics.py +0 -0
  164. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_distribution.py +0 -0
  165. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_distribution_verify.py +0 -0
  166. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_evals.py +0 -0
  167. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_impact.py +0 -0
  168. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_improvement.py +0 -0
  169. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_process_graph.py +0 -0
  170. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_process_install.py +0 -0
  171. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_publication.py +0 -0
  172. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_publish_event.py +0 -0
  173. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_pypi_publication.py +0 -0
  174. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_recommendation.py +0 -0
  175. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_release.py +0 -0
  176. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_release_candidate_boundary.py +0 -0
  177. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_release_completion_identity.py +0 -0
  178. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_release_evidence_restore.py +0 -0
  179. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_release_evidence_selection.py +0 -0
  180. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_release_preparation.py +0 -0
  181. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_release_qualification.py +0 -0
  182. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_remote_verification.py +0 -0
  183. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_remote_verification_adapter.py +0 -0
  184. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_runtime.py +0 -0
  185. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_self_hosting.py +0 -0
  186. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_source_checkout.py +0 -0
  187. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_supervision.py +0 -0
  188. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_supplemental.py +0 -0
  189. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_syncing.py +0 -0
  190. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_test_suite.py +0 -0
  191. {engineering_process-0.6.0 → engineering_process-0.7.0}/tests/test_tooling.py +0 -0
  192. {engineering_process-0.6.0 → engineering_process-0.7.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.6.0
3
+ Version: 0.7.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
@@ -291,6 +291,14 @@ project-native dependency commands, dependency edges, and remediation. Project s
291
291
  does not carry a generic downloader, archive installer, doctor, or setup lifecycle.
292
292
  Host prerequisites with no safe automated setup action stay blocking.
293
293
 
294
+ The exact logical executable `python` is reserved by the distribution and resolves to
295
+ the absolute interpreter running the selected immutable process authority. This rule
296
+ applies consistently to requirement probes, verification profiles, setup command
297
+ actions, and `processctl exec`; callers do not activate a virtual environment or
298
+ modify `PATH` first. Manifests and reports retain the portable logical token, managed
299
+ tools cannot shadow it, and absolute executables plus non-Python commands keep their
300
+ existing resolution behavior.
301
+
294
302
  Probe `readOnly`, foreground-only execution, and command-action mutation scopes are
295
303
  project-owner attestations, not an operating-system sandbox: `processctl` cannot infer
296
304
  arbitrary subprocess side effects. Commands must not daemonize, start a detached
@@ -528,6 +536,48 @@ resolution records a selected valid option but grants no lifecycle completion, m
528
536
  release, deployment, or adoption authority. Those owning gates remain separate. The
529
537
  accepted decision is recorded before dependent work resumes.
530
538
 
539
+ Projects may separately adopt the `provenance-gated-authored-review` lifecycle policy.
540
+ Under that policy, every new nontrivial authored plan uses schema 3 and is assessed
541
+ before implementation by a genuinely fresh read-only reviewer. The assessment covers
542
+ architecture, authority, compatibility, external mutation, lifecycle order, owner,
543
+ rollout, scope, and trust boundary for the exact contract, plan, clean source,
544
+ authority, policy, author, and reviewer context. A clear assessment permits
545
+ implementation. A decision-required assessment must complete the existing reviewed
546
+ recommendation and owner-resolution chain, with a dedicated invariant binding the
547
+ exact assessment digest:
548
+
549
+ ~~~text
550
+ processctl change decision start --project-root . --change-id issue-123 \
551
+ --actor <reviewer> --context <fresh-context> --actor-kind agent \
552
+ --method isolated-context --attested-by <host> \
553
+ --attestation-evidence <bounded-attestation>
554
+ processctl contract validate --kind plan-decision-review \
555
+ plan-decision-review.json
556
+ processctl change decision submit --project-root . --change-id issue-123 \
557
+ --review plan-decision-review.json
558
+ processctl change decision resolve --project-root . --change-id issue-123 \
559
+ --actor <coordinator> --context <coordinator-context> --actor-kind agent \
560
+ --recommendation recommendation.json \
561
+ --assignment recommendation-review-assignment.json \
562
+ --recommendation-review recommendation-review.json \
563
+ --resolution recommendation-resolution.json
564
+ processctl change implement --project-root . --change-id issue-123 \
565
+ --actor <worker> --context <worker-context> --actor-kind agent
566
+ ~~~
567
+
568
+ The resolve command is used only for `decision-required`; a clear assessment goes
569
+ directly to `change implement`. Unreviewed prose, risk tiers, heuristics, author
570
+ self-classification, and generator labels are candidate-only and grant no authority.
571
+ A generated bypass is valid only for a core-registered generator whose complete plan
572
+ is exactly recomputed from bounded source-owned inputs and the immutable installed
573
+ authority. Exact generated plans are not universally sent to semantic review. Core
574
+ requires no daemon, scheduler, service, webhook receiver, hosted reviewer platform,
575
+ vendor, model, or proprietary agent API.
576
+ Every later implementation cycle after a finding or clean post-verification source
577
+ drift repeats the assessment with a newly reserved reviewer context bound to the new
578
+ source checkpoint. Earlier assignment, assessment, and owner-decision artifacts stay
579
+ historical and cannot authorize the new cycle.
580
+
531
581
  When a schema-3 change selects a project-owned `requiredEvidence` id, local profiles
532
582
  alone do not advance it to review. Create the exact no-authority request, run the
533
583
  project adapter, and ingest the complete supplemental set first:
@@ -783,9 +833,10 @@ fingerprint, source tree, or publication range.
783
833
  exclusively by their hash-locked `requirements/process.txt`. The action invokes the
784
834
  producer-owned installer from its immutable action checkout and never downloads or
785
835
  executes helper source from the consumer branch.
786
- - Versioned JSON schemas define change, plan, verification, review, recommendation,
787
- independent recommendation assignment and challenge, owner resolution, lifecycle,
788
- completion-related artifacts, release-change fragments, and the release
836
+ - Versioned JSON schemas define change, plan provenance, plan-decision assignment and
837
+ review, verification, review, recommendation, independent recommendation assignment
838
+ and challenge, owner resolution, lifecycle, completion-related artifacts,
839
+ release-change fragments, and the release
789
840
  classification contract. The generated Release PR gate binds that contract to the
790
841
  exact SemVer increment, package version, latest reachable prior tag, reviewed head,
791
842
  identical merge tree, immutable checkpoint, and main ancestry.
@@ -798,10 +849,12 @@ fingerprint, source tree, or publication range.
798
849
  readable under their released semantics. GitHub's artifact id and digest complete
799
850
  the immutable remote reference; this supplements rather than replaces N-1
800
851
  lifecycle evidence.
801
- - New lifecycle work uses bounded plan schema 2. Selective-impact consumers may add
802
- the optional capability on project schema 3, while new integrations use bounded
803
- project schema 4. Plan schema 1 and the pre-existing fields of project schemas 1-3
804
- retain their published validation behavior instead of being tightened in place.
852
+ - Projects without plan-decision opt-in continue using bounded plan schema 2. An
853
+ opted-in project uses plan schema 3 provenance and the pre-implementation gate.
854
+ Selective-impact consumers may add optional capabilities on project schema 3,
855
+ while new integrations use bounded project schema 4. Plan schemas 1 and 2 and the
856
+ pre-existing fields of project schemas 1-3 retain their published validation
857
+ behavior instead of being tightened in place.
805
858
  - `release.json` is the single release-identity owner. Governed GitHub tag and title
806
859
  are both exactly `v<SemVer>`; package metadata, runtime version, artifact names,
807
860
  authorization evidence, and later consumer locks must match it. Public-impact PRs
@@ -55,6 +55,12 @@ canonical command, or installing a consumer wrapper. Durable reports record only
55
55
  policy, severity, stream, line number, bounded count, truncation state, and line
56
56
  SHA-256. They never copy the diagnostic line into lifecycle evidence.
57
57
 
58
+ The portable logical command `python` resolves to the exact absolute interpreter of
59
+ the running immutable process authority across doctor, setup, execution, and
60
+ verification. Ambient `PATH` cannot select another Python installation, managed tools
61
+ cannot shadow the reserved binding, and evidence retains the logical command rather
62
+ than a host-specific activation sequence.
63
+
58
64
  Missing, stale, truncated beyond a declared policy, blocked, or unverifiable evidence
59
65
  never becomes a pass. Independent review records each accepted dimension as
60
66
  `verified`, `failed`, or `not-applicable-confirmed`; lifecycle submission compares
@@ -109,6 +115,34 @@ evidence boundaries as completion-blocking.
109
115
 
110
116
  ## Recommendation validity
111
117
 
118
+ An opted-in project gates implementation through plan provenance. Every nontrivial
119
+ authored plan receives a fresh read-only semantic assessment for architecture,
120
+ authority, compatibility, external mutation, lifecycle order, owner, rollout, scope,
121
+ and trust boundary. The assignment binds the exact contract, plan, clean source,
122
+ authority, project policy, author, reviewer context, and canonical category set. A
123
+ clear assessment may authorize implementation; a decision-required assessment must
124
+ bind the existing independently reviewed recommendation and explicit owner resolution
125
+ for that exact assessment. Drift in any binding fails closed.
126
+ Each later implementation cycle after a finding or clean post-verification source
127
+ drift requires a newly reserved context and assessment bound to that cycle's source;
128
+ cycle-1 evidence cannot be relabeled or reused.
129
+
130
+ A process-generated plan bypass is accepted only when the immutable installed core
131
+ recognizes its generator and exactly recomputes the complete plan from bounded
132
+ validated source-owned inputs. Generator labels, risk labels, author
133
+ self-classification, heuristic prose scanning, and partial comparison are not
134
+ provenance. Exact generated plans are not universally sent to semantic review, and
135
+ portable core does not introduce a daemon, scheduler, webhook, hosted reviewer
136
+ platform, vendor, model, or proprietary agent API. Unreviewed prose remains
137
+ candidate-only and grants no decision or lifecycle authority.
138
+
139
+ The three possible review boundaries never review one another. Plan-decision review
140
+ assesses the authored plan; recommendation review challenges only the recommendation
141
+ and its digest binding; final lifecycle review assesses implemented source and current
142
+ evidence. Reviewer-of-reviewer, meta-assessment, assessment-of-assessment,
143
+ policy-for-policy, dynamically generated approval chains, and generic workflow
144
+ engines are outside the portable contract.
145
+
112
146
  A material owner decision derives recommendation eligibility before optimization.
113
147
  Every option assesses every governing hard invariant and references only proven or
114
148
  explicitly unproven assumptions. Any violated invariant makes the option invalid; any
@@ -256,6 +256,14 @@ project-native dependency commands, dependency edges, and remediation. Project s
256
256
  does not carry a generic downloader, archive installer, doctor, or setup lifecycle.
257
257
  Host prerequisites with no safe automated setup action stay blocking.
258
258
 
259
+ The exact logical executable `python` is reserved by the distribution and resolves to
260
+ the absolute interpreter running the selected immutable process authority. This rule
261
+ applies consistently to requirement probes, verification profiles, setup command
262
+ actions, and `processctl exec`; callers do not activate a virtual environment or
263
+ modify `PATH` first. Manifests and reports retain the portable logical token, managed
264
+ tools cannot shadow it, and absolute executables plus non-Python commands keep their
265
+ existing resolution behavior.
266
+
259
267
  Probe `readOnly`, foreground-only execution, and command-action mutation scopes are
260
268
  project-owner attestations, not an operating-system sandbox: `processctl` cannot infer
261
269
  arbitrary subprocess side effects. Commands must not daemonize, start a detached
@@ -493,6 +501,48 @@ resolution records a selected valid option but grants no lifecycle completion, m
493
501
  release, deployment, or adoption authority. Those owning gates remain separate. The
494
502
  accepted decision is recorded before dependent work resumes.
495
503
 
504
+ Projects may separately adopt the `provenance-gated-authored-review` lifecycle policy.
505
+ Under that policy, every new nontrivial authored plan uses schema 3 and is assessed
506
+ before implementation by a genuinely fresh read-only reviewer. The assessment covers
507
+ architecture, authority, compatibility, external mutation, lifecycle order, owner,
508
+ rollout, scope, and trust boundary for the exact contract, plan, clean source,
509
+ authority, policy, author, and reviewer context. A clear assessment permits
510
+ implementation. A decision-required assessment must complete the existing reviewed
511
+ recommendation and owner-resolution chain, with a dedicated invariant binding the
512
+ exact assessment digest:
513
+
514
+ ~~~text
515
+ processctl change decision start --project-root . --change-id issue-123 \
516
+ --actor <reviewer> --context <fresh-context> --actor-kind agent \
517
+ --method isolated-context --attested-by <host> \
518
+ --attestation-evidence <bounded-attestation>
519
+ processctl contract validate --kind plan-decision-review \
520
+ plan-decision-review.json
521
+ processctl change decision submit --project-root . --change-id issue-123 \
522
+ --review plan-decision-review.json
523
+ processctl change decision resolve --project-root . --change-id issue-123 \
524
+ --actor <coordinator> --context <coordinator-context> --actor-kind agent \
525
+ --recommendation recommendation.json \
526
+ --assignment recommendation-review-assignment.json \
527
+ --recommendation-review recommendation-review.json \
528
+ --resolution recommendation-resolution.json
529
+ processctl change implement --project-root . --change-id issue-123 \
530
+ --actor <worker> --context <worker-context> --actor-kind agent
531
+ ~~~
532
+
533
+ The resolve command is used only for `decision-required`; a clear assessment goes
534
+ directly to `change implement`. Unreviewed prose, risk tiers, heuristics, author
535
+ self-classification, and generator labels are candidate-only and grant no authority.
536
+ A generated bypass is valid only for a core-registered generator whose complete plan
537
+ is exactly recomputed from bounded source-owned inputs and the immutable installed
538
+ authority. Exact generated plans are not universally sent to semantic review. Core
539
+ requires no daemon, scheduler, service, webhook receiver, hosted reviewer platform,
540
+ vendor, model, or proprietary agent API.
541
+ Every later implementation cycle after a finding or clean post-verification source
542
+ drift repeats the assessment with a newly reserved reviewer context bound to the new
543
+ source checkpoint. Earlier assignment, assessment, and owner-decision artifacts stay
544
+ historical and cannot authorize the new cycle.
545
+
496
546
  When a schema-3 change selects a project-owned `requiredEvidence` id, local profiles
497
547
  alone do not advance it to review. Create the exact no-authority request, run the
498
548
  project adapter, and ingest the complete supplemental set first:
@@ -748,9 +798,10 @@ fingerprint, source tree, or publication range.
748
798
  exclusively by their hash-locked `requirements/process.txt`. The action invokes the
749
799
  producer-owned installer from its immutable action checkout and never downloads or
750
800
  executes helper source from the consumer branch.
751
- - Versioned JSON schemas define change, plan, verification, review, recommendation,
752
- independent recommendation assignment and challenge, owner resolution, lifecycle,
753
- completion-related artifacts, release-change fragments, and the release
801
+ - Versioned JSON schemas define change, plan provenance, plan-decision assignment and
802
+ review, verification, review, recommendation, independent recommendation assignment
803
+ and challenge, owner resolution, lifecycle, completion-related artifacts,
804
+ release-change fragments, and the release
754
805
  classification contract. The generated Release PR gate binds that contract to the
755
806
  exact SemVer increment, package version, latest reachable prior tag, reviewed head,
756
807
  identical merge tree, immutable checkpoint, and main ancestry.
@@ -763,10 +814,12 @@ fingerprint, source tree, or publication range.
763
814
  readable under their released semantics. GitHub's artifact id and digest complete
764
815
  the immutable remote reference; this supplements rather than replaces N-1
765
816
  lifecycle evidence.
766
- - New lifecycle work uses bounded plan schema 2. Selective-impact consumers may add
767
- the optional capability on project schema 3, while new integrations use bounded
768
- project schema 4. Plan schema 1 and the pre-existing fields of project schemas 1-3
769
- retain their published validation behavior instead of being tightened in place.
817
+ - Projects without plan-decision opt-in continue using bounded plan schema 2. An
818
+ opted-in project uses plan schema 3 provenance and the pre-implementation gate.
819
+ Selective-impact consumers may add optional capabilities on project schema 3,
820
+ while new integrations use bounded project schema 4. Plan schemas 1 and 2 and the
821
+ pre-existing fields of project schemas 1-3 retain their published validation
822
+ behavior instead of being tightened in place.
770
823
  - `release.json` is the single release-identity owner. Governed GitHub tag and title
771
824
  are both exactly `v<SemVer>`; package metadata, runtime version, artifact names,
772
825
  authorization evidence, and later consumer locks must match it. Public-impact PRs
@@ -154,6 +154,32 @@ Completed historical decisions retain their original evidence and require no
154
154
  backfill. A recommendation resolution is decision evidence only and never substitutes
155
155
  for lifecycle completion or delivery authority.
156
156
 
157
+ ## Material-decision implementation gate
158
+
159
+ Plan schema 3 adds explicit `authored` or `process-generated` provenance. The
160
+ plan-decision assignment and review artifacts start at schema 1, while the optional
161
+ project lifecycle policy is additive to project schemas 3 and 4. Released plan
162
+ schemas 1 and 2 retain their historical meaning and remain readable; a project that
163
+ does not adopt the policy retains its released schema-2 planning behavior.
164
+
165
+ Adopting `provenance-gated-authored-review` changes the pre-implementation lifecycle
166
+ semantics and is therefore a breaking package change before 1.0. Every new
167
+ nontrivial authored plan receives a fresh read-only semantic assessment across the
168
+ canonical material categories. A clear assessment permits `change implement`; a
169
+ decision-required assessment remains blocked until the existing independently
170
+ reviewed recommendation and explicit owner-resolution chain bind that exact
171
+ assessment. A process-generated plan bypasses semantic assessment only when the
172
+ installed immutable authority recognizes its generator and exactly recomputes the
173
+ complete plan from validated source-owned inputs. Unknown generators, claimed
174
+ labels, partial comparison, and stale contract, plan, source, authority, policy,
175
+ context, assessment, recommendation, or resolution evidence fail closed.
176
+
177
+ The producer ships the opt-in as a target-version adoption migration. Its current
178
+ N-1 release candidate stays on plan schema 2, then self-adoption activates schema 3
179
+ and exact release-plan recomputation for subsequent releases. No package, runtime,
180
+ tag, artifact, or consumer-lock identity changes in the feature PR; the separate
181
+ generated Release PR derives the pre-1.0 minor version.
182
+
157
183
  Remote-verification request and evidence-set schema-1 artifacts, optional project
158
184
  requirements, optional change selections, lifecycle references, and receipt content
159
185
  are additive serialized surfaces. A project does not gain the gate until a separate
@@ -1,3 +1,3 @@
1
1
  """Agent-neutral engineering process."""
2
2
 
3
- VERSION = "0.6.0"
3
+ VERSION = "0.7.0"
@@ -28,6 +28,8 @@ from .contracts import (
28
28
  validate_improvement_resolution,
29
29
  validate_improvement_signal,
30
30
  validate_plan,
31
+ validate_plan_decision_review,
32
+ validate_plan_decision_review_assignment,
31
33
  validate_process_lock,
32
34
  validate_project,
33
35
  validate_recommendation,
@@ -79,10 +81,13 @@ from .lifecycle import (
79
81
  lifecycle_status,
80
82
  ingest_remote_verification,
81
83
  register_plan,
84
+ resolve_plan_decision,
82
85
  request_remote_verification,
83
86
  start_change,
87
+ start_plan_decision_review,
84
88
  start_review,
85
89
  submit_review,
90
+ submit_plan_decision_review,
86
91
  verify_change,
87
92
  )
88
93
  from .runner import run_profile, source_state
@@ -295,6 +300,8 @@ def command_contract_validate(args: argparse.Namespace) -> int:
295
300
  "improvement-resolution": validate_improvement_resolution,
296
301
  "improvement-signal": validate_improvement_signal,
297
302
  "plan": validate_plan,
303
+ "plan-decision-review": validate_plan_decision_review,
304
+ "plan-decision-review-assignment": validate_plan_decision_review_assignment,
298
305
  "recommendation": validate_recommendation,
299
306
  "recommendation-resolution": validate_recommendation_resolution,
300
307
  "recommendation-review": validate_recommendation_review,
@@ -628,11 +635,80 @@ def command_change_plan(args: argparse.Namespace) -> int:
628
635
  return 0
629
636
 
630
637
 
638
+ def command_change_decision_start(args: argparse.Namespace) -> int:
639
+ project = _lifecycle_project(args)
640
+ state, assignment = start_plan_decision_review(
641
+ args.project_root,
642
+ project,
643
+ args.change_id,
644
+ actor_id=args.actor,
645
+ context_id=args.context,
646
+ kind=args.actor_kind,
647
+ method=args.method,
648
+ attested_by=args.attested_by,
649
+ evidence=args.attestation_evidence,
650
+ )
651
+ _emit(
652
+ args,
653
+ _change_result(
654
+ "change decision start",
655
+ state,
656
+ verdict="pending",
657
+ assignment=state["planDecision"]["assignment"]["path"],
658
+ planSha256=assignment["planSha256"],
659
+ ),
660
+ )
661
+ return 0
662
+
663
+
664
+ def command_change_decision_submit(args: argparse.Namespace) -> int:
665
+ project = _lifecycle_project(args)
666
+ state, review = submit_plan_decision_review(
667
+ args.project_root, project, args.change_id, args.review
668
+ )
669
+ _emit(
670
+ args,
671
+ _change_result(
672
+ "change decision submit",
673
+ state,
674
+ verdict=review["verdict"],
675
+ review=state["planDecision"]["review"]["path"],
676
+ ),
677
+ )
678
+ return 0
679
+
680
+
681
+ def command_change_decision_resolve(args: argparse.Namespace) -> int:
682
+ project = _lifecycle_project(args)
683
+ state = resolve_plan_decision(
684
+ args.project_root,
685
+ project,
686
+ args.change_id,
687
+ recommendation_path=args.recommendation,
688
+ assignment_path=args.assignment,
689
+ review_path=args.recommendation_review,
690
+ resolution_path=args.resolution,
691
+ actor_id=args.actor,
692
+ context_id=args.context,
693
+ kind=args.actor_kind,
694
+ )
695
+ _emit(
696
+ args,
697
+ _change_result(
698
+ "change decision resolve",
699
+ state,
700
+ resolution=state["planDecision"]["resolution"]["path"],
701
+ ),
702
+ )
703
+ return 0
704
+
705
+
631
706
  def command_change_implement(args: argparse.Namespace) -> int:
632
- _lifecycle_project(args)
707
+ project = _lifecycle_project(args)
633
708
  state = begin_implementation(
634
709
  args.project_root,
635
710
  args.change_id,
711
+ project=project,
636
712
  actor_id=args.actor,
637
713
  context_id=args.context,
638
714
  kind=args.actor_kind,
@@ -1597,6 +1673,8 @@ def build_parser() -> argparse.ArgumentParser:
1597
1673
  "improvement-resolution",
1598
1674
  "improvement-signal",
1599
1675
  "plan",
1676
+ "plan-decision-review",
1677
+ "plan-decision-review-assignment",
1600
1678
  "recommendation",
1601
1679
  "recommendation-resolution",
1602
1680
  "recommendation-review",
@@ -2361,6 +2439,47 @@ def build_parser() -> argparse.ArgumentParser:
2361
2439
  change_plan.add_argument("--plan", type=Path, required=True)
2362
2440
  change_plan.set_defaults(handler=command_change_plan)
2363
2441
 
2442
+ change_decision = change_commands.add_parser(
2443
+ "decision", help="Assess material decisions in an authored plan"
2444
+ )
2445
+ decision_commands = change_decision.add_subparsers(
2446
+ dest="change_decision_command", required=True
2447
+ )
2448
+ decision_start = decision_commands.add_parser(
2449
+ "start", help="Reserve a fresh reviewer and create the plan assessment assignment"
2450
+ )
2451
+ _add_lifecycle_common(decision_start)
2452
+ _add_actor(decision_start)
2453
+ decision_start.add_argument("--change-id", required=True)
2454
+ decision_start.add_argument(
2455
+ "--method", choices=("isolated-context", "separate-person"), required=True
2456
+ )
2457
+ decision_start.add_argument("--attested-by", required=True)
2458
+ decision_start.add_argument("--attestation-evidence", required=True)
2459
+ decision_start.set_defaults(handler=command_change_decision_start)
2460
+
2461
+ decision_submit = decision_commands.add_parser(
2462
+ "submit", help="Validate and register the fresh material-decision assessment"
2463
+ )
2464
+ _add_lifecycle_common(decision_submit)
2465
+ decision_submit.add_argument("--change-id", required=True)
2466
+ decision_submit.add_argument("--review", type=Path, required=True)
2467
+ decision_submit.set_defaults(handler=command_change_decision_submit)
2468
+
2469
+ decision_resolve = decision_commands.add_parser(
2470
+ "resolve", help="Bind an approved recommendation and owner resolution"
2471
+ )
2472
+ _add_lifecycle_common(decision_resolve)
2473
+ _add_actor(decision_resolve)
2474
+ decision_resolve.add_argument("--change-id", required=True)
2475
+ decision_resolve.add_argument("--recommendation", type=Path, required=True)
2476
+ decision_resolve.add_argument("--assignment", type=Path, required=True)
2477
+ decision_resolve.add_argument(
2478
+ "--recommendation-review", type=Path, required=True
2479
+ )
2480
+ decision_resolve.add_argument("--resolution", type=Path, required=True)
2481
+ decision_resolve.set_defaults(handler=command_change_decision_resolve)
2482
+
2364
2483
  change_implement = change_commands.add_parser(
2365
2484
  "implement", help="Register an implementation actor and begin a cycle"
2366
2485
  )
@@ -6,6 +6,9 @@ from __future__ import annotations
6
6
  LIFECYCLE_COMMAND_PATHS = frozenset(
7
7
  {
8
8
  "change finish",
9
+ "change decision resolve",
10
+ "change decision start",
11
+ "change decision submit",
9
12
  "change implement",
10
13
  "change plan",
11
14
  "change remote ingest",