diff --git a/SKILL.md b/SKILL.md index 56b0d85..ed54fe7 100644 --- a/SKILL.md +++ b/SKILL.md @@ -204,7 +204,7 @@ Architecture derives and maintains implementation-task semantics, dependencies, Architecture owns complete Task decomposition for every Feature allocated to the release. Before reporting a release planning-ready, Architecture must: -1. review existing Tasks and retain, revise, or supersede them according to the current Feature outcomes and Architecture boundaries; +1. Architecture creates missing Tasks, reviews existing Tasks, and retains, revises, supersedes, or removes them according to the current Feature outcomes and Architecture boundaries. Architecture may freely revise or remove only draft Tasks with no implementation approval, Kanban admission, execution, or completion evidence; 2. define at least two independently executable Tasks per Feature unless a recorded Architecture rationale proves that one atomic Task is the smallest verifiable boundary; 3. map the Feature's Tasks collectively to every acceptance outcome and every applicable requirement, with reciprocal canonical traceability; 4. encode within-Feature sequencing and every cross-Feature prerequisite as acyclic Task dependencies; @@ -213,6 +213,8 @@ Architecture owns complete Task decomposition for every Feature allocated to the Architecture must not report planning readiness while any Feature allocated to the release lacks this complete Task breakdown. A Feature-shaped placeholder Task, a generated empty Task group, or requirement coverage without executable Tasks does not satisfy the gate. +Approved, Kanban-admitted, in-progress, or completed Tasks must not be deleted or silently rewritten. Retain an obsolete Task with a terminal Superseded or Cancelled status, its prior evidence and history, and explicit replacement links. A material change to Task scope, outcome, dependency, repository, or component must invalidate prior readiness evidence and return the affected record to the appropriate pre-approval state; renewed human `Approved for Implementation` and a separate exact-task Kanban Focus admission are required where applicable before execution resumes. + ```text canonical_id | display_id | feature | outcome | scope | dependencies | owner | status | acceptance evidence | affected repository/component ``` diff --git a/tests/test_task_breakdown_policy.py b/tests/test_task_breakdown_policy.py index 703f135..9c93240 100644 --- a/tests/test_task_breakdown_policy.py +++ b/tests/test_task_breakdown_policy.py @@ -11,7 +11,7 @@ class TaskBreakdownPolicyTest(unittest.TestCase): required = [ "Architecture owns complete Task decomposition", "every Feature allocated to the release", - "review existing Tasks", + "reviews existing Tasks", "at least two independently executable Tasks", "every acceptance outcome", "every applicable requirement", @@ -20,6 +20,27 @@ class TaskBreakdownPolicyTest(unittest.TestCase): for marker in required: self.assertIn(marker, self.skill) + def test_task_lifecycle_and_readiness_rules_are_fail_closed(self): + required = [ + "version: 1.7.0", + "repository/component owner", + "future acceptance-evidence requirement", + "within-Feature sequencing", + "cross-Feature prerequisite", + "acyclic Task dependencies", + "creates missing Tasks", + "freely revise or remove only draft Tasks", + "must not be deleted or silently rewritten", + "Superseded or Cancelled", + "replacement links", + "invalidate prior readiness evidence", + "pre-approval state", + "renewed human `Approved for Implementation`", + "separate exact-task Kanban Focus admission", + ] + for marker in required: + self.assertIn(marker, self.skill) + if __name__ == "__main__": unittest.main()