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.
- {engineering_process-1.1.2 → engineering_process-1.2.0}/MANIFEST.in +1 -1
- {engineering_process-1.1.2/engineering_process.egg-info → engineering_process-1.2.0}/PKG-INFO +147 -7
- {engineering_process-1.1.2 → engineering_process-1.2.0}/README.md +146 -6
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/__init__.py +1 -1
- engineering_process-1.1.2/engineering_process/supervision.py → engineering_process-1.2.0/engineering_process/_supervisor_contract.py +1 -22
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/_supervisor_posix.py +1 -1
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/_supervisor_windows.py +1 -1
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/cli.py +15 -1
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/contracts.py +1 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/lifecycle.py +67 -9
- engineering_process-1.2.0/engineering_process/production_engineering.py +109 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/project.py +6 -0
- engineering_process-1.2.0/engineering_process/publication_compat.py +322 -0
- engineering_process-1.2.0/engineering_process/supervision.py +32 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0/engineering_process.egg-info}/PKG-INFO +147 -7
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process.egg-info/SOURCES.txt +6 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/process-graph.json +2 -1
- {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/finish-change/SKILL.md +6 -4
- {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/implement-change/SKILL.md +4 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/improve-process/SKILL.md +5 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/plan-change/SKILL.md +6 -0
- engineering_process-1.2.0/process_assets/skills/production-engineering/SKILL.md +40 -0
- engineering_process-1.2.0/process_assets/skills/production-engineering/invariants.json +46 -0
- engineering_process-1.2.0/process_assets/skills/review-change/SKILL.md +64 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/run-change/SKILL.md +5 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/start-change/SKILL.md +5 -1
- {engineering_process-1.1.2 → engineering_process-1.2.0}/pyproject.toml +6 -1
- {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/plan.schema.json +39 -2
- engineering_process-1.2.0/schemas/production-engineering.schema.json +40 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/project.schema.json +7 -1
- engineering_process-1.2.0/schemas/review.schema.json +212 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/run.schema.json +4 -1
- engineering_process-1.2.0/templates/PULL_REQUEST_TEMPLATE.md +37 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_adoption.py +26 -6
- engineering_process-1.2.0/tests/test_architecture.py +159 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_automation.py +102 -4
- {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_cli.py +65 -2
- {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_contracts.py +126 -0
- engineering_process-1.2.0/tests/test_lifecycle.py +817 -0
- engineering_process-1.2.0/tests/test_production_engineering.py +221 -0
- engineering_process-1.2.0/tests/test_publication_compat.py +328 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_skills.py +46 -20
- engineering_process-1.1.2/engineering_process/publication_compat.py +0 -110
- engineering_process-1.1.2/process_assets/skills/review-change/SKILL.md +0 -38
- engineering_process-1.1.2/schemas/review.schema.json +0 -64
- engineering_process-1.1.2/templates/PULL_REQUEST_TEMPLATE.md +0 -21
- engineering_process-1.1.2/tests/test_architecture.py +0 -44
- engineering_process-1.1.2/tests/test_lifecycle.py +0 -432
- engineering_process-1.1.2/tests/test_publication_compat.py +0 -65
- {engineering_process-1.1.2 → engineering_process-1.2.0}/LICENSE +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/__main__.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/_windows_job.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/adoption.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/commands.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/distribution.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/helper_launch.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/release.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/repository.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/requirements-dev.txt +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/requirements-runtime.txt +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process/skills.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process.egg-info/dependency_links.txt +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process.egg-info/entry_points.txt +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process.egg-info/requires.txt +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/engineering_process.egg-info/top_level.txt +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/process_assets/skills/verify-change/SKILL.md +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/change.schema.json +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/process-graph.schema.json +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/process-lock.schema.json +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/project-legacy.schema.json +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/receipt.schema.json +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/release-change.schema.json +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/schemas/release.schema.json +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/setup.cfg +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/templates/AGENTS.process.md +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/templates/adopt-process-windows-job.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/templates/adopt-process.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_commands.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_release.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_repository.py +0 -0
- {engineering_process-1.1.2 → engineering_process-1.2.0}/tests/test_supervisor_posix.py +0 -0
{engineering_process-1.1.2/engineering_process.egg-info → engineering_process-1.2.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: engineering-process
|
|
3
|
-
Version: 1.
|
|
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.
|
|
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.
|
|
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":
|
|
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":
|
|
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.
|
|
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.
|
|
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":
|
|
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":
|
|
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,14 +1,8 @@
|
|
|
1
|
-
"""
|
|
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}")
|
|
@@ -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
|
-
|
|
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
|
|