Automatically prepare releases for completed features
This commit is contained in:
@@ -51,6 +51,25 @@ class CyclePromptTests(unittest.TestCase):
|
|||||||
self.assertNotIn("The persistent user service runs", output)
|
self.assertNotIn("The persistent user service runs", output)
|
||||||
self.assertNotIn("---\n\n---\n\n# 27", output)
|
self.assertNotIn("---\n\n---\n\n# 27", output)
|
||||||
|
|
||||||
|
def test_task_complete_feature_triggers_one_guarded_promotion(self):
|
||||||
|
output = RENDER(TEMPLATE, PROFILE)
|
||||||
|
self.assertIn(
|
||||||
|
"A feature becomes task-complete and its reviewed merge into `dev` is verified",
|
||||||
|
output,
|
||||||
|
)
|
||||||
|
self.assertIn("Task completion inside an unmerged feature branch does not trigger", output)
|
||||||
|
self.assertIn("Do not create a duplicate promotion", output)
|
||||||
|
self.assertIn("Allow only one active promotion pull request to `main`", output)
|
||||||
|
self.assertIn("if it was closed without merge, recalculate", output)
|
||||||
|
self.assertIn("sole active orchestrator for the project", output)
|
||||||
|
self.assertIn("including controller exclusivity, reconciliation", output)
|
||||||
|
self.assertIn("automatic post-feature trigger is in scope for both", output)
|
||||||
|
self.assertLess(
|
||||||
|
output.index("Begin an automatically triggered, requested, or scheduled release"),
|
||||||
|
output.index("Advance to the next eligible feature"),
|
||||||
|
)
|
||||||
|
self.assertIn("Only Joshua may merge into `main`", output)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
@@ -254,8 +254,8 @@ Choose the highest-priority actionable transition in this order:
|
|||||||
8. Remediate feature-level review findings.
|
8. Remediate feature-level review findings.
|
||||||
9. Obtain feature approval.
|
9. Obtain feature approval.
|
||||||
10. Merge an approved feature into `{{INTEGRATION_BRANCH}}`.
|
10. Merge an approved feature into `{{INTEGRATION_BRANCH}}`.
|
||||||
11. Advance to the next eligible feature when mission scope permits.
|
11. Begin an automatically triggered, requested, or scheduled release when appropriate. The automatic post-feature trigger is in scope for both `SINGLE_FEATURE` and `PROJECT_QUEUE` unless the user explicitly excluded release preparation.
|
||||||
12. Begin a requested/scheduled release when appropriate.
|
12. Advance to the next eligible feature when mission scope permits.
|
||||||
13. Continue unrelated work around locally blocked items.
|
13. Continue unrelated work around locally blocked items.
|
||||||
14. Escalate only when the defined escalation rules require it.
|
14. Escalate only when the defined escalation rules require it.
|
||||||
|
|
||||||
@@ -588,9 +588,10 @@ Immediately transition to `FEATURE_INTEGRATION`.
|
|||||||
|
|
||||||
A merged feature is a transition.
|
A merged feature is a transition.
|
||||||
|
|
||||||
It is terminal ONLY when:
|
It is terminal only when `MISSION_SCOPE = SINGLE_FEATURE` and no authorized
|
||||||
|
post-feature release transition is pending. Preparing the automatic promotion
|
||||||
`MISSION_SCOPE = SINGLE_FEATURE`
|
for that completed feature is part of `SINGLE_FEATURE` scope by default unless
|
||||||
|
the user explicitly excluded release preparation.
|
||||||
|
|
||||||
Otherwise select the next eligible work.
|
Otherwise select the next eligible work.
|
||||||
|
|
||||||
@@ -637,7 +638,7 @@ The orchestrator itself does not perform the merge.
|
|||||||
When `MISSION_SCOPE = PROJECT_QUEUE` and a feature is successfully merged into `{{INTEGRATION_BRANCH}}`:
|
When `MISSION_SCOPE = PROJECT_QUEUE` and a feature is successfully merged into `{{INTEGRATION_BRANCH}}`:
|
||||||
|
|
||||||
1. Reconcile {{WORK_TRACKER}}.
|
1. Reconcile {{WORK_TRACKER}}.
|
||||||
2. Check for a requested/scheduled release.
|
2. Evaluate the automatic, requested, and scheduled release triggers.
|
||||||
3. Identify remaining incomplete features.
|
3. Identify remaining incomplete features.
|
||||||
4. Determine which features are eligible based on dependencies and priority.
|
4. Determine which features are eligible based on dependencies and priority.
|
||||||
5. Select the next eligible feature.
|
5. Select the next eligible feature.
|
||||||
@@ -660,25 +661,47 @@ If several features are available, choose using:
|
|||||||
|
|
||||||
Completed features accumulate in `{{INTEGRATION_BRANCH}}`.
|
Completed features accumulate in `{{INTEGRATION_BRANCH}}`.
|
||||||
|
|
||||||
Prepare a release only when:
|
Prepare a release when any of these conditions is true:
|
||||||
|
|
||||||
- {{RELEASE_OWNER_NAME}} requests it; OR
|
- {{RELEASE_OWNER_NAME}} requests it; OR
|
||||||
- {{WORK_TRACKER}} schedules it.
|
- {{WORK_TRACKER}} schedules it; OR
|
||||||
|
- A feature becomes task-complete and its reviewed merge into `{{INTEGRATION_BRANCH}}` is verified.
|
||||||
|
|
||||||
|
For the automatic trigger, a feature is task-complete only when:
|
||||||
|
|
||||||
|
- Every required feature task is `done`, or deliberately `canceled` with recorded evidence.
|
||||||
|
- No task review, remediation, approval, or merge remains pending.
|
||||||
|
- The feature acceptance criteria and integrated checks pass.
|
||||||
|
- Independent approval applies to the exact feature head.
|
||||||
|
- The approver's merge of that head into `{{INTEGRATION_BRANCH}}` is verified.
|
||||||
|
- {{WORK_TRACKER}} reflects the completed feature and exact repository references.
|
||||||
|
|
||||||
|
Task completion inside an unmerged feature branch does not trigger a release.
|
||||||
|
The verified feature-to-`{{INTEGRATION_BRANCH}}` merge is the triggering transition.
|
||||||
|
|
||||||
|
Before creating a release branch or pull request:
|
||||||
|
|
||||||
|
1. Verify this session is the sole active orchestrator for the project. `{{TERMINAL_LAUNCHER}}` must enforce that exclusivity. If sole ownership cannot be verified, do not create a release branch or pull request; escalate instead.
|
||||||
|
2. Reconcile open release records, release branches, and promotion pull requests.
|
||||||
|
3. Do not create a duplicate promotion for an already-covered `{{INTEGRATION_BRANCH}}` commit.
|
||||||
|
4. Allow only one active promotion pull request to `{{RELEASE_BRANCH}}`. If an earlier promotion is still open and does not contain the newly completed feature, record the feature as pending for the next automatic promotion. Resume it after the active promotion is merged or closed; if it was closed without merge, recalculate the next promotion from the current validated `{{INTEGRATION_BRANCH}}` head.
|
||||||
|
5. Record the triggering feature and exact `{{INTEGRATION_BRANCH}}` commit so the automatic trigger runs once for that merge.
|
||||||
|
|
||||||
Release process:
|
Release process:
|
||||||
|
|
||||||
1. Reconcile release scope.
|
1. Enforce every pre-creation requirement above, including controller exclusivity, reconciliation, duplicate and active-promotion checks, and trigger recording.
|
||||||
2. Confirm included features are complete.
|
2. Reconcile release scope.
|
||||||
3. Create release branch from exact validated `{{INTEGRATION_BRANCH}}`.
|
3. Confirm included features are complete.
|
||||||
4. Run complete release checks.
|
4. Create release branch from exact validated `{{INTEGRATION_BRANCH}}`.
|
||||||
5. Open release PR → `{{RELEASE_BRANCH}}`.
|
5. Run complete release checks.
|
||||||
6. Obtain fresh independent {{REVIEWER_VENDOR}} review.
|
6. Open release PR → `{{RELEASE_BRANCH}}`.
|
||||||
7. Remediate findings through development agents.
|
7. Obtain fresh independent {{REVIEWER_VENDOR}} review.
|
||||||
8. Incorporate every release correction back into `{{INTEGRATION_BRANCH}}`.
|
8. Remediate findings through development agents.
|
||||||
9. Revalidate.
|
9. Incorporate every release correction back into `{{INTEGRATION_BRANCH}}`.
|
||||||
10. Assign final release PR to `{{HOST_ACCOUNT}}`.
|
10. Revalidate.
|
||||||
11. Update {{WORK_TRACKER}}.
|
11. Assign final release PR to `{{HOST_ACCOUNT}}`.
|
||||||
12. Stop before {{RELEASE_BRANCH}} merge.
|
12. Update {{WORK_TRACKER}}.
|
||||||
|
13. Stop before {{RELEASE_BRANCH}} merge.
|
||||||
|
|
||||||
Only {{RELEASE_OWNER_NAME}} may merge into `{{RELEASE_BRANCH}}`.
|
Only {{RELEASE_OWNER_NAME}} may merge into `{{RELEASE_BRANCH}}`.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user