@rse/ase 0.9.11 → 0.9.13

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 (44) hide show
  1. package/dst/ase-compat.js +68 -0
  2. package/dst/ase-diagram.js +5 -2
  3. package/dst/ase-getopt.js +2 -1
  4. package/dst/ase-hook.js +158 -67
  5. package/dst/ase-mcp.js +2 -0
  6. package/dst/ase-persona.js +4 -1
  7. package/dst/ase-service.js +2 -0
  8. package/dst/ase-setup.js +52 -23
  9. package/dst/ase-skills.js +13 -3
  10. package/dst/ase-statusline.js +9 -5
  11. package/dst/ase.js +3 -1
  12. package/package.json +2 -1
  13. package/plugin/.claude-plugin/plugin.json +1 -1
  14. package/plugin/.codex-plugin/mcp.json +8 -0
  15. package/plugin/.codex-plugin/plugin.json +17 -0
  16. package/plugin/.github/plugin/plugin.json +1 -1
  17. package/plugin/hooks/hooks-codex.json +67 -0
  18. package/plugin/meta/ase-dialog.md +21 -1
  19. package/plugin/meta/ase-format-arch.md +26 -9
  20. package/plugin/meta/ase-format-meta.md +7 -3
  21. package/plugin/meta/ase-format-spec.md +11 -6
  22. package/plugin/meta/ase-getopt.md +6 -2
  23. package/plugin/meta/ase-skill.md +43 -19
  24. package/plugin/package.json +1 -1
  25. package/plugin/skills/ase-arch-analyze/SKILL.md +17 -10
  26. package/plugin/skills/ase-code-craft/SKILL.md +17 -5
  27. package/plugin/skills/ase-code-explain/SKILL.md +0 -1
  28. package/plugin/skills/ase-code-insight/SKILL.md +1 -1
  29. package/plugin/skills/ase-code-lint/SKILL.md +13 -14
  30. package/plugin/skills/ase-code-refactor/SKILL.md +17 -5
  31. package/plugin/skills/ase-code-resolve/SKILL.md +18 -5
  32. package/plugin/skills/ase-docs-proofread/SKILL.md +11 -12
  33. package/plugin/skills/ase-meta-compat/SKILL.md +278 -0
  34. package/plugin/skills/ase-meta-compat/help.md +67 -0
  35. package/plugin/skills/ase-meta-diff/SKILL.md +3 -3
  36. package/plugin/skills/ase-meta-evaluate/SKILL.md +20 -18
  37. package/plugin/skills/ase-meta-quorum/SKILL.md +3 -3
  38. package/plugin/skills/ase-task-condense/SKILL.md +6 -0
  39. package/plugin/skills/ase-task-edit/SKILL.md +6 -2
  40. package/plugin/skills/ase-task-grill/SKILL.md +10 -7
  41. package/plugin/skills/ase-task-id/SKILL.md +3 -3
  42. package/plugin/skills/ase-task-implement/SKILL.md +6 -2
  43. package/plugin/skills/ase-task-preflight/SKILL.md +5 -1
  44. package/plugin/skills/ase-task-rename/SKILL.md +9 -0
@@ -0,0 +1,278 @@
1
+ ---
2
+ name: ase-meta-compat
3
+ description: >
4
+ Self-test the LLM's ability to execute ASE's core interpreter
5
+ machinery (control flow, XML placeholders, regex matching,
6
+ arithmetic) and report an overall compatibility rating. Use when
7
+ the user wants to check how well the current model/harness is
8
+ compatible with ASE, or asks to "test ASE compatibility" or "check
9
+ ASE compatibility".
10
+ user-invocable: true
11
+ disable-model-invocation: true
12
+ ---
13
+
14
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
15
+
16
+ Self-Test ASE Compatibility
17
+ ===========================
18
+
19
+ Objective
20
+ ---------
21
+
22
+ *Self-test* how faithfully the current LLM (and its harness) executes the
23
+ four *core interpreter primitives* that every ASE skill silently relies
24
+ on -- *control flow*, *XML placeholders*, *regex matching*, and
25
+ *arithmetic* -- and report an overall **0%…100% compatibility** rating.
26
+
27
+ This skill is unusual: it is both the *test definition* and the *system
28
+ under test*. Each *probe* is a pure ASE construct that you execute and
29
+ record its *actual* result. You *MUST NOT* compare against any expected
30
+ value until STEP 6. Do not fabricate passes: a probe whose actual result
31
+ differs from its expected result *MUST* be recorded as a *fail*.
32
+
33
+ Notice that this skill intentionally does not strictly follow the ASE
34
+ skill format, especially it does not include any meta skill information,
35
+ etc.
36
+
37
+ Procedure
38
+ ---------
39
+
40
+ 1. STEP 1: Initialize Self-Test
41
+
42
+ Initialize the running map of actual probe results <actuals></actuals>
43
+ (set to empty) -- every probe in STEPs 2-5 stores its result here as
44
+ a `<category/>/<probe-name/>` entry with its *actual* computed value.
45
+
46
+ Initialize the running list of failed probes <failures></failures>
47
+ (set to empty) -- this is populated only in STEP 6 after comparing
48
+ actuals against the expected values.
49
+
50
+ 2. STEP 2: Probe XML Placeholders
51
+
52
+ Execute *all* of the following XML-placeholder probes (in the given
53
+ order). For each probe, record the *actual* result in <actuals/>
54
+ under the key `xml-placeholders/<probe-name/>`. Do *not* compare to
55
+ any expected value here.
56
+
57
+ 1. *get-and-set*: Set <v>42</v>, then get <v/>.
58
+ Record actual result for `xml-placeholders/get-and-set`.
59
+
60
+ 2. *self-ref*: Set <v>42</v>, then set `<v>pre_<v/></v>`, then get <v/>.
61
+ Record actual result for `xml-placeholders/self-ref`.
62
+
63
+ 3. *overwrite*: Set <v>42</v>, then set `<v>99</v>`, then get <v/>.
64
+ Record actual result for `xml-placeholders/overwrite`.
65
+
66
+ 4. *indexed*: Set `<eval-1-2>+1</eval-1-2>` and `<eval-2-1>-1</eval-2-1>`,
67
+ then get <eval-1-2/> and <eval-2-1/> via `<eval-1-2/>,<eval-2-1/>`.
68
+ Record actual result for `xml-placeholders/indexed`.
69
+
70
+ 5. *nested-attr*: With <w>20</w>, build the value of an XML attribute
71
+ `width="<w/>"` and read the attribute `width` back.
72
+ Record actual result for `xml-placeholders/nested-attr`.
73
+
74
+ 6. *entity*: Evaluate the XML entity `&#x29BF;` and get the rendered
75
+ Unicode character.
76
+ Record actual result for `xml-placeholders/entity`.
77
+
78
+ Set <xml-total/> to the number of XML-placeholder probes above.
79
+
80
+ 3. STEP 3: Probe Control Flow
81
+
82
+ Execute *all* of the following control-flow probes (in the given
83
+ order). For each probe, record the *actual* result in <actuals/>
84
+ under the key `control-flow/<probe-name/>`. Do *not* compare to any
85
+ expected value here.
86
+
87
+ 1. *branch*: Set <a>3</a>, then evaluate
88
+ `<if condition="<a/> is greater than 5">big</if>
89
+ <elseif condition="<a/> is greater than 2">mid</elseif>
90
+ <else>small</else>`.
91
+ Record actual result for `control-flow/branch`.
92
+
93
+ 2. *while-sum*: Set <s>0</s> and <i>1</i>, then evaluate
94
+ `<while condition="<i/> is less than or equal to 5">
95
+ set <s/> to <s/> + <i/>,
96
+ set <i/> to <i/> + 1
97
+ </while>`.
98
+ Record <s/> as actual result for `control-flow/while-sum`.
99
+
100
+ 3. *for-order*: Set <s></s>, then evaluate
101
+ `<for items="x y z"><s><s/>-<item/></for>`.
102
+ Record <s/> as actual result for `control-flow/for-order`.
103
+
104
+ 4. *while-break*: Set <i>1</i> and <hit></hit>, then evaluate
105
+ `<while condition="<i/> is less than or equal to 9">
106
+ if <i/> equals 4 set <hit/> to <i/> and <break/>,
107
+ else set <i/> to <i/> + 1
108
+ </while>`.
109
+ Record <hit/> as actual result for `control-flow/while-break`.
110
+
111
+ 5. *step-skip*: A `<step condition="[...]">[...]</step>` either expands
112
+ to its body (if condition evaluates to true) or to the empty string,
113
+ so what does `<step condition="42 is greater than 7">X</step>` expands into?
114
+ Record the result of this construct for `control-flow/step-skip`.
115
+
116
+ 6. *expand-subst*: With `<define name="foo">[<arg1/>:<content/>]</define>`,
117
+ evaluate `<expand name="foo" arg1="K">V</expand>`.
118
+ Record actual result for `control-flow/expand-subst`.
119
+
120
+ Set <cf-total/> to the number of control-flow probes above.
121
+
122
+ 4. STEP 4: Probe Regex Matching
123
+
124
+ Execute *all* of the following regex probes (in the given order).
125
+ For each probe, record the *actual* result in <actuals/> under the
126
+ key `regex/<probe-name/>`. Do *not* compare to any expected value
127
+ here.
128
+
129
+ 1. *getopt-dash*: Does the string `-l foo` match the regexp `(^|\s)-`?
130
+ Record `yes` or `no` as actual result for `regex/getopt-dash`.
131
+
132
+ 2. *getopt-nodash*: Does the string `foo` match the regexp `(^|\s)-`?
133
+ Record `yes` or `no` as actual result for `regex/getopt-nodash`.
134
+
135
+ 3. *anchored-int*: Does `123` fully match `^\d+$`, and does `12a` fully
136
+ match `^\d+$`? Report as `<yes-or-no/>,<yes-or-no/>`.
137
+ Record actual result for `regex/anchored-int`.
138
+
139
+ 4. *alternation*: Does `thorough` match `^(basic|standard|thorough)$`?
140
+ Record `yes` or `no` as actual result for `regex/alternation`.
141
+
142
+ 5. *capture*: Apply `^--(\w+).+` to `--foo-bar-quux`.
143
+ Record the first capture group as actual result for `regex/capture`.
144
+
145
+ 6. *whitespace*: Does ` -x` (leading space then dash) match `(^|\s)-`
146
+ (the `\s` alternative)?
147
+ Record `yes` or `no` as actual result for `regex/whitespace`.
148
+
149
+ 7. *complex*: Does `--level=(low|high)...` match
150
+ `^--([A-Za-z][A-Za-z0-9-]*)(?:\|-([A-Za-z]))?(?:=(\((.*)\)(\.\.\.)?|.*))?$`?
151
+ Record `yes` or `no` as actual result for `regex/complex`.
152
+
153
+ Set <re-total/> to the number of regex probes above.
154
+
155
+ 5. STEP 5: Probe Arithmetic
156
+
157
+ Execute *all* of the following arithmetic probes (in the given
158
+ order). For each probe, record the *actual* result in <actuals/>
159
+ under the key `arithmetic/<probe-name/>`. Do *not* compare to any
160
+ expected value here.
161
+
162
+ 1. *increment*: With <n>7</n>, compute <n/> + 2.
163
+ Record actual result for `arithmetic/increment`.
164
+
165
+ 2. *product-sum*: Compute `4.00 * 1.00 + 2.00 * 0.50`.
166
+ Record actual result (as `X.XX`) for `arithmetic/product-sum`.
167
+
168
+ 3. *percentage*: Compute `3 / 7` rounded to 2 decimal places.
169
+ Record actual result (as `0.XX`) for `arithmetic/percentage`.
170
+
171
+ 4. *bar-width*: With <title-len>13</title-len>, compute `67 - <title-len/>`.
172
+ Record actual result for `arithmetic/bar-width`.
173
+
174
+ 5. *threshold*: Is `0.095` less than `0.10`?
175
+ Record `yes` or `no` as actual result for `arithmetic/threshold`.
176
+
177
+ 6. *round-half*: Round `2.5` to the nearest integer (round half up).
178
+ Record actual result for `arithmetic/round-half`.
179
+
180
+ Set <arith-total/> to the number of arithmetic probes above.
181
+
182
+ 6. STEP 6: Fetch Expected Values and Score
183
+
184
+ Call the `ase_compat()` tool of the `ase` MCP server with an
185
+ *internal* *programmatic* MCP tool call (and *NOT* with an external
186
+ shell command) and set <compat-output/> to the `text` content of the
187
+ response.
188
+
189
+ Parse <compat-output/> into a map <expected/> by splitting on
190
+ newlines; for each non-empty line of the form `<id/>: <value/>`, set
191
+ `<expected[<id/>]>` to `<value/>` (value may be empty for probes
192
+ whose correct answer is an empty string).
193
+
194
+ For each probe in <actuals/>, compare the actual result to
195
+ `<expected[<id/>]>` using an exact-match comparison:
196
+
197
+ - If they match, count the probe as *pass*.
198
+ - If they differ, count the probe as *fail* and append `<id/>`
199
+ to <failures/>.
200
+
201
+ Tally pass counts per category:
202
+
203
+ - Set <xml-pass/> to the number of `xml-placeholders/*` probes that passed.
204
+ - Set <cf-pass/> to the number of `control-flow/*` probes that passed.
205
+ - Set <re-pass/> to the number of `regex/*` probes that passed.
206
+ - Set <arith-pass/> to the number of `arithmetic/*` probes that passed.
207
+
208
+ 7. STEP 7: Compute and Report Compatibility
209
+
210
+ Compute each category's *pass-rate* (a value in 0.0…1.0) by dividing
211
+ its passes by its total:
212
+
213
+ set <xml-rate/> to <xml-pass/> / <xml-total/>,
214
+ set <cf-rate/> to <cf-pass/> / <cf-total/>,
215
+ set <re-rate/> to <re-pass/> / <re-total/>,
216
+ set <arith-rate/> to <arith-pass/> / <arith-total/>.
217
+
218
+ Compute the overall compatibility as a *weighted average* of the
219
+ four pass-rates, where *XML placeholders* carry weight `4.00` (the
220
+ backbone of every skill), *control flow* carries weight `3.00`,
221
+ *regex matching* carries weight `2.00`, and *arithmetic* carries
222
+ weight `1.00`. Use the `ase_decision_matrix` MCP tool with a single
223
+ "compatibility" alternative column, one matrix row per category of
224
+ the form `[ <weight/>, <rate/> ]`:
225
+
226
+ Call...
227
+
228
+ `ase_decision_matrix(matrix: [
229
+ [ 4.00, <xml-rate/> ],
230
+ [ 3.00, <cf-rate/> ],
231
+ [ 2.00, <re-rate/> ],
232
+ [ 1.00, <arith-rate/> ]
233
+ ])`
234
+
235
+ ...of the `ase` MCP server with an *internal* *programmatic* MCP
236
+ tool call (and *NOT* with an external shell command) and set
237
+ <product-sum/> to the *single* numerical value of the returned
238
+ array.
239
+
240
+ The product-sum is the sum over the four rows of `<weight/> *
241
+ <rate/>`, so dividing by the sum of weights (4.00 + 3.00 + 2.00 +
242
+ 1.00 = 10.00) yields the weighted-average compatibility on 0.0…1.0:
243
+
244
+ Set <overall/> to <product-sum/> / 10.00.
245
+ Set <overall-pct/> to round(<overall/> * 100) (an integer percentage).
246
+
247
+ Also compute each category's display percentage:
248
+
249
+ Set <cf-pct/> to round(<cf-rate/> * 100), and
250
+ likewise <xml-pct/>, <re-pct/>, <arith-pct/>.
251
+
252
+ Determine the <verdict/> from <overall-pct/>:
253
+
254
+ 1. If <overall-pct/> is greater than or equal to 90:
255
+ Set <verdict>✓ *FULLY COMPATIBLE*</verdict>.
256
+
257
+ 2. Else if <overall-pct/> is greater than or equal to 60:
258
+ Set <verdict>⚠ *PARTIALLY COMPATIBLE*</verdict>.
259
+
260
+ 3. Else:
261
+ Set <verdict>✘ *INCOMPATIBLE*</verdict>.
262
+
263
+ 4. If <failures/> is not empty:
264
+ Append to <verdict/> the suffix ` (failed: <failures/>)`.
265
+
266
+ Finally, output the compatibility report:
267
+
268
+ **RESULTS**:
269
+
270
+ | ⦿ *Capability* | ⚖ *Weight* | ✓ *Passed* | ⚑ *Rate* |
271
+ | :------------------- | ----------: | ---------------------------: | ------------------: |
272
+ | XML Placeholders | 4.00 | <xml-pass/>/<xml-total/> | <xml-pct/>% |
273
+ | Control Flow | 3.00 | <cf-pass/>/<cf-total/> | <cf-pct/>% |
274
+ | Regex Matching | 2.00 | <re-pass/>/<re-total/> | <re-pct/>% |
275
+ | Arithmetic | 1.00 | <arith-pass/>/<arith-total/> | <arith-pct/>% |
276
+ | **OVERALL** | | | **<overall-pct/>%** |
277
+
278
+ **VERDICT**: <verdict/>
@@ -0,0 +1,67 @@
1
+
2
+ ## NAME
3
+
4
+ `ase-meta-compat` - Self-Test ASE Compatibility
5
+
6
+ ## SYNOPSIS
7
+
8
+ `ase-meta-compat`
9
+ [`--help`|`-h`]
10
+
11
+ ## DESCRIPTION
12
+
13
+ The `ase-meta-compat` skill *self-tests* how faithfully the current LLM
14
+ (and its harness) executes the four *core interpreter primitives* that
15
+ every ASE skill silently relies on, and reports an overall *0%…100%
16
+ compatibility* rating. ASE skills are not run by a conventional
17
+ interpreter - they are interpreted by the *model itself*, which must honor
18
+ control-flow constructs, substitute XML placeholders, evaluate regex
19
+ conditions, and perform arithmetic. If a model cannot execute these
20
+ primitives reliably, *every* ASE skill silently misbehaves, so this skill
21
+ lets a user measure the fit *before* relying on ASE.
22
+
23
+ The skill is both the *test definition* and the *system under test*. It
24
+ probes four capability categories:
25
+
26
+ - *XML Placeholders*: the get (`<x/>`) and set (`<x>v</x>`) semantics,
27
+ including the get-and-set composite, indexed names, and XML-entity
28
+ rendering.
29
+
30
+ - *Control Flow*: the `<if>`/`<elseif>`/`<else>`, `<while>`/`<break>`,
31
+ `<for>`, `<step condition=…>`, and `<expand>`/`<define>` constructs.
32
+
33
+ - *Regex Matching*: the patterns ASE genuinely uses (e.g. the getopt
34
+ short-circuit `(^|\s)-`), plus anchoring, alternation, and captures.
35
+
36
+ - *Arithmetic*: counter increments, decision-matrix product-sums,
37
+ percentage rounding, and bar-width computations.
38
+
39
+ Each *probe* embeds a construct with a *known expected result*; the model
40
+ executes it and honestly self-checks its actual result against the
41
+ expected one. Per-category pass-rates are combined into the overall rating
42
+ via the `ase_decision_matrix` MCP tool as a *weighted average*, with
43
+ *XML Placeholders* weighted `4.00` (the backbone of every skill),
44
+ *Control Flow* weighted `3.00`, *Regex Matching* weighted `2.00`, and
45
+ *Arithmetic* weighted `1.00`. The
46
+ result is a boxed per-category table (passes and percentage per category),
47
+ a final *OVERALL COMPATIBILITY* percentage, and a one-line *VERDICT*
48
+ (`✓ fully compatible` at `≥ 90%`, `⚠ partially compatible` at `60–89%`,
49
+ `✘ incompatible` below `60%`) that names any failed probes.
50
+
51
+ ## ARGUMENTS
52
+
53
+ The `ase-meta-compat` skill takes no arguments (besides `--help`|`-h`). It
54
+ always runs the most rigorous self-test, with 6 *probes per category*
55
+ (7 for *Regex Matching*), for 25 probes in total.
56
+
57
+ ## EXAMPLES
58
+
59
+ Run the compatibility self-test:
60
+
61
+ ```text
62
+ ❯ /ase-meta-compat
63
+ ```
64
+
65
+ ## SEE ALSO
66
+
67
+ [`ase-meta-evaluate`](../ase-meta-evaluate/help.md), [`ase-meta-quorum`](../ase-meta-quorum/help.md), [`ase-meta-why`](../ase-meta-why/help.md).
@@ -274,9 +274,9 @@ explicitly requested by this procedure via outputs based on a <template/>!
274
274
 
275
275
  <ase-tpl-bullet-signal/> **CHANGE RISK REPORT**: Overall: **<band/>** (<aggregate/>/5)
276
276
 
277
- | Axis | Score | Findings |
278
- | ----------- | ---------- | ----------------------------------------------------------- |
279
- | **<axis/>** | <score/>/5 | ● **EVIDENCE**: <evidence/> ● **MITIGATION**: <mitigation/> |
277
+ | Axis | Score | Findings |
278
+ | ----------- | ---------- | ----------------------------------------------------------------------------------------------------- |
279
+ | **<axis/>** | <score/>/5 | ● **EVIDENCE**: <evidence/><if condition="axis score is `>= 4`"> ● **MITIGATION**: <mitigation/></if> |
280
280
  </template>
281
281
  </step>
282
282
 
@@ -81,15 +81,17 @@ multi-*criteria* decision matrix.
81
81
  - For each alternative <alternative-K/> (K=1-N), decide whether
82
82
  it is a genuine member of <class-of-alternatives/>. If any
83
83
  <alternative-K/> is *not* a member (i.e. the alternatives are not
84
- mutually comparable within a single class), let <alternative-J/>
85
- (J=1-P, P<=N) be the subset of non-member alternatives, output the
86
- following <template/> and *stop the entire flow* immediately without
87
- executing any further steps:
84
+ mutually comparable within a single class), collect the subset
85
+ of non-member alternatives into the space-separated list
86
+ <non-members/> (the <alternative-K/> for which the membership
87
+ decision was negative), output the following <template/> and
88
+ *stop the entire flow* immediately without executing any further
89
+ steps:
88
90
 
89
91
  <template>
90
92
  <ase-tpl-bullet-signal/> **ERROR: INCOMPARABLE ALTERNATIVES**: *<class-of-alternatives/>*
91
93
 
92
- <for items="<alternative-J/> [...]">
94
+ <for items="<non-members/>">
93
95
  ⚑ **<item/>** (*member of a different class*)
94
96
  </for>
95
97
  </template>
@@ -217,29 +219,29 @@ multi-*criteria* decision matrix.
217
219
  appear large; the all-negative regime is surfaced as a dedicated
218
220
  warning branch below. Do not output anything.
219
221
 
220
- - If <percentage/> is less than 0.01 (i.e. <distance/> is
221
- effectively zero relative to abs(<rating-K/>)), stop the flow after
222
- you output just the following <template/> and do not output anything
223
- else:
224
-
225
- <template>
226
- <ase-tpl-bullet-signal/> **ERROR**: ✘ *MULTIPLE BEST ALTERNATIVES FOUND*,
227
- ⚠ *Please give some hints on the criteria to ensure a single best alternative!*
228
- </template>
229
-
230
- - Otherwise, if <rating-K/> is less than zero (i.e. all alternatives
222
+ - If <rating-K/> is less than zero (i.e. all alternatives
231
223
  rate negatively and the "best" is merely the least-bad), stop the
232
224
  flow after you output just the following <template/> and do not
233
225
  output anything else. This all-negative check is evaluated *before*
234
- the small-distance check below, so that an all-negative alternative
226
+ the small-distance checks below, so that an all-negative alternative
235
227
  set with a small winning gap surfaces the all-negative warning rather
236
- than being masked by the small-distance branch:
228
+ than being masked by the multiple-best or small-distance branches:
237
229
 
238
230
  <template>
239
231
  <ase-tpl-bullet-signal/> **BEST ALTERNATIVE**: ⚑ **<alternative-K/>**
240
232
  ⚠ *ATTENTION: all alternatives rate negatively; this is the least-bad choice, not a strong winner!*
241
233
  </template>
242
234
 
235
+ - Otherwise, if <percentage/> is less than 0.01 (i.e. <distance/> is
236
+ effectively zero relative to abs(<rating-K/>)), stop the flow after
237
+ you output just the following <template/> and do not output anything
238
+ else:
239
+
240
+ <template>
241
+ <ase-tpl-bullet-signal/> **ERROR**: ✘ *MULTIPLE BEST ALTERNATIVES FOUND*,
242
+ ⚠ *Please give some hints on the criteria to ensure a single best alternative!*
243
+ </template>
244
+
243
245
  - Otherwise, if <percentage/> is less than 0.10, stop the flow after
244
246
  you output just the following <template/> and do not output anything
245
247
  else:
@@ -142,9 +142,9 @@ by querying *multiple* AIs for an *optimal consensus*.
142
142
  set <disagreement/> to `(no quorum: no foreign AIs were available)`,
143
143
  then skip the rest of this step.
144
144
 
145
- Otherwise, determine, on a Likert scale of 0..<n/>, the amount of the
146
- overall consensus <c/> of all the responses. The <n/> is the *total
147
- number of responders* (yourself plus all available foreign AIs above).
145
+ Otherwise, let <n/> be the *total number of responders* (yourself plus
146
+ all available foreign AIs above). Then determine, on a Likert scale of
147
+ 0..<n/>, the amount of the overall consensus <c/> of all the responses.
148
148
  If all responses disagree, the consensus <c/> is zero.
149
149
  If all responses agree, <c/> is <n/>.
150
150
 
@@ -93,6 +93,12 @@ explicitly requested by this procedure via outputs based on a <template/>!
93
93
  Set <words-before><words/></words-before> (remember the loaded
94
94
  word count for the strictly-smaller check in step 3).
95
95
 
96
+ <if condition="<content/> contains 'Created: <text/>'">
97
+ Set <timestamp-created><text/></timestamp-created> (extract the
98
+ original creation timestamp so it can be re-inserted unchanged
99
+ into the condensed <content/> in step 3).
100
+ </if>
101
+
96
102
  Only output the following <template/>:
97
103
 
98
104
  <template>
@@ -171,7 +171,11 @@ Set <content-dirty>true</content-dirty>.
171
171
 
172
172
  1. Determine any existing plan content:
173
173
 
174
- <if condition="<getopt-option-int-reuse-task/> is equal `true`">
174
+ <if condition="
175
+ <getopt-option-int-reuse-task/> is equal `true`
176
+ *and* a `ase_task_save(id: '<ase-task-id/>', ...)` tool call
177
+ exists earlier in the current session
178
+ ">
175
179
  Set <text/> to the `text` argument of the most recent
176
180
  `ase_task_save(id: '<ase-task-id/>', ...)` tool call,
177
181
  *without* calling `ase_task_load` again. Set <status>plan
@@ -286,7 +290,7 @@ Set <content-dirty>true</content-dirty>.
286
290
  </template>
287
291
  </if>
288
292
 
289
- 4. <if condition="<content/> does not contain '# TASK' AND <instruction/> is empty">
293
+ 4. <if condition="no line of <content/> matches the case-insensitive regex `^\s*#+\s*TASK\b` AND <instruction/> is empty">
290
294
  Set <instruction><content/></instruction> (set instruction to content).
291
295
  Set <content></content> (set content to empty).
292
296
  Set <content-dirty>true</content-dirty>.
@@ -80,7 +80,11 @@ explicitly requested by this procedure via outputs based on a <template/>!
80
80
 
81
81
  1. Determine the current task plan content:
82
82
 
83
- <if condition="<getopt-option-int-reuse-task/> is equal `true`">
83
+ <if condition="
84
+ <getopt-option-int-reuse-task/> is equal `true`
85
+ *and* a `ase_task_save(id: '<ase-task-id/>', ...)` tool call
86
+ exists earlier in the current session
87
+ ">
84
88
  Set <text/> to the `text` argument of the most recent
85
89
  `ase_task_save(id: '<ase-task-id/>', ...)` tool call,
86
90
  *without* calling `ase_task_load` again. Set <status>plan
@@ -105,12 +109,11 @@ explicitly requested by this procedure via outputs based on a <template/>!
105
109
  - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
106
110
  Set <plan><text/></plan> (set plan to text).
107
111
  Calculate the number of words <words/> of <plan/>.
112
+ Then output the following <template/>:
108
113
 
109
- Output the following <template/>:
110
-
111
- <template>
112
- ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **<status/>**
113
- </template>
114
+ <template>
115
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **<status/>**
116
+ </template>
114
117
 
115
118
  2. <if condition="<plan/> is empty">
116
119
  Complain and tell the user to use the `ase-code-resolve`,
@@ -195,7 +198,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
195
198
 
196
199
  <expand name="custom-dialog" arg1="--other">
197
200
  <aspect-N/>: <question-N/>
198
- <answer-N-1-label/>: ⚝ **CURRENT PLAN** ⚝ <answer-N-1-description/>
201
+ <answer-N-1-label/>: ⚝ **CURRENT PLAN** ⚝ - <answer-N-1-description/>
199
202
  <answer-N-K-label/>: <answer-N-K-description/>
200
203
  [...]
201
204
  </expand>
@@ -52,9 +52,9 @@ Configure Task Id
52
52
  </if>
53
53
 
54
54
  4. <if condition="<request/> is NOT empty">
55
- - Set <ase-task-id><request/></ase-task-id> and
56
- call the `ase_task_id(id: "<ase-task-id/>", session: "<ase-session-id/>")`
57
- tool from the `ase` MCP server.
55
+ - Call the `ase_task_id(id: "<request/>", session: "<ase-session-id/>")`
56
+ tool from the `ase` MCP server. Check the response as mandated
57
+ above; only on a clean response set <ase-task-id><request/></ase-task-id>.
58
58
 
59
59
  - Output:
60
60
  <template>
@@ -97,7 +97,11 @@ explicitly requested by this procedure via outputs based on a <template/>!
97
97
 
98
98
  1. Determine the current task plan content:
99
99
 
100
- <if condition="<getopt-option-int-reuse-task/> is equal `true`">
100
+ <if condition="
101
+ <getopt-option-int-reuse-task/> is equal `true`
102
+ *and* a `ase_task_save(id: '<ase-task-id/>', ...)` tool call
103
+ exists earlier in the current session
104
+ ">
101
105
  Set <text/> to the `text` argument of the most recent
102
106
  `ase_task_save(id: '<ase-task-id/>', ...)` tool call,
103
107
  *without* calling `ase_task_load` again. Set <status>plan
@@ -210,7 +214,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
210
214
  skill accepts only an optional `[<id>]` argument and no
211
215
  `--next` option; remaining tokens are intentionally discarded.
212
216
  Only output the following <template/> and then call the
213
- tool `Skill(skill: "ase:ase-task-delete", args: <args/>)`
217
+ tool `Skill(skill: "ase:ase-task-delete", args: "<args/>")`
214
218
  to invoke the `ase:ase-task-delete` skill in order to
215
219
  *delete* the updated plan. Immediately stop processing the
216
220
  current skill once the `Skill` tool was used.
@@ -97,7 +97,11 @@ explicitly requested by this procedure via outputs based on a <template/>!
97
97
 
98
98
  1. Determine the current task plan content:
99
99
 
100
- <if condition="<getopt-option-int-reuse-task/> is equal `true`">
100
+ <if condition="
101
+ <getopt-option-int-reuse-task/> is equal `true`
102
+ *and* a `ase_task_save(id: '<ase-task-id/>', ...)` tool call
103
+ exists earlier in the current session
104
+ ">
101
105
  Set <text/> to the `text` argument of the most recent
102
106
  `ase_task_save(id: '<ase-task-id/>', ...)` tool call,
103
107
  *without* calling `ase_task_load` again. Set <status>plan
@@ -71,6 +71,15 @@ explicitly requested by this procedure via outputs based on a <template/>!
71
71
  </template>
72
72
  </if>
73
73
 
74
+ 6. <if condition="<old/> is equal <new/>">
75
+ Only output the following <template/> and then immediately
76
+ *STOP* processing the entire current skill:
77
+
78
+ <template>
79
+ ⧉ **ASE**: ◉ task: **<old/>**, ▶ status: **task unchanged (old and new task id are equal)**
80
+ </template>
81
+ </if>
82
+
74
83
  2. **Perform Operation**:
75
84
 
76
85
  1. Call the `ase_task_rename(old: "<old/>", new: "<new/>")` tool of the