engineering-process 1.1.2__tar.gz → 1.2.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 (81) hide show
  1. {engineering_process-1.1.2 → engineering_process-1.2.0}/MANIFEST.in +1 -1
  2. {engineering_process-1.1.2/engineering_process.egg-info → engineering_process-1.2.0}/PKG-INFO +147 -7
  3. {engineering_process-1.1.2 → engineering_process-1.2.0}/README.md +146 -6
  4. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/__init__.py +1 -1
  5. engineering_process-1.1.2/engineering_process/supervision.py → engineering_process-1.2.0/engineering_process/_supervisor_contract.py +1 -22
  6. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/_supervisor_posix.py +1 -1
  7. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/_supervisor_windows.py +1 -1
  8. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/cli.py +15 -1
  9. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/contracts.py +1 -0
  10. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/lifecycle.py +67 -9
  11. engineering_process-1.2.0/engineering_process/production_engineering.py +109 -0
  12. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/project.py +6 -0
  13. engineering_process-1.2.0/engineering_process/publication_compat.py +322 -0
  14. engineering_process-1.2.0/engineering_process/supervision.py +32 -0
  15. {engineering_process-1.1.2 → engineering_process-1.2.0/engineering_process.egg-info}/PKG-INFO +147 -7
  16. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process.egg-info/SOURCES.txt +6 -0
  17. {engineering_process-1.1.2 → engineering_process-1.2.0}/process-graph.json +2 -1
  18. {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/finish-change/SKILL.md +6 -4
  19. {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/implement-change/SKILL.md +4 -0
  20. {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/improve-process/SKILL.md +5 -0
  21. {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/plan-change/SKILL.md +6 -0
  22. engineering_process-1.2.0/process_assets/skills/production-engineering/SKILL.md +40 -0
  23. engineering_process-1.2.0/process_assets/skills/production-engineering/invariants.json +46 -0
  24. engineering_process-1.2.0/process_assets/skills/review-change/SKILL.md +64 -0
  25. {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/run-change/SKILL.md +5 -0
  26. {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/start-change/SKILL.md +5 -1
  27. {engineering_process-1.1.2 → engineering_process-1.2.0}/pyproject.toml +6 -1
  28. {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/plan.schema.json +39 -2
  29. engineering_process-1.2.0/schemas/production-engineering.schema.json +40 -0
  30. {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/project.schema.json +7 -1
  31. engineering_process-1.2.0/schemas/review.schema.json +212 -0
  32. {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/run.schema.json +4 -1
  33. engineering_process-1.2.0/templates/PULL_REQUEST_TEMPLATE.md +37 -0
  34. {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_adoption.py +26 -6
  35. engineering_process-1.2.0/tests/test_architecture.py +159 -0
  36. {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_automation.py +102 -4
  37. {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_cli.py +65 -2
  38. {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_contracts.py +126 -0
  39. engineering_process-1.2.0/tests/test_lifecycle.py +817 -0
  40. engineering_process-1.2.0/tests/test_production_engineering.py +221 -0
  41. engineering_process-1.2.0/tests/test_publication_compat.py +328 -0
  42. {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_skills.py +46 -20
  43. engineering_process-1.1.2/engineering_process/publication_compat.py +0 -110
  44. engineering_process-1.1.2/process_assets/skills/review-change/SKILL.md +0 -38
  45. engineering_process-1.1.2/schemas/review.schema.json +0 -64
  46. engineering_process-1.1.2/templates/PULL_REQUEST_TEMPLATE.md +0 -21
  47. engineering_process-1.1.2/tests/test_architecture.py +0 -44
  48. engineering_process-1.1.2/tests/test_lifecycle.py +0 -432
  49. engineering_process-1.1.2/tests/test_publication_compat.py +0 -65
  50. {engineering_process-1.1.2 → engineering_process-1.2.0}/LICENSE +0 -0
  51. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/__main__.py +0 -0
  52. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/_windows_job.py +0 -0
  53. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/adoption.py +0 -0
  54. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/commands.py +0 -0
  55. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/distribution.py +0 -0
  56. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/helper_launch.py +0 -0
  57. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/release.py +0 -0
  58. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/repository.py +0 -0
  59. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/requirements-dev.txt +0 -0
  60. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/requirements-runtime.txt +0 -0
  61. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/skills.py +0 -0
  62. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process.egg-info/dependency_links.txt +0 -0
  63. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process.egg-info/entry_points.txt +0 -0
  64. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process.egg-info/requires.txt +0 -0
  65. {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process.egg-info/top_level.txt +0 -0
  66. {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/verify-change/SKILL.md +0 -0
  67. {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/change.schema.json +0 -0
  68. {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/process-graph.schema.json +0 -0
  69. {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/process-lock.schema.json +0 -0
  70. {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/project-legacy.schema.json +0 -0
  71. {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/receipt.schema.json +0 -0
  72. {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/release-change.schema.json +0 -0
  73. {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/release.schema.json +0 -0
  74. {engineering_process-1.1.2 → engineering_process-1.2.0}/setup.cfg +0 -0
  75. {engineering_process-1.1.2 → engineering_process-1.2.0}/templates/AGENTS.process.md +0 -0
  76. {engineering_process-1.1.2 → engineering_process-1.2.0}/templates/adopt-process-windows-job.py +0 -0
  77. {engineering_process-1.1.2 → engineering_process-1.2.0}/templates/adopt-process.py +0 -0
  78. {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_commands.py +0 -0
  79. {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_release.py +0 -0
  80. {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_repository.py +0 -0
  81. {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_supervisor_posix.py +0 -0
@@ -1,4 +1,4 @@
1
1
  include process-graph.json
2
- recursive-include process_assets/skills SKILL.md
2
+ recursive-include process_assets/skills SKILL.md *.json
3
3
  recursive-include schemas *.json
4
4
  recursive-include templates *.md *.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: engineering-process
3
- Version: 1.1.2
3
+ Version: 1.2.0
4
4
  Summary: A small agent-neutral engineering lifecycle with managed adoption
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/phuongnse/engineering-process
@@ -37,9 +37,9 @@ release decisions.
37
37
 
38
38
  The distribution has four live parts:
39
39
 
40
- 1. Eight skills under process_assets/skills, all reachable from run-change.
40
+ 1. Managed skills under process_assets/skills, all reachable from run-change.
41
41
  2. One processctl state machine under engineering_process/lifecycle.py.
42
- 3. Eleven JSON Schemas that are loaded directly by the runtime.
42
+ 3. JSON Schemas that are loaded directly by the runtime.
43
43
  4. One adoption transaction that synchronizes managed skills and configuration from
44
44
  an exact hash-locked package.
45
45
 
@@ -53,6 +53,12 @@ may have implemented the current cycle. There is no attestation hierarchy,
53
53
  recommendation chain, authority-transition protocol, remote-evidence federation, or
54
54
  second handwritten validator.
55
55
 
56
+ Runtime architecture is enforced by semantic fitness functions, not module or source-
57
+ line quotas. Every module has an explicit dependency layer, imports point toward lower
58
+ layers, the internal graph remains acyclic, and lifecycle.py alone owns state
59
+ transitions behind the CLI adapter. Size metrics may guide refactoring but do not
60
+ decide correctness or release eligibility.
61
+
56
62
  ## Consumer configuration
57
63
 
58
64
  Python 3.11 or newer and Git are required. A consumer owns .process/project.json:
@@ -138,6 +144,37 @@ runtime/license delivery, Linux advisory resolution, real-host workspace securit
138
144
  updater, incident recovery, and independent security review remain planned.
139
145
  Consumers without readiness remain compatible during that evidence-backed rollout.
140
146
 
147
+ ### Production engineering invariants
148
+
149
+ Every new plan and independent review applies one small, versioned invariant floor:
150
+
151
+ - authoritative structure for open-world decisions;
152
+ - one authoritative source for shared policy;
153
+ - bounded, least-authority side effects;
154
+ - explicit compatibility and migration boundaries;
155
+ - assurance bound to current objective evidence and independent judgment.
156
+
157
+ The canonical triggers, required structures, prohibited failures, and expected
158
+ evidence live once in the managed `production-engineering/invariants.json` asset.
159
+ They are cross-domain invariants, not a catalog of preferred design patterns. A
160
+ closed, owner-versioned protocol may use literal state or enum tables; automation
161
+ must not guess open-world meaning from keywords, identifiers, filenames, diagnostic
162
+ text, or growing exception lists.
163
+
164
+ Plan schema version 5 requires a reasoned applicability decision for every invariant
165
+ and real work-item references for each applicable entry. A change started by this
166
+ authority records that writer requirement before planning. The public reader retains
167
+ schema version 4 so a run started by an earlier 1.x authority can still validate and
168
+ register its old plan; that registration is assigned review schema version 6. Review
169
+ schema version 7 requires an independent result and evidence for each entry. A
170
+ violation links to a blocking finding, so it cannot coexist with approval. Structural
171
+ completeness is machine-enforced; the reviewer remains responsible for contextual
172
+ truth.
173
+
174
+ This assessment is not a production certificate. Production still requires the
175
+ consumer's immutable readiness pack, every required capability in `enforced` state,
176
+ fresh consumer-owned verification on the exact candidate, and independent review.
177
+
141
178
  For each ordinary change, `run-change` first surfaces this readiness view. The accepted
142
179
  request and consumer rules determine which capabilities are affected. Every change
143
180
  retains the project's baseline `requiredProfiles`; start and plan add any conditional
@@ -200,7 +237,7 @@ assigned checkpoint:
200
237
  }
201
238
 
202
239
  {
203
- "schemaVersion": 4,
240
+ "schemaVersion": 5,
204
241
  "changeId": "change-123",
205
242
  "contractDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
206
243
  "approach": "Implement through the existing owner.",
@@ -211,11 +248,43 @@ assigned checkpoint:
211
248
  "affectedPaths": ["src/", "tests/"]
212
249
  }
213
250
  ],
214
- "risks": []
251
+ "risks": [],
252
+ "productionEngineering": [
253
+ {
254
+ "id": "authoritative-structure",
255
+ "applicability": "not-applicable",
256
+ "rationale": "The change does not classify an extensible vocabulary.",
257
+ "evidenceWorkItems": []
258
+ },
259
+ {
260
+ "id": "single-policy-authority",
261
+ "applicability": "not-applicable",
262
+ "rationale": "The change introduces no shared policy authority.",
263
+ "evidenceWorkItems": []
264
+ },
265
+ {
266
+ "id": "bounded-side-effects",
267
+ "applicability": "not-applicable",
268
+ "rationale": "The change introduces no resource-bearing side effect.",
269
+ "evidenceWorkItems": []
270
+ },
271
+ {
272
+ "id": "contractual-evolution",
273
+ "applicability": "not-applicable",
274
+ "rationale": "The change does not alter a persisted or public contract.",
275
+ "evidenceWorkItems": []
276
+ },
277
+ {
278
+ "id": "evidence-bound-assurance",
279
+ "applicability": "applicable",
280
+ "rationale": "Completion must be proven on the exact candidate.",
281
+ "evidenceWorkItems": ["implementation"]
282
+ }
283
+ ]
215
284
  }
216
285
 
217
286
  {
218
- "schemaVersion": 5,
287
+ "schemaVersion": 7,
219
288
  "changeId": "change-123",
220
289
  "reviewer": {
221
290
  "actorId": "review-agent",
@@ -230,9 +299,59 @@ assigned checkpoint:
230
299
  },
231
300
  "verdict": "approved",
232
301
  "summary": "Accepted outcomes and evidence are complete.",
233
- "findings": []
302
+ "findings": [],
303
+ "productionEngineering": [
304
+ {
305
+ "id": "authoritative-structure",
306
+ "status": "not-applicable",
307
+ "rationale": "No open-world classification is present.",
308
+ "evidence": []
309
+ },
310
+ {
311
+ "id": "single-policy-authority",
312
+ "status": "not-applicable",
313
+ "rationale": "No shared policy authority is present.",
314
+ "evidence": []
315
+ },
316
+ {
317
+ "id": "bounded-side-effects",
318
+ "status": "not-applicable",
319
+ "rationale": "No resource-bearing side effect is present.",
320
+ "evidence": []
321
+ },
322
+ {
323
+ "id": "contractual-evolution",
324
+ "status": "not-applicable",
325
+ "rationale": "No persisted or public contract changed.",
326
+ "evidence": []
327
+ },
328
+ {
329
+ "id": "evidence-bound-assurance",
330
+ "status": "satisfied",
331
+ "rationale": "Required profiles passed on the assigned snapshot.",
332
+ "evidence": ["development and review profile reports"]
333
+ }
334
+ ],
335
+ "processImprovement": {
336
+ "status": "none",
337
+ "rationale": "No reusable shared-process problem was observed."
338
+ }
234
339
  }
235
340
 
341
+ `change review start` returns the exact `reportSchemaVersion` for its assignment and
342
+ bounded `processSignals` derived from existing lifecycle events. Signals are prompts
343
+ for independent judgment, not evidence that hidden external actions occurred.
344
+ Version 6 distinguishes priority from severity: priority records impact if unresolved,
345
+ while severity alone controls the current lifecycle gate. Every non-blocking finding
346
+ in versions 6 and 7 records one disposition: `resolved` with a rationale, or
347
+ `accepted-risk` / `tracked-follow-up` with a rationale, owner, and stable HTTPS
348
+ `recordUrl`. Version 7 adds the production-engineering resolution and requires a
349
+ `processImprovement` classification of `none`, `consumer-specific`, or
350
+ `shared-process`. A shared-process report requires an existing, owner-authorized issue
351
+ URL; without it, the review remains pending. Earlier plan and review documents remain
352
+ readable, and their runs remain registrable or finishable with the version selected by
353
+ the authority that started the relevant phase.
354
+
236
355
  ## Running a change
237
356
 
238
357
  Create and validate a change contract, then register it:
@@ -287,6 +406,27 @@ approved can finish only while the repository still matches the reviewed snapsho
287
406
  --actor coordinator \
288
407
  --context finish-123
289
408
 
409
+ ### Public pull-request evidence
410
+
411
+ The managed pull-request template keeps public assurance separate from local
412
+ lifecycle identity. Its five sections and labeled fields are ordered and stable:
413
+ outcome and scope; source, risk, compatibility, and stack; profiles, snapshot, and
414
+ completion receipt; verdict, cycles, blocking status, and non-blocking dispositions;
415
+ and a distinct completion gate for the overall assertions.
416
+ The public description never needs an actor ID, context ID, reviewer
417
+ handle, or local `.process/runs` path. Those values remain in lifecycle state, where
418
+ they enforce self-review rejection but do not pretend to be provider-authenticated
419
+ review identities.
420
+
421
+ `processctl publication validate-pr` checks that public contract deterministically.
422
+ It rejects missing, repeated, misplaced, hidden, unordered, or unsupported visible
423
+ structure. Completion checkboxes belong only to the Completion gate section. Ready
424
+ pull requests must have every checkbox checked; drafts may retain unchecked work.
425
+ The managed template never solicits execution identity,
426
+ and authors plus independent review keep it out of free-form values. The validator is
427
+ a positive grammar for public fields; it deliberately does not guess identities from
428
+ an open-ended vocabulary of names or labels.
429
+
290
430
  At any point:
291
431
 
292
432
  processctl change status --change-id change-123 --json
@@ -13,9 +13,9 @@ release decisions.
13
13
 
14
14
  The distribution has four live parts:
15
15
 
16
- 1. Eight skills under process_assets/skills, all reachable from run-change.
16
+ 1. Managed skills under process_assets/skills, all reachable from run-change.
17
17
  2. One processctl state machine under engineering_process/lifecycle.py.
18
- 3. Eleven JSON Schemas that are loaded directly by the runtime.
18
+ 3. JSON Schemas that are loaded directly by the runtime.
19
19
  4. One adoption transaction that synchronizes managed skills and configuration from
20
20
  an exact hash-locked package.
21
21
 
@@ -29,6 +29,12 @@ may have implemented the current cycle. There is no attestation hierarchy,
29
29
  recommendation chain, authority-transition protocol, remote-evidence federation, or
30
30
  second handwritten validator.
31
31
 
32
+ Runtime architecture is enforced by semantic fitness functions, not module or source-
33
+ line quotas. Every module has an explicit dependency layer, imports point toward lower
34
+ layers, the internal graph remains acyclic, and lifecycle.py alone owns state
35
+ transitions behind the CLI adapter. Size metrics may guide refactoring but do not
36
+ decide correctness or release eligibility.
37
+
32
38
  ## Consumer configuration
33
39
 
34
40
  Python 3.11 or newer and Git are required. A consumer owns .process/project.json:
@@ -114,6 +120,37 @@ runtime/license delivery, Linux advisory resolution, real-host workspace securit
114
120
  updater, incident recovery, and independent security review remain planned.
115
121
  Consumers without readiness remain compatible during that evidence-backed rollout.
116
122
 
123
+ ### Production engineering invariants
124
+
125
+ Every new plan and independent review applies one small, versioned invariant floor:
126
+
127
+ - authoritative structure for open-world decisions;
128
+ - one authoritative source for shared policy;
129
+ - bounded, least-authority side effects;
130
+ - explicit compatibility and migration boundaries;
131
+ - assurance bound to current objective evidence and independent judgment.
132
+
133
+ The canonical triggers, required structures, prohibited failures, and expected
134
+ evidence live once in the managed `production-engineering/invariants.json` asset.
135
+ They are cross-domain invariants, not a catalog of preferred design patterns. A
136
+ closed, owner-versioned protocol may use literal state or enum tables; automation
137
+ must not guess open-world meaning from keywords, identifiers, filenames, diagnostic
138
+ text, or growing exception lists.
139
+
140
+ Plan schema version 5 requires a reasoned applicability decision for every invariant
141
+ and real work-item references for each applicable entry. A change started by this
142
+ authority records that writer requirement before planning. The public reader retains
143
+ schema version 4 so a run started by an earlier 1.x authority can still validate and
144
+ register its old plan; that registration is assigned review schema version 6. Review
145
+ schema version 7 requires an independent result and evidence for each entry. A
146
+ violation links to a blocking finding, so it cannot coexist with approval. Structural
147
+ completeness is machine-enforced; the reviewer remains responsible for contextual
148
+ truth.
149
+
150
+ This assessment is not a production certificate. Production still requires the
151
+ consumer's immutable readiness pack, every required capability in `enforced` state,
152
+ fresh consumer-owned verification on the exact candidate, and independent review.
153
+
117
154
  For each ordinary change, `run-change` first surfaces this readiness view. The accepted
118
155
  request and consumer rules determine which capabilities are affected. Every change
119
156
  retains the project's baseline `requiredProfiles`; start and plan add any conditional
@@ -176,7 +213,7 @@ assigned checkpoint:
176
213
  }
177
214
 
178
215
  {
179
- "schemaVersion": 4,
216
+ "schemaVersion": 5,
180
217
  "changeId": "change-123",
181
218
  "contractDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
182
219
  "approach": "Implement through the existing owner.",
@@ -187,11 +224,43 @@ assigned checkpoint:
187
224
  "affectedPaths": ["src/", "tests/"]
188
225
  }
189
226
  ],
190
- "risks": []
227
+ "risks": [],
228
+ "productionEngineering": [
229
+ {
230
+ "id": "authoritative-structure",
231
+ "applicability": "not-applicable",
232
+ "rationale": "The change does not classify an extensible vocabulary.",
233
+ "evidenceWorkItems": []
234
+ },
235
+ {
236
+ "id": "single-policy-authority",
237
+ "applicability": "not-applicable",
238
+ "rationale": "The change introduces no shared policy authority.",
239
+ "evidenceWorkItems": []
240
+ },
241
+ {
242
+ "id": "bounded-side-effects",
243
+ "applicability": "not-applicable",
244
+ "rationale": "The change introduces no resource-bearing side effect.",
245
+ "evidenceWorkItems": []
246
+ },
247
+ {
248
+ "id": "contractual-evolution",
249
+ "applicability": "not-applicable",
250
+ "rationale": "The change does not alter a persisted or public contract.",
251
+ "evidenceWorkItems": []
252
+ },
253
+ {
254
+ "id": "evidence-bound-assurance",
255
+ "applicability": "applicable",
256
+ "rationale": "Completion must be proven on the exact candidate.",
257
+ "evidenceWorkItems": ["implementation"]
258
+ }
259
+ ]
191
260
  }
192
261
 
193
262
  {
194
- "schemaVersion": 5,
263
+ "schemaVersion": 7,
195
264
  "changeId": "change-123",
196
265
  "reviewer": {
197
266
  "actorId": "review-agent",
@@ -206,9 +275,59 @@ assigned checkpoint:
206
275
  },
207
276
  "verdict": "approved",
208
277
  "summary": "Accepted outcomes and evidence are complete.",
209
- "findings": []
278
+ "findings": [],
279
+ "productionEngineering": [
280
+ {
281
+ "id": "authoritative-structure",
282
+ "status": "not-applicable",
283
+ "rationale": "No open-world classification is present.",
284
+ "evidence": []
285
+ },
286
+ {
287
+ "id": "single-policy-authority",
288
+ "status": "not-applicable",
289
+ "rationale": "No shared policy authority is present.",
290
+ "evidence": []
291
+ },
292
+ {
293
+ "id": "bounded-side-effects",
294
+ "status": "not-applicable",
295
+ "rationale": "No resource-bearing side effect is present.",
296
+ "evidence": []
297
+ },
298
+ {
299
+ "id": "contractual-evolution",
300
+ "status": "not-applicable",
301
+ "rationale": "No persisted or public contract changed.",
302
+ "evidence": []
303
+ },
304
+ {
305
+ "id": "evidence-bound-assurance",
306
+ "status": "satisfied",
307
+ "rationale": "Required profiles passed on the assigned snapshot.",
308
+ "evidence": ["development and review profile reports"]
309
+ }
310
+ ],
311
+ "processImprovement": {
312
+ "status": "none",
313
+ "rationale": "No reusable shared-process problem was observed."
314
+ }
210
315
  }
211
316
 
317
+ `change review start` returns the exact `reportSchemaVersion` for its assignment and
318
+ bounded `processSignals` derived from existing lifecycle events. Signals are prompts
319
+ for independent judgment, not evidence that hidden external actions occurred.
320
+ Version 6 distinguishes priority from severity: priority records impact if unresolved,
321
+ while severity alone controls the current lifecycle gate. Every non-blocking finding
322
+ in versions 6 and 7 records one disposition: `resolved` with a rationale, or
323
+ `accepted-risk` / `tracked-follow-up` with a rationale, owner, and stable HTTPS
324
+ `recordUrl`. Version 7 adds the production-engineering resolution and requires a
325
+ `processImprovement` classification of `none`, `consumer-specific`, or
326
+ `shared-process`. A shared-process report requires an existing, owner-authorized issue
327
+ URL; without it, the review remains pending. Earlier plan and review documents remain
328
+ readable, and their runs remain registrable or finishable with the version selected by
329
+ the authority that started the relevant phase.
330
+
212
331
  ## Running a change
213
332
 
214
333
  Create and validate a change contract, then register it:
@@ -263,6 +382,27 @@ approved can finish only while the repository still matches the reviewed snapsho
263
382
  --actor coordinator \
264
383
  --context finish-123
265
384
 
385
+ ### Public pull-request evidence
386
+
387
+ The managed pull-request template keeps public assurance separate from local
388
+ lifecycle identity. Its five sections and labeled fields are ordered and stable:
389
+ outcome and scope; source, risk, compatibility, and stack; profiles, snapshot, and
390
+ completion receipt; verdict, cycles, blocking status, and non-blocking dispositions;
391
+ and a distinct completion gate for the overall assertions.
392
+ The public description never needs an actor ID, context ID, reviewer
393
+ handle, or local `.process/runs` path. Those values remain in lifecycle state, where
394
+ they enforce self-review rejection but do not pretend to be provider-authenticated
395
+ review identities.
396
+
397
+ `processctl publication validate-pr` checks that public contract deterministically.
398
+ It rejects missing, repeated, misplaced, hidden, unordered, or unsupported visible
399
+ structure. Completion checkboxes belong only to the Completion gate section. Ready
400
+ pull requests must have every checkbox checked; drafts may retain unchecked work.
401
+ The managed template never solicits execution identity,
402
+ and authors plus independent review keep it out of free-form values. The validator is
403
+ a positive grammar for public fields; it deliberately does not guess identities from
404
+ an open-ended vocabulary of names or labels.
405
+
266
406
  At any point:
267
407
 
268
408
  processctl change status --change-id change-123 --json
@@ -1,3 +1,3 @@
1
1
  """Agent-neutral engineering process."""
2
2
 
3
- VERSION = "1.1.2"
3
+ VERSION = "1.2.0"
@@ -1,14 +1,8 @@
1
- """Portable foreground-task supervision.
2
-
3
- The public execution contract is deliberately platform-neutral. Kernel-specific
4
- process containment lives in the selected backend and must not leak into consumer
5
- manifests, reports, or lifecycle code.
6
- """
1
+ """Platform-neutral process supervision contract."""
7
2
 
8
3
  from __future__ import annotations
9
4
 
10
5
  from dataclasses import dataclass
11
- import os
12
6
  from pathlib import Path
13
7
  import subprocess
14
8
  from typing import Mapping, Protocol
@@ -62,18 +56,3 @@ class ProcessSupervisor(Protocol):
62
56
  *,
63
57
  grace_seconds: float,
64
58
  ) -> CleanupOutcome: ...
65
-
66
-
67
- def process_supervisor(*, platform_name: str | None = None) -> ProcessSupervisor:
68
- """Select the sole platform adapter used by the execution layer."""
69
-
70
- selected = os.name if platform_name is None else platform_name
71
- if selected == "posix":
72
- from ._supervisor_posix import POSIX_SUPERVISOR
73
-
74
- return POSIX_SUPERVISOR
75
- if selected == "nt":
76
- from ._supervisor_windows import WINDOWS_SUPERVISOR
77
-
78
- return WINDOWS_SUPERVISOR
79
- raise OSError(f"unsupported process supervision platform: {selected}")
@@ -13,7 +13,7 @@ import sys
13
13
  import time
14
14
  from typing import Mapping
15
15
 
16
- from .supervision import CleanupOutcome, NATURAL_DRAIN_GRACE_MILLISECONDS
16
+ from ._supervisor_contract import CleanupOutcome, NATURAL_DRAIN_GRACE_MILLISECONDS
17
17
 
18
18
 
19
19
  PR_SET_CHILD_SUBREAPER = 36
@@ -10,7 +10,7 @@ import threading
10
10
  from typing import Mapping
11
11
 
12
12
  from .helper_launch import isolated_helper_command
13
- from .supervision import CleanupOutcome
13
+ from ._supervisor_contract import CleanupOutcome
14
14
 
15
15
 
16
16
  _UNSUPPORTED_SHELL_SUFFIXES = {".bat", ".cmd"}
@@ -28,6 +28,7 @@ from .lifecycle import (
28
28
  begin_implementation,
29
29
  finish_change,
30
30
  lifecycle_status,
31
+ process_improvement_signals,
31
32
  register_plan,
32
33
  start_change,
33
34
  start_review,
@@ -35,6 +36,10 @@ from .lifecycle import (
35
36
  verify_change,
36
37
  )
37
38
  from .project import load_project, readiness_summary
39
+ from .production_engineering import (
40
+ validate_plan_assessments,
41
+ validate_review_assessments,
42
+ )
38
43
  from .publication_compat import (
39
44
  branch_issues,
40
45
  commit_issues,
@@ -117,7 +122,15 @@ def command_lock_validate(args: argparse.Namespace) -> Result:
117
122
 
118
123
  def command_contract_validate(args: argparse.Namespace) -> Result:
119
124
  process_root = _process_root(args)
120
- load_and_validate(args.path, args.kind, schema_root=schemas_root(process_root))
125
+ document = load_and_validate(
126
+ args.path,
127
+ args.kind,
128
+ schema_root=schemas_root(process_root),
129
+ )
130
+ if args.kind == "plan":
131
+ validate_plan_assessments(document, process_root)
132
+ elif args.kind == "review":
133
+ validate_review_assessments(document, process_root)
121
134
  return _result("contract validate", kind=args.kind, path=str(args.path)), 0
122
135
 
123
136
 
@@ -298,6 +311,7 @@ def command_change_review_start(args: argparse.Namespace) -> Result:
298
311
  "change review start",
299
312
  state,
300
313
  assignment=state["reviewAssignment"],
314
+ processSignals=process_improvement_signals(state),
301
315
  reportPath=f".process/runs/{args.change_id}/review-{state['cycle']}.json",
302
316
  ), 0
303
317
 
@@ -21,6 +21,7 @@ CONTRACT_KINDS = (
21
21
  "plan",
22
22
  "process-graph",
23
23
  "process-lock",
24
+ "production-engineering",
24
25
  "project",
25
26
  "project-legacy",
26
27
  "receipt",