engineering-process 0.3.0__tar.gz → 0.5.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 (181) hide show
  1. engineering_process-0.5.0/MANIFEST.in +2 -0
  2. {engineering_process-0.3.0/engineering_process.egg-info → engineering_process-0.5.0}/PKG-INFO +195 -11
  3. engineering_process-0.5.0/PROCESS_IMPROVEMENT.md +132 -0
  4. {engineering_process-0.3.0 → engineering_process-0.5.0}/PRODUCTION_STANDARD.md +59 -6
  5. {engineering_process-0.3.0 → engineering_process-0.5.0}/README.md +194 -10
  6. {engineering_process-0.3.0 → engineering_process-0.5.0}/VERSIONING.md +85 -19
  7. {engineering_process-0.3.0 → engineering_process-0.5.0}/bundles.json +2 -6
  8. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/__init__.py +1 -1
  9. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/_supervisor_posix.py +15 -2
  10. engineering_process-0.5.0/engineering_process/_supervisor_windows.py +284 -0
  11. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/_windows_job.py +128 -15
  12. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/bootstrap.py +3 -2
  13. engineering_process-0.5.0/engineering_process/bounded_process.py +236 -0
  14. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/cli.py +809 -6
  15. engineering_process-0.5.0/engineering_process/command_catalog.py +26 -0
  16. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/contracts.py +1224 -7
  17. engineering_process-0.5.0/engineering_process/diagnostics.py +95 -0
  18. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/distribution.py +14 -1
  19. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/distribution_verify.py +11 -0
  20. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/environment.py +22 -0
  21. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/evidence.py +2 -0
  22. engineering_process-0.5.0/engineering_process/evidence_transport.py +93 -0
  23. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/git.py +12 -0
  24. engineering_process-0.5.0/engineering_process/improvement.py +1308 -0
  25. engineering_process-0.5.0/engineering_process/lifecycle.py +2457 -0
  26. engineering_process-0.5.0/engineering_process/lifecycle_routes.py +107 -0
  27. engineering_process-0.5.0/engineering_process/process_graph.py +327 -0
  28. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/publication.py +356 -2
  29. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/release_candidate.py +47 -1
  30. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/runner.py +2 -1
  31. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/supervision.py +3 -0
  32. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/supplemental.py +5 -4
  33. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/syncing.py +9 -5
  34. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/tooling.py +40 -11
  35. {engineering_process-0.3.0 → engineering_process-0.5.0/engineering_process.egg-info}/PKG-INFO +195 -11
  36. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process.egg-info/SOURCES.txt +38 -0
  37. engineering_process-0.5.0/examples/automation-policy.json +30 -0
  38. engineering_process-0.5.0/examples/automation-proposal-policy.json +30 -0
  39. engineering_process-0.5.0/examples/automation-proposal.json +72 -0
  40. engineering_process-0.5.0/examples/improvement-catalog.json +24 -0
  41. engineering_process-0.5.0/examples/improvement-disposition.json +36 -0
  42. engineering_process-0.5.0/examples/improvement-reproduction.json +40 -0
  43. engineering_process-0.5.0/examples/improvement-resolution.json +26 -0
  44. engineering_process-0.5.0/examples/improvement-signal.json +50 -0
  45. engineering_process-0.5.0/improvement-catalog.json +67 -0
  46. engineering_process-0.5.0/process-graph.json +136 -0
  47. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/assess-design/SKILL.md +5 -1
  48. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/cross-repo-change/SKILL.md +6 -0
  49. engineering_process-0.5.0/process_assets/skills/evolve-process/SKILL.md +69 -0
  50. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/finish-change/SKILL.md +6 -1
  51. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/plan-change/SKILL.md +4 -0
  52. engineering_process-0.5.0/process_assets/skills/publish-change/SKILL.md +88 -0
  53. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/review-change/SKILL.md +16 -0
  54. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/run-change/SKILL.md +24 -5
  55. engineering_process-0.5.0/process_assets/skills/run-change/references/execution.md +242 -0
  56. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/run-project-command/SKILL.md +5 -1
  57. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/verify-change/SKILL.md +6 -2
  58. {engineering_process-0.3.0 → engineering_process-0.5.0}/pyproject.toml +19 -2
  59. engineering_process-0.5.0/release.json +138 -0
  60. engineering_process-0.5.0/schemas/automation-policy.schema.json +63 -0
  61. engineering_process-0.5.0/schemas/automation-proposal-policy.schema.json +117 -0
  62. engineering_process-0.5.0/schemas/automation-proposal.schema.json +223 -0
  63. engineering_process-0.5.0/schemas/improvement-catalog.schema.json +89 -0
  64. engineering_process-0.5.0/schemas/improvement-disposition.schema.json +167 -0
  65. engineering_process-0.5.0/schemas/improvement-reproduction.schema.json +89 -0
  66. engineering_process-0.5.0/schemas/improvement-resolution.schema.json +65 -0
  67. engineering_process-0.5.0/schemas/improvement-signal.schema.json +235 -0
  68. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/lifecycle.schema.json +54 -1
  69. engineering_process-0.5.0/schemas/process-graph.schema.json +48 -0
  70. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/supplemental-verification.schema.json +106 -4
  71. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/verification.schema.json +103 -2
  72. {engineering_process-0.3.0 → engineering_process-0.5.0}/templates/adopt-process-windows-job.py +128 -15
  73. {engineering_process-0.3.0 → engineering_process-0.5.0}/templates/adopt-process.py +215 -7
  74. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_adoption_runner.py +57 -0
  75. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_bootstrap.py +46 -0
  76. engineering_process-0.5.0/tests/test_bounded_process.py +229 -0
  77. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_bundles.py +3 -2
  78. engineering_process-0.5.0/tests/test_cli.py +891 -0
  79. engineering_process-0.5.0/tests/test_completed_release_dispatch.py +249 -0
  80. engineering_process-0.5.0/tests/test_completion_evidence_transport.py +91 -0
  81. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_contracts.py +190 -0
  82. engineering_process-0.5.0/tests/test_diagnostics.py +80 -0
  83. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_distribution_verify.py +47 -33
  84. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_environment.py +63 -0
  85. engineering_process-0.5.0/tests/test_improvement.py +499 -0
  86. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_lifecycle.py +847 -1
  87. engineering_process-0.5.0/tests/test_process_graph.py +174 -0
  88. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_process_install.py +211 -0
  89. engineering_process-0.5.0/tests/test_publication.py +976 -0
  90. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_release_candidate.py +94 -156
  91. engineering_process-0.5.0/tests/test_release_candidate_boundary.py +92 -0
  92. engineering_process-0.5.0/tests/test_release_completion_identity.py +141 -0
  93. engineering_process-0.5.0/tests/test_release_evidence_restore.py +259 -0
  94. engineering_process-0.5.0/tests/test_release_evidence_selection.py +164 -0
  95. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_release_qualification.py +69 -8
  96. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_runner.py +95 -1
  97. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_schemas.py +52 -0
  98. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_self_hosting.py +188 -106
  99. engineering_process-0.5.0/tests/test_skills.py +135 -0
  100. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_source_checkout.py +62 -0
  101. engineering_process-0.5.0/tests/test_supervision.py +310 -0
  102. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_supplemental.py +40 -2
  103. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_syncing.py +7 -1
  104. engineering_process-0.5.0/tests/test_test_suite.py +62 -0
  105. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_tooling.py +88 -4
  106. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_windows_job.py +121 -9
  107. engineering_process-0.3.0/MANIFEST.in +0 -4
  108. engineering_process-0.3.0/engineering_process/_supervisor_windows.py +0 -149
  109. engineering_process-0.3.0/engineering_process/lifecycle.py +0 -1204
  110. engineering_process-0.3.0/process_assets/skills/evolve-process/SKILL.md +0 -39
  111. engineering_process-0.3.0/process_assets/skills/publish-change/SKILL.md +0 -49
  112. engineering_process-0.3.0/process_assets/skills/run-change/references/execution.md +0 -92
  113. engineering_process-0.3.0/release.json +0 -54
  114. engineering_process-0.3.0/tests/test_cli.py +0 -426
  115. engineering_process-0.3.0/tests/test_publication.py +0 -356
  116. engineering_process-0.3.0/tests/test_skills.py +0 -65
  117. engineering_process-0.3.0/tests/test_supervision.py +0 -146
  118. {engineering_process-0.3.0 → engineering_process-0.5.0}/LICENSE +0 -0
  119. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/__main__.py +0 -0
  120. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/_download_worker.py +0 -0
  121. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/adoption.py +0 -0
  122. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/artifact_attestation.py +0 -0
  123. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/bundles.py +0 -0
  124. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/git_attributes.py +0 -0
  125. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/helper_launch.py +0 -0
  126. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/impact.py +0 -0
  127. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/managed.py +0 -0
  128. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/markdown.py +0 -0
  129. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/release.py +0 -0
  130. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/requirements-build.txt +0 -0
  131. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/requirements-dev.txt +0 -0
  132. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/requirements-release.txt +0 -0
  133. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/requirements-runtime.txt +0 -0
  134. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/runtime.py +0 -0
  135. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process/skills.py +0 -0
  136. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process.egg-info/dependency_links.txt +0 -0
  137. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process.egg-info/entry_points.txt +0 -0
  138. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process.egg-info/requires.txt +0 -0
  139. {engineering_process-0.3.0 → engineering_process-0.5.0}/engineering_process.egg-info/top_level.txt +0 -0
  140. {engineering_process-0.3.0 → engineering_process-0.5.0}/examples/adoption-migration.json +0 -0
  141. {engineering_process-0.3.0 → engineering_process-0.5.0}/examples/change.json +0 -0
  142. {engineering_process-0.3.0 → engineering_process-0.5.0}/examples/plan.json +0 -0
  143. {engineering_process-0.3.0 → engineering_process-0.5.0}/examples/project.json +0 -0
  144. {engineering_process-0.3.0 → engineering_process-0.5.0}/examples/release-change.json +0 -0
  145. {engineering_process-0.3.0 → engineering_process-0.5.0}/examples/release.json +0 -0
  146. {engineering_process-0.3.0 → engineering_process-0.5.0}/examples/review.json +0 -0
  147. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/build-frontend/SKILL.md +0 -0
  148. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/build-frontend-foundation/SKILL.md +0 -0
  149. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/change-api/SKILL.md +0 -0
  150. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/define-change-contract/SKILL.md +0 -0
  151. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/design-module/SKILL.md +0 -0
  152. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/govern-ui/SKILL.md +0 -0
  153. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/implement-change/SKILL.md +0 -0
  154. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/implement-module/SKILL.md +0 -0
  155. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/implement-use-case/SKILL.md +0 -0
  156. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/integrate-mcp/SKILL.md +0 -0
  157. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/maintain-docs/SKILL.md +0 -0
  158. {engineering_process-0.3.0 → engineering_process-0.5.0}/process_assets/skills/specify-use-case/SKILL.md +0 -0
  159. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/adoption-migration.schema.json +0 -0
  160. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/change.schema.json +0 -0
  161. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/evidence-receipt.schema.json +0 -0
  162. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/plan.schema.json +0 -0
  163. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/process-lock.schema.json +0 -0
  164. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/project.schema.json +0 -0
  165. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/release-change.schema.json +0 -0
  166. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/release.schema.json +0 -0
  167. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/review.schema.json +0 -0
  168. {engineering_process-0.3.0 → engineering_process-0.5.0}/schemas/reviewer-attestation.schema.json +0 -0
  169. {engineering_process-0.3.0 → engineering_process-0.5.0}/setup.cfg +0 -0
  170. {engineering_process-0.3.0 → engineering_process-0.5.0}/templates/AGENTS.process.md +0 -0
  171. {engineering_process-0.3.0 → engineering_process-0.5.0}/templates/PULL_REQUEST_TEMPLATE.md +0 -0
  172. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_adoption.py +0 -0
  173. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_artifact_attestation.py +0 -0
  174. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_distribution.py +0 -0
  175. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_evals.py +0 -0
  176. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_impact.py +0 -0
  177. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_publish_event.py +0 -0
  178. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_pypi_publication.py +0 -0
  179. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_release.py +0 -0
  180. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_release_preparation.py +0 -0
  181. {engineering_process-0.3.0 → engineering_process-0.5.0}/tests/test_runtime.py +0 -0
@@ -0,0 +1,2 @@
1
+ # Package inputs are explicitly declared in pyproject.toml. Archive verification
2
+ # rejects managed, generated, and bytecode paths from both wheel and sdist outputs.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: engineering-process
3
- Version: 0.3.0
3
+ Version: 0.5.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
@@ -78,6 +78,13 @@ checkpoint and workspace fingerprint.
78
78
 
79
79
  ## Execution architecture
80
80
 
81
+ Validated failures participate in a federated improvement loop. Consumers export
82
+ bounded, redacted signals to the owning producer without granting authority;
83
+ producer triage, lifecycle completion, immutable release, consumer adoption, and
84
+ consumer reproduction remain separate gates. `processctl improvement status` exposes
85
+ the portable chain and next owner. See
86
+ [PROCESS_IMPROVEMENT.md](PROCESS_IMPROVEMENT.md).
87
+
81
88
  Consumers use one foreground-task contract on every supported platform. The contract
82
89
  owns argument-array commands, non-interactive standard input, bounded output, timeout,
83
90
  exit status, and descendant cleanup. Platform selection occurs once inside the
@@ -85,6 +92,9 @@ distribution: the POSIX backend owns a new process session/group and the Windows
85
92
  backend owns a kill-on-close Job Object. Consumer manifests, evidence, and exit codes
86
93
  do not branch by operating system. If an outer Windows Job applies incompatible
87
94
  nesting or UI limits, target creation fails closed instead of running uncontained.
95
+ After a command root exits, both backends allow at most 250 milliseconds for child
96
+ accounting to drain naturally. A process still present after that bound is terminated
97
+ and makes the command fail; commands with no remaining child return immediately.
88
98
 
89
99
  This task boundary intentionally separates finite commands from services and
90
100
  interactive protocols. `processctl exec`, requirement probes, setup command actions,
@@ -94,6 +104,14 @@ commands outside this executor until a separate service or interactive lifecycle
94
104
  specified. They must not be placed in verification profiles or wrapped by
95
105
  `processctl exec`.
96
106
 
107
+ A finite command succeeds only when its process boundary passes and its complete
108
+ admitted stdout and stderr are free of classified warning and error diagnostics. The
109
+ shared classifier is bounded and non-configurable. Exit-zero diagnostics therefore
110
+ fail `doctor`, `setup`, `exec`, verification, and internal distribution commands at
111
+ the shared owner. Reports retain redacted diagnostic metadata and line digests, not
112
+ raw matched text. Fix the warning or error at its owner; do not silence it, replace
113
+ the canonical command, or set a tool-specific suppression variable to obtain a pass.
114
+
97
115
  ## Consumer bootstrap
98
116
 
99
117
  Add only project-owned configuration:
@@ -156,10 +174,12 @@ Renovate must install and verify a target authority before that target exists in
156
174
  checkout, and `processctl sync --check` compares those bytes with the pinned
157
175
  distribution.
158
176
 
159
- For an existing consumer, a published version is adopted through one Renovate draft.
177
+ For an existing consumer, automation may prepare one unpublished adoption candidate,
178
+ but the normal Renovate PR-first route is excluded from process-authority updates.
160
179
  The managed runner installs the target authority from the complete hash lock outside
161
- the checkout and atomically updates the process lock and managed assets. If the
162
- consumer chooses or requires new project configuration, it adds
180
+ the checkout and atomically updates the process lock and managed assets before the
181
+ lifecycle host publishes the completed candidate. If the consumer chooses or requires
182
+ new project configuration, it adds
163
183
  `.process/adoption-migrations/<target-version>.json`; the installed target authority
164
184
  binds the source and target manifest digests, validates the complete target manifest,
165
185
  and updates `.process/project.json` in the same rollback transaction. Optional
@@ -365,7 +385,8 @@ component closure, check routing, and evidence remain distribution-owned.
365
385
 
366
386
  Select capability bundles from `bundles.json`: every consumer starts with `core`,
367
387
  then adds only capabilities it actually owns. For example, a web product commonly
368
- adds `delivery`, `product`, `api`, `frontend`, `docs`, and `publication`. Add
388
+ adds `delivery`, `product`, `api`, `frontend`, and `docs`. Publication from a
389
+ completed checkpoint is part of the mandatory core chain. Add
369
390
  `cross-repo` only when independently versioned repositories participate in one
370
391
  public-contract change. Re-run `project init ... --replace` with the intended bundle
371
392
  set when deliberately changing the pin; version remains unchanged during an
@@ -384,6 +405,12 @@ through its public N-1 self-hosting boundary.
384
405
  Agents enter non-trivial delivery through the synchronized `run-change` skill; phase
385
406
  skills are internal owners, not a workflow each project must reconnect.
386
407
 
408
+ `process-graph.json` is the machine-readable owner for that chain. It binds every
409
+ phase to one owner skill, permitted `processctl` commands, success/failure outcomes,
410
+ next phase/skill, and the standing-policy merge boundary. Distribution validation rejects
411
+ missing skills, non-core chain owners, nonexistent commands, unknown phases, and
412
+ broken handoffs; prose skills explain the graph but do not replace it.
413
+
387
414
  ## Canonical lifecycle
388
415
 
389
416
  Create a change contract from `examples/change.json` and a plan from
@@ -445,7 +472,26 @@ through a fail-closed migration that replays immutable review artifacts to recon
445
472
  pending findings before any transition is allowed.
446
473
 
447
474
  Completion does not imply commit creation, push, merge, release, or deployment.
448
- Those remain separately authorized project workflows.
475
+ Those remain separately gated project workflows. A valid `.process/automation.json`
476
+ provides standing authorization, so the host continues each operation automatically
477
+ after its owning gate instead of asking for repeated confirmation. An owner directive
478
+ may authorize installing that policy but never substitutes for a missing policy.
479
+
480
+ When new evidence exposes multiple materially valid directions or would change
481
+ accepted scope, owner, trust boundary, authority, compatibility, rollout, or
482
+ lifecycle order, the coordinator stops dependent mutation and asks the project owner.
483
+ It presents evidence, the invariant, real options, trade-offs, and a recommendation;
484
+ the accepted decision is recorded before work resumes. Bounded implementation details
485
+ already decided by the contract continue autonomously.
486
+
487
+ The canonical publication order is stricter than a PR-first workflow: implementation
488
+ and every required profile pass on a clean checkpoint; a consumer-selected independent
489
+ agent or human semantically reviews that checkpoint; findings repeat implementation,
490
+ complete verification, and fresh review until approved; `change finish` records
491
+ completion; only then may automation push and create the PR. Static policy/secret/pin
492
+ checks supplement this review and cannot generate a semantic verdict. With a valid
493
+ standing policy, automation then waits for exact-head/current-base required checks and
494
+ performs the configured merge without a separate human step.
449
495
 
450
496
  Completed local evidence can be moved across machines or attached to a release as a
451
497
  bounded receipt. Export and validate it before any explicit prune:
@@ -477,6 +523,10 @@ processctl publication validate-range --project-root . \
477
523
  --branch feat/short-description --range origin/main..HEAD
478
524
  processctl publication validate-pr --title "feat(scope): describe the change" \
479
525
  --branch feat/short-description --state draft --body-file pr.md
526
+ processctl publication validate-source --project-root . \
527
+ --change-id issue-123 --commit <completed-checkpoint> \
528
+ --title "feat(scope): describe the change" \
529
+ --branch feat/short-description --body-file pr.md
480
530
  processctl contract validate --kind release release.json
481
531
  processctl publication validate-release --project-root . \
482
532
  --tag v0.2.0 --release-name v0.2.0 \
@@ -497,6 +547,90 @@ remains responsible for the semantic truth of project-specific evidence.
497
547
  Raw HTML is outside the supported grammar for both managed `AGENTS.md` contracts and
498
548
  pull-request descriptions; use visible CommonMark instead.
499
549
 
550
+ `validate-pr` remains a metadata-compatibility command. `validate-source` is the
551
+ canonical publication gate and requires current completion evidence for the exact
552
+ commit, regardless of provider draft/ready presentation.
553
+
554
+ ### Standing gated automation
555
+
556
+ Projects opt into unattended routine operation with `.process/automation.json`, using
557
+ the packaged `automation-policy` schema. The exact policy authorizes commit, push,
558
+ review-object publication, merge, release, publication, deployment, adoption, and
559
+ ephemeral cleanup only after their existing gates. Merge always requires completed
560
+ lifecycle evidence, fresh independent review, exact head, current protected base,
561
+ required checks, branch protection, and the configured merge method. Missing or
562
+ invalid policy grants no authority.
563
+
564
+ The confirmation mode is `exceptions-only`. Automation involves the owner only when a
565
+ required capability or authority is unavailable, bounded idempotent recovery is
566
+ exhausted, or a material product/security decision is missing. Pending checks,
567
+ ordinary retries, routine merges, and already authorized external actions continue
568
+ without per-action confirmation.
569
+
570
+ ### Controlled automation proposals
571
+
572
+ Completion-before-publication remains the default. A consumer may enable an untrusted
573
+ dependency proposal before completion only through a policy file already present on
574
+ the protected base at `.process/automation-proposals.json`. The policy uses the
575
+ shape in `examples/automation-proposal-policy.json`: current policy uses schema 2,
576
+ selects the target and automation prefix, allows only `dependency-update`,
577
+ requires the canonical `lifecycle-completion` check, and fixes every dangerous control
578
+ to its fail-closed value. Absence, disablement, a branch-only policy, or a policy digest
579
+ mismatch blocks the route.
580
+
581
+ The immutable provider verifier emits one bounded
582
+ `engineering-process-controlled-automation-proposal` report for the exact repository,
583
+ base/head, changed paths, title/body digest, owner, controls, and verifier revision.
584
+ The adapter resolves `--base-commit` independently from the provider's current target
585
+ event; it must not copy that value from the report being checked. Before creating or
586
+ updating a proposal, validate the report against the clean source:
587
+
588
+ ~~~text
589
+ processctl contract validate --kind automation-proposal-policy \
590
+ .process/automation-proposals.json
591
+ processctl contract validate --kind automation-proposal proposal-policy.json
592
+ processctl publication validate-proposal --project-root . \
593
+ --policy-evidence proposal-policy.json \
594
+ --repository <owner/repository> --commit <head-sha> \
595
+ --title "chore(deps): update dependencies" \
596
+ --branch automation/renovate/dependencies --target-branch main \
597
+ --base-commit <protected-base-sha> \
598
+ --state draft --body-file pr.md \
599
+ --verifier-repository <owner/verifier> --verifier-commit <verifier-sha>
600
+ ~~~
601
+
602
+ This pass proves only that the proposal is safe to expose as untrusted input. It is
603
+ not verification, semantic review, completion, or merge authority. Proposal checks
604
+ remain read-only and receive no secrets; automerge, scripts, plugins, shell execution,
605
+ privileged CI, process-authority, workflow, release, deployment, security-policy, and
606
+ trust-root changes are excluded.
607
+
608
+ The required completion check is absent on every new proposal head. After the exact
609
+ head completes the lifecycle, export its receipt, finalize the managed PR requirements,
610
+ and have the same immutable verifier produce fresh policy evidence bound to the final
611
+ ready body and unchanged base/head. Then run the combined gate:
612
+
613
+ ~~~text
614
+ processctl publication validate-proposal-completion --project-root . \
615
+ --policy-evidence proposal-policy.json \
616
+ --evidence completion.json --evidence-kind receipt \
617
+ --repository <owner/repository> --commit <head-sha> \
618
+ --title "chore(deps): update dependencies" \
619
+ --branch automation/renovate/dependencies --target-branch main \
620
+ --base-commit <protected-base-sha> \
621
+ --body-file ready-pr.md \
622
+ --verifier-repository <owner/verifier> --verifier-commit <verifier-sha>
623
+ ~~~
624
+
625
+ Only a successful combined gate permits the provider adapter to create
626
+ `lifecycle-completion` for that exact SHA. A force update has no inherited check;
627
+ branch protection must require the proposal to be current with the exact validated
628
+ base; duplicate mismatch fails closed. Historical schema-1 policy remains human-only.
629
+ Schema 2 keeps provider automerge disabled before completion and permits merge only
630
+ after the protected base's standing automation policy and exact completion gate pass.
631
+ Provider tokens, check APIs, branch protection, retries, and repository selection
632
+ remain consumer-owned adapter behavior.
633
+
500
634
  ## Trust boundary
501
635
 
502
636
  The CLI proves structural separation: reviewer actor id and context id must both be
@@ -508,11 +642,58 @@ conversation, pass stable identities to `change review start`, and preserve its
508
642
  evidence. A stable reviewer actor or role may be reused with a fresh context; merely
509
643
  renaming retained context does not satisfy the process.
510
644
 
645
+ Self-hosted verifier, signing, release-controller, and process-authority changes use
646
+ the portable authority-rotation rule: the old trust root governs introduction, the
647
+ new root is published under an immutable identity before consumers pin it, cutover is
648
+ proved without a control gap, and retirement happens only after the new boundary is
649
+ active. Provider-specific mechanics may require multiple independently completed
650
+ changes; normal product changes do not inherit that staging automatically.
651
+
511
652
  `change review submit` may be invoked by a coordinator transporting the assigned
512
653
  reviewer's exact report. The CLI validates that artifact against the assignment and
513
654
  carried findings; the attesting host or human boundary, not local process state,
514
655
  authenticates who produced it.
515
656
 
657
+ The producer release workflows implement the same host-neutral chain with explicit
658
+ artifacts and callbacks: `release-pr.yml` creates only an unpublished Git bundle;
659
+ `release-candidate.yml` restores it and runs `change start`, `change plan`,
660
+ `change implement`, and every required `change verify`; the resulting
661
+ `engineering-process-review-required` event names the exact artifact and checkpoint.
662
+ The consumer-selected host restores that lifecycle, chooses an agent or human,
663
+ registers the assignment, submits the exact report, resolves any finding loop, runs
664
+ `change finish`, and exports completion evidence. It sends only that bounded
665
+ gzip/base64 evidence to `release-approval.yml`; semantic reports and reviewer selection
666
+ never become workflow inputs. The publication workflow validates the receipt against
667
+ the exact clean source with `publication validate-evidence-source`, and only then
668
+ pushes the branch, creates or reconciles the ready PR, validates the standing policy,
669
+ and enables exact-head protected auto-merge. No workflow bypasses branch protection.
670
+
671
+ The host callback is deterministic after semantic completion:
672
+
673
+ ~~~text
674
+ processctl evidence export --change-id <change-id> --output completion.json
675
+ processctl evidence encode-completion --evidence completion.json \
676
+ --evidence-kind receipt --output completion.txt
677
+ gh workflow run release-approval.yml --ref main \
678
+ -f verified_run_id=<verified-run-id> \
679
+ -f comparison_base=<base-sha> \
680
+ -f release_head_sha=<completed-checkpoint> \
681
+ -f completion_evidence_gzip_base64="$(<completion.txt)"
682
+ ~~~
683
+
684
+ The callback `comparison_base` is the candidate source base: the immediate protected
685
+ `main` parent used for source restoration, current-base checks, and the publication
686
+ range. The receipt's lifecycle comparison base is independently owned by
687
+ `.release/change.json` and normally identifies the previous immutable release tag;
688
+ the publication boundary validates both identities against their respective owners.
689
+ An older callback whose candidate source base is no longer current fails before any
690
+ candidate-owned publication adapter is invoked.
691
+
692
+ A bootstrap-authority release uses `evidence export-bootstrap` and
693
+ `--evidence-kind bootstrap-authorization`. The adapter rejects oversized or malformed
694
+ transport, a different process identity, base, project, checkpoint, workspace
695
+ fingerprint, source tree, or publication range.
696
+
516
697
  ## Distribution contracts
517
698
 
518
699
  - `project.json` declares baseline profiles and exact argument-array checks.
@@ -541,12 +722,15 @@ authenticates who produced it.
541
722
  classification contract. The generated Release PR gate binds that contract to the
542
723
  exact SemVer increment, package version, latest reachable prior tag, reviewed head,
543
724
  identical merge tree, immutable checkpoint, and main ancestry.
544
- - Remote matrix jobs publish one bounded supplemental-verification schema-1 bundle
725
+ - Remote matrix jobs publish one bounded supplemental-verification schema-2 bundle
545
726
  per platform/runtime. Its manifest binds the exact source and workflow checkpoints,
546
727
  automation actor/context, run URL, platform/runtime identity, selected impact,
547
- configured timeouts, output byte counts/digests, truncation state, and the hashes of
548
- its schema-2 profile reports. GitHub's artifact id and digest complete the immutable
549
- remote reference; this supplements rather than replaces N-1 lifecycle evidence.
728
+ configured timeouts, output byte counts/digests, redacted diagnostic summaries,
729
+ truncation state, and the hashes of its schema-3 profile reports. Historical
730
+ supplemental schema-1 bundles and verification schema-1/schema-2 reports remain
731
+ readable under their released semantics. GitHub's artifact id and digest complete
732
+ the immutable remote reference; this supplements rather than replaces N-1
733
+ lifecycle evidence.
550
734
  - New lifecycle work uses bounded plan schema 2. Selective-impact consumers may add
551
735
  the optional capability on project schema 3, while new integrations use bounded
552
736
  project schema 4. Plan schema 1 and the pre-existing fields of project schemas 1-3
@@ -580,7 +764,7 @@ authenticates who produced it.
580
764
  ~~~text
581
765
  python -m venv .venv
582
766
  .venv/bin/python -m pip install -e '.[dev]'
583
- .venv/bin/python -m unittest discover -s tests -p 'test_*.py'
767
+ .venv/bin/python verification/run_test_suite.py
584
768
  .venv/bin/python processctl.py skills validate --root process_assets/skills
585
769
  .venv/bin/python processctl.py digest
586
770
  ~~~
@@ -0,0 +1,132 @@
1
+ # Federated process improvement
2
+
3
+ This document owns the public feedback protocol that turns validated failures into
4
+ local correction or shared process evolution without transferring repository
5
+ authority.
6
+
7
+ ## Ownership
8
+
9
+ A consumer owns its project behavior, exact evidence, local lifecycle, publication,
10
+ and adoption decisions. A process producer owns portable lifecycle semantics,
11
+ schemas, CLI enforcement, invariant classification, releases, and the public
12
+ improvement catalog. A transport moves immutable artifacts and may attest delivery;
13
+ it owns neither side's implementation, merge, release, nor adoption.
14
+
15
+ Consumer evidence is untrusted producer input. A signal can trigger triage but never
16
+ authorizes mutation. A producer disposition can classify and link work but never
17
+ authorizes implementation or delivery. A completed producer change does not prove an
18
+ immutable release or consumer recovery.
19
+
20
+ ## Artifact chain
21
+
22
+ The portable chain contains four independent schema-1 JSON artifacts:
23
+
24
+ 1. `engineering-process-improvement-signal` binds the consumer project, repository,
25
+ checkpoint, process lock, trigger, owner claim, proposed invariant, bounded
26
+ evidence hashes, and target producer. It contains no raw output, environment,
27
+ secrets, credentials, or authority grant.
28
+ 2. `engineering-process-improvement-disposition` is producer-owned triage. It binds
29
+ the canonical signal digest, assigns the canonical invariant and reusable class,
30
+ records new, duplicate, or recurring status, and links accepted work to a producer
31
+ lifecycle. Rejection is explicit and evidence-backed.
32
+ 3. `engineering-process-improvement-resolution` binds an accepted disposition to a
33
+ completed producer lifecycle receipt and one immutable public release. It grants
34
+ no consumer adoption authority.
35
+ 4. `engineering-process-improvement-reproduction` binds the producer version, tag,
36
+ release name, commit, and artifact-set digest to a clean consumer checkpoint, its
37
+ selected-skill process-lock digest, and passing project-owned profiles. Only this
38
+ artifact closes a shared consumer case.
39
+
40
+ Every later artifact carries canonical digests for every prior artifact. Validation
41
+ is bounded by item count, document bytes, aggregate bytes, identifier size, and URI
42
+ size. Core reads and writes local files only. GitHub issues, dispatches, MCP calls,
43
+ queues, or other delivery mechanisms are optional adapters and must preserve exact
44
+ artifact bytes.
45
+
46
+ ## Lifecycle gates
47
+
48
+ A rejected governed verification profile or unresolved independent-review finding
49
+ creates a pending improvement case. Corrective work cannot silently advance through
50
+ another verification, completion, or source publication while classification is
51
+ missing.
52
+
53
+ Classification records:
54
+
55
+ - owner boundary: `project-local`, `shared-process`, `operations-or-external`, or
56
+ `missing-product-or-authorization-input`;
57
+ - reusable class: local behavior, process rule, deterministic enforcement,
58
+ portability gap, or obsolete guidance;
59
+ - canonical or proposed invariant id;
60
+ - explicit local, shared, external, input, or producer disposition;
61
+ - a rationale digest and, for shared escalation, the producer target.
62
+
63
+ A reviewed local fix may close at lifecycle completion. An accepted inbound producer
64
+ case may reach producer completion but stays release-owned until an immutable
65
+ resolution exists. A shared consumer case stays incomplete until disposition,
66
+ resolution, and reproduction all validate.
67
+
68
+ `producer-improvement` classifies a shared-process defect discovered in the producer's
69
+ own governed work. It remains local producer lifecycle work and requires the reviewed
70
+ catalog to activate the same invariant and change before completion; it does not
71
+ fabricate a consumer signal. Inbound consumer evidence enters only through
72
+ `improvement ingest` and retains the complete signal/catalog/disposition receipt
73
+ boundary.
74
+
75
+ `processctl change status` reports every local, producer, and consumer case, including
76
+ proposed and canonical invariant ids, recurrence, catalog status and digest,
77
+ producer/change, immutable release, consumer checkpoint/process identity, artifact
78
+ source and canonical digests, blockers, and next owner. The public projection omits
79
+ private lifecycle artifact paths.
80
+ `processctl improvement status` reports a transported artifact chain without reading
81
+ either repository's private lifecycle files.
82
+
83
+ ## Recurrence
84
+
85
+ `improvement-catalog.json` is producer-owned and versioned with the distribution. It
86
+ contains canonical invariant ids, reusable classes, public surfaces, status, and
87
+ public resolving change/release identity. It never contains consumer repository
88
+ identity or incident evidence.
89
+
90
+ A new signal assigned to a resolved catalog invariant is a recurrence. It cannot be
91
+ closed as another non-shared narrow incident unless the producer disposition carries
92
+ an explicit owner-approved exception and evidence digest. An active invariant yields
93
+ a duplicate disposition linked to existing work. A new semantic class is added only
94
+ through a reviewed producer lifecycle. Before that producer lifecycle can complete,
95
+ the reviewed distribution catalog must contain the canonical invariant as `active`,
96
+ with the same reusable class and `activeChangeId` as the selected lifecycle. Release
97
+ PR materialization resolves only entries whose active change is in the exact release
98
+ change set.
99
+
100
+ ## Release and adoption
101
+
102
+ Producer completion, producer release, consumer adoption, and consumer reproduction
103
+ are separate boundaries:
104
+
105
+ 1. Public N-1 governs and reviews the producer capability.
106
+ 2. The owner separately authorizes one immutable producer release.
107
+ 3. A consumer independently adopts that release under its currently pinned public
108
+ authority. It never commits a dependency on the producer working tree.
109
+ 4. The consumer reruns the exact affected boundary and exports reproduction evidence.
110
+ 5. Aggregate improvement closes only when producer and consumer proof are both valid.
111
+
112
+ Before release, a read-only candidate artifact may provide forward compatibility
113
+ evidence at a real consumer. It is supplemental proof, not a production dependency,
114
+ adoption, publication, or merge authorization.
115
+
116
+ ## Commands
117
+
118
+ ~~~text
119
+ processctl improvement classify ...
120
+ processctl improvement observe ...
121
+ processctl improvement export-signal ...
122
+ processctl improvement disposition ...
123
+ processctl improvement ingest ...
124
+ processctl improvement resolution ...
125
+ processctl improvement reproduction ...
126
+ processctl improvement attach ...
127
+ processctl improvement validate-chain ...
128
+ processctl improvement status ...
129
+ ~~~
130
+
131
+ All mutation commands operate only on the selected local project and explicit output
132
+ files. No improvement command performs network work or mutates another repository.
@@ -46,18 +46,56 @@ Environment probe regular expressions evaluate a bounded view whose CRLF and CR
46
46
  boundaries are canonicalized to LF. Captured output, byte counts, truncation state,
47
47
  and digests retain the original bytes so portability does not weaken evidence.
48
48
 
49
+ Process-owned finite commands pass only when execution is otherwise successful and
50
+ the complete admitted stdout and stderr streams are free of classified warning and
51
+ error diagnostics. The distribution owns one bounded, non-configurable classifier;
52
+ an exit code of zero cannot override a diagnostic failure. Projects correct the
53
+ diagnostic at its owning boundary rather than suppressing output, changing the
54
+ canonical command, or installing a consumer wrapper. Durable reports record only the
55
+ policy, severity, stream, line number, bounded count, truncation state, and line
56
+ SHA-256. They never copy the diagnostic line into lifecycle evidence.
57
+
49
58
  Missing, stale, truncated beyond a declared policy, blocked, or unverifiable evidence
50
59
  never becomes a pass. Independent review records each accepted dimension as
51
60
  `verified`, `failed`, or `not-applicable-confirmed`; lifecycle submission compares
52
61
  that evidence one-for-one with the change contract before approval.
53
62
 
54
63
  Remote matrix claims require one bounded supplemental bundle per platform/runtime.
55
- The schema-1 manifest binds the exact source and workflow checkpoints, automation
56
- actor/context, run identity and URL, platform/runtime identity, selected impact,
57
- configured timeouts, output byte counts/digests, truncation state, and the hashes of
58
- its schema-2 profile reports. The remote artifact id and service-computed digest are
59
- preserved with review evidence. These reports supplement the public N-1 lifecycle
60
- authority; code under verification never promotes itself to lifecycle authority.
64
+ The current schema-2 manifest binds the exact source and workflow checkpoints,
65
+ automation actor/context, run identity and URL, platform/runtime identity, selected
66
+ impact, configured timeouts, output byte counts/digests, diagnostic summaries,
67
+ truncation state, and the hashes of its schema-3 profile reports. Historical
68
+ supplemental schema-1 manifests and verification schema-1/schema-2 reports retain
69
+ their released reader semantics. The remote artifact id and service-computed digest
70
+ are preserved with review evidence. These reports supplement the public N-1
71
+ lifecycle authority; code under verification never promotes itself to lifecycle
72
+ authority.
73
+
74
+ ## Failure to invariant
75
+
76
+ A validated command, gate, release, adoption, or external-integration failure must
77
+ preserve exact bounded evidence and classify its owner before corrective mutation as
78
+ project-local, shared-process, operations-or-external, or missing product or
79
+ authorization input. Dependent candidates stay blocked. Shared defects are corrected
80
+ in the producer rather than wrapped or duplicated by consumers; project behavior
81
+ remains project-owned unless a portable class is proven.
82
+
83
+ Every governed verification failure and unresolved review finding has a structured
84
+ improvement disposition before corrective progress. A shared consumer case exports a
85
+ bounded untrusted signal and remains incomplete until a producer disposition,
86
+ completed-lifecycle and immutable-release resolution, and exact consumer reproduction
87
+ all validate. A failure assigned to an already resolved catalog invariant is a
88
+ recurrence and requires producer-owned process evolution or an explicit owner-approved
89
+ exception. See `PROCESS_IMPROVEMENT.md`.
90
+
91
+ Every correction proves valid behavior and the corresponding fail-closed class at the
92
+ lowest reliable owner boundary. Shared corrections additionally require producer
93
+ profiles and reproduction at affected consumer boundaries before release. A transient
94
+ operations/external recovery is allowed only with unchanged source and configuration;
95
+ attempts are bounded, idempotent, diagnostic-preserving, and stop on deterministic
96
+ failure. Source, branch, version, credentials, and controls are never changed merely
97
+ to cause another attempt. Independent review treats violation of these ownership and
98
+ evidence boundaries as completion-blocking.
61
99
 
62
100
  ## Resource and generated-state policy
63
101
 
@@ -104,6 +142,21 @@ policy. This keeps distribution input bytes platform-independent. The producer
104
142
  root policy is not a consumer-managed asset and is never written by bootstrap or
105
143
  sync.
106
144
 
145
+ ## Standing gated automation
146
+
147
+ A project-owned standing policy may authorize unattended commit, push,
148
+ review-object, exact-head merge, release, publication, deployment, adoption, and
149
+ ephemeral cleanup only after the existing owning gates pass. It never weakens
150
+ lifecycle completion, fresh independent review, exact head/base, required checks,
151
+ branch protection, consumer ownership, release identity, or destructive-target
152
+ validation. Provider automerge remains disabled for untrusted pre-completion
153
+ proposals.
154
+
155
+ Owner involvement is exceptions-only: a required capability or authority is
156
+ unavailable, bounded idempotent recovery is exhausted, or a material product/security
157
+ decision is missing. Pending checks, normal bounded retries, and routine authorized
158
+ merge or publication operations continue automatically with durable diagnostics.
159
+
107
160
  ## Release identity
108
161
 
109
162
  The release contract is the source of truth for package name, distribution name,