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.
- engineering_process-0.2.0/MANIFEST.in +4 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/PKG-INFO +195 -21
- engineering_process-0.2.0/PRODUCTION_STANDARD.md +120 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/README.md +194 -20
- engineering_process-0.2.0/VERSIONING.md +151 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/__init__.py +1 -1
- engineering_process-0.2.0/engineering_process/__main__.py +5 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/_supervisor_posix.py +2 -1
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/_supervisor_windows.py +2 -1
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/_windows_job.py +20 -1
- engineering_process-0.2.0/engineering_process/adoption.py +941 -0
- engineering_process-0.2.0/engineering_process/artifact_attestation.py +423 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/bootstrap.py +30 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/cli.py +428 -2
- engineering_process-0.2.0/engineering_process/contracts.py +2791 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/distribution.py +12 -2
- engineering_process-0.2.0/engineering_process/distribution_verify.py +541 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/environment.py +145 -25
- engineering_process-0.2.0/engineering_process/evidence.py +486 -0
- engineering_process-0.2.0/engineering_process/git.py +267 -0
- engineering_process-0.2.0/engineering_process/git_attributes.py +81 -0
- engineering_process-0.2.0/engineering_process/impact.py +364 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/lifecycle.py +187 -42
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/publication.py +10 -13
- engineering_process-0.2.0/engineering_process/release.py +379 -0
- engineering_process-0.2.0/engineering_process/release_candidate.py +535 -0
- engineering_process-0.2.0/engineering_process/requirements-release.txt +28 -0
- engineering_process-0.2.0/engineering_process/runner.py +388 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/supervision.py +1 -0
- engineering_process-0.2.0/engineering_process/supplemental.py +470 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/syncing.py +331 -8
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/tooling.py +18 -1
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process.egg-info/PKG-INFO +195 -21
- engineering_process-0.2.0/engineering_process.egg-info/SOURCES.txt +125 -0
- engineering_process-0.2.0/examples/adoption-migration.json +77 -0
- engineering_process-0.2.0/examples/change.json +46 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/examples/plan.json +1 -1
- {engineering_process-0.1.0 → engineering_process-0.2.0}/examples/project.json +21 -3
- engineering_process-0.2.0/examples/release-change.json +12 -0
- engineering_process-0.2.0/examples/release.json +42 -0
- engineering_process-0.2.0/examples/review.json +46 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/define-change-contract/SKILL.md +7 -3
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/evolve-process/SKILL.md +2 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/finish-change/SKILL.md +3 -2
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/implement-change/SKILL.md +2 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/plan-change/SKILL.md +2 -1
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/publish-change/SKILL.md +13 -2
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/review-change/SKILL.md +15 -4
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/run-change/references/execution.md +8 -4
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/verify-change/SKILL.md +2 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/pyproject.toml +35 -25
- engineering_process-0.2.0/release.json +114 -0
- engineering_process-0.2.0/schemas/adoption-migration.schema.json +38 -0
- engineering_process-0.2.0/schemas/change.schema.json +169 -0
- engineering_process-0.2.0/schemas/evidence-receipt.schema.json +82 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/schemas/plan.schema.json +34 -2
- {engineering_process-0.1.0 → engineering_process-0.2.0}/schemas/project.schema.json +159 -3
- engineering_process-0.2.0/schemas/release-change.schema.json +54 -0
- engineering_process-0.2.0/schemas/release.schema.json +129 -0
- engineering_process-0.2.0/schemas/review.schema.json +230 -0
- engineering_process-0.2.0/schemas/supplemental-verification.schema.json +252 -0
- engineering_process-0.2.0/schemas/verification.schema.json +310 -0
- engineering_process-0.2.0/templates/adopt-process-windows-job.py +438 -0
- engineering_process-0.2.0/templates/adopt-process.py +631 -0
- engineering_process-0.2.0/tests/test_adoption.py +598 -0
- engineering_process-0.2.0/tests/test_adoption_runner.py +584 -0
- engineering_process-0.2.0/tests/test_artifact_attestation.py +269 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_bootstrap.py +17 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_bundles.py +1 -1
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_cli.py +178 -0
- engineering_process-0.2.0/tests/test_contracts.py +798 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_distribution.py +46 -2
- engineering_process-0.2.0/tests/test_distribution_verify.py +203 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_environment.py +86 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_evals.py +1 -1
- engineering_process-0.2.0/tests/test_impact.py +269 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_lifecycle.py +466 -21
- engineering_process-0.2.0/tests/test_release.py +379 -0
- engineering_process-0.2.0/tests/test_release_candidate.py +303 -0
- engineering_process-0.2.0/tests/test_runner.py +353 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_runtime.py +26 -0
- engineering_process-0.2.0/tests/test_schemas.py +99 -0
- engineering_process-0.2.0/tests/test_self_hosting.py +362 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_skills.py +3 -1
- engineering_process-0.2.0/tests/test_source_checkout.py +411 -0
- engineering_process-0.2.0/tests/test_supplemental.py +284 -0
- engineering_process-0.2.0/tests/test_syncing.py +768 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_tooling.py +68 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_windows_job.py +23 -8
- engineering_process-0.1.0/engineering_process/contracts.py +0 -1274
- engineering_process-0.1.0/engineering_process/runner.py +0 -191
- engineering_process-0.1.0/engineering_process.egg-info/SOURCES.txt +0 -89
- engineering_process-0.1.0/examples/change.json +0 -26
- engineering_process-0.1.0/examples/review.json +0 -31
- engineering_process-0.1.0/schemas/change.schema.json +0 -88
- engineering_process-0.1.0/schemas/review.schema.json +0 -140
- engineering_process-0.1.0/schemas/verification.schema.json +0 -120
- engineering_process-0.1.0/tests/test_contracts.py +0 -306
- engineering_process-0.1.0/tests/test_runner.py +0 -154
- engineering_process-0.1.0/tests/test_schemas.py +0 -41
- engineering_process-0.1.0/tests/test_syncing.py +0 -352
- {engineering_process-0.1.0 → engineering_process-0.2.0}/LICENSE +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/bundles.json +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/_download_worker.py +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/bundles.py +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/helper_launch.py +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/managed.py +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/markdown.py +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/requirements-build.txt +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/requirements-dev.txt +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/requirements-runtime.txt +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/runtime.py +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process/skills.py +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process.egg-info/dependency_links.txt +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process.egg-info/entry_points.txt +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process.egg-info/requires.txt +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/engineering_process.egg-info/top_level.txt +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/assess-design/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/build-frontend/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/build-frontend-foundation/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/change-api/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/cross-repo-change/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/design-module/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/govern-ui/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/implement-module/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/implement-use-case/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/integrate-mcp/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/maintain-docs/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/run-change/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/run-project-command/SKILL.md +0 -0
- {engineering_process-0.1.0/.agents → engineering_process-0.2.0/process_assets}/skills/specify-use-case/SKILL.md +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/schemas/lifecycle.schema.json +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/schemas/process-lock.schema.json +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/schemas/reviewer-attestation.schema.json +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/setup.cfg +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/templates/AGENTS.process.md +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/templates/PULL_REQUEST_TEMPLATE.md +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_publication.py +0 -0
- {engineering_process-0.1.0 → engineering_process-0.2.0}/tests/test_supervision.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: engineering-process
|
|
3
|
-
Version: 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
|
-
|
|
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.
|
|
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
|
|
117
|
-
|
|
118
|
-
explicitly. `sync --check` and
|
|
119
|
-
|
|
120
|
-
|
|
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
|
|
231
|
-
(the original environment contract) remain readable for backward
|
|
232
|
-
are not relabeled as newer shapes.
|
|
233
|
-
|
|
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,
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
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
|
-
-
|
|
360
|
-
|
|
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
|
|
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
|
-
|
|
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.
|