From e0f3ce660e2a00f4de9712a9bf7177e95d5c1b83 Mon Sep 17 00:00:00 2001 From: Joshua Date: Wed, 23 Sep 2026 12:13:07 -0400 Subject: [PATCH] Automatically prepare releases for completed features --- orchestration_tests/test_cycle_prompt.py | 11 +++++ templates/ORCHESTRATOR-PROMPT.template.md | 53 ++++++++++++++++------- 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/orchestration_tests/test_cycle_prompt.py b/orchestration_tests/test_cycle_prompt.py index 2e26afc..35574c4 100644 --- a/orchestration_tests/test_cycle_prompt.py +++ b/orchestration_tests/test_cycle_prompt.py @@ -51,6 +51,17 @@ class CyclePromptTests(unittest.TestCase): self.assertNotIn("The persistent user service runs", 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("Only Joshua may merge into `main`", output) + if __name__ == "__main__": unittest.main() diff --git a/templates/ORCHESTRATOR-PROMPT.template.md b/templates/ORCHESTRATOR-PROMPT.template.md index f17e098..5c26e79 100644 --- a/templates/ORCHESTRATOR-PROMPT.template.md +++ b/templates/ORCHESTRATOR-PROMPT.template.md @@ -255,7 +255,7 @@ Choose the highest-priority actionable transition in this order: 9. Obtain feature approval. 10. Merge an approved feature into `{{INTEGRATION_BRANCH}}`. 11. Advance to the next eligible feature when mission scope permits. -12. Begin a requested/scheduled release when appropriate. +12. Begin an automatically triggered, requested, or scheduled release when appropriate. 13. Continue unrelated work around locally blocked items. 14. Escalate only when the defined escalation rules require it. @@ -637,7 +637,7 @@ The orchestrator itself does not perform the merge. When `MISSION_SCOPE = PROJECT_QUEUE` and a feature is successfully merged into `{{INTEGRATION_BRANCH}}`: 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. 4. Determine which features are eligible based on dependencies and priority. 5. Select the next eligible feature. @@ -660,25 +660,46 @@ If several features are available, choose using: 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 -- {{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. Reconcile open release records, release branches, and promotion pull requests. +2. Do not create a duplicate promotion for an already-covered `{{INTEGRATION_BRANCH}}` commit. +3. 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 and resume it after the active promotion resolves. +4. Record the triggering feature and exact `{{INTEGRATION_BRANCH}}` commit so the automatic trigger runs once for that merge. Release process: -1. Reconcile release scope. -2. Confirm included features are complete. -3. Create release branch from exact validated `{{INTEGRATION_BRANCH}}`. -4. Run complete release checks. -5. Open release PR → `{{RELEASE_BRANCH}}`. -6. Obtain fresh independent {{REVIEWER_VENDOR}} review. -7. Remediate findings through development agents. -8. Incorporate every release correction back into `{{INTEGRATION_BRANCH}}`. -9. Revalidate. -10. Assign final release PR to `{{HOST_ACCOUNT}}`. -11. Update {{WORK_TRACKER}}. -12. Stop before {{RELEASE_BRANCH}} merge. +1. Enforce the active-promotion and duplicate checks above. +2. Reconcile release scope. +3. Confirm included features are complete. +4. Create release branch from exact validated `{{INTEGRATION_BRANCH}}`. +5. Run complete release checks. +6. Open release PR → `{{RELEASE_BRANCH}}`. +7. Obtain fresh independent {{REVIEWER_VENDOR}} review. +8. Remediate findings through development agents. +9. Incorporate every release correction back into `{{INTEGRATION_BRANCH}}`. +10. Revalidate. +11. Assign final release PR to `{{HOST_ACCOUNT}}`. +12. Update {{WORK_TRACKER}}. +13. Stop before {{RELEASE_BRANCH}} merge. Only {{RELEASE_OWNER_NAME}} may merge into `{{RELEASE_BRANCH}}`.