engineering-process 0.8.0__tar.gz → 1.0.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.0.0/MANIFEST.in +4 -0
- engineering_process-1.0.0/PKG-INFO +279 -0
- engineering_process-1.0.0/README.md +255 -0
- {engineering_process-0.8.0 → engineering_process-1.0.0}/engineering_process/__init__.py +1 -1
- engineering_process-1.0.0/engineering_process/_supervisor_posix.py +367 -0
- {engineering_process-0.8.0 → engineering_process-1.0.0}/engineering_process/_supervisor_windows.py +3 -0
- engineering_process-1.0.0/engineering_process/adoption.py +557 -0
- engineering_process-1.0.0/engineering_process/cli.py +559 -0
- engineering_process-1.0.0/engineering_process/commands.py +218 -0
- engineering_process-1.0.0/engineering_process/contracts.py +131 -0
- engineering_process-1.0.0/engineering_process/distribution.py +122 -0
- {engineering_process-0.8.0 → engineering_process-1.0.0}/engineering_process/helper_launch.py +0 -1
- engineering_process-1.0.0/engineering_process/lifecycle.py +536 -0
- engineering_process-1.0.0/engineering_process/project.py +115 -0
- engineering_process-1.0.0/engineering_process/publication_compat.py +110 -0
- engineering_process-1.0.0/engineering_process/release.py +74 -0
- engineering_process-1.0.0/engineering_process/repository.py +140 -0
- engineering_process-1.0.0/engineering_process/requirements-dev.txt +3 -0
- engineering_process-1.0.0/engineering_process/requirements-runtime.txt +1 -0
- engineering_process-1.0.0/engineering_process/skills.py +108 -0
- {engineering_process-0.8.0 → engineering_process-1.0.0}/engineering_process/supervision.py +2 -0
- engineering_process-1.0.0/engineering_process.egg-info/PKG-INFO +279 -0
- engineering_process-1.0.0/engineering_process.egg-info/SOURCES.txt +65 -0
- engineering_process-1.0.0/engineering_process.egg-info/requires.txt +6 -0
- engineering_process-1.0.0/process-graph.json +84 -0
- engineering_process-1.0.0/process_assets/skills/finish-change/SKILL.md +15 -0
- engineering_process-1.0.0/process_assets/skills/implement-change/SKILL.md +22 -0
- engineering_process-1.0.0/process_assets/skills/improve-process/SKILL.md +22 -0
- engineering_process-1.0.0/process_assets/skills/plan-change/SKILL.md +20 -0
- engineering_process-1.0.0/process_assets/skills/review-change/SKILL.md +31 -0
- engineering_process-1.0.0/process_assets/skills/run-change/SKILL.md +31 -0
- engineering_process-1.0.0/process_assets/skills/start-change/SKILL.md +19 -0
- engineering_process-1.0.0/process_assets/skills/verify-change/SKILL.md +19 -0
- engineering_process-1.0.0/pyproject.toml +68 -0
- engineering_process-1.0.0/schemas/change.schema.json +66 -0
- engineering_process-1.0.0/schemas/plan.schema.json +57 -0
- engineering_process-1.0.0/schemas/process-graph.schema.json +63 -0
- engineering_process-1.0.0/schemas/process-lock.schema.json +78 -0
- engineering_process-0.8.0/schemas/project.schema.json → engineering_process-1.0.0/schemas/project-legacy.schema.json +2 -2
- engineering_process-1.0.0/schemas/project.schema.json +81 -0
- engineering_process-1.0.0/schemas/receipt.schema.json +88 -0
- engineering_process-1.0.0/schemas/release-change.schema.json +20 -0
- engineering_process-1.0.0/schemas/release.schema.json +40 -0
- engineering_process-1.0.0/schemas/review.schema.json +64 -0
- engineering_process-1.0.0/schemas/run.schema.json +176 -0
- engineering_process-1.0.0/templates/AGENTS.process.md +13 -0
- engineering_process-1.0.0/templates/PULL_REQUEST_TEMPLATE.md +21 -0
- {engineering_process-0.8.0 → engineering_process-1.0.0}/templates/adopt-process.py +123 -37
- engineering_process-1.0.0/tests/test_adoption.py +406 -0
- engineering_process-1.0.0/tests/test_architecture.py +44 -0
- engineering_process-1.0.0/tests/test_automation.py +107 -0
- engineering_process-1.0.0/tests/test_cli.py +78 -0
- engineering_process-1.0.0/tests/test_commands.py +169 -0
- engineering_process-1.0.0/tests/test_contracts.py +67 -0
- engineering_process-1.0.0/tests/test_lifecycle.py +432 -0
- engineering_process-1.0.0/tests/test_publication_compat.py +65 -0
- engineering_process-1.0.0/tests/test_release.py +139 -0
- engineering_process-1.0.0/tests/test_repository.py +52 -0
- engineering_process-1.0.0/tests/test_skills.py +53 -0
- engineering_process-0.8.0/MANIFEST.in +0 -2
- engineering_process-0.8.0/PKG-INFO +0 -950
- engineering_process-0.8.0/PROCESS_IMPROVEMENT.md +0 -132
- engineering_process-0.8.0/PRODUCTION_STANDARD.md +0 -271
- engineering_process-0.8.0/README.md +0 -914
- engineering_process-0.8.0/VERSIONING.md +0 -340
- engineering_process-0.8.0/bundles.json +0 -43
- engineering_process-0.8.0/engineering_process/_download_worker.py +0 -73
- engineering_process-0.8.0/engineering_process/_supervisor_posix.py +0 -176
- engineering_process-0.8.0/engineering_process/adoption.py +0 -941
- engineering_process-0.8.0/engineering_process/artifact_attestation.py +0 -423
- engineering_process-0.8.0/engineering_process/bootstrap.py +0 -248
- engineering_process-0.8.0/engineering_process/bounded_process.py +0 -236
- engineering_process-0.8.0/engineering_process/bundles.py +0 -99
- engineering_process-0.8.0/engineering_process/cli.py +0 -2625
- engineering_process-0.8.0/engineering_process/command_catalog.py +0 -31
- engineering_process-0.8.0/engineering_process/contracts.py +0 -6307
- engineering_process-0.8.0/engineering_process/diagnostics.py +0 -95
- engineering_process-0.8.0/engineering_process/distribution.py +0 -261
- engineering_process-0.8.0/engineering_process/distribution_verify.py +0 -558
- engineering_process-0.8.0/engineering_process/environment.py +0 -924
- engineering_process-0.8.0/engineering_process/evidence.py +0 -1091
- engineering_process-0.8.0/engineering_process/evidence_transport.py +0 -93
- engineering_process-0.8.0/engineering_process/git.py +0 -279
- engineering_process-0.8.0/engineering_process/git_attributes.py +0 -81
- engineering_process-0.8.0/engineering_process/impact.py +0 -364
- engineering_process-0.8.0/engineering_process/improvement.py +0 -1308
- engineering_process-0.8.0/engineering_process/lifecycle.py +0 -3719
- engineering_process-0.8.0/engineering_process/lifecycle_routes.py +0 -107
- engineering_process-0.8.0/engineering_process/managed.py +0 -89
- engineering_process-0.8.0/engineering_process/markdown.py +0 -78
- engineering_process-0.8.0/engineering_process/process_graph.py +0 -355
- engineering_process-0.8.0/engineering_process/publication.py +0 -1981
- engineering_process-0.8.0/engineering_process/recommendation.py +0 -517
- engineering_process-0.8.0/engineering_process/release.py +0 -375
- engineering_process-0.8.0/engineering_process/release_candidate.py +0 -836
- engineering_process-0.8.0/engineering_process/remote_verification.py +0 -498
- engineering_process-0.8.0/engineering_process/requirements-build.txt +0 -1
- engineering_process-0.8.0/engineering_process/requirements-dev.txt +0 -10
- engineering_process-0.8.0/engineering_process/requirements-release.txt +0 -30
- engineering_process-0.8.0/engineering_process/requirements-runtime.txt +0 -4
- engineering_process-0.8.0/engineering_process/runner.py +0 -389
- engineering_process-0.8.0/engineering_process/runtime.py +0 -55
- engineering_process-0.8.0/engineering_process/skills.py +0 -225
- engineering_process-0.8.0/engineering_process/supplemental.py +0 -471
- engineering_process-0.8.0/engineering_process/syncing.py +0 -900
- engineering_process-0.8.0/engineering_process/tooling.py +0 -937
- engineering_process-0.8.0/engineering_process.egg-info/PKG-INFO +0 -950
- engineering_process-0.8.0/engineering_process.egg-info/SOURCES.txt +0 -191
- engineering_process-0.8.0/engineering_process.egg-info/requires.txt +0 -20
- engineering_process-0.8.0/examples/adoption-migration.json +0 -77
- engineering_process-0.8.0/examples/automation-policy.json +0 -30
- engineering_process-0.8.0/examples/automation-process-adoption-policy.json +0 -36
- engineering_process-0.8.0/examples/automation-process-adoption-proposal.json +0 -174
- engineering_process-0.8.0/examples/automation-proposal-policy.json +0 -30
- engineering_process-0.8.0/examples/automation-proposal.json +0 -72
- engineering_process-0.8.0/examples/change.json +0 -47
- engineering_process-0.8.0/examples/improvement-catalog.json +0 -24
- engineering_process-0.8.0/examples/improvement-disposition.json +0 -36
- engineering_process-0.8.0/examples/improvement-reproduction.json +0 -40
- engineering_process-0.8.0/examples/improvement-resolution.json +0 -26
- engineering_process-0.8.0/examples/improvement-signal.json +0 -50
- engineering_process-0.8.0/examples/plan-decision-review-assignment.json +0 -45
- engineering_process-0.8.0/examples/plan-decision-review.json +0 -26
- engineering_process-0.8.0/examples/plan.json +0 -40
- engineering_process-0.8.0/examples/project.json +0 -108
- engineering_process-0.8.0/examples/recommendation-resolution.json +0 -21
- engineering_process-0.8.0/examples/recommendation-review-assignment.json +0 -22
- engineering_process-0.8.0/examples/recommendation-review.json +0 -60
- engineering_process-0.8.0/examples/recommendation.json +0 -89
- engineering_process-0.8.0/examples/release-change.json +0 -12
- engineering_process-0.8.0/examples/release.json +0 -42
- engineering_process-0.8.0/examples/remote-verification-evidence.json +0 -26
- engineering_process-0.8.0/examples/remote-verification-request.json +0 -40
- engineering_process-0.8.0/examples/review.json +0 -46
- engineering_process-0.8.0/improvement-catalog.json +0 -99
- engineering_process-0.8.0/process-graph.json +0 -151
- engineering_process-0.8.0/process_assets/skills/assess-design/SKILL.md +0 -59
- engineering_process-0.8.0/process_assets/skills/build-frontend/SKILL.md +0 -38
- engineering_process-0.8.0/process_assets/skills/build-frontend-foundation/SKILL.md +0 -36
- engineering_process-0.8.0/process_assets/skills/change-api/SKILL.md +0 -36
- engineering_process-0.8.0/process_assets/skills/cross-repo-change/SKILL.md +0 -43
- engineering_process-0.8.0/process_assets/skills/define-change-contract/SKILL.md +0 -44
- engineering_process-0.8.0/process_assets/skills/design-module/SKILL.md +0 -37
- engineering_process-0.8.0/process_assets/skills/evolve-process/SKILL.md +0 -75
- engineering_process-0.8.0/process_assets/skills/finish-change/SKILL.md +0 -40
- engineering_process-0.8.0/process_assets/skills/govern-ui/SKILL.md +0 -40
- engineering_process-0.8.0/process_assets/skills/implement-change/SKILL.md +0 -59
- engineering_process-0.8.0/process_assets/skills/implement-module/SKILL.md +0 -36
- engineering_process-0.8.0/process_assets/skills/implement-use-case/SKILL.md +0 -36
- engineering_process-0.8.0/process_assets/skills/integrate-mcp/SKILL.md +0 -37
- engineering_process-0.8.0/process_assets/skills/maintain-docs/SKILL.md +0 -35
- engineering_process-0.8.0/process_assets/skills/plan-change/SKILL.md +0 -54
- engineering_process-0.8.0/process_assets/skills/publish-change/SKILL.md +0 -114
- engineering_process-0.8.0/process_assets/skills/review-change/SKILL.md +0 -76
- engineering_process-0.8.0/process_assets/skills/run-change/SKILL.md +0 -76
- engineering_process-0.8.0/process_assets/skills/run-change/references/execution.md +0 -340
- engineering_process-0.8.0/process_assets/skills/run-project-command/SKILL.md +0 -59
- engineering_process-0.8.0/process_assets/skills/specify-use-case/SKILL.md +0 -37
- engineering_process-0.8.0/process_assets/skills/verify-change/SKILL.md +0 -52
- engineering_process-0.8.0/pyproject.toml +0 -180
- engineering_process-0.8.0/release.json +0 -53
- engineering_process-0.8.0/schemas/adoption-migration.schema.json +0 -38
- engineering_process-0.8.0/schemas/automation-policy.schema.json +0 -63
- engineering_process-0.8.0/schemas/automation-proposal-policy.schema.json +0 -193
- engineering_process-0.8.0/schemas/automation-proposal.schema.json +0 -432
- engineering_process-0.8.0/schemas/change.schema.json +0 -186
- engineering_process-0.8.0/schemas/evidence-receipt.schema.json +0 -165
- engineering_process-0.8.0/schemas/improvement-catalog.schema.json +0 -89
- engineering_process-0.8.0/schemas/improvement-disposition.schema.json +0 -167
- engineering_process-0.8.0/schemas/improvement-reproduction.schema.json +0 -89
- engineering_process-0.8.0/schemas/improvement-resolution.schema.json +0 -65
- engineering_process-0.8.0/schemas/improvement-signal.schema.json +0 -235
- engineering_process-0.8.0/schemas/lifecycle.schema.json +0 -228
- engineering_process-0.8.0/schemas/plan-decision-review-assignment.schema.json +0 -99
- engineering_process-0.8.0/schemas/plan-decision-review.schema.json +0 -81
- engineering_process-0.8.0/schemas/plan.schema.json +0 -222
- engineering_process-0.8.0/schemas/process-graph.schema.json +0 -48
- engineering_process-0.8.0/schemas/process-lock.schema.json +0 -39
- engineering_process-0.8.0/schemas/recommendation-resolution.schema.json +0 -60
- engineering_process-0.8.0/schemas/recommendation-review-assignment.schema.json +0 -56
- engineering_process-0.8.0/schemas/recommendation-review.schema.json +0 -112
- engineering_process-0.8.0/schemas/recommendation.schema.json +0 -178
- engineering_process-0.8.0/schemas/release-change.schema.json +0 -54
- engineering_process-0.8.0/schemas/release.schema.json +0 -129
- engineering_process-0.8.0/schemas/remote-verification-evidence.schema.json +0 -61
- engineering_process-0.8.0/schemas/remote-verification-request.schema.json +0 -116
- engineering_process-0.8.0/schemas/review.schema.json +0 -230
- engineering_process-0.8.0/schemas/reviewer-attestation.schema.json +0 -30
- engineering_process-0.8.0/schemas/supplemental-verification.schema.json +0 -354
- engineering_process-0.8.0/schemas/verification.schema.json +0 -411
- engineering_process-0.8.0/templates/AGENTS.process.md +0 -17
- engineering_process-0.8.0/templates/PULL_REQUEST_TEMPLATE.md +0 -27
- engineering_process-0.8.0/tests/test_adoption.py +0 -598
- engineering_process-0.8.0/tests/test_adoption_runner.py +0 -701
- engineering_process-0.8.0/tests/test_artifact_attestation.py +0 -269
- engineering_process-0.8.0/tests/test_bootstrap.py +0 -328
- engineering_process-0.8.0/tests/test_bounded_process.py +0 -229
- engineering_process-0.8.0/tests/test_bundles.py +0 -71
- engineering_process-0.8.0/tests/test_cli.py +0 -892
- engineering_process-0.8.0/tests/test_completed_release_dispatch.py +0 -249
- engineering_process-0.8.0/tests/test_completion_evidence_transport.py +0 -91
- engineering_process-0.8.0/tests/test_contracts.py +0 -1203
- engineering_process-0.8.0/tests/test_diagnostics.py +0 -80
- engineering_process-0.8.0/tests/test_distribution.py +0 -182
- engineering_process-0.8.0/tests/test_distribution_verify.py +0 -217
- engineering_process-0.8.0/tests/test_environment.py +0 -741
- engineering_process-0.8.0/tests/test_evals.py +0 -59
- engineering_process-0.8.0/tests/test_impact.py +0 -269
- engineering_process-0.8.0/tests/test_improvement.py +0 -499
- engineering_process-0.8.0/tests/test_lifecycle.py +0 -2641
- engineering_process-0.8.0/tests/test_process_graph.py +0 -174
- engineering_process-0.8.0/tests/test_process_install.py +0 -446
- engineering_process-0.8.0/tests/test_publication.py +0 -2232
- engineering_process-0.8.0/tests/test_publish_event.py +0 -57
- engineering_process-0.8.0/tests/test_pypi_publication.py +0 -156
- engineering_process-0.8.0/tests/test_recommendation.py +0 -578
- engineering_process-0.8.0/tests/test_release.py +0 -422
- engineering_process-0.8.0/tests/test_release_candidate.py +0 -651
- engineering_process-0.8.0/tests/test_release_candidate_boundary.py +0 -92
- engineering_process-0.8.0/tests/test_release_completion_identity.py +0 -141
- engineering_process-0.8.0/tests/test_release_evidence_restore.py +0 -259
- engineering_process-0.8.0/tests/test_release_evidence_selection.py +0 -164
- engineering_process-0.8.0/tests/test_release_preparation.py +0 -68
- engineering_process-0.8.0/tests/test_release_qualification.py +0 -160
- engineering_process-0.8.0/tests/test_remote_verification.py +0 -833
- engineering_process-0.8.0/tests/test_remote_verification_adapter.py +0 -360
- engineering_process-0.8.0/tests/test_runner.py +0 -476
- engineering_process-0.8.0/tests/test_runtime.py +0 -109
- engineering_process-0.8.0/tests/test_schemas.py +0 -167
- engineering_process-0.8.0/tests/test_self_hosting.py +0 -673
- engineering_process-0.8.0/tests/test_skills.py +0 -255
- engineering_process-0.8.0/tests/test_source_checkout.py +0 -473
- engineering_process-0.8.0/tests/test_supervision.py +0 -310
- engineering_process-0.8.0/tests/test_supplemental.py +0 -322
- engineering_process-0.8.0/tests/test_syncing.py +0 -828
- engineering_process-0.8.0/tests/test_test_suite.py +0 -62
- engineering_process-0.8.0/tests/test_tooling.py +0 -653
- engineering_process-0.8.0/tests/test_windows_job.py +0 -440
- {engineering_process-0.8.0 → engineering_process-1.0.0}/LICENSE +0 -0
- {engineering_process-0.8.0 → engineering_process-1.0.0}/engineering_process/__main__.py +0 -0
- {engineering_process-0.8.0 → engineering_process-1.0.0}/engineering_process/_windows_job.py +0 -0
- {engineering_process-0.8.0 → engineering_process-1.0.0}/engineering_process.egg-info/dependency_links.txt +0 -0
- {engineering_process-0.8.0 → engineering_process-1.0.0}/engineering_process.egg-info/entry_points.txt +0 -0
- {engineering_process-0.8.0 → engineering_process-1.0.0}/engineering_process.egg-info/top_level.txt +0 -0
- {engineering_process-0.8.0 → engineering_process-1.0.0}/setup.cfg +0 -0
- {engineering_process-0.8.0 → engineering_process-1.0.0}/templates/adopt-process-windows-job.py +0 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: engineering-process
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: A small agent-neutral engineering lifecycle with managed adoption
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Project-URL: Homepage, https://github.com/phuongnse/engineering-process
|
|
7
|
+
Project-URL: Issues, https://github.com/phuongnse/engineering-process/issues
|
|
8
|
+
Project-URL: Repository, https://github.com/phuongnse/engineering-process.git
|
|
9
|
+
Classifier: Development Status :: 4 - Beta
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
14
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
15
|
+
Requires-Python: >=3.11
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
License-File: LICENSE
|
|
18
|
+
Requires-Dist: jsonschema==4.26.0
|
|
19
|
+
Provides-Extra: dev
|
|
20
|
+
Requires-Dist: build==1.5.0; extra == "dev"
|
|
21
|
+
Requires-Dist: packaging==26.3; extra == "dev"
|
|
22
|
+
Requires-Dist: pyproject-hooks==1.2.0; extra == "dev"
|
|
23
|
+
Dynamic: license-file
|
|
24
|
+
|
|
25
|
+
# Engineering Process
|
|
26
|
+
|
|
27
|
+
Engineering Process is a small, agent-neutral way to drive repository changes through
|
|
28
|
+
one auditable path:
|
|
29
|
+
|
|
30
|
+
start → plan → implement → verify → independent review → finish
|
|
31
|
+
|
|
32
|
+
Portable skills explain what to do. processctl owns state transitions and current
|
|
33
|
+
evidence. Each consumer owns its product rules, exact commands, merge policy, and
|
|
34
|
+
release decisions.
|
|
35
|
+
|
|
36
|
+
## Architecture
|
|
37
|
+
|
|
38
|
+
The distribution has four live parts:
|
|
39
|
+
|
|
40
|
+
1. Eight skills under process_assets/skills, all reachable from run-change.
|
|
41
|
+
2. One processctl state machine under engineering_process/lifecycle.py.
|
|
42
|
+
3. Eleven JSON Schemas that are loaded directly by the runtime.
|
|
43
|
+
4. One adoption transaction that synchronizes managed skills and configuration from
|
|
44
|
+
an exact hash-locked package.
|
|
45
|
+
|
|
46
|
+
Lifecycle state is local under .process/runs and completion creates one bounded receipt
|
|
47
|
+
under .process/receipts. Both paths are ignored by Git. Verification evidence is bound
|
|
48
|
+
to HEAD plus a fingerprint of tracked and non-ignored untracked files. Any relevant
|
|
49
|
+
mutation invalidates it.
|
|
50
|
+
|
|
51
|
+
Independent review is one direct rule: neither the reviewer actor nor reviewer context
|
|
52
|
+
may have implemented the current cycle. There is no attestation hierarchy,
|
|
53
|
+
recommendation chain, authority-transition protocol, remote-evidence federation, or
|
|
54
|
+
second handwritten validator.
|
|
55
|
+
|
|
56
|
+
## Consumer configuration
|
|
57
|
+
|
|
58
|
+
Python 3.11 or newer and Git are required. A consumer owns .process/project.json:
|
|
59
|
+
|
|
60
|
+
{
|
|
61
|
+
"schemaVersion": 5,
|
|
62
|
+
"project": "my-project",
|
|
63
|
+
"lifecycle": {
|
|
64
|
+
"requiredProfiles": ["development", "review"]
|
|
65
|
+
},
|
|
66
|
+
"setup": [
|
|
67
|
+
{
|
|
68
|
+
"id": "prepare-project-tool",
|
|
69
|
+
"run": ["npm", "rebuild", "native-tool"],
|
|
70
|
+
"timeoutSeconds": 300
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"profiles": {
|
|
74
|
+
"development": [
|
|
75
|
+
{
|
|
76
|
+
"id": "tests",
|
|
77
|
+
"run": ["python", "-m", "unittest"],
|
|
78
|
+
"timeoutSeconds": 600
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
"review": [
|
|
82
|
+
{
|
|
83
|
+
"id": "package",
|
|
84
|
+
"run": ["python", "-m", "build"],
|
|
85
|
+
"timeoutSeconds": 600
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
Commands are argument arrays, never shell strings. Each command has a finite timeout.
|
|
92
|
+
Output has a hard aggregate budget; evidence stores byte counts and hashes, never raw
|
|
93
|
+
stdout or stderr that could contain secrets.
|
|
94
|
+
|
|
95
|
+
Pin the process in requirements/process.in:
|
|
96
|
+
|
|
97
|
+
--only-binary :all:
|
|
98
|
+
engineering-process==0.9.0
|
|
99
|
+
|
|
100
|
+
Generate requirements/process.txt with hashes, install that lock, then run:
|
|
101
|
+
|
|
102
|
+
processctl adoption apply \
|
|
103
|
+
--project-root . \
|
|
104
|
+
--requirements-lock requirements/process.txt
|
|
105
|
+
|
|
106
|
+
The transaction writes only managed surfaces:
|
|
107
|
+
|
|
108
|
+
- .agents/skills/<distributed-skill>
|
|
109
|
+
- the marked block in .github/PULL_REQUEST_TEMPLATE.md
|
|
110
|
+
- .process/adopt-process.py
|
|
111
|
+
- .process/process.lock
|
|
112
|
+
- the marked engineering-process block in AGENTS.md
|
|
113
|
+
- a schema migration of .process/project.json
|
|
114
|
+
|
|
115
|
+
It removes obsolete skills named by the previous process lock and preserves
|
|
116
|
+
consumer-owned skills and instructions. Applying the same version twice is a no-op.
|
|
117
|
+
The legacy managed runner can enter 1.0 directly, so consumers do not need a chain of
|
|
118
|
+
per-version migration documents. The same transaction deletes the retired migration
|
|
119
|
+
directory and standing automation policy; the Windows Job Object helper remains a
|
|
120
|
+
managed runtime-containment asset.
|
|
121
|
+
|
|
122
|
+
The three authored lifecycle documents stay intentionally small. A change contains
|
|
123
|
+
source, scope, outcomes, and profiles; a plan binds its digest; a review binds the
|
|
124
|
+
assigned checkpoint:
|
|
125
|
+
|
|
126
|
+
{
|
|
127
|
+
"schemaVersion": 5,
|
|
128
|
+
"id": "change-123",
|
|
129
|
+
"summary": "Deliver the accepted behavior",
|
|
130
|
+
"source": "issue-123",
|
|
131
|
+
"comparisonBase": "main",
|
|
132
|
+
"risk": "medium",
|
|
133
|
+
"affectedProjects": ["my-project"],
|
|
134
|
+
"acceptanceCriteria": [
|
|
135
|
+
{"id": "works", "outcome": "The observable behavior works"}
|
|
136
|
+
],
|
|
137
|
+
"requiredProfiles": ["development", "review"]
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
{
|
|
141
|
+
"schemaVersion": 4,
|
|
142
|
+
"changeId": "change-123",
|
|
143
|
+
"contractDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
|
|
144
|
+
"approach": "Implement through the existing owner.",
|
|
145
|
+
"workItems": [
|
|
146
|
+
{
|
|
147
|
+
"id": "implementation",
|
|
148
|
+
"outcome": "Deliver and prove the behavior",
|
|
149
|
+
"affectedPaths": ["src/", "tests/"]
|
|
150
|
+
}
|
|
151
|
+
],
|
|
152
|
+
"risks": []
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
{
|
|
156
|
+
"schemaVersion": 5,
|
|
157
|
+
"changeId": "change-123",
|
|
158
|
+
"reviewer": {
|
|
159
|
+
"actorId": "review-agent",
|
|
160
|
+
"contextId": "review-123",
|
|
161
|
+
"kind": "agent"
|
|
162
|
+
},
|
|
163
|
+
"checkpoint": {
|
|
164
|
+
"head": "0000000000000000000000000000000000000000",
|
|
165
|
+
"fingerprint": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
|
|
166
|
+
"fileCount": 1,
|
|
167
|
+
"byteCount": 1
|
|
168
|
+
},
|
|
169
|
+
"verdict": "approved",
|
|
170
|
+
"summary": "Accepted outcomes and evidence are complete.",
|
|
171
|
+
"findings": []
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
## Running a change
|
|
175
|
+
|
|
176
|
+
Create and validate a change contract, then register it:
|
|
177
|
+
|
|
178
|
+
processctl contract validate --kind change change.json
|
|
179
|
+
processctl change start \
|
|
180
|
+
--actor implementation-agent \
|
|
181
|
+
--context change-123 \
|
|
182
|
+
--contract change.json
|
|
183
|
+
|
|
184
|
+
Register a plan bound to the returned contract digest:
|
|
185
|
+
|
|
186
|
+
processctl change plan \
|
|
187
|
+
--change-id change-123 \
|
|
188
|
+
--actor implementation-agent \
|
|
189
|
+
--context change-123 \
|
|
190
|
+
--plan plan.json
|
|
191
|
+
|
|
192
|
+
Register implementation and run every required profile:
|
|
193
|
+
|
|
194
|
+
processctl change implement \
|
|
195
|
+
--change-id change-123 \
|
|
196
|
+
--actor implementation-agent \
|
|
197
|
+
--context change-123
|
|
198
|
+
processctl change verify --change-id change-123 --profile development
|
|
199
|
+
processctl change verify --change-id change-123 --profile review
|
|
200
|
+
|
|
201
|
+
Assign an independent reviewer and submit its report:
|
|
202
|
+
|
|
203
|
+
processctl change review start \
|
|
204
|
+
--change-id change-123 \
|
|
205
|
+
--actor review-agent \
|
|
206
|
+
--context review-123
|
|
207
|
+
|
|
208
|
+
Write the report at the returned reportPath (under .process/runs, so it does not
|
|
209
|
+
change the reviewed snapshot), then submit it:
|
|
210
|
+
|
|
211
|
+
processctl change review submit \
|
|
212
|
+
--change-id change-123 \
|
|
213
|
+
--review .process/runs/change-123/review-1.json
|
|
214
|
+
|
|
215
|
+
changes-requested returns to implementation and increments the cycle. The first
|
|
216
|
+
review is bounded by the frozen acceptance criteria. The same reviewer
|
|
217
|
+
checks correction diffs; new blockers are admitted only for remediation regressions
|
|
218
|
+
or a reasoned P0/P1 miss inside the original contract. A third changes-requested
|
|
219
|
+
review blocks the change after two correction cycles—it never waives review.
|
|
220
|
+
|
|
221
|
+
approved can finish only while the repository still matches the reviewed snapshot:
|
|
222
|
+
|
|
223
|
+
processctl change finish \
|
|
224
|
+
--change-id change-123 \
|
|
225
|
+
--actor coordinator \
|
|
226
|
+
--context finish-123
|
|
227
|
+
|
|
228
|
+
At any point:
|
|
229
|
+
|
|
230
|
+
processctl change status --change-id change-123 --json
|
|
231
|
+
|
|
232
|
+
## Release to consumer PR
|
|
233
|
+
|
|
234
|
+
Every opted-in consumer uses Renovate's pip-compile manager. Its engineering-process
|
|
235
|
+
package rule is enabled, never automerges, and runs exactly:
|
|
236
|
+
|
|
237
|
+
python .process/adopt-process.py --project-root . --requirements-lock requirements/process.txt
|
|
238
|
+
|
|
239
|
+
postUpgradeTasks.fileFilters includes the managed paths, so Renovate commits the new
|
|
240
|
+
hash lock and the fully materialized process in the same pull request. A self-hosted
|
|
241
|
+
Renovate administrator must allow only this anchored command and must keep shell
|
|
242
|
+
execution disabled:
|
|
243
|
+
|
|
244
|
+
^python \.process/adopt-process\.py --project-root \. --requirements-lock requirements/process\.txt$
|
|
245
|
+
|
|
246
|
+
The release workflow publishes exact wheel and sdist bytes to PyPI, verifies their
|
|
247
|
+
registry hashes, creates the immutable GitHub release, and sends one authenticated
|
|
248
|
+
engineering-process-published event to renovate-ops. That control plane runs Renovate
|
|
249
|
+
for each repository whose protected config explicitly opts in. Each consumer's normal
|
|
250
|
+
CI and independent review decide whether its PR can merge.
|
|
251
|
+
|
|
252
|
+
This repository opts in through .github/renovate.json, so it receives the same
|
|
253
|
+
adoption PR as every other consumer. See SELF_HOSTING.md and RELEASING.md.
|
|
254
|
+
|
|
255
|
+
## Compatibility
|
|
256
|
+
|
|
257
|
+
Version 1.x retains a few small pre-1.0 command shapes so existing consumers can
|
|
258
|
+
pass their first adoption PR:
|
|
259
|
+
|
|
260
|
+
- setup runs only the consumer-owned setup arrays migrated from its old manifest;
|
|
261
|
+
- doctor --profile validates the selected profile.
|
|
262
|
+
- publication validate-branch, validate-commit, validate-range, and validate-pr remain
|
|
263
|
+
read-only while consumers move those conventions into their own repositories.
|
|
264
|
+
|
|
265
|
+
They do not restore the removed governance machinery and can be deleted in the next
|
|
266
|
+
package major after all known consumers have adopted 1.x.
|
|
267
|
+
|
|
268
|
+
## Development
|
|
269
|
+
|
|
270
|
+
python -m pip install \
|
|
271
|
+
-r engineering_process/requirements-runtime.txt \
|
|
272
|
+
-r engineering_process/requirements-dev.txt \
|
|
273
|
+
-r engineering_process/requirements-build.txt
|
|
274
|
+
python verification/run_test_suite.py
|
|
275
|
+
python processctl.py skills validate --root process_assets/skills
|
|
276
|
+
python verification/verify_distribution.py
|
|
277
|
+
|
|
278
|
+
The process repository requires a real consumer incident or request in every process
|
|
279
|
+
change contract. PROCESS_IMPROVEMENT.md explains that brake.
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
# Engineering Process
|
|
2
|
+
|
|
3
|
+
Engineering Process is a small, agent-neutral way to drive repository changes through
|
|
4
|
+
one auditable path:
|
|
5
|
+
|
|
6
|
+
start → plan → implement → verify → independent review → finish
|
|
7
|
+
|
|
8
|
+
Portable skills explain what to do. processctl owns state transitions and current
|
|
9
|
+
evidence. Each consumer owns its product rules, exact commands, merge policy, and
|
|
10
|
+
release decisions.
|
|
11
|
+
|
|
12
|
+
## Architecture
|
|
13
|
+
|
|
14
|
+
The distribution has four live parts:
|
|
15
|
+
|
|
16
|
+
1. Eight skills under process_assets/skills, all reachable from run-change.
|
|
17
|
+
2. One processctl state machine under engineering_process/lifecycle.py.
|
|
18
|
+
3. Eleven JSON Schemas that are loaded directly by the runtime.
|
|
19
|
+
4. One adoption transaction that synchronizes managed skills and configuration from
|
|
20
|
+
an exact hash-locked package.
|
|
21
|
+
|
|
22
|
+
Lifecycle state is local under .process/runs and completion creates one bounded receipt
|
|
23
|
+
under .process/receipts. Both paths are ignored by Git. Verification evidence is bound
|
|
24
|
+
to HEAD plus a fingerprint of tracked and non-ignored untracked files. Any relevant
|
|
25
|
+
mutation invalidates it.
|
|
26
|
+
|
|
27
|
+
Independent review is one direct rule: neither the reviewer actor nor reviewer context
|
|
28
|
+
may have implemented the current cycle. There is no attestation hierarchy,
|
|
29
|
+
recommendation chain, authority-transition protocol, remote-evidence federation, or
|
|
30
|
+
second handwritten validator.
|
|
31
|
+
|
|
32
|
+
## Consumer configuration
|
|
33
|
+
|
|
34
|
+
Python 3.11 or newer and Git are required. A consumer owns .process/project.json:
|
|
35
|
+
|
|
36
|
+
{
|
|
37
|
+
"schemaVersion": 5,
|
|
38
|
+
"project": "my-project",
|
|
39
|
+
"lifecycle": {
|
|
40
|
+
"requiredProfiles": ["development", "review"]
|
|
41
|
+
},
|
|
42
|
+
"setup": [
|
|
43
|
+
{
|
|
44
|
+
"id": "prepare-project-tool",
|
|
45
|
+
"run": ["npm", "rebuild", "native-tool"],
|
|
46
|
+
"timeoutSeconds": 300
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"profiles": {
|
|
50
|
+
"development": [
|
|
51
|
+
{
|
|
52
|
+
"id": "tests",
|
|
53
|
+
"run": ["python", "-m", "unittest"],
|
|
54
|
+
"timeoutSeconds": 600
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"review": [
|
|
58
|
+
{
|
|
59
|
+
"id": "package",
|
|
60
|
+
"run": ["python", "-m", "build"],
|
|
61
|
+
"timeoutSeconds": 600
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
Commands are argument arrays, never shell strings. Each command has a finite timeout.
|
|
68
|
+
Output has a hard aggregate budget; evidence stores byte counts and hashes, never raw
|
|
69
|
+
stdout or stderr that could contain secrets.
|
|
70
|
+
|
|
71
|
+
Pin the process in requirements/process.in:
|
|
72
|
+
|
|
73
|
+
--only-binary :all:
|
|
74
|
+
engineering-process==0.9.0
|
|
75
|
+
|
|
76
|
+
Generate requirements/process.txt with hashes, install that lock, then run:
|
|
77
|
+
|
|
78
|
+
processctl adoption apply \
|
|
79
|
+
--project-root . \
|
|
80
|
+
--requirements-lock requirements/process.txt
|
|
81
|
+
|
|
82
|
+
The transaction writes only managed surfaces:
|
|
83
|
+
|
|
84
|
+
- .agents/skills/<distributed-skill>
|
|
85
|
+
- the marked block in .github/PULL_REQUEST_TEMPLATE.md
|
|
86
|
+
- .process/adopt-process.py
|
|
87
|
+
- .process/process.lock
|
|
88
|
+
- the marked engineering-process block in AGENTS.md
|
|
89
|
+
- a schema migration of .process/project.json
|
|
90
|
+
|
|
91
|
+
It removes obsolete skills named by the previous process lock and preserves
|
|
92
|
+
consumer-owned skills and instructions. Applying the same version twice is a no-op.
|
|
93
|
+
The legacy managed runner can enter 1.0 directly, so consumers do not need a chain of
|
|
94
|
+
per-version migration documents. The same transaction deletes the retired migration
|
|
95
|
+
directory and standing automation policy; the Windows Job Object helper remains a
|
|
96
|
+
managed runtime-containment asset.
|
|
97
|
+
|
|
98
|
+
The three authored lifecycle documents stay intentionally small. A change contains
|
|
99
|
+
source, scope, outcomes, and profiles; a plan binds its digest; a review binds the
|
|
100
|
+
assigned checkpoint:
|
|
101
|
+
|
|
102
|
+
{
|
|
103
|
+
"schemaVersion": 5,
|
|
104
|
+
"id": "change-123",
|
|
105
|
+
"summary": "Deliver the accepted behavior",
|
|
106
|
+
"source": "issue-123",
|
|
107
|
+
"comparisonBase": "main",
|
|
108
|
+
"risk": "medium",
|
|
109
|
+
"affectedProjects": ["my-project"],
|
|
110
|
+
"acceptanceCriteria": [
|
|
111
|
+
{"id": "works", "outcome": "The observable behavior works"}
|
|
112
|
+
],
|
|
113
|
+
"requiredProfiles": ["development", "review"]
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
{
|
|
117
|
+
"schemaVersion": 4,
|
|
118
|
+
"changeId": "change-123",
|
|
119
|
+
"contractDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
|
|
120
|
+
"approach": "Implement through the existing owner.",
|
|
121
|
+
"workItems": [
|
|
122
|
+
{
|
|
123
|
+
"id": "implementation",
|
|
124
|
+
"outcome": "Deliver and prove the behavior",
|
|
125
|
+
"affectedPaths": ["src/", "tests/"]
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
"risks": []
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
{
|
|
132
|
+
"schemaVersion": 5,
|
|
133
|
+
"changeId": "change-123",
|
|
134
|
+
"reviewer": {
|
|
135
|
+
"actorId": "review-agent",
|
|
136
|
+
"contextId": "review-123",
|
|
137
|
+
"kind": "agent"
|
|
138
|
+
},
|
|
139
|
+
"checkpoint": {
|
|
140
|
+
"head": "0000000000000000000000000000000000000000",
|
|
141
|
+
"fingerprint": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
|
|
142
|
+
"fileCount": 1,
|
|
143
|
+
"byteCount": 1
|
|
144
|
+
},
|
|
145
|
+
"verdict": "approved",
|
|
146
|
+
"summary": "Accepted outcomes and evidence are complete.",
|
|
147
|
+
"findings": []
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
## Running a change
|
|
151
|
+
|
|
152
|
+
Create and validate a change contract, then register it:
|
|
153
|
+
|
|
154
|
+
processctl contract validate --kind change change.json
|
|
155
|
+
processctl change start \
|
|
156
|
+
--actor implementation-agent \
|
|
157
|
+
--context change-123 \
|
|
158
|
+
--contract change.json
|
|
159
|
+
|
|
160
|
+
Register a plan bound to the returned contract digest:
|
|
161
|
+
|
|
162
|
+
processctl change plan \
|
|
163
|
+
--change-id change-123 \
|
|
164
|
+
--actor implementation-agent \
|
|
165
|
+
--context change-123 \
|
|
166
|
+
--plan plan.json
|
|
167
|
+
|
|
168
|
+
Register implementation and run every required profile:
|
|
169
|
+
|
|
170
|
+
processctl change implement \
|
|
171
|
+
--change-id change-123 \
|
|
172
|
+
--actor implementation-agent \
|
|
173
|
+
--context change-123
|
|
174
|
+
processctl change verify --change-id change-123 --profile development
|
|
175
|
+
processctl change verify --change-id change-123 --profile review
|
|
176
|
+
|
|
177
|
+
Assign an independent reviewer and submit its report:
|
|
178
|
+
|
|
179
|
+
processctl change review start \
|
|
180
|
+
--change-id change-123 \
|
|
181
|
+
--actor review-agent \
|
|
182
|
+
--context review-123
|
|
183
|
+
|
|
184
|
+
Write the report at the returned reportPath (under .process/runs, so it does not
|
|
185
|
+
change the reviewed snapshot), then submit it:
|
|
186
|
+
|
|
187
|
+
processctl change review submit \
|
|
188
|
+
--change-id change-123 \
|
|
189
|
+
--review .process/runs/change-123/review-1.json
|
|
190
|
+
|
|
191
|
+
changes-requested returns to implementation and increments the cycle. The first
|
|
192
|
+
review is bounded by the frozen acceptance criteria. The same reviewer
|
|
193
|
+
checks correction diffs; new blockers are admitted only for remediation regressions
|
|
194
|
+
or a reasoned P0/P1 miss inside the original contract. A third changes-requested
|
|
195
|
+
review blocks the change after two correction cycles—it never waives review.
|
|
196
|
+
|
|
197
|
+
approved can finish only while the repository still matches the reviewed snapshot:
|
|
198
|
+
|
|
199
|
+
processctl change finish \
|
|
200
|
+
--change-id change-123 \
|
|
201
|
+
--actor coordinator \
|
|
202
|
+
--context finish-123
|
|
203
|
+
|
|
204
|
+
At any point:
|
|
205
|
+
|
|
206
|
+
processctl change status --change-id change-123 --json
|
|
207
|
+
|
|
208
|
+
## Release to consumer PR
|
|
209
|
+
|
|
210
|
+
Every opted-in consumer uses Renovate's pip-compile manager. Its engineering-process
|
|
211
|
+
package rule is enabled, never automerges, and runs exactly:
|
|
212
|
+
|
|
213
|
+
python .process/adopt-process.py --project-root . --requirements-lock requirements/process.txt
|
|
214
|
+
|
|
215
|
+
postUpgradeTasks.fileFilters includes the managed paths, so Renovate commits the new
|
|
216
|
+
hash lock and the fully materialized process in the same pull request. A self-hosted
|
|
217
|
+
Renovate administrator must allow only this anchored command and must keep shell
|
|
218
|
+
execution disabled:
|
|
219
|
+
|
|
220
|
+
^python \.process/adopt-process\.py --project-root \. --requirements-lock requirements/process\.txt$
|
|
221
|
+
|
|
222
|
+
The release workflow publishes exact wheel and sdist bytes to PyPI, verifies their
|
|
223
|
+
registry hashes, creates the immutable GitHub release, and sends one authenticated
|
|
224
|
+
engineering-process-published event to renovate-ops. That control plane runs Renovate
|
|
225
|
+
for each repository whose protected config explicitly opts in. Each consumer's normal
|
|
226
|
+
CI and independent review decide whether its PR can merge.
|
|
227
|
+
|
|
228
|
+
This repository opts in through .github/renovate.json, so it receives the same
|
|
229
|
+
adoption PR as every other consumer. See SELF_HOSTING.md and RELEASING.md.
|
|
230
|
+
|
|
231
|
+
## Compatibility
|
|
232
|
+
|
|
233
|
+
Version 1.x retains a few small pre-1.0 command shapes so existing consumers can
|
|
234
|
+
pass their first adoption PR:
|
|
235
|
+
|
|
236
|
+
- setup runs only the consumer-owned setup arrays migrated from its old manifest;
|
|
237
|
+
- doctor --profile validates the selected profile.
|
|
238
|
+
- publication validate-branch, validate-commit, validate-range, and validate-pr remain
|
|
239
|
+
read-only while consumers move those conventions into their own repositories.
|
|
240
|
+
|
|
241
|
+
They do not restore the removed governance machinery and can be deleted in the next
|
|
242
|
+
package major after all known consumers have adopted 1.x.
|
|
243
|
+
|
|
244
|
+
## Development
|
|
245
|
+
|
|
246
|
+
python -m pip install \
|
|
247
|
+
-r engineering_process/requirements-runtime.txt \
|
|
248
|
+
-r engineering_process/requirements-dev.txt \
|
|
249
|
+
-r engineering_process/requirements-build.txt
|
|
250
|
+
python verification/run_test_suite.py
|
|
251
|
+
python processctl.py skills validate --root process_assets/skills
|
|
252
|
+
python verification/verify_distribution.py
|
|
253
|
+
|
|
254
|
+
The process repository requires a real consumer incident or request in every process
|
|
255
|
+
change contract. PROCESS_IMPROVEMENT.md explains that brake.
|