@rse/ase 1.0.7 → 2.0.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.
Files changed (279) hide show
  1. package/dst/ase-agent-definition-api.d.ts +184 -0
  2. package/dst/ase-agent-definition-api.js +6 -0
  3. package/dst/ase-agent-definition-builtin/condenser.js +42 -0
  4. package/dst/ase-agent-definition-builtin/editor.js +45 -0
  5. package/dst/ase-agent-definition-builtin/estimator.js +98 -0
  6. package/dst/ase-agent-definition-builtin/implementer.js +121 -0
  7. package/dst/ase-agent-definition-builtin/integrator.js +56 -0
  8. package/dst/ase-agent-definition-builtin/qualifier.js +61 -0
  9. package/dst/ase-agent-definition-builtin/rebooter.js +41 -0
  10. package/dst/ase-agent-definition-builtin/researcher.js +77 -0
  11. package/dst/ase-agent-definition-core.js +827 -0
  12. package/dst/ase-agent-fleet.js +772 -0
  13. package/dst/ase-agent-process.js +232 -0
  14. package/dst/ase-agent-relay-client.js +509 -0
  15. package/dst/ase-agent-relay-core.js +213 -0
  16. package/dst/ase-agent-relay-server-bind.js +242 -0
  17. package/dst/ase-agent-relay-server-cli.js +50 -0
  18. package/dst/ase-agent-runtime-claim.js +189 -0
  19. package/dst/ase-agent-runtime-engine.js +1100 -0
  20. package/dst/ase-agent-runtime-exec.js +275 -0
  21. package/dst/ase-agent-runtime-phase.js +581 -0
  22. package/dst/ase-agent-runtime-request.js +272 -0
  23. package/dst/ase-agent-runtime-tool.js +207 -0
  24. package/dst/ase-agent-runtime.js +1316 -0
  25. package/dst/ase-agent.js +65 -0
  26. package/dst/ase-artifact.js +6 -5
  27. package/dst/ase-config-core.js +465 -0
  28. package/dst/ase-config-schema.js +351 -0
  29. package/dst/ase-config-scope.js +172 -0
  30. package/dst/ase-config.js +25 -585
  31. package/dst/ase-hook.js +228 -111
  32. package/dst/ase-lib-daemon-cli.js +130 -0
  33. package/dst/ase-lib-hash.js +20 -0
  34. package/dst/{ase-log.js → ase-lib-log.js} +40 -7
  35. package/dst/ase-lib-server-bind.js +115 -0
  36. package/dst/ase-lib-server-cli.js +474 -0
  37. package/dst/{ase-table.js → ase-lib-table.js} +1 -1
  38. package/dst/{ase-version.js → ase-lib-version.js} +3 -0
  39. package/dst/ase-man.js +96 -0
  40. package/dst/ase-mcp.js +166 -13
  41. package/dst/{ase-getopt.js → ase-service-getopt.js} +82 -80
  42. package/dst/{ase-markdown.js → ase-service-markdown.js} +18 -11
  43. package/dst/ase-service-otel.js +1246 -0
  44. package/dst/{ase-skills.js → ase-service-skills.js} +29 -64
  45. package/dst/ase-service-state.js +101 -0
  46. package/dst/ase-service.js +251 -76
  47. package/dst/ase-setup-common.js +141 -0
  48. package/dst/ase-setup-mcp.js +359 -0
  49. package/dst/ase-setup-settings.js +837 -0
  50. package/dst/ase-setup.js +113 -869
  51. package/dst/ase-spec.js +31 -19
  52. package/dst/ase-statusline.js +108 -43
  53. package/dst/ase-task-board-core.js +739 -0
  54. package/dst/ase-task-board-filter.js +127 -0
  55. package/dst/ase-task-board-flow.js +237 -0
  56. package/dst/ase-task-board-graph.js +497 -0
  57. package/dst/ase-task-board-stats.js +263 -0
  58. package/dst/ase-task-board-tui-control.js +775 -0
  59. package/dst/ase-task-board-tui-model.js +1008 -0
  60. package/dst/ase-task-board-tui-popup.js +626 -0
  61. package/dst/ase-task-board-tui-style.js +106 -0
  62. package/dst/ase-task-board-tui-view.js +847 -0
  63. package/dst/ase-task-board-tui.js +189 -0
  64. package/dst/ase-task-board-web-client.css +1 -0
  65. package/dst/ase-task-board-web-client.html +20 -0
  66. package/dst/ase-task-board-web-client.js +81 -0
  67. package/dst/ase-task-board-web-server.js +823 -0
  68. package/dst/ase-task-board.js +134 -0
  69. package/dst/ase-task-format.js +757 -0
  70. package/dst/ase-task-request.js +208 -0
  71. package/dst/ase-task-store-client.js +495 -0
  72. package/dst/ase-task-store-core.js +804 -0
  73. package/dst/ase-task-store-issues.js +237 -0
  74. package/dst/ase-task-store-plugin-api.js +6 -0
  75. package/dst/ase-task-store-plugin-ase.js +484 -0
  76. package/dst/ase-task-store-plugin-delegate.js +137 -0
  77. package/dst/ase-task-store-plugin-gitea.js +666 -0
  78. package/dst/ase-task-store-plugin-github.js +696 -0
  79. package/dst/ase-task-store-plugin-gitlab.js +668 -0
  80. package/dst/ase-task-store-server-bind.js +538 -0
  81. package/dst/ase-task-store-server-cli.js +154 -0
  82. package/dst/ase-task.js +1335 -357
  83. package/dst/{ase-compat.js → ase-util-compat.js} +2 -2
  84. package/dst/{ase-diagram.js → ase-util-diagram.js} +107 -32
  85. package/dst/{ase-meta.js → ase-util-meta.js} +2 -2
  86. package/dst/{ase-metric.js → ase-util-metric.js} +2 -2
  87. package/dst/{ase-mint.js → ase-util-mint.js} +19 -12
  88. package/dst/{ase-worktree.js → ase-util-worktree.js} +30 -19
  89. package/dst/ase-util.js +20 -0
  90. package/dst/ase.js +108 -32
  91. package/dst/man/ase-agent-adhoc.1 +515 -0
  92. package/dst/man/ase-agent-condenser.1 +193 -0
  93. package/dst/man/ase-agent-editor.1 +212 -0
  94. package/dst/man/ase-agent-estimator.1 +214 -0
  95. package/dst/man/ase-agent-fleet.1 +185 -0
  96. package/dst/man/ase-agent-implementer.1 +233 -0
  97. package/dst/man/ase-agent-integrator.1 +213 -0
  98. package/dst/man/ase-agent-qualifier.1 +214 -0
  99. package/dst/man/ase-agent-rebooter.1 +193 -0
  100. package/dst/man/ase-agent-relay.1 +128 -0
  101. package/dst/man/ase-agent-researcher.1 +217 -0
  102. package/dst/man/ase-agent.1 +264 -0
  103. package/dst/man/ase-artifact-list.1 +38 -0
  104. package/dst/man/ase-artifact-name.1 +39 -0
  105. package/dst/man/ase-artifact.1 +56 -0
  106. package/dst/man/ase-config-delete.1 +45 -0
  107. package/dst/man/ase-config-edit.1 +48 -0
  108. package/dst/man/ase-config-get.1 +46 -0
  109. package/dst/man/ase-config-init.1 +60 -0
  110. package/dst/man/ase-config-list.1 +42 -0
  111. package/dst/man/ase-config-set.1 +52 -0
  112. package/dst/man/ase-config.1 +225 -0
  113. package/dst/man/ase-hook-permission-request.1 +36 -0
  114. package/dst/man/ase-hook-pre-tool-use.1 +59 -0
  115. package/dst/man/ase-hook-session-end.1 +47 -0
  116. package/dst/man/ase-hook-session-persona.1 +37 -0
  117. package/dst/man/ase-hook-session-start.1 +81 -0
  118. package/dst/man/ase-hook-stop.1 +34 -0
  119. package/dst/man/ase-hook-user-prompt-submit.1 +34 -0
  120. package/dst/man/ase-hook.1 +51 -0
  121. package/dst/man/ase-man.1 +67 -0
  122. package/dst/man/ase-mcp.1 +61 -0
  123. package/dst/man/ase-service-log.1 +43 -0
  124. package/dst/man/ase-service-send.1 +47 -0
  125. package/dst/man/ase-service-start.1 +54 -0
  126. package/dst/man/ase-service-status.1 +46 -0
  127. package/dst/man/ase-service-stop.1 +37 -0
  128. package/dst/man/ase-service.1 +85 -0
  129. package/dst/man/ase-setup-disable.1 +44 -0
  130. package/dst/man/ase-setup-enable.1 +45 -0
  131. package/dst/man/ase-setup-install.1 +73 -0
  132. package/dst/man/ase-setup-mcp.1 +124 -0
  133. package/dst/man/ase-setup-status.1 +60 -0
  134. package/dst/man/ase-setup-statusline.1 +92 -0
  135. package/dst/man/ase-setup-telemetry.1 +92 -0
  136. package/dst/man/ase-setup-uninstall.1 +59 -0
  137. package/dst/man/ase-setup-update.1 +64 -0
  138. package/dst/man/ase-setup.1 +93 -0
  139. package/dst/man/ase-spec-export.1 +62 -0
  140. package/dst/man/ase-spec-lint.1 +40 -0
  141. package/dst/man/ase-spec-preview.1 +40 -0
  142. package/dst/man/ase-spec.1 +46 -0
  143. package/dst/man/ase-statusline.1 +189 -0
  144. package/dst/man/ase-task-assign.1 +71 -0
  145. package/dst/man/ase-task-board.1 +384 -0
  146. package/dst/man/ase-task-delete.1 +35 -0
  147. package/dst/man/ase-task-edit.1 +46 -0
  148. package/dst/man/ase-task-idscheme.1 +65 -0
  149. package/dst/man/ase-task-lifecycle.1 +57 -0
  150. package/dst/man/ase-task-list.1 +47 -0
  151. package/dst/man/ase-task-load.1 +36 -0
  152. package/dst/man/ase-task-newid.1 +61 -0
  153. package/dst/man/ase-task-purge.1 +37 -0
  154. package/dst/man/ase-task-rename.1 +44 -0
  155. package/dst/man/ase-task-request.1 +61 -0
  156. package/dst/man/ase-task-save.1 +48 -0
  157. package/dst/man/ase-task-status.1 +55 -0
  158. package/dst/man/ase-task-store.1 +194 -0
  159. package/dst/man/ase-task-view.1 +40 -0
  160. package/dst/man/ase-task.1 +160 -0
  161. package/dst/man/ase-util-compat.1 +25 -0
  162. package/dst/man/ase-util-diagram.1 +76 -0
  163. package/dst/man/ase-util-meta.1 +45 -0
  164. package/dst/man/ase-util-metric.1 +54 -0
  165. package/dst/man/ase-util-mint.1 +59 -0
  166. package/dst/man/ase-util-worktree.1 +72 -0
  167. package/dst/man/ase-util.1 +50 -0
  168. package/dst/man/ase.1 +124 -0
  169. package/package.json +79 -21
  170. package/plugin/.claude-plugin/plugin.json +1 -1
  171. package/plugin/.codex-plugin/plugin.json +1 -1
  172. package/plugin/.github/plugin/plugin.json +1 -1
  173. package/plugin/agents/ase-meta-diagram.md +12 -8
  174. package/plugin/agents/ase-repo-review.md +322 -0
  175. package/plugin/hooks/hooks-codex.json +5 -0
  176. package/plugin/hooks/hooks-copilot.json +5 -0
  177. package/plugin/hooks/hooks.json +8 -0
  178. package/plugin/meta/ase-common-approach.md +117 -0
  179. package/plugin/meta/ase-common-changeset.md +256 -0
  180. package/plugin/meta/ase-common-code.md +10 -173
  181. package/plugin/meta/ase-common-grill.md +317 -0
  182. package/plugin/meta/ase-common-resolve.md +305 -0
  183. package/plugin/meta/ase-common-task.md +83 -4
  184. package/plugin/meta/ase-constitution.md +0 -2
  185. package/plugin/meta/ase-format-specbook.md +208 -25
  186. package/plugin/meta/ase-format-specbook.yaml +242 -851
  187. package/plugin/meta/ase-format-task.md +669 -125
  188. package/plugin/meta/ase-persona.md +3 -4
  189. package/plugin/meta/ase-skill.md +9 -0
  190. package/plugin/mods/ase-mods.ts +409 -0
  191. package/plugin/mods/claude-code.d.ts +13417 -0
  192. package/plugin/skills/ase-arch-analyze/SKILL.md +1 -1
  193. package/plugin/skills/ase-arch-analyze/help.md +2 -2
  194. package/plugin/skills/ase-code-analyze/SKILL.md +59 -8
  195. package/plugin/skills/ase-code-analyze/help.md +29 -4
  196. package/plugin/skills/ase-code-edit/SKILL.md +107 -181
  197. package/plugin/skills/ase-code-edit/help.md +118 -31
  198. package/plugin/skills/ase-code-lint/SKILL.md +64 -13
  199. package/plugin/skills/ase-code-lint/help.md +32 -2
  200. package/plugin/skills/ase-docs-proofread/SKILL.md +4 -4
  201. package/plugin/skills/ase-docs-proofread/help.md +1 -1
  202. package/plugin/skills/ase-docs-refine/SKILL.md +4 -4
  203. package/plugin/skills/ase-docs-shorten/SKILL.md +4 -4
  204. package/plugin/skills/ase-help-intent/data.md +2164 -1087
  205. package/plugin/skills/ase-help-intent/help.md +1 -1
  206. package/plugin/skills/ase-help-skill/catalog.md +12 -9
  207. package/plugin/skills/ase-meta-brainstorm/SKILL.md +1 -1
  208. package/plugin/skills/ase-meta-config/SKILL.md +3 -4
  209. package/plugin/skills/ase-meta-config/help.md +31 -10
  210. package/plugin/skills/ase-meta-mint/SKILL.md +5 -5
  211. package/plugin/skills/ase-meta-mint/help.md +10 -5
  212. package/plugin/skills/ase-meta-why/help.md +1 -1
  213. package/plugin/skills/ase-meta-workflow/SKILL.md +7 -7
  214. package/plugin/skills/ase-meta-workflow/help.md +4 -4
  215. package/plugin/skills/ase-meta-workflow/sample.md +3 -3
  216. package/plugin/skills/ase-meta-workflow/workflow.txt +22 -18
  217. package/plugin/skills/{ase-meta-changelog → ase-repo-changelog}/SKILL.md +4 -3
  218. package/plugin/skills/{ase-meta-changelog → ase-repo-changelog}/help.md +5 -5
  219. package/plugin/skills/{ase-meta-commit → ase-repo-commit}/SKILL.md +6 -6
  220. package/plugin/skills/{ase-meta-commit → ase-repo-commit}/help.md +5 -5
  221. package/plugin/skills/{ase-meta-diff → ase-repo-diff}/SKILL.md +6 -6
  222. package/plugin/skills/{ase-meta-diff → ase-repo-diff}/help.md +8 -8
  223. package/plugin/skills/{ase-code-dissect → ase-repo-dissect}/SKILL.md +19 -19
  224. package/plugin/skills/{ase-code-dissect → ase-repo-dissect}/help.md +10 -12
  225. package/plugin/skills/ase-repo-merge/SKILL.md +346 -0
  226. package/plugin/skills/ase-repo-merge/help.md +107 -0
  227. package/plugin/skills/ase-repo-resolve/SKILL.md +158 -0
  228. package/plugin/skills/ase-repo-resolve/help.md +102 -0
  229. package/plugin/skills/ase-repo-review/SKILL.md +406 -0
  230. package/plugin/skills/ase-repo-review/help.md +181 -0
  231. package/plugin/skills/ase-spec-edit/SKILL.md +117 -183
  232. package/plugin/skills/ase-spec-edit/help.md +107 -26
  233. package/plugin/skills/ase-sync-reconcile/help.md +1 -1
  234. package/plugin/skills/ase-task-assign/SKILL.md +111 -0
  235. package/plugin/skills/ase-task-assign/help.md +119 -0
  236. package/plugin/skills/ase-task-condense/SKILL.md +21 -21
  237. package/plugin/skills/ase-task-condense/help.md +12 -10
  238. package/plugin/skills/ase-task-delete/SKILL.md +1 -1
  239. package/plugin/skills/ase-task-dissect/SKILL.md +71 -48
  240. package/plugin/skills/ase-task-dissect/help.md +10 -9
  241. package/plugin/skills/ase-task-edit/SKILL.md +379 -94
  242. package/plugin/skills/ase-task-edit/help.md +95 -22
  243. package/plugin/skills/ase-task-estimate/SKILL.md +492 -0
  244. package/plugin/skills/ase-task-estimate/help.md +158 -0
  245. package/plugin/skills/ase-task-grill/SKILL.md +246 -138
  246. package/plugin/skills/ase-task-grill/help.md +129 -26
  247. package/plugin/skills/ase-task-id/SKILL.md +8 -1
  248. package/plugin/skills/ase-task-id/help.md +6 -3
  249. package/plugin/skills/ase-task-implement/SKILL.md +535 -145
  250. package/plugin/skills/ase-task-implement/help.md +138 -47
  251. package/plugin/skills/ase-task-integrate/SKILL.md +549 -0
  252. package/plugin/skills/ase-task-integrate/help.md +187 -0
  253. package/plugin/skills/ase-task-list/SKILL.md +55 -23
  254. package/plugin/skills/ase-task-list/help.md +45 -21
  255. package/plugin/skills/ase-task-reboot/SKILL.md +84 -43
  256. package/plugin/skills/ase-task-reboot/help.md +28 -8
  257. package/plugin/skills/ase-task-rename/SKILL.md +10 -2
  258. package/plugin/skills/ase-task-research/SKILL.md +386 -0
  259. package/plugin/skills/ase-task-research/help.md +102 -0
  260. package/plugin/skills/ase-task-status/SKILL.md +137 -0
  261. package/plugin/skills/ase-task-status/help.md +80 -0
  262. package/plugin/skills/ase-task-view/SKILL.md +49 -24
  263. package/plugin/skills/ase-task-view/help.md +19 -9
  264. package/plugin/agents/ase-meta-review.md +0 -187
  265. package/plugin/skills/ase-code-craft/SKILL.md +0 -264
  266. package/plugin/skills/ase-code-craft/help.md +0 -122
  267. package/plugin/skills/ase-code-refactor/SKILL.md +0 -232
  268. package/plugin/skills/ase-code-refactor/help.md +0 -109
  269. package/plugin/skills/ase-code-resolve/SKILL.md +0 -289
  270. package/plugin/skills/ase-code-resolve/help.md +0 -116
  271. package/plugin/skills/ase-meta-review/SKILL.md +0 -210
  272. package/plugin/skills/ase-meta-review/help.md +0 -96
  273. package/plugin/skills/ase-task-preflight/SKILL.md +0 -166
  274. package/plugin/skills/ase-task-preflight/help.md +0 -82
  275. /package/dst/{ase-ignore.js → ase-lib-ignore.js} +0 -0
  276. /package/dst/{ase-stdio.js → ase-lib-stdio.js} +0 -0
  277. /package/dst/{ase-kv.js → ase-service-kv.js} +0 -0
  278. /package/dst/{ase-sleep.js → ase-service-sleep.js} +0 -0
  279. /package/dst/{ase-timestamp.js → ase-service-timestamp.js} +0 -0
@@ -0,0 +1,158 @@
1
+
2
+ ## NAME
3
+
4
+ `ase-task-estimate` - Estimate the Effort of a Task Plan
5
+
6
+ ## SYNOPSIS
7
+
8
+ `ase-task-estimate`
9
+ [`--help`|`-h`]
10
+ [`--force`|`-f`]
11
+ [`--dry-run`|`-d`]
12
+ [`--all`|`-a`]
13
+ [*id* ...]
14
+
15
+ `ase-task-estimate`
16
+ `--calibrate`|`-c`
17
+ [`--save`|`-s`]
18
+
19
+ ## DESCRIPTION
20
+
21
+ The `ase-task-estimate` skill *estimates* the effort of task plans and
22
+ stores it in their `Effort:` frontmatter key. The effort is the expected
23
+ *human time* of the *entire* lifecycle of a task (including its
24
+ planning), matching the human time `time.hr` booked on the usage
25
+ attachment of the task (see `ase-task-assign`), expressed as one of the
26
+ T-shirt sizes `XS`, `S`, `M`, `L`, or `XL`. The sizes are bands on a
27
+ *logarithmic* scale with the upper bounds `15`, `60`, `240`, and `960`
28
+ human minutes for `XS` to `L` (configuration `project.task.effort.scale`),
29
+ while `XL` is open-ended. A task without an `Effort:` key is *not
30
+ estimated*.
31
+
32
+ The estimation of a plan combines:
33
+
34
+ - an *attention score*: the weighted number of the distinct
35
+ requirements, behaviors, or changes stated by its checklist items
36
+ (`DOM` 5.0, `IFC` 4.0, `ARC` 3.0, `IMP` 1.0, `REG` 0.5, `CON` 1.0),
37
+ converted via `project.task.effort.factor` (default: `1`) human
38
+ minutes per point,
39
+
40
+ - a *volume score*: the code impact of its `ARC` and `IMP` items,
41
+ predicted read-only from the plan and the code base (never measured
42
+ from an already existing change set), converted via
43
+ `project.task.effort.file` (default: `1`) human review minutes per
44
+ touched file and `project.task.effort.line` (default: `0.025`)
45
+ human minutes per predicted changed line, which also cover the edge
46
+ cases and polishing no plan describes, where a newly written line
47
+ weighs three times a changed one,
48
+
49
+ - a *risk surcharge*: 20% more per applying risk out of `dependency`,
50
+ `ambiguity`, `untested`, `concurrency`, `security`, and
51
+ `persistence`, but at most 40% in total, where risks applying to
52
+ virtually every task of the project do not count,
53
+
54
+ - an *iteration multiplier*: `project.task.effort.iteration`
55
+ (default: `2.5`) times the minutes for a task whose main
56
+ deliverable is an interactive or visual user interface, as such
57
+ work needs many rounds of post-adjustment,
58
+
59
+ - a *plausibility check*: a comparable realization already existing
60
+ in the code base, whose deviating size lowers the reported
61
+ *confidence*, and
62
+
63
+ - *analogues*: finished tasks with an effort and a usage attachment,
64
+ whose disagreement lowers the reported *confidence*.
65
+
66
+ Cancelled (`[-]`) and deferred (`[>]`) items never count. The skill
67
+ reports the size, the confidence, and the main drivers of each
68
+ estimation, and for `XL` additionally warns and suggests splitting the
69
+ task via `ase-task-dissect` -- an `XL` effort never blocks the
70
+ lifecycle.
71
+
72
+ The effort is *bound* to the plan content it was given for: once the
73
+ plan content changes, the effort becomes *invalid* and is dropped, while
74
+ mere checkbox state changes and whitespace-only edits keep it. Hence,
75
+ an estimation never needs to be cleaned up by hand. Writing the effort
76
+ neither changes the `Modified:` key nor the lifecycle status of a task.
77
+ Empty plans and explicit epic tasks (whose effort is the sum of their
78
+ member tasks) are skipped, and so are tasks already carrying a valid
79
+ effort, unless `--force` is given.
80
+
81
+ With `--calibrate`, the skill instead re-estimates the successfully
82
+ finished tasks with the *current* rates and compares the results with
83
+ their *actual* human time (only tasks with at least `5` human minutes
84
+ count, as agent-driven tasks book little human time), so a repeated
85
+ calibration converges, and reports the estimated vs. actual band matrix,
86
+ the hit rate, the bias, the best-fitting rates (factor, file, and line
87
+ minutes), and alternatively fitting scale bounds.
88
+
89
+ The `ase agent estimator` command estimates the tasks automatically in
90
+ the background, and with `--mode request` on request, in any unfinished
91
+ status, via `ase task request <id> estimate <prompt>` or key `R` of the
92
+ task boards.
93
+
94
+ ## OPTIONS
95
+
96
+ - `--force`|`-f`:
97
+ Re-estimate tasks which already carry a valid effort.
98
+
99
+ - `--dry-run`|`-d`:
100
+ Estimate and report only, but do not store the effort.
101
+
102
+ - `--all`|`-a`:
103
+ Estimate all unfinished tasks without a valid effort (with `--force`,
104
+ all unfinished tasks), instead of the current or given ones.
105
+
106
+ - `--calibrate`|`-c`:
107
+ Report the calibration of the estimation against the finished tasks
108
+ instead of estimating any task.
109
+
110
+ - `--save`|`-s`:
111
+ Together with `--calibrate`, store the fitted rates as
112
+ `project.task.effort.factor`, `project.task.effort.file`, and
113
+ `project.task.effort.line` on the `project` scope. The fitted scale
114
+ bounds always stay a suggestion only.
115
+
116
+ ## ARGUMENTS
117
+
118
+ - *id* ...:
119
+ The unique identifiers of the tasks to estimate. If omitted (and
120
+ without `--all`), the *current* task is estimated.
121
+
122
+ ## SCENARIOS
123
+
124
+ - You want to know how much human time a planned task will need
125
+ - You want to size all open tasks for planning a sprint or release
126
+ - You want to check whether a task is too large and should be split
127
+ - You want to tune the estimation to the actual pace of your team
128
+
129
+ ## EXAMPLES
130
+
131
+ Estimate the current task plan:
132
+
133
+ ```text
134
+ ❯ /ase-task-estimate
135
+ ```
136
+
137
+ Estimate all unestimated tasks, without storing the results:
138
+
139
+ ```text
140
+ ❯ /ase-task-estimate --all --dry-run
141
+ ```
142
+
143
+ Re-estimate two specific tasks:
144
+
145
+ ```text
146
+ ❯ /ase-task-estimate --force export-json import-csv
147
+ ```
148
+
149
+ Calibrate the estimation and store the fitted rates:
150
+
151
+ ```text
152
+ ❯ /ase-task-estimate --calibrate --save
153
+ ```
154
+
155
+ ## SEE ALSO
156
+
157
+ [`ase-task-view`](../ase-task-view/help.md), [`ase-task-list`](../ase-task-list/help.md), [`ase-task-dissect`](../ase-task-dissect/help.md),
158
+ [`ase-task-assign`](../ase-task-assign/help.md), [`ase-meta-config`](../ase-meta-config/help.md).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-task-grill
3
- argument-hint: "[--help|-h] [--rounds|-r <n>] [--next|-n <option>[,...]] [<id>]"
3
+ argument-hint: "[--help|-h] [--rounds|-r <n>] [--until|-u MUST|SHOULD|MAY] [--perspective|-p <perspective>] [--ground|-G] [--focus|-f <section>[,...]] [--force|-F] [--next|-n <option>[,...]] [<id>]"
4
4
  description: >
5
5
  Interview the user relentlessly about the task plan until reaching a
6
6
  shared understanding, resolving each branch of the question decision
@@ -22,7 +22,7 @@ Iteratively Grill a Task Plan
22
22
 
23
23
  <expand name="getopt"
24
24
  arg1="ase-task-grill"
25
- arg2="--rounds|-r=1 --next|-n=(none|DONE|EDIT|IMPLEMENT|PREFLIGHT)... --int-reuse-task">
25
+ arg2="--rounds|-r=1 --until|-u=(MUST|SHOULD|MAY) --perspective|-p= --ground|-G --focus|-f=(all|SPECIFICATION|SPEC|DESIGN|DES|VERIFICATION|VER)... --force|-F --next|-n=(none|DONE|GRILL|EDIT|IMPLEMENT|DRAFT)... --int-reuse-task">
26
26
  $ARGUMENTS
27
27
  </expand>
28
28
 
@@ -61,7 +61,31 @@ Set <args>--int-reuse-task</args>.
61
61
  ⧉ **ASE**: ☻ skill: **ase-task-grill**, ▶ ERROR: invalid `--rounds` value: **<getopt-option-rounds/>**
62
62
  </template>
63
63
 
64
- 3. React on task id:
64
+ 3. Treat <getopt-option-focus/> as a comma-separated list of
65
+ *section tokens*. Trim and upper-case every token, then expand
66
+ the abbreviations `SPEC`, `DES`, and `VER` to `SPECIFICATION`,
67
+ `DESIGN`, and `VERIFICATION`, and expand the sentinel `ALL`
68
+ (the default) to `SPECIFICATION,DESIGN,VERIFICATION`. Set
69
+ <sections/> to the resulting list, *keeping the given order*.
70
+ The getopt parser validates only the *first* token, so you
71
+ *MUST* validate each token yourself: if any token is *empty*,
72
+ *not* one of the recognized sections or abbreviations, or
73
+ results in a section already present in <sections/>, bind
74
+ <token/> to that offending token, then only output the
75
+ following <template/> and immediately *STOP* processing the
76
+ entire current skill:
77
+
78
+ <template>
79
+ ⧉ **ASE**: ☻ skill: **ase-task-grill**, ▶ ERROR: invalid `--focus` token: **<token/>**
80
+ </template>
81
+
82
+ Each section in <sections/> selects its *focus areas* of the
83
+ grilling: `SPECIFICATION` selects `DOMAIN` and `INTERFACE`,
84
+ `DESIGN` selects `ARCHITECTURE` and `IMPLEMENTATION`, and
85
+ `VERIFICATION` selects `REGRESSION` and `CONFIRMATION`. Do not
86
+ output anything.
87
+
88
+ 4. React on task id:
65
89
 
66
90
  <expand name="task-react-id" arg1="ase-task-grill"></expand>
67
91
 
@@ -72,166 +96,226 @@ Set <args>--int-reuse-task</args>.
72
96
  <expand name="task-load-content"></expand>
73
97
 
74
98
  2. <if condition="<task-content/> is empty">
75
- Complain and tell the user to use the `ase-code-resolve`,
76
- `ase-code-refactor`, `ase-code-craft`, or `ase-task-edit` skills
99
+ Complain and tell the user to use the `ase-task-edit` skill
77
100
  first to create a task plan. Then immediately stop processing
78
101
  this skill.
79
102
  </if>
80
103
 
81
- 3. **Iterate Over Task Plan Aspects:**
104
+ 3. Determine the *grilling scope* of each section in <sections/>,
105
+ in order to grill an *already grilled* section again *only* where
106
+ questions are still *open*:
82
107
 
83
- 1. Understand what "grilling" is about:
84
-
85
- <expand name="grill-understanding" arg1="the task plan in <task-content/>"></expand>
108
+ - If <getopt-option-force/> is `true`, *ignore* any
109
+ `grilled:<section/>` tag: the scope of *every* section is the
110
+ *entire* section, so already grilled sections are *re-grilled*
111
+ completely. Skip the following two cases.
86
112
 
87
- 2. Perform <getopt-option-rounds/> grilling *rounds*, numbered
88
- <m/> (1-<getopt-option-rounds/>). Each round starts *from
89
- scratch* from *only* the *current* <task-content/> -- as
90
- updated by all previous rounds -- and *forgets* all questions
91
- and answers gathered in previous rounds.
92
-
93
- For each round:
94
-
95
- 1. INITIALIZE ROUND:
96
-
97
- Set <round-id/> to `GRILLING ROUND <m/>/<getopt-option-rounds/>`
98
- if <getopt-option-rounds/> is greater than 1, or to
99
- `GRILLING` otherwise (a single round needs no round
100
- numbering). Then output only the following <template/>:
113
+ - If the `Tags:` frontmatter key of <task-content/> carries
114
+ the tag `grilled:<section/>` (with <section/> being the
115
+ *lower-case* name of the section) and the section contains
116
+ *no* bullet-point in checkbox state `[?]`, the section is
117
+ *already grilled* and nothing is open: *remove* it from
118
+ <sections/> and only output the following <template/>:
101
119
 
102
120
  <template>
103
- ⧉ **ASE**: <round-id/>: *Relentless Interviewing Until Clarity*
121
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **section <section/> already grilled -- skipped (use `--force` to re-grill)**
104
122
  </template>
105
123
 
106
- 2. DETERMINE QUESTIONS:
124
+ - If the `Tags:` frontmatter key carries the tag
125
+ `grilled:<section/>` and the section contains *at least one*
126
+ bullet-point in checkbox state `[?]`, *restrict* the scope of
127
+ the section to *exactly* these `[?]` bullet-points, so the
128
+ grilling re-asks only the *still open* questions.
107
129
 
108
- Determine the essential aspects <aspect-N/> (a one- or
109
- two-word-long short identifier like `Foo` or `Bar-Baz`, also
110
- serving as the topic hint) and the corresponding, very brief
111
- but precise decision/question <question-N/> where a shared
112
- understanding is required. Each question is chosen to
113
- resolve the open points related to the above understanding
114
- of grilling, by focusing on the mentioned *Focus Areas* and
115
- checking the mentioned *Indicators*.
116
-
117
- For <question-N/> use the format `Shall...?` for
118
- questions of focus area `DOMAIN` and `INTERFACE`, the format
119
- `Should...?` for questions of focus area `ARCHITECTURE`,
120
- and the format `May...?` for questions of focus area
121
- `IMPLEMENTATION`.
122
-
123
- In every <question-N/>, encode all *literal aspects*
124
- -- file and directory paths, identifiers, symbols, types,
125
- commands, options, configuration keys, and literal values --
126
- with backticks. Do not output anything.
127
-
128
- 3. DETERMINE CONTEXT:
129
-
130
- For each question, determine its focus area
131
- <context-N-focus/> from the mentioned *Focus Areas*.
132
- <context-N-severity/>, describing how important this
133
- question is.
134
-
135
- 4. SORT QUESTIONS:
136
-
137
- Create a decisions/questions tree for the questions,
138
- capturing the dependencies between the decisions. Then
139
- *sort* the questions *primarily* by descending focus area
140
- order -- first all `DOMAIN`, then all `INTERFACE`, then all
141
- `ARCHITECTURE`, and then all `IMPLEMENTATION` ones -- and
142
- *secondarily*, within each focus area, by the decision tree
143
- order, so that each decision is asked *after* the decisions
144
- it depends on. Renumber <N/> according to this order,
145
- starting at `1` in *every* round, independent of the
146
- numbering of previous rounds. Truncate the list after a
147
- maximum of 10 questions and set <n/> to the number of
148
- remaining questions. Do not output anything.
149
-
150
- 5. For each question <question-N/> in the iteration cycle <N/>,
151
- *one at a time*:
152
-
153
- 1. Output the following <template/>:
130
+ - Otherwise, the scope of the section is the *entire* section.
154
131
 
155
- <template>
156
- <ase-tpl-bullet-signal/> ASPECT <N/>/<n/> ▶ **<context-N-focus/>** (<context-N-severity/>) ▷ **<aspect-N/>**
157
- </template>
132
+ Independent of the scope, bullet-points in checkbox state `[-]`
133
+ (cancelled) or `[>]` (deferred) are *inert*: they are *never*
134
+ subject of a question and their checkbox is *never* changed.
158
135
 
159
- 2. Determine the answer alternatives:
136
+ <if condition="<sections/> is empty afterwards">
137
+ Skip the entire step 3 below -- the plan is *neither* updated
138
+ *nor* saved -- and continue directly with step 4.
139
+ </if>
160
140
 
161
- 1. Check the <task-content/> for the answer <answer-N-1/>,
162
- which reflects the current plan.
141
+ 3. **Iterate Over Task Plan Aspects:**
163
142
 
164
- 2. Check the code base and your world knowledge and
165
- use this information to find *up to three* grounded
166
- alternative answers <answer-N-K/> (K={2,3,4}), so there
167
- are between two and four answer options in total.
143
+ 1. Understand what "grilling" is about:
168
144
 
169
- 3. For each <answer-N-K/> (K={1,2,3,4}) determine
170
- a 1-3 word label <answer-N-K-label/>, and an
171
- ultra brief description <answer-N-K-description/>
172
- of at most *10 words*. Prepend `⚑ ` to the
173
- <answer-N-K-description/> which reflects the current
174
- plan. Do not output anything.
145
+ <expand name="grill-understanding"
146
+ arg1="the task plan in <task-content/>"
147
+ arg2="<getopt-option-perspective/>"
148
+ arg3="<getopt-option-ground/>"></expand>
175
149
 
176
- 3. In the following, you *MUST* *NOT* use your built-in
177
- <user-dialog-tool/> tool! Instead, you *MUST* just show a
178
- custom dialog according to the expanded `custom-dialog`
179
- definition. You *MUST* closely follow this definition.
150
+ Ground the grilling:
180
151
 
181
- Let the user select the <answer-N/> out of the answer
182
- alternatives <answer-N-K/> by raising a question with the
183
- following custom dialog. Emit only the answer lines for
184
- the alternatives <answer-N-K/> you actually determined in
185
- the previous step (between two and four lines in total),
186
- followed by the fixed `SKIP GRILLING` answer option:
152
+ <expand name="grill-ground"
153
+ arg1="the task plan in <task-content/>"
154
+ arg2=""></expand>
187
155
 
188
- <expand name="custom-dialog" arg1="--other">
189
- <aspect-N/>: <question-N/>
190
- <answer-N-1-label/>: <answer-N-1-description/>
191
- <answer-N-2-label/>: <answer-N-2-description/>
192
- [...]
193
- SKIP GRILLING: skip all remaining grilling and continue with the plan update
194
- </expand>
156
+ 2. <if condition="the frontmatter of <task-content/> carries a `Created: <text/>` key">
157
+ Set <timestamp-created><text/></timestamp-created> (set
158
+ timestamp-created to extracted text).
159
+ </if>
195
160
 
196
- Check the <result/> and dispatch accordingly:
161
+ 3. Perform *at most* <getopt-option-rounds/> grilling *rounds*,
162
+ numbered <m/> (1-<getopt-option-rounds/>) -- the round count is
163
+ a *maximum* only, as every round can *stop* the grilling *early*
164
+ in its item 2 below.
197
165
 
198
- - If <result/> is `CANCEL`, only output the following
199
- <template/> and then immediately *STOP* processing
200
- the entire current skill, leaving the plan *untouched*:
166
+ For each round:
201
167
 
202
- <template>
203
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **grilling stopped**
204
- </template>
168
+ 1. INITIALIZE ROUND:
205
169
 
206
- - If <result/> is `SKIP GRILLING`, ask no further
207
- questions, continue with item 6 below (updating the
208
- plan with the answers gathered so far), and after
209
- item 6 skip all remaining rounds and continue with
210
- item 3.3 below.
170
+ Explicitly start *from scratch* from *only* the *current*
171
+ <task-content/> -- as updated by all previous rounds -- and
172
+ *forget* all questions and answers gathered in previous
173
+ rounds -- except the grounding facts <grill-facts/>. Set
174
+ <round-id/> to
175
+ `GRILLING ROUND <m/>/<getopt-option-rounds/>` if
176
+ <getopt-option-rounds/> is greater than 1, or to
177
+ `GRILLING` otherwise (a single round needs no round
178
+ numbering). Do not output anything.
211
179
 
212
- - Otherwise, strip any leading `OTHER: ` prefix from
213
- <result/> and set <answer-N/> to the remainder.
180
+ 2. DETERMINE QUESTIONS:
214
181
 
215
- 4. Output the following <template/>:
182
+ <expand name="grill-questions"
183
+ arg1="<getopt-option-until/>"
184
+ arg2="◉ task: **<ase-task-id/>**"
185
+ arg3="file and directory paths, identifiers, symbols, types, commands, options, configuration keys, and literal values"
186
+ arg4="the <task-content/>, the code base,"
187
+ arg5=", and *finally* by the decision tree order, which *overrides* the impact order wherever a decision has to be asked *after* the decisions it depends on">
188
+ Focus *only* on the *Focus Areas* selected by
189
+ <sections/> -- the *themes* of the focused sections,
190
+ *within* the *grilling scope* of each section as
191
+ determined in step 2.3, while the *entire*
192
+ <task-content/> stays the context -- and check the
193
+ mentioned *Indicators*. For a section restricted to its
194
+ `[?]` bullet-points, derive the questions from *exactly*
195
+ these bullet-points only. Never raise a question about a
196
+ `[-]` or `[>]` bullet-point. Create a decisions/questions
197
+ tree for the questions, capturing the dependencies
198
+ between the decisions.
199
+
200
+ For each question, set <items-N/> to the bullet-points of
201
+ <task-content/> the question is about -- possibly *none*,
202
+ if the question concerns an aspect the plan does not
203
+ cover yet.
204
+ </expand>
205
+
206
+ If <grill-stop/> is `true`, skip the items 3, 4, and 6 of
207
+ this round, perform item 5 of this round (as the focused
208
+ sections are clear, they are tagged as grilled), then skip
209
+ all remaining rounds and continue with step 4.
210
+
211
+ 3. INTERACTIVE DIALOG:
212
+
213
+ In the following, you *MUST* *NOT* use your built-in
214
+ <user-dialog-tool/> tool! Instead, you *MUST* just show a
215
+ custom dialog according to the expanded `custom-dialog`
216
+ definition. You *MUST* closely follow this definition. The
217
+ dialog below carries the fixed answer option
218
+ `SKIP GRILLING`, dispatched as follows:
219
+
220
+ - If a <result/> is `SKIP GRILLING`, ask no further
221
+ questions -- *all* questions of this round stay
222
+ *unanswered* --, continue with items 4 to 6 below
223
+ (updating and saving the plan with the answers of the
224
+ previous rounds), and afterwards skip all remaining
225
+ rounds and continue with step 4.
226
+
227
+ - If a <result/> is `CANCEL`, only output the following
228
+ <template/> and then immediately *STOP* processing the
229
+ entire current skill, *not* updating the plan with the
230
+ current round (the plan updates saved by previous
231
+ rounds are kept):
216
232
 
217
233
  <template>
218
- <ase-tpl-bullet-normal/> ASPECT <N/>/<n/> ▶ **<context-N-focus/>** (<context-N-severity/>) ▷ **<aspect-N/>**, ANSWER: **<answer-N/>**
234
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **grilling stopped**
219
235
  </template>
220
236
 
221
- 6. Update <task-content/> based on all answers <answer-N/>
222
- gathered in this round. Do not output anything.
237
+ Show a custom dialog. Its only answer option is the fixed
238
+ one, so the user normally answers all aspects in *one*
239
+ free-text reply:
240
+
241
+ <expand name="custom-dialog" arg1="--other">
242
+ <round-id/>: What is your (combined) answer to all (or a subset) of the above questions? (keywords or `nX` short responses are sufficient)
243
+ SKIP GRILLING: skip all remaining grilling and continue with the plan update
244
+ </expand>
245
+
246
+ Dispatch `SKIP GRILLING` and `CANCEL` as defined above.
247
+ Otherwise, strip any leading `OTHER: ` prefix from
248
+ <result/> and treat the remainder as the combined free-text
249
+ answers to all questions of the round.
250
+
251
+ 4. MERGE ANSWERS INTO PLAN:
252
+
253
+ Merge all gathered answers in <result/> of the round -- the
254
+ combined reply -- *exclusively* back into <task-content/>.
255
+
256
+ <expand name="grill-short-responses"></expand>
257
+
258
+ A question *not* addressed by the combined reply accepts its
259
+ answer marked with `⚑` (the current plan) if one exists, and
260
+ otherwise stays *unanswered*. Additionally, record the
261
+ *open* questions in the checkboxes of the body
262
+ bullet-points, changing *only* checkboxes in state `[ ]` or
263
+ `[?]` and leaving every `[/]`, `[x]`, `[-]`, and `[>]`
264
+ checkbox *untouched*:
265
+
266
+ - For each *answered* question, set the checkbox of every
267
+ bullet-point in <items-N/> to `[ ]`, as the question is
268
+ resolved now.
269
+
270
+ - For each *unanswered* question, set the checkbox of every
271
+ bullet-point in <items-N/> to `[?]`, as the question is
272
+ still open. If <items-N/> is *empty*, *add* a new `[?]`
273
+ bullet-point to the section of the question's focus area
274
+ <context-N-focus/>, with the corresponding <type/>, a
275
+ <summary/> derived from <context-N-topic/>, and a <text/>
276
+ stating the open <question-N-text/>, so a later grilling
277
+ can re-ask it.
278
+
279
+ Set <changes/> to all bullet-points of <task-content/> which
280
+ were changed or added in this round. Do not output anything.
281
+
282
+ 5. SAVE PLAN:
283
+
284
+ For each section in <sections/>, *set* the tag
285
+ `grilled:<section/>` -- with <section/> being the
286
+ *lower-case* name of the section (`specification`,
287
+ `design`, or `verification`) -- in the `Tags:` frontmatter
288
+ key of <task-content/>: keep an already present identical
289
+ tag as is, otherwise append it, keeping all other already
290
+ present tags (including `grilled:` tags of other sections)
291
+ and *creating* the whole key at its position in the key
292
+ order of the plan <format/> if the plan carries none. A
293
+ fully grilled plan hence carries the tags
294
+ `grilled:specification, grilled:design,
295
+ grilled:verification`.
296
+
297
+ <expand name="task-save-content" arg1="plan updated"></expand>
298
+
299
+ 6. SHOW PLAN CHANGES:
300
+
301
+ Set <round-suffix/> to
302
+ ` round <m/>/<getopt-option-rounds/>` if
303
+ <getopt-option-rounds/> is greater than 1, or to empty
304
+ otherwise, and only output the following <template/>, which
305
+ shows every bullet-point of <changes/> in its plan format
306
+ `- <box/> <type/>: **<summary/>**: <text/>`, grouped below
307
+ a `**<SECTION>**:` line per plan section, where an empty
308
+ <changes/> renders as `(none)` -- this intentionally closes
309
+ *every* round, so the intermediate plan changes stay
310
+ visible:
223
311
 
224
- 3. <if condition="the frontmatter of <task-content/> carries a `Created: <text/>` key">
225
- Set <timestamp-created><text/></timestamp-created> (set
226
- timestamp-created to extracted text).
227
- </if>
312
+ <template>
313
+ <ase-tpl-head title="PLAN CHANGES" subtitle="after grilling<round-suffix/>"/>
228
314
 
229
- 4. *Add* the value `grilled` to the `Properties:` frontmatter key of
230
- <task-content/> if it is still absent, keeping all already
231
- present values and *creating* the whole key (with the single
232
- value `grilled`) if the plan carries none.
315
+ <changes/>
233
316
 
234
- 5. <expand name="task-save-content" arg1="plan updated"></expand>
317
+ <ase-tpl-foot title="PLAN CHANGES" subtitle="after grilling<round-suffix/>"/>
318
+ </template>
235
319
 
236
320
  4. **Decide Next Step:**
237
321
 
@@ -239,11 +323,12 @@ Set <args>--int-reuse-task</args>.
239
323
 
240
324
  <expand name="task-next-select"
241
325
  arg1="ase-task-grill"
242
- arg2="DONE|EDIT|IMPLEMENT|PREFLIGHT">
326
+ arg2="DONE|GRILL|EDIT|IMPLEMENT|DRAFT">
243
327
  Next Step: How would you like to proceed with the plan?
244
328
  DONE: Stop processing.
329
+ GRILL: Re-grill the entire plan again.
245
330
  EDIT: Hand off plan to editing.
246
- PREFLIGHT: Hand off plan to pre-flighting.
331
+ DRAFT: Hand off plan to implementation drafting.
247
332
  IMPLEMENT: Hand off plan to implementation.
248
333
  </expand>
249
334
 
@@ -257,6 +342,27 @@ Set <args>--int-reuse-task</args>.
257
342
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- done**
258
343
  </template>
259
344
 
345
+ - If <result/> is `GRILL`:
346
+ <expand name="handoff-args"/>
347
+ Set <args><args/> --force --rounds <getopt-option-rounds/> --until <getopt-option-until/> --focus <getopt-option-focus/></args>.
348
+ <if condition="<getopt-option-perspective/> is not empty">
349
+ Set <args><args/> --perspective <getopt-option-perspective/></args>,
350
+ with the value shell-quoted if it contains spaces or special characters.
351
+ </if>
352
+ <if condition="<getopt-option-ground/> is `true`">
353
+ Set <args><args/> --ground</args>.
354
+ </if>
355
+ Only output the following <template/> and then call the
356
+ tool `Skill(skill: "ase:ase-task-grill", args: "<args/>")`
357
+ to invoke the `ase:ase-task-grill` skill again in order to
358
+ *re-grill* the updated plan with the same grilling options.
359
+ Immediately stop processing the current skill once the
360
+ `Skill` tool was used.
361
+
362
+ <template>
363
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- hand-off to re-grilling**
364
+ </template>
365
+
260
366
  - If <result/> is `EDIT`:
261
367
  <expand name="handoff-args"/>
262
368
  Only output the following <template/> and then call the
@@ -269,14 +375,15 @@ Set <args>--int-reuse-task</args>.
269
375
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- hand-off to edit**
270
376
  </template>
271
377
 
272
- - If <result/> is `PREFLIGHT`:
378
+ - If <result/> is `DRAFT`:
273
379
  <expand name="handoff-args"/>
274
- Only output the following <template/> and then call the
275
- `Skill(skill: "ase:ase-task-preflight", args: "<args/>")` tool
276
- to *apply* the plan.
380
+ Set <args><args/> --draft</args>. Only output the following
381
+ <template/> and then call the
382
+ `Skill(skill: "ase:ase-task-implement", args: "<args/>")` tool
383
+ to *draft* the implementation of the plan.
277
384
 
278
385
  <template>
279
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- hand-off to pre-flight**
386
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- hand-off to implementation draft**
280
387
  </template>
281
388
 
282
389
  - If <result/> is `IMPLEMENT`:
@@ -288,3 +395,4 @@ Set <args>--int-reuse-task</args>.
288
395
  <template>
289
396
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **plan updated -- hand-off to implementation**
290
397
  </template>
398
+