@rse/ase 0.9.59 → 0.9.61

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.
Files changed (34) hide show
  1. package/dst/ase-hook.js +45 -5
  2. package/dst/ase-markdown.js +1 -1
  3. package/dst/ase-meta.js +1 -1
  4. package/dst/ase-setup.js +1 -1
  5. package/dst/ase-statusline.js +1 -1
  6. package/package.json +12 -13
  7. package/plugin/.claude-plugin/plugin.json +1 -1
  8. package/plugin/.codex-plugin/plugin.json +1 -1
  9. package/plugin/.github/plugin/plugin.json +1 -1
  10. package/plugin/meta/ase-common-code.md +1 -1
  11. package/plugin/meta/ase-common-task.md +8 -8
  12. package/plugin/meta/ase-dialog.md +4 -2
  13. package/plugin/package.json +4 -4
  14. package/plugin/skills/ase-code-craft/SKILL.md +43 -9
  15. package/plugin/skills/ase-code-craft/help.md +13 -0
  16. package/plugin/skills/ase-code-edit/SKILL.md +492 -0
  17. package/plugin/skills/ase-code-edit/help.md +127 -0
  18. package/plugin/skills/ase-code-refactor/SKILL.md +7 -6
  19. package/plugin/skills/ase-code-resolve/SKILL.md +7 -6
  20. package/plugin/skills/ase-help-skill/catalog.md +1 -0
  21. package/plugin/skills/ase-sync-import/SKILL.md +2 -1
  22. package/plugin/skills/ase-sync-reconcile/SKILL.md +3 -1
  23. package/plugin/skills/ase-task-condense/SKILL.md +13 -13
  24. package/plugin/skills/ase-task-dissect/SKILL.md +6 -5
  25. package/plugin/skills/ase-task-edit/SKILL.md +42 -20
  26. package/plugin/skills/ase-task-edit/help.md +7 -0
  27. package/plugin/skills/ase-task-grill/SKILL.md +4 -4
  28. package/plugin/skills/ase-task-implement/SKILL.md +21 -10
  29. package/plugin/skills/ase-task-implement/help.md +4 -2
  30. package/plugin/skills/ase-task-preflight/SKILL.md +18 -4
  31. package/plugin/skills/ase-task-preflight/help.md +5 -1
  32. package/plugin/skills/ase-task-reboot/SKILL.md +1 -1
  33. package/plugin/skills/ase-task-view/SKILL.md +1 -2
  34. package/plugin/package-lock.json +0 -2890
@@ -48,8 +48,9 @@ Procedure
48
48
 
49
49
  <if condition="<getopt-option-direct/> is not equal to 'true'">
50
50
  You *MUST* *NOT* call `Edit`, `Write`, `NotebookEdit`, or any
51
- filesystem-modifying tool during this entire skill. The *only*
52
- permitted way to persist artifacts is via `ase_task_save(...)`.
51
+ filesystem-modifying tool, nor execute any filesystem-modifying
52
+ shell command, during this entire skill. The *only* permitted way
53
+ to persist artifacts is via the `ase_task_save(...)` MCP tool.
53
54
  </if>
54
55
  <else>
55
56
  The `--direct`/`-D` mode applies the resolution *in place*, so STEP 4
@@ -257,11 +258,11 @@ resolution actually demands, and you *MUST* *NOT* call
257
258
  `ase` MCP server and use the `text` field of its response for
258
259
  <timestamp-created/> and <timestamp-modified/> information. Then
259
260
  insert the current <ase-task-id/>, <timestamp-created/>,
260
- <timestamp-modified/>, and <task-kind/> information and calculate
261
- the number of words <words/> of <task-content/>.
261
+ <timestamp-modified/>, and <task-kind/> information.
262
262
 
263
263
  3. You then *MUST* *save* the resulting plan content with the
264
- `ase_task_save(id: "<ase-task-id/>", text: "<task-content/>")`.
264
+ `ase_task_save(id: "<ase-task-id/>", text: "<task-content/>")`
265
+ MCP tool call only -- *NEVER* by executing a shell command.
265
266
 
266
267
  4. If <problem-id/> is set (i.e. the <problem/> was retrieved from
267
268
  `ase_kv_get` in STEP 1.1 via key `ase-issue-<problem-id/>`),
@@ -273,7 +274,7 @@ resolution actually demands, and you *MUST* *NOT* call
273
274
  5. Output a hint with the following <template/>:
274
275
 
275
276
  <template>
276
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan created**
277
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan created**
277
278
  </template>
278
279
 
279
280
  6. Directly pass through control to the next skill:
@@ -28,6 +28,7 @@
28
28
  ○ `ase-code-craft`: Craft Source Code
29
29
  ○ `ase-code-refactor`: Refactor Artifacts
30
30
  ○ `ase-code-resolve`: Resolve Problem
31
+ ○ `ase-code-edit`: Edit Source Code
31
32
  ○ `ase-sync-import`: Import Foreign Sources into Artifact Set
32
33
  ○ `ase-sync-reconcile`: Reconcile Artifact Set to Artifact Set
33
34
  ○ `ase-sync-export`: Export Artifact Set to Side-by-Side Files
@@ -167,7 +167,8 @@ Procedure
167
167
 
168
168
  Apply the generation/update directly to the target artifacts via
169
169
  the `Write`/`Edit` tools. For a `TASK` target, apply it via the
170
- `ase_task_save` tool instead.
170
+ `ase_task_save` MCP tool instead -- *NEVER* write a task plan
171
+ file via `Write`/`Edit` or by executing a shell command.
171
172
 
172
173
  6. Report the performed changes with the following <template/>, listing
173
174
  one bullet line per generated or updated file (with <file/> its
@@ -177,7 +177,9 @@ Procedure
177
177
  parts of an output artifact.
178
178
 
179
179
  Apply the update directly to the output artifacts via the
180
- `Write`/`Edit` tools.
180
+ `Write`/`Edit` tools. For a `TASK` output, apply it via the
181
+ `ase_task_save` MCP tool instead -- *NEVER* write a task plan
182
+ file via `Write`/`Edit` or by executing a shell command.
181
183
 
182
184
  For each formatted output artifact kind, strictly honor its
183
185
  format contract.
@@ -64,8 +64,8 @@ Set <args></args> (set args to empty).
64
64
 
65
65
  <expand name="task-load-content"></expand>
66
66
 
67
- Set <words-before><words/></words-before> (remember the loaded
68
- word count for the strictly-smaller check in step 3).
67
+ Set <content-before><task-content/></content-before> (remember the
68
+ loaded plan content for the strictly-shorter check in step 3).
69
69
 
70
70
  <if condition="the frontmatter of <task-content/> carries a `Created: <text/>` key">
71
71
  Set <timestamp-created><text/></timestamp-created> (extract the
@@ -124,21 +124,21 @@ Set <args></args> (set args to empty).
124
124
  example. If a shortening would change meaning, *keep the
125
125
  longer wording*.
126
126
 
127
- 2. *Persist only if smaller*: calculate the number of words <words/>
128
- of the condensed <task-content/>.
127
+ 2. *Persist only if smaller*: compare the condensed <task-content/>
128
+ against <content-before/>, without counting words.
129
129
 
130
- - <if condition="<words/> is strictly smaller than <words-before/>">
130
+ - <if condition="the condensed <task-content/> is strictly shorter than <content-before/>">
131
131
  <expand name="task-save-content" arg1="plan condensed"></expand>
132
132
  </if>
133
133
 
134
- - <if condition="<words/> is NOT strictly smaller than <words-before/>">
134
+ - <if condition="the condensed <task-content/> is NOT strictly shorter than <content-before/>">
135
135
  Do *not* save and do *not* bump the timestamp. Set
136
- <words><words-before/></words> (report the word count of the
137
- *unchanged* stored plan, not of the discarded condensed one).
136
+ <task-content><content-before/></task-content> (keep the
137
+ *unchanged* stored plan, discard the condensed one).
138
138
  Only output the following <template/>:
139
139
 
140
140
  <template>
141
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan already condensed**
141
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan already condensed**
142
142
  </template>
143
143
  </if>
144
144
 
@@ -162,7 +162,7 @@ Set <args></args> (set args to empty).
162
162
  Only output the following <template/> and then *STOP*.
163
163
 
164
164
  <template>
165
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan condensed -- done**
165
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan condensed -- done**
166
166
  </template>
167
167
 
168
168
  - If <result/> is `EDIT`:
@@ -174,7 +174,7 @@ Set <args></args> (set args to empty).
174
174
  skill once the `Skill` tool was used.
175
175
 
176
176
  <template>
177
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan condensed -- hand-off to edit**
177
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan condensed -- hand-off to edit**
178
178
  </template>
179
179
 
180
180
  - If <result/> is `IMPLEMENT`:
@@ -184,7 +184,7 @@ Set <args></args> (set args to empty).
184
184
  to *apply* the plan.
185
185
 
186
186
  <template>
187
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan condensed -- hand-off to implementation**
187
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan condensed -- hand-off to implementation**
188
188
  </template>
189
189
 
190
190
  - If <result/> is `PREFLIGHT`:
@@ -194,5 +194,5 @@ Set <args></args> (set args to empty).
194
194
  to *apply* the plan.
195
195
 
196
196
  <template>
197
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan condensed -- hand-off to pre-flight**
197
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan condensed -- hand-off to pre-flight**
198
198
  </template>
@@ -245,13 +245,14 @@ Procedure
245
245
 
246
246
  2. Call the `ase_task_save(id: "<part-id/>", text:
247
247
  "<part-content/>")` tool of the `ase` MCP server to persist
248
- the sub-task plan, and calculate the number of words
249
- <part-words/> of <part-content/>. Do not output anything
250
- related to this MCP tool call except the following
251
- <template/>:
248
+ the sub-task plan -- this MCP tool call is the *only*
249
+ permitted way to persist it, *NEVER* write the plan file
250
+ via `Write`/`Edit` or by executing a shell command. Do not
251
+ output anything related to this MCP tool call except the
252
+ following <template/>:
252
253
 
253
254
  <template>
254
- ⧉ **ASE**: ◉ task: **<part-id/>**, ✪ plan: **<part-words/>** words, ▶ status: **sub-task plan created**
255
+ ⧉ **ASE**: ◉ task: **<part-id/>**, ▶ status: **sub-task plan created**
255
256
  </template>
256
257
 
257
258
  4. *Report the overall result* with the following <template/>:
@@ -48,7 +48,17 @@ When refining the plan this way, preserve the overall structure of the
48
48
  plan and only modify what the user actually requested. Do *not* rewrite
49
49
  unrelated sections of the plan.
50
50
 
51
- Calculate the number of words <words/> of <task-content/>.
51
+ <if condition="<task-content/> contains a `## IMPLEMENTATION DRAFT`
52
+ section (from the companion skill `ase-task-preflight`) AND the
53
+ applied <instruction/> changed the plan text *outside* of that
54
+ section">
55
+ The implementation draft was created for the *previous* plan text and
56
+ hence is *stale* now. Remove the entire `## IMPLEMENTATION DRAFT`
57
+ section from <task-content/>, remove the value `preflighted` from the
58
+ `Properties:` frontmatter key (dropping the whole key if it carries no
59
+ values anymore), and set <draft-removed>true</draft-removed>.
60
+ </if>
61
+
52
62
  Set <task-content-dirty>true</task-content-dirty>.
53
63
  </define>
54
64
 
@@ -76,8 +86,7 @@ Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
76
86
  `ase` MCP server and use the `text` field of its response
77
87
  for fresh <timestamp-created/> and <timestamp-modified/>
78
88
  information. Then insert the current <ase-task-id/>,
79
- <timestamp-created/>, and <timestamp-modified/> information
80
- and calculate the number of words <words/> of <task-content/>.
89
+ <timestamp-created/>, and <timestamp-modified/> information.
81
90
  Set <task-content-dirty>true</task-content-dirty>.
82
91
  </define>
83
92
 
@@ -205,21 +214,20 @@ Set <args></args> (set args to empty).
205
214
  </else>
206
215
 
207
216
  Set <task-content-dirty>false</task-content-dirty>.
217
+ Set <draft-removed>false</draft-removed>.
208
218
 
209
219
  - If <text/> starts with `ERROR:` or `WARNING:`:
210
220
  Silently ignore the MCP error.
211
221
  Set <task-content/> to empty.
212
222
  Set <task-render/> to empty.
213
- Set <words/> to "0".
214
223
  Do not output anything.
215
224
 
216
225
  - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
217
226
  Set <task-content><text/></task-content> (set task content to text).
218
- Calculate the number of words <words/> of <task-content/>.
219
227
  Only output the following <template/>:
220
228
 
221
229
  <template>
222
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **<status/>**
230
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **<status/>**
223
231
  </template>
224
232
 
225
233
  2. <if condition="<task-content/> is empty AND <instruction/> is empty">
@@ -267,7 +275,7 @@ Set <args></args> (set args to empty).
267
275
  *STOP* processing this skill:
268
276
 
269
277
  <template>
270
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan preserved**
278
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan preserved**
271
279
  </template>
272
280
 
273
281
  - If <result/> is `OVERWRITE`:
@@ -277,7 +285,7 @@ Set <args></args> (set args to empty).
277
285
  Only output the following <template/> and continue processing:
278
286
 
279
287
  <template>
280
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan overwritten**
288
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan overwritten**
281
289
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇌ instruction: **<instruction/>**, ▶ status: **instruction given**
282
290
  </template>
283
291
 
@@ -288,7 +296,7 @@ Set <args></args> (set args to empty).
288
296
  Only output the following <template/> and continue processing:
289
297
 
290
298
  <template>
291
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan refined**
299
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan refined**
292
300
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇌ instruction: **<instruction/>**, ▶ status: **instruction given**
293
301
  </template>
294
302
 
@@ -302,7 +310,7 @@ Set <args></args> (set args to empty).
302
310
  Only output the following <template/> and continue processing:
303
311
 
304
312
  <template>
305
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan refined**
313
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan refined**
306
314
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇌ instruction: **<instruction/>**, ▶ status: **instruction given**
307
315
  </template>
308
316
  </if>
@@ -321,7 +329,7 @@ Set <args></args> (set args to empty).
321
329
 
322
330
  <template>
323
331
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ⇌ instruction: **<instruction/>**, ▶ status: **instruction given**
324
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan generated**
332
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan generated**
325
333
  </template>
326
334
  </if>
327
335
 
@@ -349,18 +357,32 @@ Set <args></args> (set args to empty).
349
357
  persist the current plan -- <task-content/> always is the
350
358
  *authoring form* of the plan and hence is persisted *as is* --
351
359
  and then set <task-content-dirty>false</task-content-dirty>
352
- again. Finally, set <task-render/> to the `text` *output* field
360
+ again. This `ase_task_save` MCP tool call is the *only*
361
+ permitted way to persist the plan -- *NEVER* write the plan
362
+ file via `Write`/`Edit` or by executing a shell command.
363
+ Finally, set <task-render/> to the `text` *output* field
353
364
  of this `ase_task_save` tool call -- the rendering-prepared form
354
365
  of the just-persisted plan, which is for *display only* and
355
366
  *MUST NOT* be confused with the `text` *argument* passed into
356
367
  that call -- so the rendering in step 3.3 stays consistent across
357
- all loop rounds. Calculate the number of words <words/> of
358
- <task-content/>. Do not output anything related to this MCP tool
368
+ all loop rounds. Do not output anything related to this MCP tool
359
369
  call except the following <template/>:
360
370
 
361
371
  <template>
362
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan saved**
372
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan saved**
363
373
  </template>
374
+
375
+ <if condition="<draft-removed/> is equal `true`">
376
+ Directly *after* this <template/>, reset
377
+ <draft-removed>false</draft-removed> and give the corrective
378
+ hint by expanding the following (which, depending on the
379
+ configured <ase-guidance-level/>, may expand into nothing and
380
+ hence emit no output at all):
381
+
382
+ <ase-tpl-hint level="minimal">
383
+ The `IMPLEMENTATION DRAFT` section became stale through the plan change and was removed -- run `/ase-task-preflight` again to re-create the draft for the changed plan.
384
+ </ase-tpl-hint>
385
+ </if>
364
386
  </if>
365
387
 
366
388
  3. *Render plan*:
@@ -459,7 +481,7 @@ Set <args></args> (set args to empty).
459
481
  and then *STOP*. Do *not* implement the plan.
460
482
 
461
483
  <template>
462
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan finalized -- done**
484
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan finalized -- done**
463
485
  </template>
464
486
 
465
487
  - If <result/> is `GRILL`:
@@ -471,7 +493,7 @@ Set <args></args> (set args to empty).
471
493
  to *grill* the finalized plan.
472
494
 
473
495
  <template>
474
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan finalized -- hand-off to grilling**
496
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan finalized -- hand-off to grilling**
475
497
  </template>
476
498
 
477
499
  - If <result/> is `PREFLIGHT`:
@@ -483,7 +505,7 @@ Set <args></args> (set args to empty).
483
505
  to *apply* the finalized plan.
484
506
 
485
507
  <template>
486
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan finalized -- hand-off to pre-flight**
508
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan finalized -- hand-off to pre-flight**
487
509
  </template>
488
510
 
489
511
  - If <result/> is `IMPLEMENT`:
@@ -495,7 +517,7 @@ Set <args></args> (set args to empty).
495
517
  to *apply* the finalized plan.
496
518
 
497
519
  <template>
498
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan finalized -- hand-off to implementation**
520
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan finalized -- hand-off to implementation**
499
521
  </template>
500
522
 
501
523
  - If <result/> matches `OTHER: <text/>`:
@@ -517,6 +539,6 @@ Set <args></args> (set args to empty).
517
539
  and then *STOP*. Do *not* implement the plan.
518
540
 
519
541
  <template>
520
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan refinement cancelled**
542
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan refinement cancelled**
521
543
  </template>
522
544
 
@@ -19,6 +19,13 @@ through a *chat-driven loop*. The user steers each round via an
19
19
  interactive dialog that offers continued refinement, finalization, or
20
20
  hand-off to implementation or preflight.
21
21
 
22
+ When a refinement changes the plan text while an `IMPLEMENTATION
23
+ DRAFT` section (produced by `ase-task-preflight`) exists, that section
24
+ became *stale* and is *removed* -- together with the `preflighted`
25
+ value of the `Properties:` frontmatter key -- and a hint is emitted
26
+ that `ase-task-preflight` has to be run again to re-create the draft
27
+ for the changed plan.
28
+
22
29
  ## OPTIONS
23
30
 
24
31
  `--plan`|`-p` *option*:
@@ -193,7 +193,7 @@ Set <args>--int-reuse-task</args>.
193
193
  without output of any further information.
194
194
 
195
195
  <template>
196
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- done**
196
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- done**
197
197
  </template>
198
198
 
199
199
  - If <result/> is `EDIT`:
@@ -205,7 +205,7 @@ Set <args>--int-reuse-task</args>.
205
205
  skill once the `Skill` tool was used.
206
206
 
207
207
  <template>
208
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- hand-off to edit**
208
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- hand-off to edit**
209
209
  </template>
210
210
 
211
211
  - If <result/> is `PREFLIGHT`:
@@ -215,7 +215,7 @@ Set <args>--int-reuse-task</args>.
215
215
  to *apply* the plan.
216
216
 
217
217
  <template>
218
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- hand-off to pre-flight**
218
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- hand-off to pre-flight**
219
219
  </template>
220
220
 
221
221
  - If <result/> is `IMPLEMENT`:
@@ -225,5 +225,5 @@ Set <args>--int-reuse-task</args>.
225
225
  to *apply* the plan.
226
226
 
227
227
  <template>
228
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- hand-off to implementation**
228
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- hand-off to implementation**
229
229
  </template>
@@ -162,13 +162,21 @@ Procedure
162
162
  by modifying the *artifacts* with a corresponding, complete
163
163
  *change set*.
164
164
 
165
- For this, primarily follow and honor the task plan in <task-content/>.
165
+ <if condition="<task-content/> contains an `## IMPLEMENTATION DRAFT` section (from skill `ase-task-preflight`)">
166
+ Take over the implementation draft of this section *1:1* as
167
+ the change set: the draft is assumed to have been *reviewed*
168
+ by the user, so you *MUST* *NOT* create a fresh implementation
169
+ from scratch. Apply the draft *verbatim* and *adjust* only
170
+ those parts which actually *fail* -- because a hunk no longer
171
+ applies to meanwhile drifted artifacts, or because the
172
+ verification phase rejects the result. For such adjusted parts,
173
+ and for aspects the draft does not cover at all, follow the
174
+ task plan in <task-content/>.
175
+ </if>
166
176
 
167
- Secondarily, derive hints from the optionally existing
168
- `IMPLEMENTATION DRAFT` section (from skill `ase-task-preflight`)
169
- in <task-content/>. But the specification text in <task-content/> always
170
- overrules the implementation draft in the `IMPLEMENTATION DRAFT`
171
- section of <task-content/>.
177
+ <if condition="<task-content/> contains NO `## IMPLEMENTATION DRAFT` section">
178
+ Follow and honor the task plan in <task-content/>.
179
+ </if>
172
180
 
173
181
  <if condition="<worktree-dir/> is not empty">
174
182
  The change set *MUST* land *exclusively inside* the worktree
@@ -224,12 +232,15 @@ Procedure
224
232
 
225
233
  Finally call the `ase_task_save(id: "<ase-task-id/>", text:
226
234
  "<task-content/>")` tool of the `ase` MCP server to persist the
227
- updated task plan. Do not output anything in this sub-step.
235
+ updated task plan. This `ase_task_save` MCP tool call is the
236
+ *only* permitted way to persist the plan -- *NEVER* write the
237
+ plan file via `Write`/`Edit` or by executing a shell command.
238
+ Do not output anything in this sub-step.
228
239
 
229
240
  3. Only output the following <template/>:
230
241
 
231
242
  <template>
232
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan implemented**
243
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan implemented**
233
244
  </template>
234
245
 
235
246
  4. <if condition="<worktree-dir/> is not empty">
@@ -260,7 +271,7 @@ Procedure
260
271
  Only output the following <template/> and then *STOP*.
261
272
 
262
273
  <template>
263
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan implemented -- done**
274
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan implemented -- done**
264
275
  </template>
265
276
 
266
277
  - If <result/> is `DELETE`:
@@ -275,6 +286,6 @@ Procedure
275
286
  current skill once the `Skill` tool was used.
276
287
 
277
288
  <template>
278
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan implemented -- hand-off to delete task**
289
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan implemented -- hand-off to delete task**
279
290
  </template>
280
291
 
@@ -16,8 +16,10 @@
16
16
  The `ase-task-implement` skill performs the *final implementation* of
17
17
  a task plan by modifying the corresponding *artifacts* with a complete
18
18
  *change set*. The plan is loaded and any optional `IMPLEMENTATION DRAFT`
19
- section produced by `ase-task-preflight` is used as a hint -- the plain
20
- plan content always overrules the draft. Afterwards the plan's
19
+ section produced by `ase-task-preflight` is taken over *1:1* as the
20
+ change set -- the draft is assumed to be user-reviewed, so no fresh
21
+ implementation is created and only parts which actually fail are
22
+ adjusted, guided by the plain plan content. Afterwards the plan's
21
23
  `Properties:` frontmatter key gains the value `implemented` (plus
22
24
  `verified`, if the verification phase actually ran and succeeded), and
23
25
  its `Status:` key becomes `COMPLETED` if the change set was applied
@@ -72,6 +72,18 @@ Procedure
72
72
  which *would* fully implement the task plan <task-content/>. Store
73
73
  this artifact change set in *unified diff* format in <unified-diff/>.
74
74
 
75
+ Create this draft with the *same rigor* as the final
76
+ implementation of the companion skill `ase-task-implement`,
77
+ because that skill later takes the draft over *1:1* -- the user
78
+ is assumed to review the draft in between. Hence *read* the
79
+ current content of *every* artifact the draft touches before
80
+ drafting its hunks, so all context lines match the artifacts
81
+ *exactly* and the diff would apply *cleanly*, and honor the
82
+ task plan and the internalized tenets just as the final
83
+ implementation would. Only the actual modification of the
84
+ artifacts and the verification phase are deferred to
85
+ `ase-task-implement`.
86
+
75
87
  2. Append this artifact change set <unified-diff/> to the end
76
88
  of the <task-content/> with the following <template/>. If a section
77
89
  named `## IMPLEMENTATION DRAFT` already exists from a
@@ -112,12 +124,14 @@ Procedure
112
124
 
113
125
  4. Finally, call the `ase_task_save(id: "<ase-task-id/>",
114
126
  text: "<task-content/>")` tool of the `ase` MCP server to save the updated
115
- task plan content. Calculate the number of words <words/> of
116
- <task-content/>. Do not output anything related to this MCP tool call
127
+ task plan content. This `ase_task_save` MCP tool call is the
128
+ *only* permitted way to persist the plan -- *NEVER* write the
129
+ plan file via `Write`/`Edit` or by executing a shell command.
130
+ Do not output anything related to this MCP tool call
117
131
  except the following <template/>:
118
132
 
119
133
  <template>
120
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated**
134
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated**
121
135
  </template>
122
136
 
123
137
  4. **Decide Next Step:**
@@ -139,7 +153,7 @@ Procedure
139
153
  Only output the following <template/> and then *STOP*.
140
154
 
141
155
  <template>
142
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- done**
156
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- done**
143
157
  </template>
144
158
 
145
159
  - If <result/> is `EDIT`:
@@ -18,7 +18,11 @@ draft for a corresponding, complete *artifact change set* in
18
18
  *unified diff* format. The draft is appended to the task plan as
19
19
  an `IMPLEMENTATION DRAFT` section (replacing any previous draft) and
20
20
  the plan's `Properties:` frontmatter key gains the value `preflighted`.
21
- No source files are modified.
21
+ No source files are modified. The draft is produced under the *same
22
+ tenets* and with the *same rigor* as a final implementation, because
23
+ `ase-task-implement` later takes it over *1:1* after user review --
24
+ only the actual artifact modification and the verification phase
25
+ are deferred.
22
26
 
23
27
  The *kind of change* stated by the plan's `Kind:` frontmatter key
24
28
  (`CRAFTING`, `REFACTORING`, or `RESOLVING`) selects which
@@ -139,7 +139,7 @@ Procedure
139
139
  Only output the following <template/> and then *STOP*.
140
140
 
141
141
  <template>
142
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan rebooted -- done**
142
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan rebooted -- done**
143
143
  </template>
144
144
 
145
145
  - If <result/> is `EDIT`:
@@ -71,11 +71,10 @@ Procedure
71
71
 
72
72
  - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
73
73
  Set <task-content><text/></task-content> (set task content to text).
74
- Calculate the number of words <words/> of <task-content/>.
75
74
  Only output the following <template/>:
76
75
 
77
76
  <template>
78
- ⧉ **ASE**: ◉ task: **<id/>**, ✪ plan: **<words/>** words, ▶ status: **plan loaded**
77
+ ⧉ **ASE**: ◉ task: **<id/>**, ▶ status: **plan loaded**
79
78
  </template>
80
79
 
81
80
  2. <if condition="<task-content/> is not empty">