ace-task 0.36.1 → 0.37.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 34781c3bdaae6a3d794b1d2ff7654b80cd0c6df85377960ca85e6b9e3868bf20
4
- data.tar.gz: a9da028f06155e0dfa3dd24f39c8d625d1768c965e26af2351f6f5e477d3510e
3
+ metadata.gz: 0c904888ee87cacc7e50943b71c57903e2b4b86e100fd430a39888268ae52c10
4
+ data.tar.gz: b7a750de5413603f17f69aba61bb18cef0c522167b69fcee88dbdfd8052feea1
5
5
  SHA512:
6
- metadata.gz: '0189d7b62882f379f721d5c34a3e5e0ca4aad445631cddc9ab88ecb46c235eb500df1a633be1ccb9dff9aba5c4267935c037baded1d4a3bdc7a76568c2940a2e'
7
- data.tar.gz: 755d4133499d1e4f005645affb13a8b723e1f1f48d5739072c25af44e29c172b3b7b068fc7def6e32ebf4a72af8cbcbf88f957e3f990c6fd4fd2711227561a0a
6
+ metadata.gz: e0d87b222c10a7b7253771f5c8c01f56d9326638cb0a56878d3d768d8988cb63758551cc24800f82f68516e25b36d87ff7a8a43d4fcef7e674027178b1b61c70
7
+ data.tar.gz: e0e3b6b034578fb56b13acf58a6cc4e412bf941077f06bcc492fb87cfee059524ac0cfc3bbb791c68c7af299ff20e685eeb4571787ab2fe4541e668aff84db59
data/CHANGELOG.md CHANGED
@@ -7,6 +7,56 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.37.0] - 2026-06-30
11
+
12
+ ### Added
13
+
14
+ - Accepted `--title` as an alternate title input for `ace-task create`, with clear conflict handling when both title forms are provided.
15
+
16
+ ## [0.36.7] - 2026-04-25
17
+
18
+ ### Changed
19
+
20
+ - Removed spike as a first-class task pattern from active ACE task drafting. Drafts must now create real child tasks for each original intention, while `as-task-review` owns the deep analysis, draft reshaping, dependency repair, and skip/split decisions for uncertain families.
21
+
22
+ ## [0.36.6] - 2026-04-24
23
+
24
+ ### Changed
25
+
26
+ - Redesigned spike-task guidance around evaluation against real parent goals instead of closure mechanics alone. Spike-first parents must now declare `Learning Targets Before Decomposition`, spike subtasks must map those targets explicitly, and spikes rewrite the active in-folder task tree before later review decides lifecycle.
27
+ - Restricted spike mutation scope to the task folder. Spikes must no longer edit package docs, handbook files, or other out-of-folder assets directly; they capture those impacts as new subtasks under the same parent instead.
28
+
29
+ ## [0.36.5] - 2026-04-24
30
+
31
+ ### Changed
32
+ - Tightened spike-task drafting and review guidance again so spikes must declare explicit outcome tasks whose type matches the completion mode, and so `reopen later if needed` is no longer an acceptable post-spike closure.
33
+
34
+ ### Fixed
35
+ - Tightened spike work guidance so a spike cannot be marked done until its declared concrete outcome task exists in addition to the synchronized parent/doc artifacts and rerun parent review.
36
+
37
+ ### Changed
38
+ - Tightened spike-task workflow guidance so spike drafts must declare a decision-complete Spike Completion Contract naming completion mode, parent sync target, related artifact sync targets, and the final `as-task-review <parent-ref>` rerun.
39
+
40
+ ### Fixed
41
+ - Ensured parent task auto-close for child task closure uses the same `TaskManager#update` flow as explicit task closes, so linked GitHub issues close through one consistent code path.
42
+ - Tightened spike work/review guidance so a spike cannot be considered complete until its parent and declared related task/doc artifacts are synchronized and the parent review has been rerun.
43
+
44
+ ## [0.36.4] - 2026-04-24
45
+
46
+ ## [0.36.2] - 2026-04-23
47
+
48
+
49
+ ### Changed
50
+ - Added layer-ownership triage into task bug-work and planning workflows to reduce cross-package misrouting of root-cause fixes.
51
+ - Tightened task planning workflows to improve issue linkage and work-on sequencing with clearer workflow ownership validation.
52
+
53
+
54
+ ### Changed
55
+ - Added layer-ownership triage to bug analysis/fix and task planning/work workflows so agents identify owner, adapter, and symptom packages before implementing cross-package shared-primitive fixes.
56
+ - Tightened the task draft workflow so GitHub issue URL inputs must create the parent or single task with `--github-issue <number>` and sync the linked issue.
57
+
58
+ ### Technical
59
+ - Added workflow contract coverage for the layer-ownership triage guidance.
10
60
  ## [0.36.1] - 2026-04-19
11
61
 
12
62
  ### Technical
@@ -2,13 +2,13 @@
2
2
  doc-type: guide
3
3
  purpose: Guide for writing clear, actionable task definitions in ace-task
4
4
  ace-docs:
5
- last-updated: '2026-03-21'
5
+ last-updated: '2026-04-25'
6
6
  ---
7
7
 
8
8
  <!-- markdownlint-disable -->
9
- # 📑 Writing Clear, Actionable Dev Tasks
9
+ # 📑 Writing Clear, Actionable Dev Tasks
10
10
 
11
- ## A playbook for documentationoriented tickets, with a complete worked example
11
+ ## A playbook for documentation-oriented tickets, with a complete worked example
12
12
 
13
13
  ## Introduction & Goal
14
14
 
@@ -19,7 +19,7 @@ minimize ambiguity and streamline the process of defining and executing document
19
19
 
20
20
  ---
21
21
 
22
- ## 0. Directory Audit Step 
22
+ ## 0. Directory Audit Step
23
23
 
24
24
  **Always start by discovering what actually exists in the repo.**
25
25
 
@@ -28,7 +28,7 @@ minimize ambiguity and streamline the process of defining and executing document
28
28
  3. From that listing, build the deliverable manifest.
29
29
 
30
30
  > **Tip:**
31
- > • If you don’t have repo access, create a tiny *preticket* titled “Generate GuideAudit Manifest”.
31
+ > • If you don’t have repo access, create a tiny *pre-ticket* titled “Generate Guide-Audit Manifest”.
32
32
  > • Commit the tree output as a comment or markdown file, then reference it in the main ticket.
33
33
 
34
34
  Example audit snippet to embed:
@@ -45,18 +45,18 @@ guides
45
45
 
46
46
  ---
47
47
 
48
- ## 1. Anatomy of a Great Task
48
+ ## 1. Anatomy of a Great Task
49
49
 
50
- | Section | Purpose | Key Questions |
50
+ | Section | Purpose | Key Questions |
51
51
  |---------|---------|---------------|
52
- | **Frontmatter** | Helps tooling & humans filter | id (use `task-manager generate-id VERSION` to generate), status, priority, estimate, dependencies |
52
+ | **Front-matter** | Helps tooling & humans filter | id (use `task-manager generate-id VERSION` to generate), status, priority, estimate, dependencies |
53
53
  | **Objective / Problem** | *Why* are we doing this? | What pain are we fixing? |
54
- | **Directory Audit (0)** | Sourceoftruth for scope | Did we include the current tree? |
54
+ | **Directory Audit (0)** | Source-of-truth for scope | Did we include the current tree? |
55
55
  | **Scope of Work** | *What* to touch | Which guides/folders? |
56
56
  | **Deliverables / Manifest** | Exact files to create / modify / delete | Could a newcomer do it with just this? |
57
- | **Phases** | Bitesized plan | Audit → Extract → Refactor → Index |
57
+ | **Phases** | Bite-sized plan | Audit → Extract → Refactor → Index |
58
58
  | **Implementation Plan** | Divided into Planning Steps (`* [ ]`) for analysis/design and Execution Steps (`- [ ]`) for implementation actions. Consider embedding automated test/verification steps directly. | |
59
- | **Acceptance Criteria** | Definition of Done | Checklist style `[ ]`. **Can include references to automated checks defined in the Implementation Plan's Planning and Execution sections or be high-level checks themselves.** |
59
+ | **Acceptance Criteria** | Definition of Done | Check-list style `[ ]`. **Can include references to automated checks defined in the Implementation Plan's Planning and Execution sections or be high-level checks themselves.** |
60
60
  | **Out of Scope** | Prevent scope creep | What must *not* be touched? |
61
61
  | **References & Risks** | Links to style guides, ADRs, **testing standards (like [Embedded Testing Guide](ace-docs/handbook/guides/embedded-testing-guide.g.md))**; mitigations | Any scripts to run? **Use links relative to the project root (e.g., `ace-handbook/handbook/guides/some-guide.g.md`), not relative to the current file (`../guides/some-guide.md`)** |
62
62
 
@@ -88,7 +88,7 @@ This distinction supports workflow separation where review/planning phases focus
88
88
 
89
89
  ---
90
90
 
91
- ## 3. **Full Worked Example**
91
+ ## 3. Full Worked Example
92
92
 
93
93
  A full worked example of a task, "Tailor Guides to Tech Stack," has been moved to a separate file:
94
94
  [`ace-task/handbook/templates/release-tasks/example.md`](../templates/release-tasks/example.md)
@@ -153,4 +153,38 @@ For complex tasks requiring analysis or design decisions, include both sections:
153
153
  6. Are Planning Steps used for complex tasks requiring analysis/design?
154
154
  7. Do visual markers distinguish planning (`* [ ]`) from execution (`- [ ]`) steps?
155
155
 
156
- Tick them all → merge the ticket.
156
+ Tick them all → merge the ticket.
157
+
158
+ ---
159
+
160
+ ## Review-first task shaping
161
+
162
+ ACE no longer uses spike as a special task type.
163
+
164
+ ### Rules
165
+
166
+ 1. The parent owns the umbrella outcome and the child-task map.
167
+ 2. Every original intention that matters must exist as a real child task from the start.
168
+ 3. If ordering matters, the first child should be the smallest real vertical slice, not a synthetic research-only task.
169
+ 4. `as-task-review` is the deep-analysis stage: it may rewrite, split, reorder, skip, or dependency-shape draft subtasks after codebase research.
170
+ 5. Do not preserve major uncertainty only in parent prose. If a goal matters enough to protect, give it a child task.
171
+ 6. If review later proves a drafted child obsolete or already satisfied, review updates the task family directly instead of relying on a dedicated spike artifact.
172
+
173
+ ### Parent responsibility
174
+
175
+ The parent should keep:
176
+ - umbrella objective
177
+ - why the family exists
178
+ - decomposition map of child refs and concerns
179
+ - shared boundaries or references
180
+
181
+ The parent should not hide work that has no child owner.
182
+
183
+ ### Child responsibility
184
+
185
+ Each child task should own:
186
+ - one concrete slice of the original intention
187
+ - its own interface contract and success criteria
188
+ - its own verification plan
189
+
190
+ If a single child is trying to answer multiple independent questions, split it before implementation.
@@ -15,7 +15,7 @@ bundle:
15
15
  doc-type: template
16
16
  purpose: Template for drafting task definitions
17
17
  ace-docs:
18
- last-updated: '2026-03-21'
18
+ last-updated: '2026-04-25'
19
19
  ---
20
20
 
21
21
  # {title}
@@ -98,7 +98,7 @@ GET/POST/PUT/DELETE /endpoint
98
98
  <!-- Ask about unclear requirements, edge cases, and user expectations -->
99
99
 
100
100
  - [ ] **Requirement Clarity**: [Question about unclear or ambiguous requirements]
101
- - [ ] **Edge Case Handling**: [Question about boundary conditions or unusual scenarios]
101
+ - [ ] **Edge Case Handling**: [Question about boundary conditions or unusual scenarios]
102
102
  - [ ] **User Experience**: [Question about user expectations, workflows, or interactions]
103
103
  - [ ] **Success Definition**: [Question about how success will be measured or validated]
104
104
 
@@ -135,7 +135,7 @@ Why are we doing this? Focus on user value and behavioral outcomes.
135
135
  <!-- Define the behavioral scope - what user experiences and system behaviors are included -->
136
136
 
137
137
  - **User Experience Scope**: [Which user interactions, workflows, and experiences are included]
138
- - **System Behavior Scope**: [Which system capabilities, responses, and behaviors are included]
138
+ - **System Behavior Scope**: [Which system capabilities, responses, and behaviors are included]
139
139
  - **Interface Scope**: [Which APIs, commands, or interfaces are included]
140
140
 
141
141
  ### Deliverables
@@ -143,7 +143,7 @@ Why are we doing this? Focus on user value and behavioral outcomes.
143
143
 
144
144
  #### Behavioral Specifications
145
145
  - User experience flow definitions
146
- - System behavior specifications
146
+ - System behavior specifications
147
147
  - Interface contract definitions
148
148
 
149
149
  #### Validation Artifacts
@@ -169,7 +169,7 @@ Why are we doing this? Focus on user value and behavioral outcomes.
169
169
  <!-- Explicitly exclude implementation concerns to maintain behavioral focus -->
170
170
 
171
171
  - ❌ **Implementation Details**: File structures, code organization, technical architecture
172
- - ❌ **Technology Decisions**: Tool selections, library choices, framework decisions
172
+ - ❌ **Technology Decisions**: Tool selections, library choices, framework decisions
173
173
  - ❌ **Performance Optimization**: Specific performance improvement strategies
174
174
  - ❌ **Future Enhancements**: Related features or capabilities not in current scope
175
175
 
@@ -177,4 +177,4 @@ Why are we doing this? Focus on user value and behavioral outcomes.
177
177
 
178
178
  - Related capture-it output (if applicable)
179
179
  - User experience requirements
180
- - Interface specification examples
180
+ - Interface specification examples
@@ -156,7 +156,29 @@ Systematically analyze bug reports to identify root cause, verify reproduction,
156
156
  - Contributing factors (conditions that enable the bug)
157
157
  - Impact scope (what else might be affected)
158
158
 
159
- ### 5. Propose Regression Tests
159
+ ### 5. Layer Ownership Triage
160
+
161
+ Before finalizing the fix plan, identify the layer that owns the failing primitive. This is required when the bug crosses package boundaries or involves shared external resources, protocols, command routing, configuration namespaces, or reusable helper APIs.
162
+
163
+ Classify each relevant package/component:
164
+
165
+ - **Owner/creator**: creates, names, persists, routes, or navigates the primitive
166
+ - **Adapter/orchestrator**: coordinates owner APIs for a workflow
167
+ - **Consumer/symptom**: exposes the failure but does not own the primitive
168
+
169
+ Answer these questions in the analysis:
170
+
171
+ - What is the failing primitive or contract?
172
+ - Which package creates or names it?
173
+ - Which package navigates, reuses, or cleans it up?
174
+ - Which package only exposed the symptom?
175
+ - Is there a shared package/API that all callers should use?
176
+
177
+ Default fix rule: fix the owner layer first, then update adapters/consumers only to call the shared behavior. Do not propose a consumer-only fix when an owner layer exists and has not been inspected.
178
+
179
+ Example: if `ace-assign` fails because `ace-t.k5a-fs` is parsed incorrectly as a tmux target, the failing primitive is tmux window naming/targeting. `ace-tmux` owns window creation, naming, and navigation, so the primary fix belongs in `ace-tmux`; `ace-assign` and `ace-overseer` should reuse the shared policy.
180
+
181
+ ### 6. Propose Regression Tests
160
182
 
161
183
  **Design tests to catch this bug:**
162
184
 
@@ -191,18 +213,20 @@ Systematically analyze bug reports to identify root cause, verify reproduction,
191
213
  - Scenario: Given [setup], when [action], then [verification]
192
214
  ```
193
215
 
194
- ### 6. Create Fix Plan
216
+ ### 7. Create Fix Plan
195
217
 
196
218
  **Document the fix strategy:**
197
219
 
198
220
  1. **Files to modify:**
199
221
  - List each file that needs changes
200
222
  - Describe the type of change for each
223
+ - Mark each file as owner, adapter/orchestrator, or consumer/symptom when layer ownership triage applies
201
224
 
202
225
  2. **Fix approach:**
203
226
  - Describe the technical solution
204
227
  - Explain why this approach was chosen
205
228
  - Note any alternative approaches considered
229
+ - Explain why the fix is placed in the owner layer, or why no owner-layer change is needed
206
230
 
207
231
  3. **Risks and side effects:**
208
232
  - What else might be affected by the fix
@@ -213,7 +237,7 @@ Systematically analyze bug reports to identify root cause, verify reproduction,
213
237
  - How to revert if issues arise
214
238
  - What to check after reverting
215
239
 
216
- ### 7. Save Analysis Results
240
+ ### 8. Save Analysis Results
217
241
 
218
242
  **Cache the analysis for fix-bug workflow:**
219
243
 
@@ -228,6 +252,14 @@ mkdir -p .ace-local/task/bug-analysis/{session}
228
252
  # .ace-local/task/bug-analysis/{session}/analysis.yml
229
253
  root_cause: "Description of root cause"
230
254
  repro_status: confirmed | not_reproducible | intermittent
255
+ layer_ownership:
256
+ primitive: "Shared resource/protocol/API involved, if any"
257
+ owner: "Package/component that owns creation/naming/routing"
258
+ adapters:
259
+ - "Adapter/orchestrator package, if any"
260
+ consumers:
261
+ - "Symptom package, if any"
262
+ fix_layer: "owner | adapter | consumer | not_applicable"
231
263
  affected_files:
232
264
  - path: path/to/file.rb
233
265
  change_summary: "Description of what change is needed"
@@ -67,6 +67,7 @@ ls .ace-local/task/bug-analysis/
67
67
  - Load the analysis.yml from the most recent session
68
68
  - Review root cause, affected files, and proposed tests
69
69
  - Confirm the fix plan with user if needed
70
+ - Review `layer_ownership` when present and verify the planned fix targets the owner layer before adapters or consumers
70
71
 
71
72
  **If no analysis exists:**
72
73
 
@@ -74,6 +75,16 @@ ls .ace-local/task/bug-analysis/
74
75
  - Gather: affected files, root cause, proposed solution
75
76
  - Document the fix approach before proceeding
76
77
 
78
+ **Layer ownership guard:**
79
+
80
+ When the bug crosses package boundaries or involves a shared primitive, classify packages before editing:
81
+
82
+ - **Owner/creator**: creates, names, persists, routes, or navigates the primitive
83
+ - **Adapter/orchestrator**: coordinates owner APIs for a workflow
84
+ - **Consumer/symptom**: exposes the failure but does not own the primitive
85
+
86
+ If the loaded/user-provided plan changes only a consumer/symptom package while an owner layer exists and was not inspected, stop and return to analysis. Do not implement a local workaround before checking the owner package.
87
+
77
88
  ### 2. Prepare for Fix
78
89
 
79
90
  **Set up the fix branch:**
@@ -100,12 +111,14 @@ git checkout -b fix/[bug-description]
100
111
  - Review surrounding code
101
112
  - Understand dependencies
102
113
  - Check for similar patterns in codebase
114
+ - If the file is a consumer of a shared primitive, inspect the owner package/API before changing local policy
103
115
 
104
116
  2. **Apply the fix:**
105
117
  - Make minimal changes to fix the bug
106
118
  - Follow existing code style and patterns
107
119
  - Add appropriate error handling
108
120
  - Include inline comments only if logic is non-obvious
121
+ - Put shared policy in the owner layer and have adapters/consumers call that policy
109
122
 
110
123
  3. **Review the change:**
111
124
  - Verify the fix addresses root cause
@@ -1,19 +1,18 @@
1
1
  ---
2
2
  name: task-draft
3
3
  allowed-tools: Bash, Read
4
- description: Create behavior-first draft tasks and subtasks with vertical slicing
5
- and verification plans
4
+ description: Create high-level behavioral specifications that define WHAT the system should do (UX/DX/AX) rather than HOW to implement it. This workflow transforms ideas or requirements into behavior-first draft tasks with clear interface contracts, leaving implementation details for the replan step. This workflow also includes automated idea file management, moving original idea files to organized locations with task number prefixes for clear traceability.
6
5
  doc-type: workflow
7
6
  purpose: task draft workflow instruction
8
7
  ace-docs:
9
- last-updated: '2026-03-21'
8
+ last-updated: '2026-04-25'
10
9
  ---
11
10
 
12
11
  # Draft Task - Behavior-First Specification
13
12
 
14
13
  ## Goal
15
14
 
16
- Create high-level behavioral specifications that define WHAT the system should do (UX/DX/AX) rather than HOW to implement it. This workflow transforms ideas or requirements into behavior-first draft tasks with clear interface contracts, leaving implementation details for the replan step. The workflow also includes automated idea file management, moving original idea files to organized locations with task number prefixes for clear traceability.
15
+ Create high-level behavioral specifications that define WHAT the system should do (UX/DX/AX) rather than HOW to implement it. This workflow transforms ideas or requirements into behavior-first draft tasks with clear interface contracts, leaving implementation details for the replan step. This workflow also includes automated idea file management, moving original idea files to organized locations with task number prefixes for clear traceability.
17
16
 
18
17
  ## Prerequisites
19
18
 
@@ -36,6 +35,11 @@ Create high-level behavioral specifications that define WHAT the system should d
36
35
  * User stories or experience descriptions
37
36
  * Interface specifications or contracts
38
37
  * If files are referenced, read their contents
38
+ * If the input is a GitHub issue URL, extract the issue number and treat it
39
+ as task lifecycle metadata. Use that number with `ace-task create
40
+ --github-issue <number>` when creating the parent task or single flat task.
41
+ The issue URL may still appear in the task body as source context, but the
42
+ lifecycle link belongs in task frontmatter as `github_issue`.
39
43
  * **Intent mapping from enhanced ideas**: When the source idea contains the
40
44
  3-Question Delegation Brief sections (`What I Hope to Accomplish`,
41
45
  `What "Complete" Looks Like`, `Success Criteria`), use them as the
@@ -79,6 +83,7 @@ Create high-level behavioral specifications that define WHAT the system should d
79
83
  - What users experience: [UX description]
80
84
  - Interface contract: [CLI/API/UI examples]
81
85
  - Success criteria: [Measurable outcomes]
86
+ - Linked GitHub issue: #[issue-number] (when drafting from a GitHub issue)
82
87
  - Status: draft (needs implementation planning)
83
88
 
84
89
  2. [Next Task Title] - [User experience summary]
@@ -111,6 +116,8 @@ Create high-level behavioral specifications that define WHAT the system should d
111
116
  * Integration/E2E scenarios when behavior crosses boundaries
112
117
  * At least one invalid/failure-path scenario
113
118
  * Capture required context files per slice for fresh sessions in `bundle.files`
119
+ * Draft real child subtasks immediately when a parent has multiple original intentions
120
+ * Do not preserve major goals only in parent prose; if an intention matters, it must exist as a real child task/subtask
114
121
 
115
122
  7. **Determine Storage Location and Create Draft Tasks**
116
123
 
@@ -127,12 +134,14 @@ Create high-level behavioral specifications that define WHAT the system should d
127
134
  **Pattern A -- Single flat task (default):**
128
135
  ```bash
129
136
  ace-task create "Task Title" --status draft --estimate "TBD"
137
+ ace-task create "Task Title" --status draft --estimate "TBD" --github-issue 276
130
138
  ```
131
139
 
132
140
  **Pattern B -- Orchestrator with subtasks:**
133
141
  ```bash
134
142
  # 1. Create the parent task first
135
143
  ace-task create "Parent Title" --status draft --estimate "TBD"
144
+ ace-task create "Parent Title" --status draft --estimate "TBD" --github-issue 276
136
145
  # Returns: v.X.Y+task.NNN
137
146
 
138
147
  # 2. Add each subtask with --child-of (auto-converts parent to orchestrator)
@@ -157,36 +166,22 @@ Create high-level behavioral specifications that define WHAT the system should d
157
166
  * For subtasks, list required shared context files explicitly in EACH subtask's bundle (no implicit inheritance)
158
167
  * Include behavioral specification template
159
168
  * Focus on behavioral content, leave implementation for replan step
169
+ * When drafting from a GitHub issue:
170
+ * Put `--github-issue <number>` only on the parent/orchestrator or single
171
+ flat task create command unless separate subtasks each own distinct
172
+ GitHub issues.
173
+ * Run `ace-task github-sync <parent-or-task-ref>` after creation so the
174
+ GitHub issue receives the ACE task tracking update.
160
175
 
161
- ### Spike-First Rule for Engine/Pipeline Redesigns
176
+ ### Review-First Rule for Uncertain Drafts
162
177
 
163
- When an orchestrator task redesigns a core execution path (test runner, build pipeline,
164
- deployment flow), the FIRST subtask should be a time-boxed spike that:
165
- 1. Validates the target architecture end-to-end with a single scenario
166
- 2. Identifies which existing concepts survive and which get removed
167
- 3. Produces a "concept inventory" showing what the final system looks like
178
+ When requirements are uncertain, do not create a special spike task. Draft the real goal subtasks immediately, then let later `as-task-review` do the deep analysis.
168
179
 
169
- Only AFTER the spike validates the end-state should remaining subtasks be drafted.
170
- This prevents decomposing into subtasks that add concepts the spike later proves unnecessary.
171
-
172
- **Anti-pattern**: 8 subtasks drafted upfront, each adding features, then a late subtask undoes half.
173
- **Correct pattern**: 1 spike subtask validates the end-state, then remaining subtasks build toward it.
174
-
175
- Every spike-first draft must also declare the spike type:
176
- - **Design-contract spike**: validates target behavior and ownership boundaries, but does not yet claim runnable proof
177
- - **Proof-of-concept spike**: validates target behavior with runnable proof, not only a design contract
178
-
179
- For both spike types, the draft must include:
180
- 1. one **Validated End-State Scenario**
181
- 2. one **Concept Inventory** with kept / changed / new / rejected outcomes
182
- 3. one **Adopted Decisions / Rejected Decisions / Deferred Gaps** section
183
- 4. one **Follow-up Tasks After Spike** section naming the next implementation or adoption work that must happen if the spike succeeds
184
-
185
- For proof-of-concept spikes, the draft must additionally include:
186
- 1. one concrete **Proof Artifact Plan** describing what runnable evidence will prove the spike
187
- 2. success criteria that require the proof artifact, not only the concept inventory
188
-
189
- Do not treat "we now understand the design" as sufficient spike completion when the spike affects a runtime, UX, or execution-path contract. A useful spike must also leave a clear proof path and explicit next task.
180
+ 1. The parent owns the umbrella outcome and decomposition map only.
181
+ 2. Each original intention or goal must exist as a real child subtask from the start.
182
+ 3. If ordering matters, make the first child the smallest real vertical slice that validates the riskiest path.
183
+ 4. Review may later rewrite, split, reorder, skip, or add dependencies between draft subtasks.
184
+ 5. Do not preserve uncertainty by inventing a dedicated research-only subtask when normal review can answer it.
190
185
 
191
186
  8. **Complete Behavioral Specifications**
192
187
  * For each created draft task, populate with:
@@ -248,19 +243,20 @@ Do not treat "we now understand the design" as sufficient spike completion when
248
243
  * **Validation Checklist:**
249
244
  * [ ] All behavioral requirements captured as drafts
250
245
  * [ ] Task files have status: draft
246
+ * [ ] GitHub issue inputs are linked through `github_issue` frontmatter on the parent/single task
247
+ * [ ] Linked GitHub issue inputs have been synced with `ace-task github-sync <ref>`
251
248
  * [ ] Behavioral specifications are complete
252
249
  * [ ] Interface contracts are defined
253
250
  * [ ] Success criteria are measurable
254
251
  * [ ] Vertical slices are defined using task/subtask model (no horizontal-only decomposition)
252
+ * [ ] Every original intention is represented as a real task/subtask, not only parent prose
255
253
  * [ ] Verification Plan includes unit/equivalent validation, integration/E2E when needed, and failure path checks
256
254
  * [ ] `bundle` frontmatter exists with canonical key order (`presets`, `files`, `commands`)
257
255
  * [ ] Required context artifacts are explicitly listed in `bundle.files` for each task/subtask
258
256
  * [ ] Draft is decision-complete: no unresolved behavior choices left for implementer
259
257
  * [ ] Defaults are explicit where behavior could otherwise be ambiguous
260
258
  * [ ] Usage documentation created in `ux/usage.md` (when task changes any API surface)
261
- * [ ] Spike tasks declare whether they are `design-contract` or `proof-of-concept`
262
- * [ ] Spike tasks include explicit follow-up task(s) after the spike
263
- * [ ] Proof-of-concept spikes include a runnable proof artifact plan
259
+ * [ ] For uncertain families, the first slice is still a real subtask rather than a dedicated spike
264
260
 
265
261
  12. **Run Quality Pass (Better, Not More)**
266
262
  * Perform one concise quality pass before finalizing:
@@ -354,6 +350,10 @@ All code implementation happens during `ace-bundle wfi://task/work` (status: in-
354
350
  * All tasks have status: draft
355
351
  * No implementation details mixed with behavioral requirements
356
352
  * Clear handoff to review-task for readiness validation and promotion to pending
353
+ * **REQUIRED when drafting from a GitHub issue URL:**
354
+ * The parent/orchestrator or single flat task is created with `--github-issue <number>`
355
+ * The task frontmatter contains `github_issue: <number>`
356
+ * `ace-task github-sync <ref>` has updated the linked issue
357
357
  * **REQUIRED when drafting from ideas:**
358
358
  * All source idea files marked as done via `ace-idea move <id> --to archive`
359
359
  * Task references updated to new idea file locations
@@ -377,6 +377,15 @@ All code implementation happens during `ace-bundle wfi://task/work` (status: in-
377
377
  **Example 3: Interface-focused requirements**
378
378
  > "Draft task for CLI tool: auth-manager with login, logout, and status commands"
379
379
 
380
+ **Example 4: GitHub issue integration**
381
+ > "Draft a task from https://github.com/cs3b/ace/issues/276"
382
+
383
+ Create the parent or single task with the linked issue number:
384
+
385
+ ```bash
386
+ ace-task create "Task Title" --status draft --estimate "TBD" --github-issue 276
387
+ ```
388
+
380
389
  ---
381
390
 
382
391
  This workflow creates behavior-first specifications that serve as clear contracts for implementation, ensuring user value is defined before technical details are considered.
@@ -137,6 +137,16 @@ The plan will be consumed by a separate execution agent that has no access to th
137
137
  - List consumer packages that will need coordinated updates
138
138
  - Document the full downstream scope before implementation begins
139
139
 
140
+ **Layer Ownership Triage:**
141
+ - For tasks involving shared resources, external protocols, command routing, configuration namespaces, or cross-package helpers, identify the owner layer before choosing files to edit.
142
+ - Classify relevant packages/components as:
143
+ - **Owner/creator**: creates, names, persists, routes, or navigates the primitive
144
+ - **Adapter/orchestrator**: coordinates owner APIs for a workflow
145
+ - **Consumer/symptom**: exposes the issue but does not own the primitive
146
+ - Default to implementing shared policy in the owner layer, then update adapters/consumers to call it.
147
+ - Do not plan a consumer-only fix when an owner layer exists and has not been inspected.
148
+ - Example: for tmux window-name failures surfaced by `ace-assign`, inspect `ace-tmux` first because it owns tmux window creation, naming, and navigation.
149
+
140
150
  **Document Research Findings:**
141
151
  - Summarize key technical insights
142
152
  - Note recommended approaches with pros/cons
@@ -164,6 +174,7 @@ The plan will be consumed by a separate execution agent that has no access to th
164
174
  - Identify existing files requiring changes
165
175
  - Document specific modifications and their impact
166
176
  - Plan integration points and interfaces
177
+ - Mark cross-package files as owner, adapter/orchestrator, or consumer/symptom when layer ownership triage applies
167
178
 
168
179
  **Delete Files:**
169
180
  - Identify obsolete files to be removed
@@ -486,4 +497,4 @@ If needed, add **`## Behavioral Gaps`** only after `## Freshness Summary`.
486
497
  - `ace-test path/to/test_file.rb`
487
498
  </template>
488
499
 
489
- </documents>
500
+ </documents>
@@ -1,19 +1,18 @@
1
1
  ---
2
2
  name: task-review
3
3
  allowed-tools: Bash, Read
4
- description: Review draft tasks for readiness, vertical slice quality, verification
5
- plans, and promotion to pending
4
+ description: Review draft tasks for readiness, vertical slice quality, verification plans, and promotion to pending
6
5
  doc-type: workflow
7
6
  purpose: Review draft tasks for readiness and quality before promotion
8
7
  ace-docs:
9
- last-updated: '2026-03-21'
8
+ last-updated: '2026-04-25'
10
9
  ---
11
10
 
12
11
  # Review Task Workflow Instruction
13
12
 
14
13
  ## Goal
15
14
 
16
- Validate draft behavioral specifications and promote to pending when ready. This workflow acts as the readiness gate between drafting and implementation. It reviews draft tasks for completeness, conducts autonomous research to resolve open questions, generates critical questions for unresolved items, and either promotes validated drafts to `status: pending` or blocks with `needs_review: true` when questions remain.
15
+ Validate draft behavioral specifications and promote to pending when ready. This workflow acts as the readiness gate between drafting and implementation. It reviews draft tasks for completeness, conducts autonomous research to resolve open questions, rewrites draft families when codebase reality differs from the original draft, generates critical questions for unresolved items, and either promotes validated drafts to `status: pending` or blocks with `needs_review: true` when questions remain.
17
16
 
18
17
  ## Prerequisites
19
18
 
@@ -40,6 +39,7 @@ Validate draft behavioral specifications and promote to pending when ready. This
40
39
  - Enumerate child subtasks and their current statuses before any promotion
41
40
  - Treat every child subtask still in `draft` as an additional review target
42
41
  - Review draft subtasks first and defer any parent promotion decision until child review outcomes are known
42
+ - Confirm the parent is acting as umbrella outcome plus decomposition map rather than hiding major work only in parent prose
43
43
  - Parse the behavioral specification sections:
44
44
  - User Experience (input, process, output)
45
45
  - Expected Behavior
@@ -51,13 +51,19 @@ Validate draft behavioral specifications and promote to pending when ready. This
51
51
  - Frontmatter `bundle` block (`presets`, `files`, `commands`)
52
52
  - Identify gaps, ambiguities, or assumptions that need clarification
53
53
 
54
- 2. **Autonomous Research Phase:**
54
+ 2. **Autonomous Research and Draft Repair Phase:**
55
55
  - **Attempt Self-Resolution First:**
56
56
  - Search project documentation for answers
57
57
  - Analyze similar implementations in codebase
58
58
  - Review related tasks and their solutions
59
59
  - Check architectural decisions and patterns
60
60
  - Consult technical documentation and best practices
61
+ - **Repair draft structure when research changes the shape:**
62
+ - Rewrite draft subtasks when codebase reality or shipped behavior differs from the original draft
63
+ - Split draft subtasks when one child is hiding multiple real goals
64
+ - Add or change normal task dependencies when ordering matters
65
+ - Mark obsolete draft subtasks `skipped` when the goal is already satisfied or no longer valid
66
+ - Update the parent decomposition summary to match the repaired child set
61
67
  - **Web Search When Appropriate:**
62
68
  - If WebSearch tool is available and needed:
63
69
  - Search for industry standards or best practices
@@ -102,9 +108,10 @@ Validate draft behavioral specifications and promote to pending when ready. This
102
108
  - [ ] **Scope Boundaries Clear**: In-scope and out-of-scope explicitly stated
103
109
  - [ ] **Validation Questions Addressed**: All validation questions either answered or documented as blocking
104
110
  - [ ] **Vertical Slice Quality (Task/Subtask)**: Scope is decomposed into end-to-end capability slices (standalone task or orchestrator+subtasks), not horizontal layer-only work
111
+ - [ ] **Original Intention Coverage**: Each major original intention exists as a real child task/subtask instead of being preserved only in parent prose
105
112
  - [ ] **Subtask Slice Clarity**: Each subtask has a distinct observable outcome and does not duplicate sibling scope
106
113
  - [ ] **Child Readiness Complete** (orchestrators only): Every draft child subtask has been reviewed and either promoted to `pending` or blocked with documented questions
107
- - [ ] **Tracer-First for Uncertain Architecture**: For uncertain/novel execution paths, first subtask is a tracer slice validating viability
114
+ - [ ] **First Slice Is Real Work**: When ordering matters, the first slice is the smallest real capability, not a synthetic research-only task
108
115
  - [ ] **Slice Size Signal Present**: Each slice includes advisory size (`small|medium|large`) for planning visibility
109
116
  - [ ] **Decision-Complete Spec**: Implementer can execute without inventing missing behavioral decisions
110
117
  - [ ] **Defaults Declared**: Ambiguous/unspecified behavior has explicit defaults
@@ -119,10 +126,7 @@ Validate draft behavioral specifications and promote to pending when ready. This
119
126
  - [ ] **Operating Modes Covered**: Spec addresses relevant operating modes (dry-run, force, verbose, quiet) or explicitly marks them out-of-scope
120
127
  - [ ] **Degenerate Inputs Covered**: Spec considers identity operations (X=Y), empty inputs, and self-referential calls where the same entity appears in both argument positions
121
128
  - [ ] **Per-Path Variations Covered**: If spec says "same behavior for X and Y", it enumerates edge cases unique to each path (guard logic, error handling, parameter differences)
122
- - [ ] **End-State Coherence** (orchestrator subtasks only): Concepts introduced by this subtask
123
- (new fields, modes, formats) are expected to exist in the final deliverable --
124
- not be removed by a later subtask. If this subtask adds a concept that a later
125
- subtask will consolidate away, flag as SCOPE RISK and consider merging subtasks.
129
+ - [ ] **End-State Coherence** (orchestrator subtasks only): Concepts introduced by this subtask are expected to exist in the final deliverable and not be removed by a later sibling rewrite without reasoned review-driven reshaping
126
130
  - [ ] **Title Length**: Title is max 80 characters
127
131
  - [ ] **Folder Slug**: 3-5 word context slug for folder
128
132
  - [ ] **File Slug**: 4-7 word action slug for spec file
@@ -239,27 +243,6 @@ While review-task primarily serves as the draft-to-pending gate, it can provide
239
243
 
240
244
  For non-draft tasks, skip the Readiness Checklist and Promote/Block steps. Focus on content enhancement and question generation only.
241
245
 
242
- ### Completed Spike Review
243
-
244
- When the reviewed task is a completed spike, treat spike usefulness as a review target:
245
-
246
- - Compare the archived spike contract against the shipped public/runtime contract instead of assuming the spike remained accurate.
247
- - Classify every meaningful difference as exactly one of:
248
- - **intentional and adopted**
249
- - **intentional but deferred to follow-up**
250
- - **spec miss that must be corrected**
251
- - Verify that the spike left a reusable adoption path:
252
- - explicit next task(s) exist
253
- - deferred gaps are named, not implied
254
- - any promised proof artifact exists if the spike was a proof-of-concept
255
- - Fail closed on spike usefulness if the spike completed without an explicit follow-up task, even if later implementation succeeded through ad-hoc decisions.
256
- - In the review summary for completed spikes, explicitly state whether the spike produced:
257
- - a reusable contract
258
- - a reusable proof artifact
259
- - a reusable next-task decision
260
-
261
- Treat "concept inventory exists" as insufficient by itself for a successful spike review when the spike was meant to guide real runtime or UX work.
262
-
263
246
  ## Decision Guidance
264
247
 
265
248
  ### When to Use This Workflow
@@ -269,6 +252,7 @@ Treat "concept inventory exists" as insufficient by itself for a successful spik
269
252
  - Refining draft specifications before implementation
270
253
  - Researching answers to open questions on draft tasks
271
254
  - Checking if a draft is implementation-ready
255
+ - Reshaping uncertain draft families without inventing a dedicated spike subtask
272
256
 
273
257
  **Don't use review-task when:**
274
258
  - Creating new tasks (use draft-task)
@@ -287,11 +271,11 @@ Treat "concept inventory exists" as insufficient by itself for a successful spik
287
271
  - Bundle frontmatter (`presets`, `files`, `commands`) validated for completeness
288
272
  - Task promoted to pending if ready, or blocked with `needs_review: true`
289
273
  - Orchestrator parents are promoted only after draft child subtasks have also passed review
274
+ - Review can rewrite, split, reorder, skip, or dependency-shape draft children when research proves the initial draft wrong
290
275
  - Structure and formatting preserved
291
276
  - No loss of existing information
292
277
  - Clear improvement in task clarity or completeness
293
278
  - User receives actionable list of questions to answer (if any)
294
- - Completed spike reviews identify contract drift and verify explicit follow-up tasks
295
279
 
296
280
  ## Task Management Integration
297
281
 
@@ -357,10 +341,11 @@ cd .ace-tasks && ace-search "needs_review: true" --content
357
341
  The review-task workflow serves as the quality gate between specification and implementation:
358
342
 
359
343
  1. **Research-First Approach**: AI agents attempt to find answers through documentation, codebase analysis, and pattern recognition before escalating
360
- 2. **Readiness Checklist**: Systematic validation ensures behavioral specs are complete before promotion
361
- 3. **Smart Question Filtering**: Only truly unresolvable questions requiring business/design decisions are escalated
362
- 4. **Persistent Question Tracking**: Questions are saved in task files with `needs_review: true` metadata for easy filtering
363
- 5. **Clear Lifecycle Decision**: Every review results in either promotion to pending or documented blocking questions
344
+ 2. **Draft Repair Authority**: Review rewrites, splits, reorders, and dependency-shapes uncertain draft families instead of requiring a special spike task type
345
+ 3. **Readiness Checklist**: Systematic validation ensures behavioral specs are complete before promotion
346
+ 4. **Smart Question Filtering**: Only truly unresolvable questions requiring business/design decisions are escalated
347
+ 5. **Persistent Question Tracking**: Questions are saved in task files with `needs_review: true` metadata for easy filtering
348
+ 6. **Clear Lifecycle Decision**: Every review results in either promotion to pending or documented blocking questions
364
349
 
365
350
  This approach enables:
366
351
  - **Clear Lifecycle Gate**: Draft tasks must pass validation before entering the implementation pipeline
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: task-work
3
- description: Execute task implementation against behavioral spec using pre-loaded
4
- plan
3
+ description: Execute task implementation against behavioral spec using pre-loaded plan
4
+ allowed-tools: Bash, Read, Write
5
5
  assign:
6
6
  sub-steps:
7
7
  - onboard-base
@@ -16,7 +16,7 @@ assign:
16
16
  doc-type: workflow
17
17
  purpose: Execute task implementation from plan with quality gates
18
18
  ace-docs:
19
- last-updated: '2026-03-21'
19
+ last-updated: '2026-04-25'
20
20
  ---
21
21
 
22
22
  # Work on Task
@@ -41,7 +41,7 @@ To avoid known `--content` stalls in some environments:
41
41
  - `ace-task plan <ref>` (path mode, reuse cached plan when available)
42
42
  - The most recent plan artifact plus current task spec, documented in the step report
43
43
  4. If stalls repeat, add a follow-up fix task and capture evidence in the retrospective.
44
- 5. If implementation reveals the spec or spike contract is materially wrong, stale, or missing an adoption path, stop and either update the spec or add a follow-up task before continuing.
44
+ 5. If implementation reveals the spec is materially wrong, stale, or missing an adoption path, stop and either update the spec or add a follow-up task before continuing.
45
45
 
46
46
  ## Primary Directive
47
47
 
@@ -59,12 +59,13 @@ Work through the plan checklist, step by step:
59
59
  - If the spec says X, implement X — don't gold-plate, don't simplify away requirements
60
60
  - If spec and plan conflict, spec wins — the plan is a HOW, not a WHAT
61
61
  - If the spec is ambiguous or incomplete: stop and ask, don't assume
62
- - If runtime work materially changes a public contract promised by a spike (flags, naming, fallback behavior, proof surface, ownership boundary), do not silently drift. Update the task/spec or create a follow-up task before release or demo cleanup.
62
+ - If runtime work materially changes a promised public contract (flags, naming, fallback behavior, proof surface, ownership boundary), do not silently drift. Update the task/spec or create a follow-up task before release or demo cleanup.
63
+ - If implementation reveals the plan targets only a symptom/consumer package for a shared primitive, stop and re-plan at the owner layer before editing. The owner layer is the package that creates, names, persists, routes, or navigates the primitive; adapters and consumers should reuse owner APIs instead of duplicating policy.
63
64
 
64
65
  **Prior implementation awareness:**
65
- - Before creating new modules, search for existing implementations of the same concern — especially spike or prototype code from prior subtasks
66
- - If a sibling task (same parent, earlier sequence) produced spike code: refactor and promote it rather than creating parallel "production" versions
67
- - Check dependency task reports and the task folder for prior work artifacts (concept inventories, spike reports)
66
+ - Before creating new modules, search for existing implementations of the same concern
67
+ - If a sibling task produced prototype or exploratory code, refactor and promote it rather than creating parallel "production" versions
68
+ - Check dependency task reports and the task folder for prior work artifacts
68
69
  - When plan file paths point to locations where code already exists, integrate rather than duplicate
69
70
 
70
71
  **Execution discipline:**
@@ -74,20 +75,20 @@ Work through the plan checklist, step by step:
74
75
  - If a test failure is undiagnosable after one attempt: stop and report
75
76
 
76
77
  **Task lifecycle:**
77
- - `draft` status: warn the user that the spec hasn't been reviewed, then continue only with explicit confirmation. In unattended/fork contexts where interactive confirmation is not possible, proceed after marking in-progress the assignment creation layer is responsible for blocking draft tasks before they reach this point.
78
+ - `draft` status: warn the user that the spec hasn't been reviewed, then continue only with explicit confirmation. In unattended/fork contexts where interactive confirmation is not possible, proceed after marking in-progress -- the assignment creation layer is responsible for blocking draft tasks before they reach this point.
78
79
  - Mark in-progress before first change, done after last verification
79
- - Never modify task frontmatter directly use `ace-task update <ref> --set key=value`
80
- - If the task implements a spike outcome, verify before marking done that deferred gaps and adoption follow-ups are explicit rather than left implicit in release notes or retrospectives.
80
+ - Never modify task frontmatter directly -- use `ace-task update <ref> --set key=value`
81
+ - If implementation reveals the reviewed draft structure is materially wrong, update the affected task specs or add follow-up tasks before continuing with misleading assumptions.
81
82
 
82
83
  ## Code Conventions
83
84
 
84
- - Follow established project patterns don't introduce new abstractions or styles
85
+ - Follow established project patterns -- don't introduce new abstractions or styles
85
86
  - 2-space indentation (Ruby); keep lines under 120 characters
86
87
  - Write tests for all new logic; run `ace-test` before committing
87
88
 
88
89
  ## Task Folder
89
90
 
90
- **Documents:** Task-specific docs (reports, findings, usage docs) go in the task folder never in the project root.
91
+ **Documents:** Task-specific docs (reports, findings, usage docs) go in the task folder -- never in the project root.
91
92
 
92
93
  **Codemods** (scripts that transform files): create in `{task-folder}/codemods/`, never in `bin/`
93
94
 
@@ -97,7 +98,7 @@ Work through the plan checklist, step by step:
97
98
 
98
99
  All plan steps checked, all success criteria pass:
99
100
 
100
- 1. **Verify working tree is clean** no uncommitted changes:
101
+ 1. **Verify working tree is clean** -- no uncommitted changes:
101
102
  ```bash
102
103
  git status --short
103
104
  ```
@@ -18,6 +18,7 @@ module Ace
18
18
 
19
19
  example [
20
20
  '"Fix login bug" # Create task with title',
21
+ '--title "Fix login bug" # Create task with title flag',
21
22
  '"Fix auth" --priority high --tags auth,security # With priority and tags',
22
23
  '"Setup DB" --child-of q7w # Create as subtask',
23
24
  '"Track issue" --github-issue 276 # Link GitHub issue',
@@ -26,8 +27,9 @@ module Ace
26
27
  '"Preview only" --dry-run # Show what would be created'
27
28
  ]
28
29
 
29
- argument :title, required: true, desc: "Task title"
30
+ argument :title_arg, required: false, desc: "Task title"
30
31
 
32
+ option :title, type: :string, desc: "Task title (alternative to positional TITLE)"
31
33
  option :priority, type: :string, aliases: %w[-p], desc: "Priority (critical, high, medium, low)"
32
34
  option :tags, type: :string, aliases: %w[-T], desc: "Tags (comma-separated)"
33
35
  option :status, type: :string, aliases: %w[-s], desc: "Initial status (draft, pending, blocked, ...)"
@@ -43,7 +45,8 @@ module Ace
43
45
  option :verbose, type: :boolean, aliases: %w[-v], desc: "Show verbose output"
44
46
  option :debug, type: :boolean, aliases: %w[-d], desc: "Show debug output"
45
47
 
46
- def call(title:, **options)
48
+ def call(title_arg: nil, **options)
49
+ title = resolve_title(title_arg, options[:title])
47
50
  dry_run = options[:"dry-run"]
48
51
  priority = options[:priority]
49
52
  tags_str = options[:tags]
@@ -127,6 +130,24 @@ module Ace
127
130
 
128
131
  private
129
132
 
133
+ def resolve_title(positional_title, flag_title)
134
+ positional_present = present_string?(positional_title)
135
+ flag_present = present_string?(flag_title)
136
+
137
+ if positional_present && flag_present
138
+ raise Ace::Support::Cli::Error.new("Choose either positional TITLE or --title, not both")
139
+ end
140
+
141
+ return positional_title if positional_present
142
+ return flag_title if flag_present
143
+
144
+ raise Ace::Support::Cli::Error.new("Title required: provide positional TITLE or --title")
145
+ end
146
+
147
+ def present_string?(value)
148
+ !value.nil? && !value.to_s.strip.empty?
149
+ end
150
+
130
151
  def parse_github_issue(raw_values)
131
152
  values = Array(raw_values).flatten.compact
132
153
  return nil if values.empty?
@@ -336,10 +336,10 @@ module Ace
336
336
  parent_dir, recursive: true
337
337
  )
338
338
 
339
- # Auto-move the parent folder to archive
340
- parent_stub = Struct.new(:path).new(parent_dir)
341
- mover = Ace::Support::Items::Molecules::FolderMover.new(@root_dir)
342
- mover.move(parent_stub, to: "archive")
339
+ parent = load_parent_from_directory(parent_dir, loader)
340
+ return unless parent
341
+
342
+ archive_parent_via_update(parent)
343
343
  end
344
344
 
345
345
  def parse_archive_date(task)
@@ -387,27 +387,46 @@ module Ace
387
387
  }
388
388
  end
389
389
 
390
- unless Atoms::TaskValidationRules.terminal_status?(parent.status.to_s.downcase)
391
- Ace::Support::Items::Molecules::FieldUpdater.update(
392
- parent.file_path, set: {"status" => "done"}
393
- )
394
- parent = loader.load(parent.path, id: parent.id, special_folder: parent.special_folder)
395
- end
396
-
397
- mover = Ace::Support::Items::Molecules::FolderMover.new(@root_dir)
398
- new_parent_path = mover.move(parent, to: "archive", date: parse_archive_date(parent))
399
- new_special_folder = Ace::Support::Items::Atoms::SpecialFolderDetector.detect_in_path(
400
- new_parent_path, root: @root_dir
401
- )
390
+ archived_parent = archive_parent_via_update(parent)
391
+ return {
392
+ path: task.path,
393
+ special_folder: task.special_folder,
394
+ id: task.id
395
+ } unless archived_parent
402
396
 
403
397
  @last_update_note = "Archived parent task #{parent.id} because all subtasks are terminal."
404
398
  {
405
- path: File.join(new_parent_path, File.basename(task.path)),
406
- special_folder: new_special_folder,
399
+ path: File.join(archived_parent.path, File.basename(task.path)),
400
+ special_folder: archived_parent.special_folder,
407
401
  id: task.id
408
402
  }
409
403
  end
410
404
 
405
+ def archive_parent_via_update(parent)
406
+ previous_note = @last_update_note
407
+ archived_parent = update(
408
+ parent.id,
409
+ set: {"status" => "done"},
410
+ move_to: "archive"
411
+ )
412
+
413
+ if archived_parent && @last_update_note == previous_note
414
+ @last_update_note = "Archived parent task #{parent.id} because all subtasks are terminal."
415
+ end
416
+
417
+ archived_parent
418
+ end
419
+
420
+ def load_parent_from_directory(parent_dir, loader)
421
+ parent_id = File.basename(parent_dir).split("-", 2).first
422
+ return nil unless parent_id
423
+
424
+ parent_special = Ace::Support::Items::Atoms::SpecialFolderDetector.detect_in_path(
425
+ parent_dir, root: @root_dir
426
+ )
427
+ loader.load(parent_dir, id: parent_id, special_folder: parent_special)
428
+ end
429
+
411
430
  # Value accessor for FilterApplier
412
431
  def task_value_accessor(item, key)
413
432
  case key
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Ace
4
4
  module Task
5
- VERSION = '0.36.1'
5
+ VERSION = '0.37.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ace-task
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.36.1
4
+ version: 0.37.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michal Czyz
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-04-20 00:00:00.000000000 Z
10
+ date: 2026-06-30 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: ace-support-core