@rse/ase 1.0.7 → 2.0.1

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 +357 -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} +8 -1
  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 +269 -81
  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 +231 -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 +81 -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
@@ -1,155 +1,404 @@
1
1
 
2
- Task
3
- ----
2
+ Task Format
3
+ -----------
4
4
 
5
- Every *task* uses a strict and fixed format:
5
+ Every *task* uses a strict and fixed textual format:
6
6
 
7
7
  <format>
8
8
  ---
9
- Id: <task-id/>
10
- Created: <timestamp-created/>
11
- Modified: <timestamp-modified/>
12
- Status: <task-status/>
13
- Properties: <task-properties/>
14
- Kind: <task-kind/>
9
+ Type: text/vnd.ase.task
10
+ Id: <task-id/>
11
+ Created: <timestamp-created/>
12
+ Modified: <timestamp-modified/>
13
+ Group: <task-group/>
14
+ Phase: <task-phase/>
15
+ After: <task-after/>
16
+ Status: <task-status/>
17
+ Assignee: <task-assignee/>
18
+ Kind: <task-kind/>
19
+ Effort: <task-effort/>
20
+ Tags: <task-tags/>
21
+ Source: <task-source/>
22
+ Changeset: <task-changeset/>
23
+ Target: <task-target/>
15
24
  ---
16
25
 
17
- # TASK: <title/>
26
+ # TASK: <task-title/>
18
27
 
19
- ## CONTEXT
28
+ ## SPECIFICATION (WHAT)
20
29
 
21
- - **WHAT**: <summary-what/>
30
+ - [ ] DOM: **[...]**: [...]
22
31
 
23
- - **WHY**: <summary-why/>
32
+ - [...]
24
33
 
25
- ## CHANGES
34
+ - [ ] IFC: **[...]**: [...]
26
35
 
27
36
  - [...]
28
37
 
38
+ ## DESIGN (HOW)
39
+
40
+ - [ ] ARC: **[...]**: [...]
41
+
29
42
  - [...]
30
43
 
31
- ## VERIFICATION
44
+ - [ ] IMP: **[...]**: [...]
32
45
 
33
46
  - [...]
34
47
 
48
+ ## VERIFICATION (WHEN)
49
+
50
+ - [ ] REG: **[...]**: [...]
51
+
35
52
  - [...]
36
53
 
54
+ - [ ] CON: **[...]**: [...]
55
+
56
+ - [...]
57
+
58
+ ---
59
+ Type: <task-attachment-type/>
60
+ Desc: <task-attachment-desc/>
61
+ Created: <task-attachment-created/>
62
+ Modified: <task-attachment-modified/>
63
+ Data: |4+
64
+ <task-attachment-payload/>
65
+ ---
66
+ Type: <task-attachment-type/>
67
+ Desc: <task-attachment-desc/>
68
+ Created: <task-attachment-created/>
69
+ Modified: <task-attachment-modified/>
70
+ File: <task-attachment-file/>
37
71
  </format>
38
72
 
39
73
  You *MUST* honor the following hints on this *task* format:
40
74
 
41
- - The content *MUST* begin with the `---` opening delimiter of the
42
- *Markdown frontmatter* as its very *first* line -- there is *no*
43
- leading empty line, as any line before the `---` would degrade the
44
- frontmatter into ordinary Markdown. You *MUST* always keep the empty
45
- line between the closing `---` delimiter and the `#` heading, and
46
- always keep the last empty line. If one of them is missing, add it
47
- back.
48
-
49
- - The *frontmatter* carries the keys `Id`, `Created`, `Modified`,
50
- `Status`, `Properties`, and `Kind`, in exactly this order, with their
51
- values being *unquoted* plain scalars and vertically aligned one
52
- space after the longest key. Only `Id` is *mandatory* -- every other
53
- key is *optional* and, when absent, falls back to its default value.
54
-
55
- - In all descriptions, highlight *code* as
56
- <template>`<code/>`</template> and *key aspects* as
57
- <template>*<aspect/>*</template>.
58
-
59
- - For <summary-what/> and <summary-why/> use an *ultra brief* but
60
- *as precise as possible* description of the overall change. In
61
- <summary-what/> tell what is changed. In <summary-why/> tell why it
62
- is changed, what benefit results or what the rationale is behind the
63
- change.
64
-
65
- - The <task-id/> of the `Id:` frontmatter key has to be substituted
75
+ - A task consists of at least two blocks, each *starting* with a `---` line.
76
+ There is *no* terminating line: a block ends where the next block starts
77
+ or where the file ends. The first block is named the "frontmatter" and is
78
+ a YAML metadata block with the task's metadata. The second block is named
79
+ the "body" and is a Markdown task plan. The third and following blocks are
80
+ named the "backmatter" and are zero or more attachment blocks, each based
81
+ on a YAML metadata block.
82
+
83
+ - The content *MUST* begin with the `---` line starting the
84
+ *frontmatter* as its very *first* line -- there is *no* leading empty line,
85
+ as any line before the `---` would degrade the frontmatter into ordinary
86
+ Markdown. You *MUST* always keep the empty line between the `---` line
87
+ starting the "body" and the `#` heading, and always keep the last empty
88
+ line of the Markdown "body" (second block) just before the `---` line starting
89
+ the "backmatter" or the end of the file. If one of them is missing, add it
90
+ back. This trailing empty line is required for the Markdown "body" *only*.
91
+
92
+ - As `---` lines start the blocks, the *body* *MUST NOT* contain a line
93
+ consisting of just `---` outside a fenced code block, as it could be read
94
+ as the start of the "backmatter" -- use `***` for a Markdown horizontal
95
+ rule instead. Inside a fenced code block, `---` lines are fine, but every
96
+ fenced code block of the *body* *MUST* be closed.
97
+
98
+ - The *frontmatter* can carry the keys `Type`, `Id`, `Created`, `Modified`,
99
+ `Group`, `Phase`, `After`, `Status`, `Assignee`, `Kind`, `Effort`, `Tags`, `Source`,
100
+ `Changeset`, and `Target` in exactly this order, with their values being
101
+ *unquoted* plain scalars and vertically aligned at a *fixed* column: each
102
+ `<key/>:` is padded with spaces to a width of 11 characters, so every value
103
+ starts at column 12 (one space after `Changeset:`) -- independent of which
104
+ keys are actually present. Only `Type` and `Id` are *mandatory* -- every
105
+ other key is *optional* and, when absent, falls back to its default value.
106
+ A skill *writing* an optional key which is still *absent* inserts it at its
107
+ position in the key order above, aligned at the same fixed column.
108
+
109
+ - The `Type` frontmatter key has to use the value `text/vnd.ase.task` for
110
+ consistency (with the backmatter) and identification reasons. A plan
111
+ *lacking* the `Type` key is a *legacy* plan, whose `Status` value is
112
+ migrated onto the current task lifecycle model on load.
113
+
114
+ - The <task-id/> of the `Id` frontmatter key has to be substituted
66
115
  with the current value of <ase-task-id/> in the current session
67
- context.
68
-
69
- - The `Status:` frontmatter key states the current *lifecycle state*
70
- of the task plan. The key is *optional* and defaults to `DRAFTED`:
71
- an *absent* key reads as `DRAFTED`, and a *newly created* plan
72
- carries `DRAFTED` explicitly. The <task-status/> value is *strictly*
73
- one of the following eight states:
74
-
75
- - `DRAFTED`: plan exists but is still provisional and not yet
76
- cleared for implementation.
77
- - `REJECTED`: plan was reviewed and refused, and has to be reworked
78
- before it can be approved.
79
- - `APPROVED`: plan is accepted as authoritative and cleared for
80
- implementation, but no work has begun.
81
- - `DEFERRED`: plan is approved and unobstructed, but its start was
82
- deliberately postponed.
83
- - `STARTED`: implementation of the plan is actively underway.
84
- - `BLOCKED`: implementation is halted by an impediment which
85
- someone has to remove before it can resume.
86
- - `COMPLETED`: plan was implemented in full and reached its
87
- intended outcome.
88
- - `CANCELLED`: plan was terminated before completion, because it
89
- failed, was called off, or became obsolete.
90
-
91
- - The eight states form a *state machine*. Whoever sets the `Status:`
92
- key *MUST* only move along one of the following transitions, whereby
93
- a *single* operation *MAY* traverse *several* transitions at once if
94
- it performs the corresponding stages in one go:
95
-
96
- ```text
97
- DRAFTED ──reject───▶ REJECTED STARTED ──block────▶ BLOCKED
98
- REJECTED ──redraft──▶ DRAFTED BLOCKED ──unblock──▶ STARTED
99
- DRAFTED ──approve──▶ APPROVED STARTED ──complete─▶ COMPLETED
100
- APPROVED ──defer────▶ DEFERRED
101
- DEFERRED ──resume───▶ APPROVED any non-terminal state
102
- APPROVED ──start────▶ STARTED ──cancel───▶ CANCELLED
103
- ```
104
-
105
- `COMPLETED` and `CANCELLED` are the two *terminal* states: a plan
106
- which reached one of them is *finished* and leaves the state machine.
107
-
108
- - The `Properties:` frontmatter key states which *stages* the task
109
- plan already passed through. The <task-properties/> value is
110
- *strictly* either `none` or a comma-separated list of the values
111
- `grilled`, `preflighted`, `implemented`, and `verified`, listed in
112
- exactly this order, each at most once. The key is *optional* and
113
- defaults to `none`: an *absent* key reads as `none`, and a *newly
114
- created* plan carries `none` explicitly. The list only ever
115
- *accumulates*: a skill *adds* its own value if still absent and
116
- *MUST NOT* drop any value already present, except when a plan is
117
- *recreated from scratch*, which resets it to `none`.
118
-
119
- - The `Kind:` frontmatter key states the *kind of change* the task plan
120
- describes, and hence which *operation-specific tenet set* of the
121
- **ASE Tenets** a subsequent preflight or implementation has to
122
- honor. The <task-kind/> value is *strictly* one of `CRAFTING`,
123
- `REFACTORING`, or `RESOLVING`.
124
-
125
- - The `Kind:` frontmatter key is *optional*: a skill *authoring* or
126
- *updating* a task plan *CAN* update an already present key or pass
127
- it through *verbatim* and *MAY* create a missing one by *inferring*
128
- the kind from the plan content (defaulting to `CRAFTING`). A
129
- `--dry` run *never* drops this key, as `--dry` only omits the
130
- `## VERIFICATION` section.
131
-
132
- - A skill *writing* an optional key which is still *absent* inserts it
133
- at its position in the key order above and re-aligns the values of
134
- the whole frontmatter block.
135
-
136
- - The <timestamp-created/> of the `Created:` frontmatter key is the
116
+ context. A task id consists of the characters `A-Z`, `a-z`, `0-9`,
117
+ `#`, `_`, and `-` only, and a *new* task id is always obtained via
118
+ the `ase_task_newid` MCP tool, which honors the task id scheme of
119
+ the project.
120
+
121
+ - The <timestamp-created/> of the `Created` frontmatter key is the
137
122
  timestamp when this task plan was created. The <timestamp-modified/>
138
- of the `Modified:` frontmatter key is the timestamp when this
139
- task plan was last modified. Both use an ISO-style format
140
- value. The value of both can be determined by a call to the
141
- `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the `ase` MCP
142
- server, using the `text` field of its response.
143
-
144
- - The <title/> is a short summary of the <summary-what/>, no longer than
145
- 50 characters.
146
-
147
- - The sections `## CHANGES` and `## VERIFICATION` are each just a short
148
- list of 1-5 bullet points. Each bullet point is formatted as
149
- `- **<aspect/>**: <specification/>` where <aspect/> indicates
150
- the aspect of the section and <specification/> is 1-3 sentences
151
- giving an *ultra precise* but also *ultra brief* and *ultra concise*
152
- description of the aspect.
123
+ of the `Modified` frontmatter key is the timestamp when the *body*
124
+ of this task plan was last modified: a change to *frontmatter* keys
125
+ only (like `Status` or `Changeset`) or to the *backmatter* only *MUST
126
+ NOT* refresh it. Both use an ISO-style format value. The value of
127
+ both has to be determined by a call to the `ase_timestamp(format:
128
+ "yyyy-LL-dd HH:mm")` tool of the `ase` MCP server, using the `text`
129
+ field of its response.
130
+
131
+ - The `Group` frontmatter key content-wise places the task into a single group.
132
+ The <task-group/> usually is the unique name of a "master task" or "epic".
133
+ An epic is created either *implicitly*, by just using the same plain
134
+ <task-group/> in the `Group` key of all its member tasks, or *explicitly*,
135
+ by an additional task whose `Id` equals the <task-group/> and whose
136
+ own `Group` equals its `Id`, too. Such an explicit epic task implicitly
137
+ comes `After` all other member tasks of its group, i.e., these need
138
+ not be listed in its `After` key.
139
+
140
+ - The `Phase` frontmatter key chronologically places the task into a single phase.
141
+ The <task-phase/> usually is the unique name of a "phase", "stage", or "sprint".
142
+
143
+ - The `After` frontmatter key places the task execution *after* one or more
144
+ other referenced tasks. The <task-after/> has to be a comma-and-space-separated
145
+ list of <task-id/> identifiers and hence should be formatted
146
+ `<task-id-1/>, <task-id-2/>[, ...]`.
147
+
148
+ - The `Status` frontmatter key states the current *lifecycle state*
149
+ of the task, as defined by **Task Lifecycle Models** below. A *newly
150
+ created* task carries the *default* state explicitly. The <task-status/>
151
+ value is *strictly* one of the pre-defined states of the task lifecycle
152
+ model configured for the current project.
153
+
154
+ - The `Assignee` frontmatter key states the current *assignee* of the task,
155
+ which is either a human or an agent. A *newly created* task carries no
156
+ assignee and there is no default value. The <task-assignee/> is an arbitrary
157
+ but unique name of the assignee.
158
+
159
+ - The `Kind` frontmatter key states the *kind of change* the task plan
160
+ describes, and hence which *operation-specific tenet set* of the **ASE
161
+ Tenets** a subsequent draft or implementation has to honor. The
162
+ <task-kind/> value is *strictly* one of `SPECIFYING`, `CRAFTING`,
163
+ `REFACTORING`, or `RESOLVING`. The `Kind` frontmatter key is *optional*:
164
+ a skill *authoring* or *updating* a task plan *CAN* update an already
165
+ present key or pass it through *verbatim* and *MAY* create a missing one by
166
+ *inferring* the kind from the plan content (defaulting to `CRAFTING`).
167
+
168
+ - The `Effort` frontmatter key states the *estimated effort* of the task: the
169
+ expected *human time* of its *entire* lifecycle (including planning), which
170
+ matches the human time `time.hr` of its usage attachment. The <task-effort/>
171
+ value is formatted `<size/> <hash/>`, with <size/> *strictly* one of the
172
+ T-shirt sizes `XS`, `S`, `M`, `L`, or `XL` -- bands on a *logarithmic* scale
173
+ (factor 4) with the upper bounds `15`, `60`, `240`, and `960` human minutes
174
+ for `XS` to `L` (configuration `project.task.effort.scale`), while `XL` is
175
+ open-ended -- and <hash/> the short *content hash* of the "body" the size was
176
+ given for. The `Effort` frontmatter key is *optional*: an absent key means
177
+ *not estimated*, and explicit epic tasks carry none, as their effort is the
178
+ sum of their member tasks. It is written by `ase-task-estimate` (or by hand)
179
+ and *never* refreshes the `Modified` key.
180
+
181
+ The size is *bound* to the plan *content*: the content hash covers the
182
+ "body" with its checkboxes and whitespace left out and its bullet-points in
183
+ the inert states `[-]` and `[>]` left out entirely. Hence, mere checkbox state
184
+ changes and whitespace-only edits (like re-wrapping) keep the size valid, while
185
+ every other content change (including cancelling or deferring a bullet-point)
186
+ makes it *stale*. The task store *drops* a stale `Effort` key on load and save,
187
+ and *stamps* a key given without <hash/> (like `Effort: M`) with the content
188
+ hash of the current "body" on save. Every skill *rewriting* a plan passes the
189
+ key through *verbatim*, and *never* invents or changes a <hash/>. A skill
190
+ persisting a plan again from its *own* copy of a previous save (like the
191
+ `text` argument of a previous `ase_task_save`) *MUST* first take over the
192
+ `Effort` key *as stored* by that save (stamped, or dropped) into its copy
193
+ -- or else load the plan again -- as a key without <hash/> would otherwise
194
+ be stamped again on the next save, even against a meanwhile changed "body".
195
+
196
+ - The `Tags` frontmatter key can be used to tag a task with arbitrary key/value
197
+ information. The <task-tags/> value has to be a comma-and-space-separated
198
+ list of `<key/>:<value/>` or plain `<key/>` identifiers and hence should be
199
+ formatted `<key/>[:<value/>], <key/>[:<value/>][, ...]`. A plain `<key/>`
200
+ tag is a boolean marker, e.g. `foo` marks the task as `foo`.
201
+
202
+ - The `Source`, `Changeset`, and `Target` frontmatter keys control the *flow*
203
+ of the change set of the task: `ase-task-implement` creates the change set
204
+ from the `Source` into the `Changeset`, and `ase-task-integrate` delivers
205
+ the change set from the `Changeset` into the `Target`. Their `worktree`
206
+ values refer to the *origin working copy* (the current Git working copy)
207
+ for `Source` and `Target`, and to the *context worktree* for `Changeset`:
208
+ the ASE worktree `.ase/worktree/<name/>` selected by the
209
+ `--worktree <name/>` option of these skills, or else the origin working
210
+ copy itself.
211
+
212
+ - The <task-source/> of the `Source` key is the *code basis* of the
213
+ change set: `worktree` (built-in default) is the origin working copy with its
214
+ checked-out branch, and `branch:<name/>` is the existing Git branch
215
+ <name/>.
216
+
217
+ - The <task-changeset/> of the `Changeset` key is the *location* of the
218
+ change set: `worktree` (built-in default) leaves it *uncommitted* in the context
219
+ worktree, `branch:<name/>` *commits* it onto the Git branch <name/>
220
+ (created from the `Source` if missing) inside a worktree carrying this
221
+ branch, and `attachment:<name/>` stores it as a *unified diff* in the
222
+ attachment block of `Type: text/x-diff; charset=utf-8; kind="<name/>"`
223
+ of the task, leaving all artifacts untouched.
224
+
225
+ - The <task-target/> of the `Target` key is the *integration target* of
226
+ the change set: `worktree` is the origin working copy with its
227
+ checked-out branch, `branch:<name/>` is the existing Git branch
228
+ <name/>, and `source` (built-in default) is whatever the `Source` key refers to.
229
+
230
+ A branch <name/> is non-empty, consists of the characters `A-Z`, `a-z`,
231
+ `0-9`, `_`, `-`, `.`, and `/` only, does *not* start with `-`, `.`, or
232
+ `/`, does *not* end with `/`, `.`, or `.lock`, and does *not* contain
233
+ `..` or `//`. An attachment <name/> is non-empty and consists of the
234
+ characters `A-Z`, `a-z`, `0-9`, `_`, and `-` only. The attachment name
235
+ `draft` is the *implementation draft*, selected by the `--draft` option
236
+ of `ase-task-implement` and `ase-task-integrate`.
237
+
238
+ A branch or attachment <name/> can carry the placeholder `{id}`, which
239
+ reads as the task id with every character other than `A-Z`, `a-z`,
240
+ `0-9`, `_`, and `-` replaced by `-`, then every run of multiple `-`
241
+ reduced to a single `-`, and finally all leading and trailing `-`
242
+ and `_` removed (e.g., the `Changeset` value
243
+ `branch:cs-{id}` commits the change set of the task `foo` onto the
244
+ branch `cs-foo`, and the one of the task `#12` onto the branch
245
+ `cs-12`). The placeholder is mainly intended for the
246
+ configured defaults, giving every task its own branch or attachment.
247
+
248
+ An *absent* `Source`, `Changeset`, or `Target` key reads as its
249
+ *configured default* at the time of use: <ase-project-task-default-source/>,
250
+ <ase-project-task-default-changeset/>, resp. <ase-project-task-default-target/>
251
+ (configuration `project.task.default.{source,changeset,target}`, with the
252
+ built-in defaults `worktree`, `worktree`, resp. `source`). Hence, a skill
253
+ *creating* or *rebooting* a task plan *MUST* leave these keys *out*, and a
254
+ skill *writing* one of these keys *MUST* leave it out if its value equals
255
+ the configured default (with the placeholder `{id}` of both replaced),
256
+ so the plan keeps following the configuration.
257
+
258
+ - A task can have zero or more attachments in the "backmatter". Each attachment is
259
+ realized with its own dedicated block. When no attachments exist, these
260
+ "backmatter" blocks are omitted. Each attachment block in the "backmatter"
261
+ carries the *mandatory* `Type` key and *exactly one* of the keys `Data`
262
+ or `File`. The `Type` key has the value <task-attachment-type/> which
263
+ is a regular MIME type, but has to be not equal to the vendor MIME type
264
+ `text/vnd.ase.task`.
265
+
266
+ For embedded content, the `Data` key contains the content data as a YAML
267
+ "literal block scalar" with the block header `|4+`, i.e., with an explicit
268
+ indentation of exactly 4 spaces (which are stripped from the content) and
269
+ with all trailing blank lines kept as part of the content -- except for
270
+ *one* blank line directly before the `---` line of the next block, which
271
+ only separates the blocks. Content without
272
+ a trailing newline instead uses the block header `|4-`, and empty content
273
+ is given as an empty `Data:` value.
274
+
275
+ When loaded via `ase_task_load` (by default), the content of a `Data` key
276
+ is *elided*, i.e., given as the single-line marker value
277
+ `[elided: <n/> lines]` instead. Keep such a marker *verbatim* to keep the
278
+ content unchanged, as `ase_task_save` restores it from the stored
279
+ attachment. Fetch the content via `ase_task_attachment` only if it has
280
+ to be read or changed, and then replace the marker with the complete
281
+ changed content. A marker *MUST* *NEVER* be copied into another block or
282
+ another task.
283
+
284
+ For referenced content, the `File` key contains the filename relative to the
285
+ task storage location. Every attachment can optionally have a `Desc` key
286
+ where <task-attachment-desc/> is a short and concise single-line description
287
+ of the attachment, and the optional keys `Created` and `Modified`, whose
288
+ values <task-attachment-created/> and <task-attachment-modified/> are the
289
+ timestamps when the attachment was created and last modified, in the same
290
+ format and determined the same way as their frontmatter counterparts.
291
+
292
+ The keys of an attachment block are ordered `Type`, `Desc`, `Created`,
293
+ `Modified`, and `Data` or `File`, with their values aligned at the same
294
+ *fixed* column as the frontmatter keys (each `<key/>:` padded to a width of
295
+ 11 characters).
296
+
297
+ - An attachment is *stale* when its `Modified` key is *absent* or *older*
298
+ than the `Modified` key of the frontmatter, as its content was then
299
+ produced for an *earlier* version of the plan "body". In particular, a
300
+ *change set* attachment produced by the skill `ase-task-implement` for a
301
+ `Changeset` of `attachment:<name/>` (like the *implementation draft*
302
+ of `--draft`) carries the `Type` key value `text/x-diff; charset=utf-8;
303
+ kind="<name/>"` and is delivered by the skill `ase-task-integrate` only
304
+ while it is *not* stale. Its `Desc` key carries `base <commit/>`, the full Git commit id the
305
+ unified diff is based on. Once it is delivered and kept (`ase-task-integrate --no-cleanup`),
306
+ its `Desc` key additionally carries `, merged <commit/>`, the full Git commit id of the target
307
+ branch after the integration, and the attachment is *delivered*: it is then neither delivered
308
+ again by `ase-task-integrate` nor re-applied by `ase-task-implement`.
309
+
310
+ For a `Changeset` of `worktree` or `branch:<name/>`, the `ase agent`
311
+ agents `implementer` and `integrator` (and every agent configured with
312
+ `--attach-changeset`) additionally maintain the *change set snapshot*: a
313
+ *view-only*, text-only unified diff of the change set, which makes it
314
+ viewable wherever the task is visible (e.g. on the task boards during its
315
+ qualification). The skills never create or change it, but pass it through
316
+ *verbatim*. It carries the `Type` key value
317
+ `text/x-diff; charset=utf-8; kind="<kind/>"` (with <kind/> being
318
+ `changeset` for the built-in agents), is *replaced* in place on every run
319
+ (keeping its `Created` key), and its `Desc` key carries `base <commit/>`
320
+ (plus `, partial` for an incomplete change set) after an implementation,
321
+ resp. `base <commit/>, merged <commit/>` after an integration. It is
322
+ *never* delivered by `ase-task-integrate`, unless the `Changeset` is
323
+ `attachment:<kind/>`, in which case this attachment *is* the change set
324
+ itself. A stale snapshot just shows an outdated change set.
325
+
326
+ The *usage attachment* carries the *accumulated AI and human usage* of the
327
+ task, as booked by `ase-task-assign` and the `ase agent` jobs. It carries the
328
+ `Type` key value `application/yaml; kind="usage"`, is created on the first
329
+ booking, and is *replaced* in place on every booking (keeping its `Created`
330
+ key and refreshing its `Modified` key, but leaving the `Modified` key of the
331
+ frontmatter alone). Its `Data` is YAML with the amounts `time: { ai, hr,
332
+ real }` (AI request, human, and real time, in minutes), `token: { cread,
333
+ cwrite, input, output }` (cache read, cache write, uncached input, and output
334
+ tokens), and `cost: { ai, hr }` (AI and human costs, in USD). As it does not
335
+ depend on the "body", it is *never* stale, and a skill *never* changes it:
336
+ the task store keeps it on every overwrite of the plan (silently ignoring a
337
+ changed, removed, or added usage attachment), and the entity tag of a
338
+ conditional save does not cover it, so a booking meanwhile never fails a save.
339
+
340
+ A skill which changes the content of an attachment refreshes its `Modified`
341
+ key with the current timestamp -- the very same value it writes into the
342
+ `Modified` key of the frontmatter if it changes the "body", too. Hence,
343
+ `ase-task-implement` stamps a change set attachment with the same value
344
+ it writes into the frontmatter when ticking checkboxes, so the attachment
345
+ does not fall behind the plan it was produced for.
346
+
347
+ - A skill which *rewrites* the "frontmatter" or the "body" of a task *MUST*
348
+ pass the entire "backmatter" through *verbatim* -- every attachment block
349
+ byte-for-byte (with its elided `Data` marker), in its original order -- unless the skill *explicitly*
350
+ manages attachments itself. Attachments are *never* dropped, reordered,
351
+ re-indented, or re-flowed as a side-effect of a body rewrite.
352
+
353
+ - All content is contained in bullet-points. Those bullet-points use
354
+ the format `- <box/> <type/>: **<summary/>**: <text/>`.
355
+
356
+ The embedded checkbox <box/> allows the following variants to express states of <text/>:
357
+
358
+ - `[ ]`: todo (the bullet-point was still not resolved)
359
+ - `[?]`: question (the bullet-point was still not resolved due to a question)
360
+ - `[/]`: incomplete (the bullet-point was only partially resolved)
361
+ - `[x]`: done (the bullet-point was fully resolved)
362
+ - `[-]`: cancelled (the bullet-point was cancelled and should not be resolved)
363
+ - `[>]`: deferred (the bullet-point was deferred and should be resolved later)
364
+
365
+ The `[?]` state is *set* by grilling on every bullet-point whose
366
+ grilling question stayed *unanswered* and *reset* to `[ ]` once the
367
+ question is answered in a later grilling. The `[-]` and `[>]` states
368
+ make a bullet-point *inert*: grilling asks *no* question about it,
369
+ drafting and implementation neither realize nor check it, and
370
+ *every* skill leaves its checkbox *untouched* until the user changes it.
371
+ On implementation, a `[?]` bullet-point is a *regular* todo like `[ ]`,
372
+ a `[x]` bullet-point is *skipped* as already resolved, and a `[/]`
373
+ bullet-point is *re-examined* for its still unresolved parts.
374
+
375
+ The <type/> classifies the <text/>:
376
+
377
+ - `DOM`: Domain (what to change from Domain perspective)
378
+ - `IFC`: Interface (what to change from Interface perspective)
379
+ - `ARC`: Architecture (how to change Architecture details)
380
+ - `IMP`: Implementation (how to change Implementation details)
381
+ - `REG`: Regression (ensure change does not break anything)
382
+ - `CON`: Confirmation (ensure change behaves as specified)
383
+
384
+ Changes to `CHANGELOG.md` files should be classified as `IMP`. Running linting (static code
385
+ analysis) and build (generating files) procedures should be classified as `REG`.
386
+
387
+ Bullet-points of types `DOM` and `IFC` (in this order) belong to the `SPECIFICATION (WHAT)` section.
388
+ Bullet-points of types `ARC` and `IMP` (in this order) belong to the `DESIGN (HOW)` section.
389
+ Bullet-points of types `REG` and `CON` (in this order) belong to the `VERIFICATION (WHEN)` section.
390
+
391
+ The <summary/> summarizes <text/> and is 1-3 words only. It is for
392
+ quickly identifying upfront what <text/> is about.
393
+
394
+ The <text/> can span multiple lines. In all <text/> parts, highlight
395
+ *code* as <template>`<code/>`</template> and *key aspects* as
396
+ <template>*<aspect/>*</template>. Each <text/> should be just 1-3 sentences
397
+ and be *very precise*, but also *ultra brief* and *ultra concise*.
398
+
399
+ - Section `SPECIFICATION` tells `WHAT` is changed,
400
+ section `DESIGN` tells `HOW` it is changed, and
401
+ section `VERIFICATION` tells `WHEN` the change counts as complete and correct.
153
402
 
154
403
  - In all sections, break all lines with a newline character
155
404
  after about 100 characters per line for better subsequent
@@ -161,3 +410,298 @@ You *MUST* honor the following hints on this *task* format:
161
410
  backtick or *after* its closing backtick, even if this means
162
411
  breaking the line noticeably earlier than after 100 characters.
163
412
 
413
+ - The <task-title/> is a short summary of the task, usually by summarizing the
414
+ `DOM` bullet-points of the `SPECIFICATION (WHAT)` section. It is no longer
415
+ than 50 characters. It has to be catchy and expressive.
416
+
417
+ Task Lifecycle Models
418
+ ---------------------
419
+
420
+ Every **ASE** *task* carries an optional `Status` frontmatter key, stating its current *lifecycle
421
+ state*. The `Status` key is the *attribute*; its value is always one of the *states* of the task
422
+ lifecycle model. When `Status` is absent, the task is in the *default* state of the selected task
423
+ lifecycle model.
424
+
425
+ The lifecycle model is a *state machine*. Whoever sets the `Status` frontmatter key *MUST* only move
426
+ along one of the defined state transitions, whereby a *single* operation *MAY* traverse *several*
427
+ transitions at once if it performs the corresponding stages in one go.
428
+
429
+ **ASE** pre-defines three reusable task lifecycle models. The lifecycle model of the current project
430
+ is defined by <ase-project-task-lifecycle/>, with allowed values `solo` (default), `team`, and
431
+ `enterprise`.
432
+
433
+ ### Solo Task Lifecycle Model (`solo`)
434
+
435
+ The 1+3 states and the transitions between them form the following state machine which realizes a
436
+ task management scheme based on just a single activity phase. It is intended for local use of a solo
437
+ developer.
438
+
439
+ ```mermaid
440
+ stateDiagram-v2
441
+ [*] --> OPEN
442
+
443
+ OPEN --> SHELVED
444
+ SHELVED --> OPEN
445
+
446
+ OPEN --> CLOSED
447
+
448
+ OPEN --> CANCELLED
449
+ SHELVED --> CANCELLED
450
+
451
+ CLOSED --> [*]
452
+ CANCELLED --> [*]
453
+ ```
454
+
455
+ ```txt
456
+ ●
457
+ │
458
+ ▼
459
+ ┏━━━━━━━━━━━━┓ ┌────────────┐
460
+ ┃ OPEN ┃─────▶│ SHELVED │
461
+ ┃ ┃◀─────│ │
462
+ ┗━━━━━━━━━━━━┛ └────────────┘
463
+ │ │ │
464
+ │ └──────────────┴───────────┐
465
+ ▼ │
466
+ ┌────────────┐ ┌────────────┐ │
467
+ │ CLOSED │ │ CANCELLED │◀───┘
468
+ │ │ │ │
469
+ └────────────┘ └────────────┘
470
+ │ │
471
+ ├───────────────────┘
472
+ │
473
+ ▼
474
+ ◉
475
+ ```
476
+
477
+ The 1 "activity" state expresses:
478
+
479
+ - `OPEN`: task is currently work in progress (idea to code-base).
480
+
481
+ The 3 "rest" states express:
482
+
483
+ - `SHELVED`: task was temporarily shelved into backlog.
484
+ - `CLOSED`: task was implemented and reached its intended outcome.
485
+ - `CANCELLED`: task was cancelled at any time, because it failed, was called off, or became obsolete.
486
+
487
+ The *default* state is the "activity" state `OPEN`.
488
+
489
+ ### Team Task Lifecycle Model (`team`)
490
+
491
+ The 2+4 states and the transitions between them form the following state machine which realizes a
492
+ task management scheme based on the two activity phases Planning and Implementation. It is intended
493
+ for distributed use by a small team of developers.
494
+
495
+ ```mermaid
496
+ stateDiagram-v2
497
+ [*] --> PLANNING
498
+
499
+ PLANNING --> SHELVED
500
+ SHELVED --> PLANNING
501
+
502
+ PLANNING --> IMPLEMENTING
503
+ IMPLEMENTING --> PLANNING
504
+ IMPLEMENTING --> STALLED
505
+ STALLED --> IMPLEMENTING
506
+
507
+ IMPLEMENTING --> IMPLEMENTED
508
+
509
+ PLANNING --> CANCELLED
510
+ SHELVED --> CANCELLED
511
+ IMPLEMENTING --> CANCELLED
512
+ STALLED --> CANCELLED
513
+
514
+ IMPLEMENTED --> [*]
515
+ CANCELLED --> [*]
516
+ ```
517
+
518
+ ```txt
519
+ ●
520
+ │
521
+ ▼
522
+ ┏━━━━━━━━━━━━┓ ┌────────────┐
523
+ ┌───▶┃ PLANNING ┃─────▶│ SHELVED │
524
+ │ ┃ ┃◀─────│ │
525
+ │ ┗━━━━━━━━━━━━┛ └────────────┘
526
+ │ │ │ │
527
+ │ │ └──────────────┴───────────┐
528
+ │ ▼ │
529
+ │ ┏━━━━━━━━━━━━┓ ┌────────────┐ │
530
+ └────┃IMPLEMENTING┃─────▶│ STALLED │ │
531
+ ┃ ┃◀─────│ │ │
532
+ ┗━━━━━━━━━━━━┛ └────────────┘ │
533
+ │ │ │ │
534
+ │ └──────────────┴───────────┤
535
+ ▼ │
536
+ ┌────────────┐ ┌────────────┐ │
537
+ │IMPLEMENTED │ │ CANCELLED │◀───┘
538
+ │ │ │ │
539
+ └────────────┘ └────────────┘
540
+ │ │
541
+ ├───────────────────┘
542
+ │
543
+ ▼
544
+ ◉
545
+ ```
546
+
547
+ The 2 "activity" states express:
548
+
549
+ - `PLANNING`: task is currently in change planning (idea to plan).
550
+ - `IMPLEMENTING`: task is currently in change implementation (plan to code-base).
551
+
552
+ The 4 "rest" states express:
553
+
554
+ - `SHELVED`: task was shelved during planning into backlog.
555
+ - `STALLED`: task was stalled during implementation by an impediment.
556
+ - `IMPLEMENTED`: task was implemented and reached its intended outcome.
557
+ - `CANCELLED`: task was cancelled at any time, because it failed, was called off, or became obsolete.
558
+
559
+ The *default* state is the "activity" state `PLANNING`.
560
+
561
+ ### Enterprise Task Lifecycle Model (`enterprise`)
562
+
563
+ The 4+10 states and the transitions between them form the following state machine which realizes
564
+ a task management scheme based on the four activity phases Planning, Implementation, Qualification
565
+ and Integration. It is intended for distributed use by an enterprise where engineers and agents act
566
+ in a gated development pipeline.
567
+
568
+ ```mermaid
569
+ stateDiagram-v2
570
+ [*] --> DRAFTED
571
+ DRAFTED --> SHELVED
572
+ SHELVED --> DRAFTED
573
+ DRAFTED --> PLANNING
574
+ PLANNING --> DRAFTED
575
+ PLANNING --> SHELVED
576
+
577
+ PLANNING --> PLANNED
578
+ PLANNED --> STALLED
579
+ STALLED --> PLANNED
580
+ PLANNED --> IMPLEMENTING
581
+ IMPLEMENTING --> PLANNED
582
+ IMPLEMENTING --> STALLED
583
+
584
+ IMPLEMENTING --> IMPLEMENTED
585
+ IMPLEMENTED --> DECLINED
586
+ DECLINED --> IMPLEMENTED
587
+ IMPLEMENTED --> QUALIFYING
588
+ QUALIFYING --> IMPLEMENTED
589
+ QUALIFYING --> DECLINED
590
+
591
+ QUALIFYING --> QUALIFIED
592
+ QUALIFIED --> DEFERRED
593
+ DEFERRED --> QUALIFIED
594
+ QUALIFIED --> INTEGRATING
595
+ INTEGRATING --> QUALIFIED
596
+ INTEGRATING --> DEFERRED
597
+
598
+ INTEGRATING --> INTEGRATED
599
+
600
+ IMPLEMENTING --> DRAFTED
601
+ QUALIFYING --> DRAFTED
602
+ QUALIFYING --> PLANNED
603
+ INTEGRATING --> DRAFTED
604
+ INTEGRATING --> PLANNED
605
+
606
+ DRAFTED --> CANCELLED
607
+ SHELVED --> CANCELLED
608
+ PLANNING --> CANCELLED
609
+ PLANNED --> CANCELLED
610
+ STALLED --> CANCELLED
611
+ IMPLEMENTING --> CANCELLED
612
+ IMPLEMENTED --> CANCELLED
613
+ DECLINED --> CANCELLED
614
+ QUALIFYING --> CANCELLED
615
+ QUALIFIED --> CANCELLED
616
+ DEFERRED --> CANCELLED
617
+ INTEGRATING --> CANCELLED
618
+
619
+ INTEGRATED --> [*]
620
+ CANCELLED --> [*]
621
+ ```
622
+
623
+ ```txt
624
+ ●
625
+ │
626
+ │ ┌──────────────────────────────┐
627
+ ▼ │ │
628
+ ┌──────────────┐ ┌──────────────┐ │
629
+ ┌────▶│ DRAFTED │──────▶│ SHELVED │─────┤
630
+ │ │ │◀──────│ │ │
631
+ │ └──────────────┘ └──────────────┘ │
632
+ │ │ ▲ ▲ │
633
+ │ ▼ │ │ │
634
+ │ ┏━━━━━━━━━━━━━━┓ │ │
635
+ │ ┃ PLANNING ┃──────────────┘ │
636
+ │ ┃ ┃────────────────────────────┤
637
+ │ ┗━━━━━━━━━━━━━━┛ │
638
+ │ │ ┌──────────────────────────────┤
639
+ │ ▼ │ │
640
+ │ ┌──────────────┐ ┌──────────────┐ │
641
+ ├────▶│ PLANNED │──────▶│ STALLED │─────┤
642
+ │ │ │◀──────│ │ │
643
+ │ └──────────────┘ └──────────────┘ │
644
+ │ │ ▲ ▲ │
645
+ │ ▼ │ │ │
646
+ │ ┏━━━━━━━━━━━━━━┓ │ │
647
+ ├─────┃ IMPLEMENTING ┃──────────────┘ │
648
+ │ ┃ ┃────────────────────────────┤
649
+ │ ┗━━━━━━━━━━━━━━┛ │
650
+ │ │ ┌──────────────────────────────┤
651
+ │ ▼ │ │
652
+ │ ┌──────────────┐ ┌──────────────┐ │
653
+ │ │ IMPLEMENTED │──────▶│ DECLINED │─────┤
654
+ │ │ │◀──────│ │ │
655
+ │ └──────────────┘ └──────────────┘ │
656
+ │ │ ▲ ▲ │
657
+ │ ▼ │ │ │
658
+ │ ┏━━━━━━━━━━━━━━┓ │ │
659
+ ├─────┃ QUALIFYING ┃──────────────┘ │
660
+ │ ┃ ┃────────────────────────────┤
661
+ │ ┗━━━━━━━━━━━━━━┛ │
662
+ │ │ ┌──────────────────────────────┤
663
+ │ ▼ │ │
664
+ │ ┌──────────────┐ ┌──────────────┐ │
665
+ │ │ QUALIFIED │──────▶│ DEFERRED │─────┤
666
+ │ │ │◀──────│ │ │
667
+ │ └──────────────┘ └──────────────┘ │
668
+ │ │ ▲ ▲ │
669
+ │ ▼ │ │ │
670
+ │ ┏━━━━━━━━━━━━━━┓ │ │
671
+ └─────┃ INTEGRATING ┃──────────────┘ │
672
+ ┃ ┃────────────────────────────┤
673
+ ┗━━━━━━━━━━━━━━┛ │
674
+ │ │
675
+ ▼ │
676
+ ┌──────────────┐ ┌──────────────┐ │
677
+ │ INTEGRATED │ │ CANCELLED │◀────┘
678
+ │ │ │ │
679
+ └──────────────┘ └──────────────┘
680
+ │ │
681
+ ├──────────────────────┘
682
+ │
683
+ ▼
684
+ ◉
685
+ ```
686
+
687
+ The 4 "activity" states express:
688
+
689
+ - `PLANNING`: task is currently in change planning (idea to plan).
690
+ - `IMPLEMENTING`: task is currently in change implementation (plan to change-set).
691
+ - `QUALIFYING`: task is currently in change qualification (change-set to decision).
692
+ - `INTEGRATING`: task is currently in change integration (change-set to code-base).
693
+
694
+ The 10 "rest" states express:
695
+
696
+ - `DRAFTED`: task is still provisional, incoherent and incomplete.
697
+ - `SHELVED`: task was shelved during planning into backlog.
698
+ - `PLANNED`: task is coherent and complete and ready for implementation.
699
+ - `STALLED`: task was stalled during implementation by an impediment.
700
+ - `IMPLEMENTED`: task is implemented and is ready for qualification.
701
+ - `DECLINED`: task was declined during qualification.
702
+ - `QUALIFIED`: task is qualified and ready for integration.
703
+ - `DEFERRED`: task was deferred during integration due to release decision.
704
+ - `INTEGRATED`: task is integrated and reached its intended outcome.
705
+ - `CANCELLED`: task was cancelled at any time, because it failed, was called off, or became obsolete.
706
+
707
+ The *default* state is the "rest" state `DRAFTED`.