engineering-process 0.6.1__tar.gz → 0.7.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.6.1/engineering_process.egg-info → engineering_process-0.7.0}/PKG-INFO +53 -8
- {engineering_process-0.6.1 → engineering_process-0.7.0}/PRODUCTION_STANDARD.md +28 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/README.md +52 -7
- {engineering_process-0.6.1 → engineering_process-0.7.0}/VERSIONING.md +26 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/__init__.py +1 -1
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/cli.py +120 -1
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/command_catalog.py +3 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/contracts.py +388 -6
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/distribution_verify.py +4 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/evidence.py +324 -2
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/lifecycle.py +733 -24
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/process_graph.py +18 -3
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/release_candidate.py +193 -3
- {engineering_process-0.6.1 → engineering_process-0.7.0/engineering_process.egg-info}/PKG-INFO +53 -8
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process.egg-info/SOURCES.txt +4 -0
- engineering_process-0.7.0/examples/plan-decision-review-assignment.json +45 -0
- engineering_process-0.7.0/examples/plan-decision-review.json +26 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/plan.json +14 -2
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/project.json +15 -1
- {engineering_process-0.6.1 → engineering_process-0.7.0}/improvement-catalog.json +16 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process-graph.json +18 -3
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/assess-design/SKILL.md +3 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/implement-change/SKILL.md +10 -2
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/plan-change/SKILL.md +15 -3
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/run-change/SKILL.md +5 -2
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/run-change/references/execution.md +39 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/pyproject.toml +5 -1
- engineering_process-0.7.0/release.json +50 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/evidence-receipt.schema.json +48 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/lifecycle.schema.json +27 -0
- engineering_process-0.7.0/schemas/plan-decision-review-assignment.schema.json +99 -0
- engineering_process-0.7.0/schemas/plan-decision-review.schema.json +81 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/plan.schema.json +88 -3
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/project.schema.json +42 -3
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_contracts.py +62 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_lifecycle.py +747 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_release_candidate.py +244 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_schemas.py +2 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_skills.py +24 -0
- engineering_process-0.6.1/release.json +0 -46
- {engineering_process-0.6.1 → engineering_process-0.7.0}/LICENSE +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/MANIFEST.in +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/PROCESS_IMPROVEMENT.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/bundles.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/__main__.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/_download_worker.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/_supervisor_posix.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/_supervisor_windows.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/_windows_job.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/adoption.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/artifact_attestation.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/bootstrap.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/bounded_process.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/bundles.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/diagnostics.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/distribution.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/environment.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/evidence_transport.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/git.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/git_attributes.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/helper_launch.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/impact.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/improvement.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/lifecycle_routes.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/managed.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/markdown.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/publication.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/recommendation.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/release.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/remote_verification.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/requirements-build.txt +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/requirements-dev.txt +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/requirements-release.txt +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/requirements-runtime.txt +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/runner.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/runtime.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/skills.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/supervision.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/supplemental.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/syncing.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process/tooling.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process.egg-info/dependency_links.txt +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process.egg-info/entry_points.txt +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process.egg-info/requires.txt +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/engineering_process.egg-info/top_level.txt +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/adoption-migration.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/automation-policy.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/automation-proposal-policy.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/automation-proposal.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/change.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/improvement-catalog.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/improvement-disposition.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/improvement-reproduction.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/improvement-resolution.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/improvement-signal.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/recommendation-resolution.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/recommendation-review-assignment.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/recommendation-review.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/recommendation.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/release-change.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/release.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/remote-verification-evidence.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/remote-verification-request.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/examples/review.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/build-frontend/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/build-frontend-foundation/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/change-api/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/cross-repo-change/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/define-change-contract/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/design-module/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/evolve-process/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/finish-change/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/govern-ui/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/implement-module/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/implement-use-case/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/integrate-mcp/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/maintain-docs/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/publish-change/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/review-change/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/run-project-command/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/specify-use-case/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/process_assets/skills/verify-change/SKILL.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/adoption-migration.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/automation-policy.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/automation-proposal-policy.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/automation-proposal.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/change.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/improvement-catalog.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/improvement-disposition.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/improvement-reproduction.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/improvement-resolution.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/improvement-signal.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/process-graph.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/process-lock.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/recommendation-resolution.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/recommendation-review-assignment.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/recommendation-review.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/recommendation.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/release-change.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/release.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/remote-verification-evidence.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/remote-verification-request.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/review.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/reviewer-attestation.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/supplemental-verification.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/schemas/verification.schema.json +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/setup.cfg +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/templates/AGENTS.process.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/templates/PULL_REQUEST_TEMPLATE.md +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/templates/adopt-process-windows-job.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/templates/adopt-process.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_adoption.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_adoption_runner.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_artifact_attestation.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_bootstrap.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_bounded_process.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_bundles.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_cli.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_completed_release_dispatch.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_completion_evidence_transport.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_diagnostics.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_distribution.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_distribution_verify.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_environment.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_evals.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_impact.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_improvement.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_process_graph.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_process_install.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_publication.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_publish_event.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_pypi_publication.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_recommendation.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_release.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_release_candidate_boundary.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_release_completion_identity.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_release_evidence_restore.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_release_evidence_selection.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_release_preparation.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_release_qualification.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_remote_verification.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_remote_verification_adapter.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_runner.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_runtime.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_self_hosting.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_source_checkout.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_supervision.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_supplemental.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_syncing.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_test_suite.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_tooling.py +0 -0
- {engineering_process-0.6.1 → engineering_process-0.7.0}/tests/test_windows_job.py +0 -0
{engineering_process-0.6.1/engineering_process.egg-info → engineering_process-0.7.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: engineering-process
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.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
|
|
@@ -536,6 +536,48 @@ resolution records a selected valid option but grants no lifecycle completion, m
|
|
|
536
536
|
release, deployment, or adoption authority. Those owning gates remain separate. The
|
|
537
537
|
accepted decision is recorded before dependent work resumes.
|
|
538
538
|
|
|
539
|
+
Projects may separately adopt the `provenance-gated-authored-review` lifecycle policy.
|
|
540
|
+
Under that policy, every new nontrivial authored plan uses schema 3 and is assessed
|
|
541
|
+
before implementation by a genuinely fresh read-only reviewer. The assessment covers
|
|
542
|
+
architecture, authority, compatibility, external mutation, lifecycle order, owner,
|
|
543
|
+
rollout, scope, and trust boundary for the exact contract, plan, clean source,
|
|
544
|
+
authority, policy, author, and reviewer context. A clear assessment permits
|
|
545
|
+
implementation. A decision-required assessment must complete the existing reviewed
|
|
546
|
+
recommendation and owner-resolution chain, with a dedicated invariant binding the
|
|
547
|
+
exact assessment digest:
|
|
548
|
+
|
|
549
|
+
~~~text
|
|
550
|
+
processctl change decision start --project-root . --change-id issue-123 \
|
|
551
|
+
--actor <reviewer> --context <fresh-context> --actor-kind agent \
|
|
552
|
+
--method isolated-context --attested-by <host> \
|
|
553
|
+
--attestation-evidence <bounded-attestation>
|
|
554
|
+
processctl contract validate --kind plan-decision-review \
|
|
555
|
+
plan-decision-review.json
|
|
556
|
+
processctl change decision submit --project-root . --change-id issue-123 \
|
|
557
|
+
--review plan-decision-review.json
|
|
558
|
+
processctl change decision resolve --project-root . --change-id issue-123 \
|
|
559
|
+
--actor <coordinator> --context <coordinator-context> --actor-kind agent \
|
|
560
|
+
--recommendation recommendation.json \
|
|
561
|
+
--assignment recommendation-review-assignment.json \
|
|
562
|
+
--recommendation-review recommendation-review.json \
|
|
563
|
+
--resolution recommendation-resolution.json
|
|
564
|
+
processctl change implement --project-root . --change-id issue-123 \
|
|
565
|
+
--actor <worker> --context <worker-context> --actor-kind agent
|
|
566
|
+
~~~
|
|
567
|
+
|
|
568
|
+
The resolve command is used only for `decision-required`; a clear assessment goes
|
|
569
|
+
directly to `change implement`. Unreviewed prose, risk tiers, heuristics, author
|
|
570
|
+
self-classification, and generator labels are candidate-only and grant no authority.
|
|
571
|
+
A generated bypass is valid only for a core-registered generator whose complete plan
|
|
572
|
+
is exactly recomputed from bounded source-owned inputs and the immutable installed
|
|
573
|
+
authority. Exact generated plans are not universally sent to semantic review. Core
|
|
574
|
+
requires no daemon, scheduler, service, webhook receiver, hosted reviewer platform,
|
|
575
|
+
vendor, model, or proprietary agent API.
|
|
576
|
+
Every later implementation cycle after a finding or clean post-verification source
|
|
577
|
+
drift repeats the assessment with a newly reserved reviewer context bound to the new
|
|
578
|
+
source checkpoint. Earlier assignment, assessment, and owner-decision artifacts stay
|
|
579
|
+
historical and cannot authorize the new cycle.
|
|
580
|
+
|
|
539
581
|
When a schema-3 change selects a project-owned `requiredEvidence` id, local profiles
|
|
540
582
|
alone do not advance it to review. Create the exact no-authority request, run the
|
|
541
583
|
project adapter, and ingest the complete supplemental set first:
|
|
@@ -791,9 +833,10 @@ fingerprint, source tree, or publication range.
|
|
|
791
833
|
exclusively by their hash-locked `requirements/process.txt`. The action invokes the
|
|
792
834
|
producer-owned installer from its immutable action checkout and never downloads or
|
|
793
835
|
executes helper source from the consumer branch.
|
|
794
|
-
- Versioned JSON schemas define change, plan
|
|
795
|
-
|
|
796
|
-
|
|
836
|
+
- Versioned JSON schemas define change, plan provenance, plan-decision assignment and
|
|
837
|
+
review, verification, review, recommendation, independent recommendation assignment
|
|
838
|
+
and challenge, owner resolution, lifecycle, completion-related artifacts,
|
|
839
|
+
release-change fragments, and the release
|
|
797
840
|
classification contract. The generated Release PR gate binds that contract to the
|
|
798
841
|
exact SemVer increment, package version, latest reachable prior tag, reviewed head,
|
|
799
842
|
identical merge tree, immutable checkpoint, and main ancestry.
|
|
@@ -806,10 +849,12 @@ fingerprint, source tree, or publication range.
|
|
|
806
849
|
readable under their released semantics. GitHub's artifact id and digest complete
|
|
807
850
|
the immutable remote reference; this supplements rather than replaces N-1
|
|
808
851
|
lifecycle evidence.
|
|
809
|
-
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
852
|
+
- Projects without plan-decision opt-in continue using bounded plan schema 2. An
|
|
853
|
+
opted-in project uses plan schema 3 provenance and the pre-implementation gate.
|
|
854
|
+
Selective-impact consumers may add optional capabilities on project schema 3,
|
|
855
|
+
while new integrations use bounded project schema 4. Plan schemas 1 and 2 and the
|
|
856
|
+
pre-existing fields of project schemas 1-3 retain their published validation
|
|
857
|
+
behavior instead of being tightened in place.
|
|
813
858
|
- `release.json` is the single release-identity owner. Governed GitHub tag and title
|
|
814
859
|
are both exactly `v<SemVer>`; package metadata, runtime version, artifact names,
|
|
815
860
|
authorization evidence, and later consumer locks must match it. Public-impact PRs
|
|
@@ -115,6 +115,34 @@ evidence boundaries as completion-blocking.
|
|
|
115
115
|
|
|
116
116
|
## Recommendation validity
|
|
117
117
|
|
|
118
|
+
An opted-in project gates implementation through plan provenance. Every nontrivial
|
|
119
|
+
authored plan receives a fresh read-only semantic assessment for architecture,
|
|
120
|
+
authority, compatibility, external mutation, lifecycle order, owner, rollout, scope,
|
|
121
|
+
and trust boundary. The assignment binds the exact contract, plan, clean source,
|
|
122
|
+
authority, project policy, author, reviewer context, and canonical category set. A
|
|
123
|
+
clear assessment may authorize implementation; a decision-required assessment must
|
|
124
|
+
bind the existing independently reviewed recommendation and explicit owner resolution
|
|
125
|
+
for that exact assessment. Drift in any binding fails closed.
|
|
126
|
+
Each later implementation cycle after a finding or clean post-verification source
|
|
127
|
+
drift requires a newly reserved context and assessment bound to that cycle's source;
|
|
128
|
+
cycle-1 evidence cannot be relabeled or reused.
|
|
129
|
+
|
|
130
|
+
A process-generated plan bypass is accepted only when the immutable installed core
|
|
131
|
+
recognizes its generator and exactly recomputes the complete plan from bounded
|
|
132
|
+
validated source-owned inputs. Generator labels, risk labels, author
|
|
133
|
+
self-classification, heuristic prose scanning, and partial comparison are not
|
|
134
|
+
provenance. Exact generated plans are not universally sent to semantic review, and
|
|
135
|
+
portable core does not introduce a daemon, scheduler, webhook, hosted reviewer
|
|
136
|
+
platform, vendor, model, or proprietary agent API. Unreviewed prose remains
|
|
137
|
+
candidate-only and grants no decision or lifecycle authority.
|
|
138
|
+
|
|
139
|
+
The three possible review boundaries never review one another. Plan-decision review
|
|
140
|
+
assesses the authored plan; recommendation review challenges only the recommendation
|
|
141
|
+
and its digest binding; final lifecycle review assesses implemented source and current
|
|
142
|
+
evidence. Reviewer-of-reviewer, meta-assessment, assessment-of-assessment,
|
|
143
|
+
policy-for-policy, dynamically generated approval chains, and generic workflow
|
|
144
|
+
engines are outside the portable contract.
|
|
145
|
+
|
|
118
146
|
A material owner decision derives recommendation eligibility before optimization.
|
|
119
147
|
Every option assesses every governing hard invariant and references only proven or
|
|
120
148
|
explicitly unproven assumptions. Any violated invariant makes the option invalid; any
|
|
@@ -501,6 +501,48 @@ resolution records a selected valid option but grants no lifecycle completion, m
|
|
|
501
501
|
release, deployment, or adoption authority. Those owning gates remain separate. The
|
|
502
502
|
accepted decision is recorded before dependent work resumes.
|
|
503
503
|
|
|
504
|
+
Projects may separately adopt the `provenance-gated-authored-review` lifecycle policy.
|
|
505
|
+
Under that policy, every new nontrivial authored plan uses schema 3 and is assessed
|
|
506
|
+
before implementation by a genuinely fresh read-only reviewer. The assessment covers
|
|
507
|
+
architecture, authority, compatibility, external mutation, lifecycle order, owner,
|
|
508
|
+
rollout, scope, and trust boundary for the exact contract, plan, clean source,
|
|
509
|
+
authority, policy, author, and reviewer context. A clear assessment permits
|
|
510
|
+
implementation. A decision-required assessment must complete the existing reviewed
|
|
511
|
+
recommendation and owner-resolution chain, with a dedicated invariant binding the
|
|
512
|
+
exact assessment digest:
|
|
513
|
+
|
|
514
|
+
~~~text
|
|
515
|
+
processctl change decision start --project-root . --change-id issue-123 \
|
|
516
|
+
--actor <reviewer> --context <fresh-context> --actor-kind agent \
|
|
517
|
+
--method isolated-context --attested-by <host> \
|
|
518
|
+
--attestation-evidence <bounded-attestation>
|
|
519
|
+
processctl contract validate --kind plan-decision-review \
|
|
520
|
+
plan-decision-review.json
|
|
521
|
+
processctl change decision submit --project-root . --change-id issue-123 \
|
|
522
|
+
--review plan-decision-review.json
|
|
523
|
+
processctl change decision resolve --project-root . --change-id issue-123 \
|
|
524
|
+
--actor <coordinator> --context <coordinator-context> --actor-kind agent \
|
|
525
|
+
--recommendation recommendation.json \
|
|
526
|
+
--assignment recommendation-review-assignment.json \
|
|
527
|
+
--recommendation-review recommendation-review.json \
|
|
528
|
+
--resolution recommendation-resolution.json
|
|
529
|
+
processctl change implement --project-root . --change-id issue-123 \
|
|
530
|
+
--actor <worker> --context <worker-context> --actor-kind agent
|
|
531
|
+
~~~
|
|
532
|
+
|
|
533
|
+
The resolve command is used only for `decision-required`; a clear assessment goes
|
|
534
|
+
directly to `change implement`. Unreviewed prose, risk tiers, heuristics, author
|
|
535
|
+
self-classification, and generator labels are candidate-only and grant no authority.
|
|
536
|
+
A generated bypass is valid only for a core-registered generator whose complete plan
|
|
537
|
+
is exactly recomputed from bounded source-owned inputs and the immutable installed
|
|
538
|
+
authority. Exact generated plans are not universally sent to semantic review. Core
|
|
539
|
+
requires no daemon, scheduler, service, webhook receiver, hosted reviewer platform,
|
|
540
|
+
vendor, model, or proprietary agent API.
|
|
541
|
+
Every later implementation cycle after a finding or clean post-verification source
|
|
542
|
+
drift repeats the assessment with a newly reserved reviewer context bound to the new
|
|
543
|
+
source checkpoint. Earlier assignment, assessment, and owner-decision artifacts stay
|
|
544
|
+
historical and cannot authorize the new cycle.
|
|
545
|
+
|
|
504
546
|
When a schema-3 change selects a project-owned `requiredEvidence` id, local profiles
|
|
505
547
|
alone do not advance it to review. Create the exact no-authority request, run the
|
|
506
548
|
project adapter, and ingest the complete supplemental set first:
|
|
@@ -756,9 +798,10 @@ fingerprint, source tree, or publication range.
|
|
|
756
798
|
exclusively by their hash-locked `requirements/process.txt`. The action invokes the
|
|
757
799
|
producer-owned installer from its immutable action checkout and never downloads or
|
|
758
800
|
executes helper source from the consumer branch.
|
|
759
|
-
- Versioned JSON schemas define change, plan
|
|
760
|
-
|
|
761
|
-
|
|
801
|
+
- Versioned JSON schemas define change, plan provenance, plan-decision assignment and
|
|
802
|
+
review, verification, review, recommendation, independent recommendation assignment
|
|
803
|
+
and challenge, owner resolution, lifecycle, completion-related artifacts,
|
|
804
|
+
release-change fragments, and the release
|
|
762
805
|
classification contract. The generated Release PR gate binds that contract to the
|
|
763
806
|
exact SemVer increment, package version, latest reachable prior tag, reviewed head,
|
|
764
807
|
identical merge tree, immutable checkpoint, and main ancestry.
|
|
@@ -771,10 +814,12 @@ fingerprint, source tree, or publication range.
|
|
|
771
814
|
readable under their released semantics. GitHub's artifact id and digest complete
|
|
772
815
|
the immutable remote reference; this supplements rather than replaces N-1
|
|
773
816
|
lifecycle evidence.
|
|
774
|
-
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
817
|
+
- Projects without plan-decision opt-in continue using bounded plan schema 2. An
|
|
818
|
+
opted-in project uses plan schema 3 provenance and the pre-implementation gate.
|
|
819
|
+
Selective-impact consumers may add optional capabilities on project schema 3,
|
|
820
|
+
while new integrations use bounded project schema 4. Plan schemas 1 and 2 and the
|
|
821
|
+
pre-existing fields of project schemas 1-3 retain their published validation
|
|
822
|
+
behavior instead of being tightened in place.
|
|
778
823
|
- `release.json` is the single release-identity owner. Governed GitHub tag and title
|
|
779
824
|
are both exactly `v<SemVer>`; package metadata, runtime version, artifact names,
|
|
780
825
|
authorization evidence, and later consumer locks must match it. Public-impact PRs
|
|
@@ -154,6 +154,32 @@ Completed historical decisions retain their original evidence and require no
|
|
|
154
154
|
backfill. A recommendation resolution is decision evidence only and never substitutes
|
|
155
155
|
for lifecycle completion or delivery authority.
|
|
156
156
|
|
|
157
|
+
## Material-decision implementation gate
|
|
158
|
+
|
|
159
|
+
Plan schema 3 adds explicit `authored` or `process-generated` provenance. The
|
|
160
|
+
plan-decision assignment and review artifacts start at schema 1, while the optional
|
|
161
|
+
project lifecycle policy is additive to project schemas 3 and 4. Released plan
|
|
162
|
+
schemas 1 and 2 retain their historical meaning and remain readable; a project that
|
|
163
|
+
does not adopt the policy retains its released schema-2 planning behavior.
|
|
164
|
+
|
|
165
|
+
Adopting `provenance-gated-authored-review` changes the pre-implementation lifecycle
|
|
166
|
+
semantics and is therefore a breaking package change before 1.0. Every new
|
|
167
|
+
nontrivial authored plan receives a fresh read-only semantic assessment across the
|
|
168
|
+
canonical material categories. A clear assessment permits `change implement`; a
|
|
169
|
+
decision-required assessment remains blocked until the existing independently
|
|
170
|
+
reviewed recommendation and explicit owner-resolution chain bind that exact
|
|
171
|
+
assessment. A process-generated plan bypasses semantic assessment only when the
|
|
172
|
+
installed immutable authority recognizes its generator and exactly recomputes the
|
|
173
|
+
complete plan from validated source-owned inputs. Unknown generators, claimed
|
|
174
|
+
labels, partial comparison, and stale contract, plan, source, authority, policy,
|
|
175
|
+
context, assessment, recommendation, or resolution evidence fail closed.
|
|
176
|
+
|
|
177
|
+
The producer ships the opt-in as a target-version adoption migration. Its current
|
|
178
|
+
N-1 release candidate stays on plan schema 2, then self-adoption activates schema 3
|
|
179
|
+
and exact release-plan recomputation for subsequent releases. No package, runtime,
|
|
180
|
+
tag, artifact, or consumer-lock identity changes in the feature PR; the separate
|
|
181
|
+
generated Release PR derives the pre-1.0 minor version.
|
|
182
|
+
|
|
157
183
|
Remote-verification request and evidence-set schema-1 artifacts, optional project
|
|
158
184
|
requirements, optional change selections, lifecycle references, and receipt content
|
|
159
185
|
are additive serialized surfaces. A project does not gain the gate until a separate
|
|
@@ -28,6 +28,8 @@ from .contracts import (
|
|
|
28
28
|
validate_improvement_resolution,
|
|
29
29
|
validate_improvement_signal,
|
|
30
30
|
validate_plan,
|
|
31
|
+
validate_plan_decision_review,
|
|
32
|
+
validate_plan_decision_review_assignment,
|
|
31
33
|
validate_process_lock,
|
|
32
34
|
validate_project,
|
|
33
35
|
validate_recommendation,
|
|
@@ -79,10 +81,13 @@ from .lifecycle import (
|
|
|
79
81
|
lifecycle_status,
|
|
80
82
|
ingest_remote_verification,
|
|
81
83
|
register_plan,
|
|
84
|
+
resolve_plan_decision,
|
|
82
85
|
request_remote_verification,
|
|
83
86
|
start_change,
|
|
87
|
+
start_plan_decision_review,
|
|
84
88
|
start_review,
|
|
85
89
|
submit_review,
|
|
90
|
+
submit_plan_decision_review,
|
|
86
91
|
verify_change,
|
|
87
92
|
)
|
|
88
93
|
from .runner import run_profile, source_state
|
|
@@ -295,6 +300,8 @@ def command_contract_validate(args: argparse.Namespace) -> int:
|
|
|
295
300
|
"improvement-resolution": validate_improvement_resolution,
|
|
296
301
|
"improvement-signal": validate_improvement_signal,
|
|
297
302
|
"plan": validate_plan,
|
|
303
|
+
"plan-decision-review": validate_plan_decision_review,
|
|
304
|
+
"plan-decision-review-assignment": validate_plan_decision_review_assignment,
|
|
298
305
|
"recommendation": validate_recommendation,
|
|
299
306
|
"recommendation-resolution": validate_recommendation_resolution,
|
|
300
307
|
"recommendation-review": validate_recommendation_review,
|
|
@@ -628,11 +635,80 @@ def command_change_plan(args: argparse.Namespace) -> int:
|
|
|
628
635
|
return 0
|
|
629
636
|
|
|
630
637
|
|
|
638
|
+
def command_change_decision_start(args: argparse.Namespace) -> int:
|
|
639
|
+
project = _lifecycle_project(args)
|
|
640
|
+
state, assignment = start_plan_decision_review(
|
|
641
|
+
args.project_root,
|
|
642
|
+
project,
|
|
643
|
+
args.change_id,
|
|
644
|
+
actor_id=args.actor,
|
|
645
|
+
context_id=args.context,
|
|
646
|
+
kind=args.actor_kind,
|
|
647
|
+
method=args.method,
|
|
648
|
+
attested_by=args.attested_by,
|
|
649
|
+
evidence=args.attestation_evidence,
|
|
650
|
+
)
|
|
651
|
+
_emit(
|
|
652
|
+
args,
|
|
653
|
+
_change_result(
|
|
654
|
+
"change decision start",
|
|
655
|
+
state,
|
|
656
|
+
verdict="pending",
|
|
657
|
+
assignment=state["planDecision"]["assignment"]["path"],
|
|
658
|
+
planSha256=assignment["planSha256"],
|
|
659
|
+
),
|
|
660
|
+
)
|
|
661
|
+
return 0
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
def command_change_decision_submit(args: argparse.Namespace) -> int:
|
|
665
|
+
project = _lifecycle_project(args)
|
|
666
|
+
state, review = submit_plan_decision_review(
|
|
667
|
+
args.project_root, project, args.change_id, args.review
|
|
668
|
+
)
|
|
669
|
+
_emit(
|
|
670
|
+
args,
|
|
671
|
+
_change_result(
|
|
672
|
+
"change decision submit",
|
|
673
|
+
state,
|
|
674
|
+
verdict=review["verdict"],
|
|
675
|
+
review=state["planDecision"]["review"]["path"],
|
|
676
|
+
),
|
|
677
|
+
)
|
|
678
|
+
return 0
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
def command_change_decision_resolve(args: argparse.Namespace) -> int:
|
|
682
|
+
project = _lifecycle_project(args)
|
|
683
|
+
state = resolve_plan_decision(
|
|
684
|
+
args.project_root,
|
|
685
|
+
project,
|
|
686
|
+
args.change_id,
|
|
687
|
+
recommendation_path=args.recommendation,
|
|
688
|
+
assignment_path=args.assignment,
|
|
689
|
+
review_path=args.recommendation_review,
|
|
690
|
+
resolution_path=args.resolution,
|
|
691
|
+
actor_id=args.actor,
|
|
692
|
+
context_id=args.context,
|
|
693
|
+
kind=args.actor_kind,
|
|
694
|
+
)
|
|
695
|
+
_emit(
|
|
696
|
+
args,
|
|
697
|
+
_change_result(
|
|
698
|
+
"change decision resolve",
|
|
699
|
+
state,
|
|
700
|
+
resolution=state["planDecision"]["resolution"]["path"],
|
|
701
|
+
),
|
|
702
|
+
)
|
|
703
|
+
return 0
|
|
704
|
+
|
|
705
|
+
|
|
631
706
|
def command_change_implement(args: argparse.Namespace) -> int:
|
|
632
|
-
_lifecycle_project(args)
|
|
707
|
+
project = _lifecycle_project(args)
|
|
633
708
|
state = begin_implementation(
|
|
634
709
|
args.project_root,
|
|
635
710
|
args.change_id,
|
|
711
|
+
project=project,
|
|
636
712
|
actor_id=args.actor,
|
|
637
713
|
context_id=args.context,
|
|
638
714
|
kind=args.actor_kind,
|
|
@@ -1597,6 +1673,8 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1597
1673
|
"improvement-resolution",
|
|
1598
1674
|
"improvement-signal",
|
|
1599
1675
|
"plan",
|
|
1676
|
+
"plan-decision-review",
|
|
1677
|
+
"plan-decision-review-assignment",
|
|
1600
1678
|
"recommendation",
|
|
1601
1679
|
"recommendation-resolution",
|
|
1602
1680
|
"recommendation-review",
|
|
@@ -2361,6 +2439,47 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
2361
2439
|
change_plan.add_argument("--plan", type=Path, required=True)
|
|
2362
2440
|
change_plan.set_defaults(handler=command_change_plan)
|
|
2363
2441
|
|
|
2442
|
+
change_decision = change_commands.add_parser(
|
|
2443
|
+
"decision", help="Assess material decisions in an authored plan"
|
|
2444
|
+
)
|
|
2445
|
+
decision_commands = change_decision.add_subparsers(
|
|
2446
|
+
dest="change_decision_command", required=True
|
|
2447
|
+
)
|
|
2448
|
+
decision_start = decision_commands.add_parser(
|
|
2449
|
+
"start", help="Reserve a fresh reviewer and create the plan assessment assignment"
|
|
2450
|
+
)
|
|
2451
|
+
_add_lifecycle_common(decision_start)
|
|
2452
|
+
_add_actor(decision_start)
|
|
2453
|
+
decision_start.add_argument("--change-id", required=True)
|
|
2454
|
+
decision_start.add_argument(
|
|
2455
|
+
"--method", choices=("isolated-context", "separate-person"), required=True
|
|
2456
|
+
)
|
|
2457
|
+
decision_start.add_argument("--attested-by", required=True)
|
|
2458
|
+
decision_start.add_argument("--attestation-evidence", required=True)
|
|
2459
|
+
decision_start.set_defaults(handler=command_change_decision_start)
|
|
2460
|
+
|
|
2461
|
+
decision_submit = decision_commands.add_parser(
|
|
2462
|
+
"submit", help="Validate and register the fresh material-decision assessment"
|
|
2463
|
+
)
|
|
2464
|
+
_add_lifecycle_common(decision_submit)
|
|
2465
|
+
decision_submit.add_argument("--change-id", required=True)
|
|
2466
|
+
decision_submit.add_argument("--review", type=Path, required=True)
|
|
2467
|
+
decision_submit.set_defaults(handler=command_change_decision_submit)
|
|
2468
|
+
|
|
2469
|
+
decision_resolve = decision_commands.add_parser(
|
|
2470
|
+
"resolve", help="Bind an approved recommendation and owner resolution"
|
|
2471
|
+
)
|
|
2472
|
+
_add_lifecycle_common(decision_resolve)
|
|
2473
|
+
_add_actor(decision_resolve)
|
|
2474
|
+
decision_resolve.add_argument("--change-id", required=True)
|
|
2475
|
+
decision_resolve.add_argument("--recommendation", type=Path, required=True)
|
|
2476
|
+
decision_resolve.add_argument("--assignment", type=Path, required=True)
|
|
2477
|
+
decision_resolve.add_argument(
|
|
2478
|
+
"--recommendation-review", type=Path, required=True
|
|
2479
|
+
)
|
|
2480
|
+
decision_resolve.add_argument("--resolution", type=Path, required=True)
|
|
2481
|
+
decision_resolve.set_defaults(handler=command_change_decision_resolve)
|
|
2482
|
+
|
|
2364
2483
|
change_implement = change_commands.add_parser(
|
|
2365
2484
|
"implement", help="Register an implementation actor and begin a cycle"
|
|
2366
2485
|
)
|