@rse/ase 0.9.10 → 0.9.12

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 (41) hide show
  1. package/dst/ase-compat.js +68 -0
  2. package/dst/ase-hook.js +158 -67
  3. package/dst/ase-service.js +2 -0
  4. package/dst/ase-setup.js +52 -23
  5. package/dst/ase-statusline.js +7 -3
  6. package/dst/ase.js +2 -0
  7. package/package.json +2 -1
  8. package/plugin/.claude-plugin/plugin.json +1 -1
  9. package/plugin/.codex-plugin/mcp.json +8 -0
  10. package/plugin/.codex-plugin/plugin.json +17 -0
  11. package/plugin/.github/plugin/plugin.json +1 -1
  12. package/plugin/hooks/hooks-codex.json +67 -0
  13. package/plugin/meta/ase-dialog.md +20 -0
  14. package/plugin/package.json +1 -1
  15. package/plugin/skills/ase-arch-analyze/SKILL.md +6 -1
  16. package/plugin/skills/ase-arch-discover/SKILL.md +2 -2
  17. package/plugin/skills/ase-code-analyze/SKILL.md +12 -5
  18. package/plugin/skills/ase-code-craft/SKILL.md +6 -3
  19. package/plugin/skills/ase-code-explain/SKILL.md +6 -1
  20. package/plugin/skills/ase-code-insight/SKILL.md +6 -1
  21. package/plugin/skills/ase-code-lint/SKILL.md +9 -3
  22. package/plugin/skills/ase-code-refactor/SKILL.md +6 -3
  23. package/plugin/skills/ase-code-resolve/SKILL.md +13 -9
  24. package/plugin/skills/ase-docs-proofread/SKILL.md +9 -3
  25. package/plugin/skills/ase-meta-brainstorm/SKILL.md +3 -4
  26. package/plugin/skills/ase-meta-changelog/SKILL.md +16 -5
  27. package/plugin/skills/ase-meta-chat/SKILL.md +6 -1
  28. package/plugin/skills/ase-meta-commit/SKILL.md +5 -0
  29. package/plugin/skills/ase-meta-compat/SKILL.md +288 -0
  30. package/plugin/skills/ase-meta-compat/help.md +67 -0
  31. package/plugin/skills/ase-meta-diaboli/SKILL.md +5 -1
  32. package/plugin/skills/ase-meta-diff/SKILL.md +1 -1
  33. package/plugin/skills/ase-meta-evaluate/SKILL.md +20 -12
  34. package/plugin/skills/ase-meta-persona/SKILL.md +6 -1
  35. package/plugin/skills/ase-meta-quorum/SKILL.md +15 -3
  36. package/plugin/skills/ase-meta-steelman/SKILL.md +5 -1
  37. package/plugin/skills/ase-task-delete/SKILL.md +6 -1
  38. package/plugin/skills/ase-task-grill/SKILL.md +30 -9
  39. package/plugin/skills/ase-task-id/SKILL.md +10 -3
  40. package/plugin/skills/ase-task-reboot/SKILL.md +2 -2
  41. package/plugin/skills/ase-task-rename/SKILL.md +15 -1
@@ -0,0 +1,288 @@
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 `&#x25CB;` 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
+ </step>
156
+
157
+ 5. STEP 5: Probe Arithmetic
158
+
159
+ Execute *all* of the following arithmetic probes (in the given
160
+ order). For each probe, record the *actual* result in <actuals/>
161
+ under the key `arithmetic/<probe-name/>`. Do *not* compare to any
162
+ expected value here.
163
+
164
+ 1. *increment*: With <n>7</n>, compute <n/> + 2.
165
+ Record actual result for `arithmetic/increment`.
166
+
167
+ 2. *product-sum*: Compute `4.00 * 1.00 + 2.00 * 0.50`.
168
+ Record actual result (as `X.XX`) for `arithmetic/product-sum`.
169
+
170
+ 3. *percentage*: Compute `3 / 7` rounded to 2 decimal places.
171
+ Record actual result (as `0.XX`) for `arithmetic/percentage`.
172
+
173
+ 4. *bar-width*: With <title-len>13</title-len>, compute `67 - <title-len/>`.
174
+ Record actual result for `arithmetic/bar-width`.
175
+
176
+ 5. *threshold*: Is `0.095` less than `0.10`?
177
+ Record `yes` or `no` as actual result for `arithmetic/threshold`.
178
+
179
+ 6. *round-half*: Round `2.5` to the nearest integer (round half up).
180
+ Record actual result for `arithmetic/round-half`.
181
+
182
+ Set <arith-total/> to the number of arithmetic probes above.
183
+
184
+ </step>
185
+
186
+ 6. STEP 6: Fetch Expected Values and Score
187
+
188
+ Call the `ase_compat()` tool of the `ase` MCP server with an
189
+ *internal* *programmatic* MCP tool call (and *NOT* with an external
190
+ shell command) and set <compat-output/> to the `text` content of the
191
+ response.
192
+
193
+ Parse <compat-output/> into a map <expected/> by splitting on
194
+ newlines; for each non-empty line of the form `<id/>: <value/>`, set
195
+ `<expected[<id/>]>` to `<value/>` (value may be empty for probes
196
+ whose correct answer is an empty string).
197
+
198
+ For each probe in <actuals/>, compare the actual result to
199
+ `<expected[<id/>]>` using an exact-match comparison:
200
+
201
+ - If they match, count the probe as *pass*.
202
+ - If they differ, count the probe as *fail* and append `<id/>`
203
+ to <failures/>.
204
+
205
+ Tally pass counts per category:
206
+
207
+ - Set <xml-pass/> to the number of `xml-placeholders/*` probes that passed.
208
+ - Set <cf-pass/> to the number of `control-flow/*` probes that passed.
209
+ - Set <re-pass/> to the number of `regex/*` probes that passed.
210
+ - Set <arith-pass/> to the number of `arithmetic/*` probes that passed.
211
+
212
+ </step>
213
+
214
+ 7. STEP 7: Compute and Report Compatibility
215
+
216
+ Compute each category's *pass-rate* (a value in 0.0…1.0) by dividing
217
+ its passes by its total:
218
+
219
+ set <xml-rate/> to <xml-pass/> / <xml-total/>,
220
+ set <cf-rate/> to <cf-pass/> / <cf-total/>,
221
+ set <re-rate/> to <re-pass/> / <re-total/>,
222
+ set <arith-rate/> to <arith-pass/> / <arith-total/>.
223
+
224
+ Compute the overall compatibility as a *weighted average* of the
225
+ four pass-rates, where *XML placeholders* carry weight `4.00` (the
226
+ backbone of every skill), *control flow* carries weight `3.00`,
227
+ *regex matching* carries weight `2.00`, and *arithmetic* carries
228
+ weight `1.00`. Use the `ase_decision_matrix` MCP tool with a single
229
+ "compatibility" alternative column, one matrix row per category of
230
+ the form `[ <weight/>, <rate/> ]`:
231
+
232
+ Call...
233
+
234
+ `ase_decision_matrix(matrix: [
235
+ [ 4.00, <xml-rate/> ],
236
+ [ 3.00, <cf-rate/> ],
237
+ [ 2.00, <re-rate/> ],
238
+ [ 1.00, <arith-rate/> ]
239
+ ])`
240
+
241
+ ...of the `ase` MCP server with an *internal* *programmatic* MCP
242
+ tool call (and *NOT* with an external shell command) and set
243
+ <product-sum/> to the *single* numerical value of the returned
244
+ array.
245
+
246
+ The product-sum is the sum over the four rows of `<weight/> *
247
+ <rate/>`, so dividing by the sum of weights (4.00 + 3.00 + 2.00 +
248
+ 1.00 = 10.00) yields the weighted-average compatibility on 0.0…1.0:
249
+
250
+ Set <overall/> to <product-sum/> / 10.00.
251
+ Set <overall-pct/> to round(<overall/> * 100) (an integer percentage).
252
+
253
+ Also compute each category's display percentage:
254
+
255
+ Set <cf-pct/> to round(<cf-rate/> * 100), and
256
+ likewise <xml-pct/>, <re-pct/>, <arith-pct/>.
257
+
258
+ Determine the <verdict/> from <overall-pct/>:
259
+
260
+ 1. If <overall-pct/> is greater than or equal to 90:
261
+ Set <verdict>✓ *FULLY COMPATIBLE*</verdict>.
262
+
263
+ 2. Else if <overall-pct/> is greater than or equal to 60:
264
+ Set <verdict>⚠ *PARTIALLY COMPATIBLE*</verdict>.
265
+
266
+ 3. Else:
267
+ Set <verdict>✘ *INCOMPATIBLE*</verdict>.
268
+
269
+ 4. If <failures/> is not empty:
270
+ Append to <verdict/> the suffix ` (failed: <failures/>)`.
271
+
272
+ Output the final compatibility report with the following <template/>:
273
+
274
+ <template>
275
+
276
+ **RESULTS**:
277
+
278
+ | ⦿ *Capability* | ⚖ *Weight* | ✓ *Passed* | ⚑ *Rate* |
279
+ | :------------------- | ----------: | ---------------------------: | ------------------: |
280
+ | XML Placeholders | 4.00 | <xml-pass/>/<xml-total/> | <xml-pct/>% |
281
+ | Control Flow | 3.00 | <cf-pass/>/<cf-total/> | <cf-pct/>% |
282
+ | Regex Matching | 2.00 | <re-pass/>/<re-total/> | <re-pct/>% |
283
+ | Arithmetic | 1.00 | <arith-pass/>/<arith-total/> | <arith-pct/>% |
284
+ | **OVERALL** | | | **<overall-pct/>%** |
285
+
286
+ **VERDICT**: <verdict/>
287
+
288
+ </template>
@@ -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).
@@ -120,7 +120,11 @@ to <getopt-option-count/>; if <getopt-option-count/> is *non-numeric* or
120
120
  Anti-Theses or Counter-Arguments until you EITHER have found at
121
121
  least <count/> Anti-Theses or Counter-Arguments with at least a rank
122
122
  of 7 OR you have already checked a total of <count/> x 5 Anti-Theses
123
- or Counter-Arguments.
123
+ or Counter-Arguments. If the second condition is reached first and
124
+ fewer than <count/> Anti-Theses or Counter-Arguments reached a rank
125
+ of at least 7, nevertheless surface the <count/> highest-ranked ones
126
+ found so far, because <count/> is the *minimum* number of
127
+ Anti-Theses to surface.
124
128
 
125
129
  Then, for the top-<count/> highest-ranked Anti-Theses or
126
130
  Counter-Arguments, sort them by their rank from highest to lowest,
@@ -109,7 +109,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
109
109
 
110
110
  3. For each discovered *intent group*, emit the following row
111
111
  <template/>, where <intent/> is the intent label, <changes/>
112
- is the total number of lines changed per feature in format
112
+ is the total number of lines changed per intent group in format
113
113
  `+N/-M`, <files/> is the list of affected file references,
114
114
  and <description/> is a *brief* one-to-two-sentence
115
115
  narrative of what changed and why:
@@ -13,11 +13,16 @@ effort: high
13
13
 
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
16
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
16
17
 
17
18
  <skill name="ase-meta-evaluate">
18
19
  Evaluate Alternatives
19
20
  </skill>
20
21
 
22
+ <expand name="getopt" arg1="ase-meta-evaluate">
23
+ $ARGUMENTS
24
+ </expand>
25
+
21
26
  <objective>
22
27
  *Evaluate* *alternatives* through a weighted
23
28
  multi-*criteria* decision matrix.
@@ -25,7 +30,7 @@ multi-*criteria* decision matrix.
25
30
 
26
31
  <flow>
27
32
  1. <step id="STEP 1: Determine Reason">
28
- - From the <request>$ARGUMENTS</request>, try to derive the overall
33
+ - From the <request><getopt-arguments/></request>, try to derive the overall
29
34
  reason <reason/> for the evaluation. If no such reason can be
30
35
  derived, assume <reason>generic comparison</reason>.
31
36
 
@@ -38,7 +43,7 @@ multi-*criteria* decision matrix.
38
43
  </step>
39
44
 
40
45
  2. <step id="STEP 2: Determine Alternatives">
41
- - From the <request>$ARGUMENTS</request> derive the two or more
46
+ - From the <request><getopt-arguments/></request> derive the two or more
42
47
  alternatives <alternative-K/> (K=1-N) the user wants to be
43
48
  evaluated. Do not output anything.
44
49
 
@@ -105,7 +110,7 @@ multi-*criteria* decision matrix.
105
110
  </step>
106
111
 
107
112
  3. <step id="STEP 3: Derive Criteria">
108
- - From the <request>$ARGUMENTS</request>, try to derive the criteria
113
+ - From the <request><getopt-arguments/></request>, try to derive the criteria
109
114
  <criteria-L/> (L=1-M) for the evaluation. Do not output anything.
110
115
 
111
116
  - For each criterion <criteria-L/> (L=1-M), decide on its <weight-L/>
@@ -222,23 +227,26 @@ multi-*criteria* decision matrix.
222
227
  ⚠ *Please give some hints on the criteria to ensure a single best alternative!*
223
228
  </template>
224
229
 
225
- - Otherwise, if <percentage/> is less than 0.10, stop the flow after
226
- you output just the following <template/> and do not output anything
227
- else:
230
+ - Otherwise, if <rating-K/> is less than zero (i.e. all alternatives
231
+ rate negatively and the "best" is merely the least-bad), stop the
232
+ flow after you output just the following <template/> and do not
233
+ output anything else. This all-negative check is evaluated *before*
234
+ the small-distance check below, so that an all-negative alternative
235
+ set with a small winning gap surfaces the all-negative warning rather
236
+ than being masked by the small-distance branch:
228
237
 
229
238
  <template>
230
239
  <ase-tpl-bullet-signal/> **BEST ALTERNATIVE**: ⚑ **<alternative-K/>**
231
- ⚠ *ATTENTION: small distance to second best alternative!*
240
+ ⚠ *ATTENTION: all alternatives rate negatively; this is the least-bad choice, not a strong winner!*
232
241
  </template>
233
242
 
234
- - Otherwise, if <rating-K/> is less than zero (i.e. all alternatives
235
- rate negatively and the "best" is merely the least-bad), stop the
236
- flow after you output just the following <template/> and do not
237
- output anything else:
243
+ - Otherwise, if <percentage/> is less than 0.10, stop the flow after
244
+ you output just the following <template/> and do not output anything
245
+ else:
238
246
 
239
247
  <template>
240
248
  <ase-tpl-bullet-signal/> **BEST ALTERNATIVE**: ⚑ **<alternative-K/>**
241
- ⚠ *ATTENTION: all alternatives rate negatively; this is the least-bad choice, not a strong winner!*
249
+ ⚠ *ATTENTION: small distance to second best alternative!*
242
250
  </template>
243
251
 
244
252
  - Otherwise (<percentage/> is greater than or equal to 0.10), output
@@ -15,18 +15,23 @@ effort: high
15
15
 
16
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
17
17
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
18
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
18
19
 
19
20
  <skill name="ase-meta-persona">
20
21
  Persona Configuration
21
22
  </skill>
22
23
 
24
+ <expand name="getopt" arg1="ase-meta-persona">
25
+ $ARGUMENTS
26
+ </expand>
27
+
23
28
  <objective>
24
29
  *Configure* the *persona style* of the agent to adjust the communication
25
30
  style and token usage intensity.
26
31
  </objective>
27
32
 
28
33
  1. Determine request:
29
- <request>$ARGUMENTS</request>
34
+ <request><getopt-arguments/></request>
30
35
  Do not output anything.
31
36
 
32
37
  2. <if condition="<request/> is empty">
@@ -134,9 +134,17 @@ by querying *multiple* AIs for an *optimal consensus*.
134
134
 
135
135
  4. <step id="STEP 4: Determine Consensus Rating">
136
136
 
137
- Determine, on a Likert scale of 0..<n/>, the amount of the overall
138
- consensus <c/> of all the responses. The <n/> is the *total number of
139
- responders* (yourself plus all available foreign AIs above).
137
+ First, count the number of *available foreign AIs* (those queried in
138
+ STEP 2 which did *not* return an `ERROR:` response). If this count is
139
+ *zero* -- i.e., every foreign AI errored out or none were reachable
140
+ and only yourself (Anthropic Claude) remains -- a quorum is *not*
141
+ possible. In this case, set <c></c> and <n></n> to empty and instead
142
+ set <disagreement/> to `(no quorum: no foreign AIs were available)`,
143
+ then skip the rest of this step.
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).
140
148
  If all responses disagree, the consensus <c/> is zero.
141
149
  If all responses agree, <c/> is <n/>.
142
150
 
@@ -165,6 +173,10 @@ by querying *multiple* AIs for an *optimal consensus*.
165
173
 
166
174
  **CONSENSUS RATE**: **<c/>/<n/>** <disagreement/>
167
175
 
176
+ When a quorum was *not* possible (see STEP 4), render this line
177
+ instead as just `**CONSENSUS RATE**: *n/a* <disagreement/>` (omitting
178
+ the `<c/>/<n/>` fraction), as a single AI cannot form a consensus.
179
+
168
180
  &#x25CB; **Anthropic Claude**:
169
181
  - [...]
170
182
  - [...]
@@ -142,7 +142,11 @@ to <getopt-option-count/>; if <getopt-option-count/> is *non-numeric* or
142
142
  more Pro-Theses or Supporting-Arguments until you EITHER have found
143
143
  at least <count/> Pro-Theses or Supporting-Arguments with at least a
144
144
  rank of 7 OR you have already checked a total of <count/> x 5
145
- Pro-Theses or Supporting-Arguments.
145
+ Pro-Theses or Supporting-Arguments. If the second condition is
146
+ reached first and fewer than <count/> Pro-Theses or
147
+ Supporting-Arguments reached a rank of at least 7, nevertheless
148
+ surface the <count/> highest-ranked ones found so far, because
149
+ <count/> is the *minimum* number of Pro-Theses to surface.
146
150
 
147
151
  Then, for the top-<count/> highest-ranked Pro-Theses or
148
152
  Supporting-Arguments, sort them by their rank from highest to lowest,
@@ -12,11 +12,16 @@ effort: high
12
12
 
13
13
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
15
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
15
16
 
16
17
  <skill name="ase-task-delete">
17
18
  Delete a Task Plan
18
19
  </skill>
19
20
 
21
+ <expand name="getopt" arg1="ase-task-delete">
22
+ $ARGUMENTS
23
+ </expand>
24
+
20
25
  <objective>
21
26
  *Delete* the task plan.
22
27
  </objective>
@@ -32,7 +37,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
32
37
 
33
38
  1. **Determine Task:**
34
39
 
35
- 1. Set <id>$ARGUMENTS</id> initially, with any leading and trailing
40
+ 1. Set <id><getopt-arguments/></id> initially, with any leading and trailing
36
41
  whitespace stripped.
37
42
  Inherit the always existing <ase-task-id/> from the current context.
38
43
  Inherit the always existing <ase-session-id/> from the current context.
@@ -175,14 +175,32 @@ explicitly requested by this procedure via outputs based on a <template/>!
175
175
 
176
176
  2. Check the code base and your world knowledge and
177
177
  use this information to find *up to three* grounded
178
- alternative answers <answer-N-K/> (K={2,3,4}).
179
-
180
- 3. Use an interactive user dialog
181
- with header <aspect-N/> and question <question-N/>, and
182
- let the user select the <answer-N/> out of <answer-N-K/>
183
- (K={1..4}). In this dialog, mark the <answer-N-1/> by
184
- appending ` ⚝ **CURRENT PLAN** ⚝` to its option name (not the
185
- description).
178
+ alternative answers <answer-N-K/> (K={2,3,4}), so there
179
+ are between two and four answer options in total.
180
+
181
+ 3. In the following, you *MUST* *NOT* use the
182
+ <user-dialog-tool/> tool! Instead, you *MUST* just show a
183
+ custom output, let the user enter input, and then you set
184
+ the result accordingly.
185
+
186
+ Let the user select the <answer-N/> out of the answer
187
+ alternatives <answer-N-K/> by raising a question with the
188
+ following custom dialog, where per alternative <answer-N-K/>
189
+ you determine a brief label <answer-N-K-label/> and a
190
+ description <answer-N-K-description/>, and you mark the
191
+ <answer-N-1/> by prefixing its description with
192
+ `⚝ **CURRENT PLAN** ⚝ `. Emit only the answer lines for the
193
+ alternatives <answer-N-K/> you actually determined in the
194
+ previous step (between two and four lines in total):
195
+
196
+ <expand name="custom-dialog" arg1="--other">
197
+ <aspect-N/>: <question-N/>
198
+ <answer-N-1-label/>: ⚝ **CURRENT PLAN** ⚝ - <answer-N-1-description/>
199
+ <answer-N-K-label/>: <answer-N-K-description/>
200
+ [...]
201
+ </expand>
202
+
203
+ Set <answer-N/> to the selected <result/>.
186
204
 
187
205
  4. Output the following <template/>:
188
206
 
@@ -199,7 +217,10 @@ explicitly requested by this procedure via outputs based on a <template/>!
199
217
 
200
218
  4. Call the `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the
201
219
  `ase` MCP server and use the `text` field of its response for
202
- <timestamp-modified/> information. Then insert the current
220
+ <timestamp-modified/> information. If <timestamp-created/> is
221
+ still unset (because the previous <plan/> had no `Created:`
222
+ line), set <timestamp-created><timestamp-modified/></timestamp-created>
223
+ (fall back to the modified timestamp). Then insert the current
203
224
  <ase-task-id/>, previous <timestamp-created/>, and refreshed
204
225
  <timestamp-modified/> information and calculate the number of
205
226
  words <words/> of <plan/>.
@@ -12,17 +12,23 @@ effort: high
12
12
 
13
13
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
14
14
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
15
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
15
16
 
16
17
  <skill name="ase-task-id">
17
18
  Configure Task Id
18
19
  </skill>
19
20
 
21
+ <expand name="getopt" arg1="ase-task-id">
22
+ $ARGUMENTS
23
+ </expand>
24
+
20
25
  <objective>
21
26
  *Get* or *set* the unique *task id* of the current session.
22
27
  </objective>
23
28
 
24
29
  1. Determine request:
25
- <request>$ARGUMENTS</request>
30
+ <request><getopt-arguments/></request>
31
+ Inherit the always existing <ase-session-id/> from the current context.
26
32
 
27
33
  2. <if condition="<request/> is NOT empty AND <request/> does NOT match the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`">
28
34
  Only output the following <template/> and then immediately
@@ -35,8 +41,9 @@ Configure Task Id
35
41
 
36
42
  3. <if condition="<request/> is empty">
37
43
  - Call the `ase_task_id(session: "<ase-session-id/>")`
38
- tool from the `ase` MCP server and set
39
- <ase-task-id/> to its `text` output.
44
+ tool from the `ase` MCP server and set <text/> to its
45
+ `text` output. Check the response as mandated above; only
46
+ on a clean response set <ase-task-id><text/></ase-task-id>.
40
47
 
41
48
  - Output:
42
49
  <template>