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