engineering-process 0.1.0__tar.gz → 0.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 (139) hide show
  1. engineering_process-0.2.0/MANIFEST.in +4 -0
  2. {engineering_process-0.1.0 → engineering_process-0.2.0}/PKG-INFO +195 -21
  3. engineering_process-0.2.0/PRODUCTION_STANDARD.md +120 -0
  4. {engineering_process-0.1.0 → engineering_process-0.2.0}/README.md +194 -20
  5. engineering_process-0.2.0/VERSIONING.md +151 -0
  6. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/__init__.py +1 -1
  7. engineering_process-0.2.0/engineering_process/__main__.py +5 -0
  8. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/_supervisor_posix.py +2 -1
  9. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/_supervisor_windows.py +2 -1
  10. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/_windows_job.py +20 -1
  11. engineering_process-0.2.0/engineering_process/adoption.py +941 -0
  12. engineering_process-0.2.0/engineering_process/artifact_attestation.py +423 -0
  13. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/bootstrap.py +30 -0
  14. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/cli.py +428 -2
  15. engineering_process-0.2.0/engineering_process/contracts.py +2791 -0
  16. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/distribution.py +12 -2
  17. engineering_process-0.2.0/engineering_process/distribution_verify.py +541 -0
  18. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/environment.py +145 -25
  19. engineering_process-0.2.0/engineering_process/evidence.py +486 -0
  20. engineering_process-0.2.0/engineering_process/git.py +267 -0
  21. engineering_process-0.2.0/engineering_process/git_attributes.py +81 -0
  22. engineering_process-0.2.0/engineering_process/impact.py +364 -0
  23. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/lifecycle.py +187 -42
  24. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/publication.py +10 -13
  25. engineering_process-0.2.0/engineering_process/release.py +379 -0
  26. engineering_process-0.2.0/engineering_process/release_candidate.py +535 -0
  27. engineering_process-0.2.0/engineering_process/requirements-release.txt +28 -0
  28. engineering_process-0.2.0/engineering_process/runner.py +388 -0
  29. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/supervision.py +1 -0
  30. engineering_process-0.2.0/engineering_process/supplemental.py +470 -0
  31. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/syncing.py +331 -8
  32. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/tooling.py +18 -1
  33. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process.egg-info/PKG-INFO +195 -21
  34. engineering_process-0.2.0/engineering_process.egg-info/SOURCES.txt +125 -0
  35. engineering_process-0.2.0/examples/adoption-migration.json +77 -0
  36. engineering_process-0.2.0/examples/change.json +46 -0
  37. {engineering_process-0.1.0 → engineering_process-0.2.0}/examples/plan.json +1 -1
  38. {engineering_process-0.1.0 → engineering_process-0.2.0}/examples/project.json +21 -3
  39. engineering_process-0.2.0/examples/release-change.json +12 -0
  40. engineering_process-0.2.0/examples/release.json +42 -0
  41. engineering_process-0.2.0/examples/review.json +46 -0
  42. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/define-change-contract/SKILL.md +7 -3
  43. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/evolve-process/SKILL.md +2 -0
  44. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/finish-change/SKILL.md +3 -2
  45. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/implement-change/SKILL.md +2 -0
  46. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/plan-change/SKILL.md +2 -1
  47. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/publish-change/SKILL.md +13 -2
  48. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/review-change/SKILL.md +15 -4
  49. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/run-change/references/execution.md +8 -4
  50. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/verify-change/SKILL.md +2 -0
  51. {engineering_process-0.1.0 → engineering_process-0.2.0}/pyproject.toml +35 -25
  52. engineering_process-0.2.0/release.json +114 -0
  53. engineering_process-0.2.0/schemas/adoption-migration.schema.json +38 -0
  54. engineering_process-0.2.0/schemas/change.schema.json +169 -0
  55. engineering_process-0.2.0/schemas/evidence-receipt.schema.json +82 -0
  56. {engineering_process-0.1.0 → engineering_process-0.2.0}/schemas/plan.schema.json +34 -2
  57. {engineering_process-0.1.0 → engineering_process-0.2.0}/schemas/project.schema.json +159 -3
  58. engineering_process-0.2.0/schemas/release-change.schema.json +54 -0
  59. engineering_process-0.2.0/schemas/release.schema.json +129 -0
  60. engineering_process-0.2.0/schemas/review.schema.json +230 -0
  61. engineering_process-0.2.0/schemas/supplemental-verification.schema.json +252 -0
  62. engineering_process-0.2.0/schemas/verification.schema.json +310 -0
  63. engineering_process-0.2.0/templates/adopt-process-windows-job.py +438 -0
  64. engineering_process-0.2.0/templates/adopt-process.py +631 -0
  65. engineering_process-0.2.0/tests/test_adoption.py +598 -0
  66. engineering_process-0.2.0/tests/test_adoption_runner.py +584 -0
  67. engineering_process-0.2.0/tests/test_artifact_attestation.py +269 -0
  68. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_bootstrap.py +17 -0
  69. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_bundles.py +1 -1
  70. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_cli.py +178 -0
  71. engineering_process-0.2.0/tests/test_contracts.py +798 -0
  72. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_distribution.py +46 -2
  73. engineering_process-0.2.0/tests/test_distribution_verify.py +203 -0
  74. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_environment.py +86 -0
  75. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_evals.py +1 -1
  76. engineering_process-0.2.0/tests/test_impact.py +269 -0
  77. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_lifecycle.py +466 -21
  78. engineering_process-0.2.0/tests/test_release.py +379 -0
  79. engineering_process-0.2.0/tests/test_release_candidate.py +303 -0
  80. engineering_process-0.2.0/tests/test_runner.py +353 -0
  81. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_runtime.py +26 -0
  82. engineering_process-0.2.0/tests/test_schemas.py +99 -0
  83. engineering_process-0.2.0/tests/test_self_hosting.py +362 -0
  84. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_skills.py +3 -1
  85. engineering_process-0.2.0/tests/test_source_checkout.py +411 -0
  86. engineering_process-0.2.0/tests/test_supplemental.py +284 -0
  87. engineering_process-0.2.0/tests/test_syncing.py +768 -0
  88. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_tooling.py +68 -0
  89. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_windows_job.py +23 -8
  90. engineering_process-0.1.0/engineering_process/contracts.py +0 -1274
  91. engineering_process-0.1.0/engineering_process/runner.py +0 -191
  92. engineering_process-0.1.0/engineering_process.egg-info/SOURCES.txt +0 -89
  93. engineering_process-0.1.0/examples/change.json +0 -26
  94. engineering_process-0.1.0/examples/review.json +0 -31
  95. engineering_process-0.1.0/schemas/change.schema.json +0 -88
  96. engineering_process-0.1.0/schemas/review.schema.json +0 -140
  97. engineering_process-0.1.0/schemas/verification.schema.json +0 -120
  98. engineering_process-0.1.0/tests/test_contracts.py +0 -306
  99. engineering_process-0.1.0/tests/test_runner.py +0 -154
  100. engineering_process-0.1.0/tests/test_schemas.py +0 -41
  101. engineering_process-0.1.0/tests/test_syncing.py +0 -352
  102. {engineering_process-0.1.0 → engineering_process-0.2.0}/LICENSE +0 -0
  103. {engineering_process-0.1.0 → engineering_process-0.2.0}/bundles.json +0 -0
  104. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/_download_worker.py +0 -0
  105. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/bundles.py +0 -0
  106. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/helper_launch.py +0 -0
  107. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/managed.py +0 -0
  108. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/markdown.py +0 -0
  109. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/requirements-build.txt +0 -0
  110. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/requirements-dev.txt +0 -0
  111. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/requirements-runtime.txt +0 -0
  112. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/runtime.py +0 -0
  113. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/skills.py +0 -0
  114. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process.egg-info/dependency_links.txt +0 -0
  115. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process.egg-info/entry_points.txt +0 -0
  116. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process.egg-info/requires.txt +0 -0
  117. {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process.egg-info/top_level.txt +0 -0
  118. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/assess-design/SKILL.md +0 -0
  119. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/build-frontend/SKILL.md +0 -0
  120. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/build-frontend-foundation/SKILL.md +0 -0
  121. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/change-api/SKILL.md +0 -0
  122. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/cross-repo-change/SKILL.md +0 -0
  123. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/design-module/SKILL.md +0 -0
  124. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/govern-ui/SKILL.md +0 -0
  125. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/implement-module/SKILL.md +0 -0
  126. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/implement-use-case/SKILL.md +0 -0
  127. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/integrate-mcp/SKILL.md +0 -0
  128. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/maintain-docs/SKILL.md +0 -0
  129. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/run-change/SKILL.md +0 -0
  130. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/run-project-command/SKILL.md +0 -0
  131. {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/specify-use-case/SKILL.md +0 -0
  132. {engineering_process-0.1.0 → engineering_process-0.2.0}/schemas/lifecycle.schema.json +0 -0
  133. {engineering_process-0.1.0 → engineering_process-0.2.0}/schemas/process-lock.schema.json +0 -0
  134. {engineering_process-0.1.0 → engineering_process-0.2.0}/schemas/reviewer-attestation.schema.json +0 -0
  135. {engineering_process-0.1.0 → engineering_process-0.2.0}/setup.cfg +0 -0
  136. {engineering_process-0.1.0 → engineering_process-0.2.0}/templates/AGENTS.process.md +0 -0
  137. {engineering_process-0.1.0 → engineering_process-0.2.0}/templates/PULL_REQUEST_TEMPLATE.md +0 -0
  138. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_publication.py +0 -0
  139. {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_supervision.py +0 -0
@@ -0,0 +1,4 @@
1
+ prune .agents
2
+ prune .process
3
+ global-exclude __pycache__
4
+ global-exclude *.py[cod]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: engineering-process
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Agent-neutral end-to-end engineering lifecycle and deterministic process CLI
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/phuongnse/engineering-process
@@ -62,6 +62,14 @@ The core ships only the agent-neutral reviewer-attestation contract. Host-specif
62
62
  launchers and model configuration are separate integrations and are never part of a
63
63
  required process bundle.
64
64
 
65
+ This repository follows the same lifecycle it distributes. The exact public N-1
66
+ release pinned in `.process/process.lock` governs development of N+1; the checkout
67
+ under test never supplies its own lifecycle authority. Managed N-1 skills live in
68
+ `.agents/skills`, while editable N+1 distribution sources live in
69
+ `process_assets/skills`. The bootstrap trust chain and evidence boundary are defined
70
+ in [`SELF_HOSTING.md`](./SELF_HOSTING.md); package, schema, release, and adoption
71
+ versions are governed by [`VERSIONING.md`](./VERSIONING.md).
72
+
65
73
  Python 3.11 or newer and Git are required. Windows command containment requires
66
74
  Windows 10 or Windows Server 2016 and newer so Job Object membership can be attached
67
75
  atomically during process creation. Lifecycle state is stored under ignored
@@ -97,7 +105,9 @@ project/
97
105
  │ └── PULL_REQUEST_TEMPLATE.md
98
106
  ├── .gitignore # includes .process/runs/
99
107
  └── .process/
100
- └── project.json # project profiles and lifecycle baseline
108
+ ├── adopt-process.py # hash-locked adoption runner
109
+ ├── adopt-process-windows-job.py # Windows process containment
110
+ └── project.json # profiles and lifecycle baseline
101
111
  ~~~
102
112
 
103
113
  Install `processctl` from a tagged release and create a candidate manifest from
@@ -105,7 +115,7 @@ Install `processctl` from a tagged release and create a candidate manifest from
105
115
  standard in one command:
106
116
 
107
117
  ~~~text
108
- python -m pip install "engineering-process==0.1.0"
118
+ python -m pip install "engineering-process==0.1.1"
109
119
  processctl project init --project-root . --manifest project.json \
110
120
  --bundle core --bundle delivery --bundle product
111
121
  processctl doctor --project-root .
@@ -113,11 +123,34 @@ processctl doctor --project-root .
113
123
 
114
124
  `project init` validates the manifest, preflights ownership conflicts, writes the
115
125
  lock, installs the managed `AGENTS.md` and pull-request contracts, adds the ignored
116
- lifecycle-state path, and synchronizes the selected skills. It refuses to replace
117
- differing project configuration or unmanaged skills unless the conflict is resolved
118
- explicitly. `sync --check` and `doctor` detect drift in skills, the managed agent
119
- contract, and the pull-request block. A consumer never authors or maintains process
120
- skills locally.
126
+ lifecycle-state path and canonical managed-skill Git attributes, and synchronizes
127
+ the selected skills and adoption runner. It refuses to replace differing project
128
+ configuration or unmanaged skills unless the conflict is resolved explicitly. `sync --check` and
129
+ `doctor` detect drift in skills, the managed agent contract, the pull-request block,
130
+ and the bounded process-owned `.agents/.gitattributes` file. That file is closer to
131
+ the managed tree than project-root attributes, canonicalizes LF only for text assets
132
+ under `.agents/skills`, and disables inherited working-tree encoding, filter, and
133
+ ident transforms for those assets. A self-rule applies the same byte-stable policy
134
+ to `.agents/.gitattributes`; binary detection remains automatic. Deeper repository
135
+ attribute files are rejected by existing managed-tree ownership and content checks.
136
+ External Git overrides that alter a checkout still fail byte-exact distribution
137
+ attestation. A consumer never authors or maintains process skills locally.
138
+
139
+ For an existing consumer, a published version is adopted through one Renovate draft.
140
+ The managed runner installs the target authority from the complete hash lock outside
141
+ the checkout and atomically updates the process lock and managed assets. If the
142
+ consumer chooses or requires new project configuration, it adds
143
+ `.process/adoption-migrations/<target-version>.json`; the installed target authority
144
+ binds the source and target manifest digests, validates the complete target manifest,
145
+ and updates `.process/project.json` in the same rollback transaction. Optional
146
+ capabilities are never inferred. CI and a fresh isolated review context approve the
147
+ fully materialized checkpoint; merge completes adoption and no post-merge sync runs.
148
+
149
+ The engineering-process producer repository separately owns its root
150
+ `.gitattributes` policy so tracked text sources and distribution inputs are LF and
151
+ byte-stable on every supported checkout. That producer policy is not synchronized
152
+ into a consumer root; consumers receive only the bounded `.agents/.gitattributes`
153
+ asset described above.
121
154
 
122
155
  The single project-manifest contract includes environment profiles, project-attested
123
156
  read-only requirement probes, remediation, declarative managed-tool artifacts, and
@@ -227,13 +260,89 @@ HTTPS, declared size/checksum/archive/path boundaries and derives their approval
227
260
  `network` plus `user-files`. Use a command action only for project-native package
228
261
  managers or domain preparation that cannot be represented by the managed-tool
229
262
  primitive, and declare every possible scope truthfully. New consumers use
230
- project-manifest schema 3. Schema 1 (without an environment contract) and schema 2
231
- (the original environment contract) remain readable for backward compatibility; they
232
- are not relabeled as newer shapes. A consumer upgrades explicitly to schema 3 to
233
- attest foreground-only task execution and use managed script bindings. New integrations
263
+ project-manifest schema 4. Schema 1 (without an environment contract), schema 2
264
+ (the original environment contract), and schema 3 remain readable for backward
265
+ compatibility; they are not relabeled as newer shapes. Schema 3 introduced
266
+ foreground-only task execution and managed script bindings. Portable impact
267
+ declarations and quality extensions are additive optional schema-3 capabilities;
268
+ schema 4 adds resource bounds to previously published fields without tightening those
269
+ historical readers. New integrations
234
270
  receive the complete environment contract instead of creating a project-local doctor
235
271
  or setup lifecycle.
236
272
 
273
+ To migrate a live project manifest from schema 3 to 4, keep the same field meanings
274
+ and first reduce it to at most 64 profiles, 256 checks per profile, 1,024 checks in
275
+ total, and 256 arguments per check, probe, or command setup action; then change
276
+ `schemaVersion` and run `processctl contract validate --kind project`. Historical
277
+ schema-3 artifacts do not need rewriting. Plan schema 1 follows the same policy:
278
+ new plans use schema 2, with at most 256 work/mapping/risk/decision entries and 64
279
+ verification profiles per mapping.
280
+
281
+ ## Affected-check selection
282
+
283
+ Schema 3 and schema 4 optionally declare the same portable impact graph. Components
284
+ own canonical forward-slash glob patterns and list downstream components in
285
+ `affects`; profile checks list the components that can invalidate them. The
286
+ distribution discovers the
287
+ committed diff from an exact Git merge base and combines staged, unstaged, and
288
+ untracked paths, then computes the transitive component closure and runs only the
289
+ selected checks.
290
+
291
+ ~~~json
292
+ {
293
+ "impact": {
294
+ "baseRefs": ["origin/main", "main"],
295
+ "unmatchedPaths": "all-scoped-checks",
296
+ "components": [
297
+ {
298
+ "id": "api-contract",
299
+ "paths": ["openapi.json"],
300
+ "affects": ["frontend"]
301
+ },
302
+ {
303
+ "id": "frontend",
304
+ "paths": ["frontend/**"],
305
+ "affects": []
306
+ }
307
+ ]
308
+ },
309
+ "profiles": {
310
+ "development": [
311
+ {
312
+ "id": "frontend-unit",
313
+ "run": ["node", "node_modules/vitest/vitest.mjs", "run"],
314
+ "timeoutSeconds": 900,
315
+ "components": ["frontend"]
316
+ }
317
+ ]
318
+ }
319
+ }
320
+ ~~~
321
+
322
+ A check without `components` is deliberately always-run. A manifest without an
323
+ `impact` object deliberately runs its complete profile through the same runner; this
324
+ is suitable for small repositories and is not a legacy execution engine. Any changed
325
+ path that matches no component selects every component-scoped check, so an incomplete
326
+ graph fails toward broader verification instead of silently omitting evidence.
327
+
328
+ Standalone verification tries `impact.baseRefs` in order or accepts an explicit
329
+ `--base-ref`. Lifecycle verification ignores those defaults and binds selection to
330
+ the registered change contract's immutable `comparisonBase`. Inspect a plan without
331
+ probing tools or executing checks:
332
+
333
+ ~~~text
334
+ processctl verify --project-root . --profile development --plan-only
335
+ processctl verify --project-root . --profile development --plan-only \
336
+ --base-ref origin/main --json
337
+ ~~~
338
+
339
+ Evidence records the resolved base and merge-base commits, changed and unmatched
340
+ paths, direct and transitive components, and a reason for every selected or skipped
341
+ check. A selected project command can read that exact immutable scope from the JSON
342
+ file named by `ENGINEERING_PROCESS_IMPACT_FILE`. This is intended only for bounded
343
+ domain analyzers, such as selecting affected MSBuild projects; changed-path discovery,
344
+ component closure, check routing, and evidence remain distribution-owned.
345
+
237
346
  Select capability bundles from `bundles.json`: every consumer starts with `core`,
238
347
  then adds only capabilities it actually owns. For example, a web product commonly
239
348
  adds `delivery`, `product`, `api`, `frontend`, `docs`, and `publication`. Add
@@ -248,6 +357,10 @@ local path.
248
357
 
249
358
  `project.json.lifecycle.requiredProfiles` is the minimum evidence for every change.
250
359
  Individual change contracts may add profiles but cannot remove the baseline.
360
+ Every new contract also applies [`production-v1`](PRODUCTION_STANDARD.md) to the ten
361
+ portable quality dimensions. Projects may add declared `project-*` dimensions but
362
+ cannot remove or weaken the shared minimum. The same contract governs this repository
363
+ through its public N-1 self-hosting boundary.
251
364
  Agents enter non-trivial delivery through the synchronized `run-change` skill; phase
252
365
  skills are internal owners, not a workflow each project must reconnect.
253
366
 
@@ -307,6 +420,25 @@ pending findings before any transition is allowed.
307
420
  Completion does not imply commit creation, push, merge, release, or deployment.
308
421
  Those remain separately authorized project workflows.
309
422
 
423
+ Completed local evidence can be moved across machines or attached to a release as a
424
+ bounded receipt. Export and validate it before any explicit prune:
425
+
426
+ ~~~text
427
+ processctl evidence export --project-root . --change-id issue-123 \
428
+ --output issue-123-evidence.json
429
+ processctl evidence validate issue-123-evidence.json
430
+ processctl evidence prune --project-root . --change-id issue-123 \
431
+ --receipt issue-123-evidence.json
432
+ processctl evidence prune --project-root . --change-id issue-123 \
433
+ --receipt issue-123-evidence.json --apply
434
+ ~~~
435
+
436
+ The first prune command is a preview. `--apply` is accepted only for a completed run
437
+ whose current state matches the validated external receipt. Active, failed,
438
+ unexported, mismatched, or tampered evidence remains fail-closed. A partial deletion
439
+ failure remains under an explicit `.pruning-*` quarantine and must be recovered from
440
+ the retained validated receipt; it is never presented again as a complete local run.
441
+
310
442
  ## Publication contract
311
443
 
312
444
  Validate common metadata before creating or updating a review object:
@@ -318,6 +450,10 @@ processctl publication validate-range --project-root . \
318
450
  --branch feat/short-description --range origin/main..HEAD
319
451
  processctl publication validate-pr --title "feat(scope): describe the change" \
320
452
  --branch feat/short-description --state draft --body-file pr.md
453
+ processctl contract validate --kind release release.json
454
+ processctl publication validate-release --project-root . \
455
+ --tag v0.2.0 --release-name v0.2.0 \
456
+ --commit <checkpoint> --main-ref origin/main
321
457
  ~~~
322
458
 
323
459
  Manual branches use `{type}/{kebab-description}`. Automation uses the provider-neutral
@@ -337,11 +473,13 @@ pull-request descriptions; use visible CommonMark instead.
337
473
  ## Trust boundary
338
474
 
339
475
  The CLI proves structural separation: reviewer actor id and context id must both be
340
- unused by implementation, and the review must match the verified checkpoint. The
341
- agent host or human organization owns the truth of the identity attestation. A host
342
- adapter should create a read-only isolated context, pass stable identities to
343
- `change review start`, and preserve its evidence. Self-asserted separation without a
344
- host or human attestation does not satisfy the process.
476
+ unused by implementation, every review assignment in the project must use a fresh
477
+ context id, and the review must match the verified checkpoint. The agent host or
478
+ human organization owns the truth of the identity attestation. A host adapter should
479
+ create a read-only isolated context with no inherited implementation or prior-review
480
+ conversation, pass stable identities to `change review start`, and preserve its
481
+ evidence. A stable reviewer actor or role may be reused with a fresh context; merely
482
+ renaming retained context does not satisfy the process.
345
483
 
346
484
  `change review submit` may be invoked by a coordinator transporting the assigned
347
485
  reviewer's exact report. The CLI validates that artifact against the assignment and
@@ -356,8 +494,43 @@ authenticates who produced it.
356
494
  templates, bundle catalog, and
357
495
  complete selected skill resources. Startup fails when installed runtime dependency
358
496
  versions differ from that lock.
359
- - Versioned JSON schemas define change, plan, verification, review, lifecycle, and
360
- completion-related artifacts.
497
+ - `requirements/process.in` owns the direct authority pin. Renovate uses the
498
+ pip-compile manager to update its complete binary-only hash lock, then the managed
499
+ `.process/adopt-process.py` runner rejects symlink, junction, or reparse input in
500
+ every supplied path component, snapshots one bounded stable copy outside the
501
+ checkout, binds every path component against concurrent retargeting, and uses that
502
+ exact digest for installation and `processctl adoption apply`. POSIX process groups
503
+ and a managed Windows kill-on-close Job Object contain every child. The resulting
504
+ draft contains the new lock, managed contracts, skill snapshots, and any
505
+ target-version consumer-owned project migration; after CI and fresh-context
506
+ independent review, merge is the end of adoption.
507
+ - Versioned JSON schemas define change, plan, verification, review, lifecycle,
508
+ completion-related artifacts, release-change fragments, and the release
509
+ classification contract. The generated Release PR gate binds that contract to the
510
+ exact SemVer increment, package version, latest reachable prior tag, reviewed head,
511
+ identical merge tree, immutable checkpoint, and main ancestry.
512
+ - Remote matrix jobs publish one bounded supplemental-verification schema-1 bundle
513
+ per platform/runtime. Its manifest binds the exact source and workflow checkpoints,
514
+ automation actor/context, run URL, platform/runtime identity, selected impact,
515
+ configured timeouts, output byte counts/digests, truncation state, and the hashes of
516
+ its schema-2 profile reports. GitHub's artifact id and digest complete the immutable
517
+ remote reference; this supplements rather than replaces N-1 lifecycle evidence.
518
+ - New lifecycle work uses bounded plan schema 2. Selective-impact consumers may add
519
+ the optional capability on project schema 3, while new integrations use bounded
520
+ project schema 4. Plan schema 1 and the pre-existing fields of project schemas 1-3
521
+ retain their published validation behavior instead of being tightened in place.
522
+ - `release.json` is the single release-identity owner. Governed GitHub tag and title
523
+ are both exactly `v<SemVer>`; package metadata, runtime version, artifact names,
524
+ authorization evidence, and later consumer locks must match it. Public-impact PRs
525
+ add bounded `release-changes/<id>.json` fragments; automation aggregates them into
526
+ one reviewed Release PR and never writes a chosen version directly to protected
527
+ `main`. Recorded bootstrap history transitions once through a separately typed
528
+ bootstrap-authority bundle, then all later releases require a public N-1 lifecycle
529
+ receipt.
530
+ - `VERSIONING.md` owns package-versus-schema classification and the explicit
531
+ Renovate-assisted adoption boundary. `processctl publication prepare-release`
532
+ derives and materializes the only permitted next package version from the complete
533
+ fragment set.
361
534
  - Project commands run without a shell and inherit the caller environment. Never put
362
535
  secrets in manifests, arguments, or reports.
363
536
  - Consumer skill roots are distribution-owned: unmanaged `SKILL.md` files or catalog
@@ -376,12 +549,13 @@ authenticates who produced it.
376
549
  python -m venv .venv
377
550
  .venv/bin/python -m pip install -e '.[dev]'
378
551
  .venv/bin/python -m unittest discover -s tests -p 'test_*.py'
379
- .venv/bin/python processctl.py skills validate --root .agents/skills
552
+ .venv/bin/python processctl.py skills validate --root process_assets/skills
380
553
  .venv/bin/python processctl.py digest
381
554
  ~~~
382
555
 
383
556
  Version 0.x remains a compatibility pilot. A 1.0 release requires publishing the CLI,
384
557
  running consumer CI through the published artifact, and completing forward tests on
385
558
  representative agent hosts. Portable evaluation fixtures live in `evals/cases.json`.
386
- Maintainer release steps and the secretless PyPI publisher identity are defined in
559
+ Automated Release PR authorization, repository controls, recovery rules, and the
560
+ secretless PyPI publisher identity are defined in
387
561
  [`RELEASING.md`](https://github.com/phuongnse/engineering-process/blob/main/RELEASING.md).
@@ -0,0 +1,120 @@
1
+ # Production standard
2
+
3
+ `production-v1` is the portable minimum quality contract for every project governed
4
+ by engineering-process, including engineering-process itself. It is a change gate,
5
+ not a claim that every dimension needs the same implementation in every product.
6
+
7
+ ## Required dimensions
8
+
9
+ Every new change contract assesses these dimensions in canonical sorted order:
10
+
11
+ - `compatibility`: supported consumers, platforms, data, APIs, and migrations;
12
+ - `correctness`: observable outcomes, invalid input, and regression behavior;
13
+ - `maintainability`: ownership, cohesion, testability, documentation, and retirement;
14
+ - `observability`: bounded logging, tracing or correlation, metrics where useful,
15
+ redaction, retention, and actionable failure evidence;
16
+ - `operability`: setup, configuration, deployment, rollback, recovery, cleanup, and
17
+ deterministic failure handling;
18
+ - `performance`: input, time, memory, process, I/O, output, and scalability bounds;
19
+ - `privacy`: personal or sensitive data collection, access, minimization, retention,
20
+ deletion, and disclosure;
21
+ - `reliability`: timeout, interruption, retry, idempotency, partial failure, and
22
+ resilience behavior;
23
+ - `security`: trust boundaries, authorization, untrusted input, secrets, dependency
24
+ execution, containment, and fail-closed behavior;
25
+ - `supply-chain`: source, dependency, evidence, artifact, release, and consumer-lock
26
+ identity and provenance.
27
+
28
+ `correctness` is always applicable. Any other dimension may be `not-applicable` only
29
+ with a concrete rationale and no mapped criterion. An applicable dimension maps to at
30
+ least one measurable acceptance criterion. A project may declare sorted
31
+ `project-*` extensions in `.process/project.json`; extensions add to the core and can
32
+ never replace or weaken it.
33
+
34
+ ## Evidence and observability
35
+
36
+ Evidence must identify the change, cycle, immutable checkpoint, workspace
37
+ fingerprint, actor/context, profile, selected impact, command digest, timestamps,
38
+ exit status, timeout state, output byte counts and output digests. Raw command output
39
+ is streamed for diagnosis but is not copied into lifecycle JSON, so reports stay
40
+ bounded and avoid becoming a secret store. Projects define redaction and retention
41
+ for their own application logs. Distributed tracing is required only when the
42
+ affected architecture needs it; every project still needs enough correlation to
43
+ explain a failed operation.
44
+
45
+ Environment probe regular expressions evaluate a bounded view whose CRLF and CR line
46
+ boundaries are canonicalized to LF. Captured output, byte counts, truncation state,
47
+ and digests retain the original bytes so portability does not weaken evidence.
48
+
49
+ Missing, stale, truncated beyond a declared policy, blocked, or unverifiable evidence
50
+ never becomes a pass. Independent review records each accepted dimension as
51
+ `verified`, `failed`, or `not-applicable-confirmed`; lifecycle submission compares
52
+ that evidence one-for-one with the change contract before approval.
53
+
54
+ 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.
61
+
62
+ ## Resource and generated-state policy
63
+
64
+ Every operation over repository-controlled or remote input has explicit limits for
65
+ time, count, individual item size, aggregate size, output, and process descendants.
66
+ Limits fail closed and have regression coverage for success, failure, timeout, and
67
+ interruption. Selective verification reduces work only through the distribution-owned
68
+ impact algorithm; unmatched or ambiguous paths expand verification.
69
+
70
+ Authority adoption treats project configuration as consumer-owned declarative data.
71
+ A target-version migration binds exact source and target manifest digests, is size
72
+ bounded, contains no executable command, validates under the installed target
73
+ authority, and shares one rollback boundary with the process lock and managed assets.
74
+ Optional capabilities are never inferred, while configuration required by the target
75
+ authority blocks adoption when it is missing or invalid.
76
+
77
+ Released serialized contracts are never tightened in place. A new resource bound or
78
+ meaning-changing requirement uses a new integer schema major with explicit migration;
79
+ historical readers retain their published behavior. A new optional capability may
80
+ expand an existing schema major without invalidating its prior documents: portable
81
+ impact and quality declarations therefore remain additive on project schema 3. New
82
+ integrations use the bounded plan and project schema majors while older artifacts
83
+ remain readable as history.
84
+
85
+ Ephemeral files use private temporary directories and are removed on success,
86
+ failure, timeout, and interruption. Build outputs are created in an isolated tracked
87
+ snapshot and never persist in the source checkout. `.process/runs/` is durable local
88
+ lifecycle evidence, not temporary state: completed evidence is exported and
89
+ validated against `schemas/evidence-receipt.schema.json` and its semantic cross-links
90
+ before an explicit prune; active or unexported evidence is not deleted.
91
+ Verification isolates interpreter bytecode caches from the checkout and rejects
92
+ ignored sourceless bytecode that could shadow checkpoint-owned source.
93
+ Managed skill text is checked out with canonical LF through a bounded process-owned
94
+ `.agents/.gitattributes` file whose directory precedence is above project-root
95
+ rules. The closer rule also disables inherited working-tree encoding, filter, and
96
+ ident transforms that could otherwise rewrite managed bytes, and a self-rule gives
97
+ the attributes file the same byte-stable checkout policy. Deeper repository attribute
98
+ files remain subject to managed-tree ownership and content checks. Integrity comparison
99
+ remains byte-exact; newline variants are not accepted as alternate distribution bytes.
100
+
101
+ The producer repository applies the same LF and byte-transform isolation to its
102
+ own automatically detected text sources through a tracked root `.gitattributes`
103
+ policy. This keeps distribution input bytes platform-independent. The producer
104
+ root policy is not a consumer-managed asset and is never written by bootstrap or
105
+ sync.
106
+
107
+ ## Release identity
108
+
109
+ The release contract is the source of truth for package name, distribution name,
110
+ SemVer, tag, GitHub release title, runtime version location, artifact names, and
111
+ lifecycle receipt name. Governed releases use the exact tag and title `v<SemVer>`.
112
+ Publication cross-checks every declared surface against one immutable checkpoint;
113
+ consumer locks change only after public artifacts and hashes are verified.
114
+ The exact public N-1 binary validates governed lifecycle receipts with no fallback to
115
+ code under release. Release/build dependencies are artifact-hash locked and the build
116
+ runs without dependency isolation or network resolution.
117
+
118
+ Immutable releases created before this contract use `bootstrap-history` provenance.
119
+ That mode records their actual identity and explicitly makes no lifecycle-governance
120
+ claim. It cannot be used for new governed releases.