@rse/ase 0.9.3 → 0.9.4

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.
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "homepage": "http://github.com/rse/ase",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "http://github.com/rse/ase/issues" },
9
- "version": "0.9.3",
9
+ "version": "0.9.4",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.3",
3
+ "version": "0.9.4",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.3",
3
+ "version": "0.9.4",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -6,7 +6,7 @@
6
6
  "homepage": "http://github.com/rse/ase",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "http://github.com/rse/ase/issues" },
9
- "version": "0.9.3",
9
+ "version": "0.9.4",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  name: ase-code-analyze
3
- argument-hint: "[--help|-h] <source-reference>"
3
+ argument-hint: "[--help|-h] [--performance|-p] [--security|-s] [--severity|-S=(LOW|MEDIUM|HIGH)] <source-reference>"
4
4
  description: >
5
- Analyze the source code for problems in the logic and semantics and its related control flow.
5
+ Analyze the source code for problems in either the logic and
6
+ semantics and its related control flow, performance and efficiency,
7
+ or security.
6
8
  user-invocable: true
7
9
  disable-model-invocation: false
8
10
  effort: high
@@ -12,50 +14,174 @@ allowed-tools:
12
14
 
13
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
14
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
17
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
15
18
 
16
19
  <skill name="ase-code-analyze">
17
20
  Analyze Source Code
18
21
  </skill>
19
22
 
23
+ <expand name="getopt"
24
+ arg1="ase-code-analyze"
25
+ arg2="--performance|-p --security|-s --severity|-S=(LOW|MEDIUM|HIGH)">
26
+ $ARGUMENTS
27
+ </expand>
28
+
20
29
  <objective>
21
- *Analyze* the source code of $ARGUMENTS, and its directly related source
22
- code, for problems in its *logic* and *semantics* and its related
23
- *control flow*.
30
+ *Analyze* the source code of <getopt-arguments/>, and its directly
31
+ related source code, for problems - read-only, *without* applying any
32
+ changes. The *analysis lens* depends on the selected options: problems
33
+ in its *logic* and *semantics* and its related *control flow*, or
34
+ problems in *performance* and *efficiency*, or problems in *security*.
24
35
  </objective>
25
36
 
26
37
  <flow>
27
38
 
28
- 1. <step id="STEP 1: Investigate Code Base">
29
- In this STEP 1, investigate on the code. If the code base is large,
39
+ 1. <step id="STEP 1: Sanity Check Usage">
40
+
41
+ <if condition="<getopt-option-performance/> is equal `true` and <getopt-option-security/> is equal `true`">
42
+
43
+ Only output the following <template/> and then *STOP* immediately:
44
+
45
+ <template>
46
+ ⧉ **ASE**: ✪ skill: **ase-code-analyze**, ▶ ERROR: options `--performance` and `--security` are mutually exclusive
47
+ </template>
48
+
49
+ </if>
50
+
51
+ </step>
52
+
53
+ 2. <step id="STEP 2: Investigate Code Base">
54
+
55
+ In this STEP 2, investigate on the code. If the code base is large,
30
56
  you *MUST* use the `Agent` tool (not inline work) to create multiple
31
57
  sub-agents to split the investigation task into appropriate chunks.
32
58
 
33
59
  Tenets:
34
60
 
35
61
  - **Quiet Operation**:
36
- During investigation in this STEP 1, do *not* output anything else,
62
+
63
+ During investigation in this STEP 2, do *not* output anything else,
37
64
  especially do not give any further explanations or information.
38
65
 
39
66
  - **Practical Relevance Only**:
67
+
40
68
  Focus on *practically relevant* cases and especially do *not*
41
69
  investigate theoretical or fictive cases.
42
70
 
43
71
  - **Problem Focus Only**:
72
+
44
73
  Still focus on the *problem only* and do *not* already
45
- investigate any possible *solution*.
74
+ investigate any possible *solution* or apply any *change*.
75
+
76
+ - **Lens Focus**:
77
+
78
+ <if condition="<getopt-option-performance/> is equal `true`">
79
+
80
+ Focus on *performance* and *efficiency* only - and do *not*
81
+ investigate logic, semantics, control flow, or security
82
+ problems.
83
+
84
+ Analysis Hints (not exhaustive, just indicators):
85
+ - high algorithmic complexity
86
+ - needless resource allocations/copies
87
+ - redundant recomputation
88
+ - many I/O and query round-trips
89
+ - concurrency bottlenecks
90
+ - mismatched data structures
91
+ - [...]
92
+
93
+ </if>
94
+
95
+ <if condition="<getopt-option-security/> is equal `true`">
96
+
97
+ Focus on *security* only - and do *not* investigate logic,
98
+ semantics, performance, or efficiency problems.
99
+
100
+ Analysis Hints (not exhaustive, just indicators):
101
+ - unsafe data deserialization
102
+ - missing input data validation/sanitization
103
+ - broken authentication/authorization
104
+ - sensitive-data exposure
105
+ - path traversal
106
+ - unsafe cryptography
107
+ - hard-coded secrets
108
+ - vulnerable dependencies
109
+ - [...]
110
+
111
+ </if>
112
+
113
+ <if condition="<getopt-option-performance/> is NOT equal `true` and <getopt-option-security/> is NOT equal `true`">
114
+
115
+ Focus on problems in the *logic* and *semantics* and the related
116
+ *control flow* only - and do *not* investigate performance,
117
+ efficiency, or security problems.
118
+
119
+ Analysis Hints (not exhaustive, just indicators):
120
+ - incorrect conditionals and boolean logic
121
+ - off-by-one and boundary errors
122
+ - operator misuse
123
+ - mishandled edge cases
124
+ - broken or missing error handling
125
+ - incorrect async/await/promise handling
126
+ - control-flow defects (unreachable code, missing breaks, wrong early returns)
127
+ - state-mutation bugs
128
+ - incorrect default values
129
+ - null/undefined mishandling
130
+ - type-coercion bugs
131
+ - faulty parsing or merge/override semantics
132
+ - [...]
133
+
134
+ </if>
135
+
136
+ You *MUST* not output anything in this STEP 2.
137
+
46
138
  </step>
47
139
 
48
- 2. <step id="STEP 2: Show Results">
49
- In this STEP 2, for every detected problem, immediately report it
50
- with the following output <template/>, based on concise bullet
140
+ 3. <step id="STEP 3: Show Results">
141
+
142
+ Before reporting, *apply the severity floor* selected via
143
+ <getopt-option-severity/> (default `LOW`): define the ordinal rank
144
+ `LOW`=1, `MEDIUM`=2, `HIGH`=3. *Keep* a detected problem if and only
145
+ if its <severity/> is `ACCEPTED` *or* `rank(severity)` is greater
146
+ than or equal to `rank(<getopt-option-severity/>)`; *silently drop*
147
+ all other problems (they are neither reported nor persisted). With
148
+ the default floor `LOW`, all problems are kept. `ACCEPTED` problems
149
+ are *never* dropped. Then renumber the surviving problems
150
+ contiguously as `P<n/>` with <n/> = 1, 2, ... in the original
151
+ ordering. If *all* problems are dropped, skip the per-problem report
152
+ but still emit the final hint <template/> below.
153
+
154
+ In this STEP 3, for *EVERY* surviving problem, immediately report
155
+ it with the following output <template/>, based on concise bullet
51
156
  points.
52
157
 
158
+ <if condition="<getopt-option-performance/> is equal `true`">
159
+
53
160
  <template>
54
- <ase-tpl-bullet-signal/> PROBLEM (Severity: **<severity/>**): **P<n/>**: **<title/>**
161
+
162
+ <ase-tpl-bullet-signal/> **PROBLEM** (Severity: **<severity/>**): **P<n/>**: **<title/>**
163
+
164
+ <description/>
165
+
166
+ ⊙ EVIDENCE: <evidence/>
167
+ ⊖ TRADEOFF: <trade-off/>
168
+
169
+ </template>
170
+
171
+ </if>
172
+
173
+ <if condition="<getopt-option-performance/> is NOT equal `true`">
174
+
175
+ <template>
176
+
177
+ <ase-tpl-bullet-signal/> **PROBLEM** (Severity: **<severity/>**): **P<n/>**: **<title/>**
55
178
 
56
179
  <description/>
180
+
57
181
  </template>
58
182
 
183
+ </if>
184
+
59
185
  Hints:
60
186
 
61
187
  - For the final results, do *not* output anything else, especially do
@@ -77,7 +203,23 @@ code, for problems in its *logic* and *semantics* and its related
77
203
 
78
204
  - In <description/>, classify the problem with a <severity/>
79
205
  of <template>LOW</template>, <template>MEDIUM</template> or
80
- <template>HIGH</template>.
206
+ <template>HIGH</template>, ranked by the estimated *impact* of the
207
+ problem.
208
+
209
+ - <if condition="<getopt-option-performance/> is equal `true`">
210
+ In <evidence/>, ground the finding by citing either the inferred
211
+ *Big-O* time/space complexity (e.g. `O(n²)` reducible to `O(n)`)
212
+ with the exact driving loop or recursion, or the matched
213
+ performance *anti-pattern* (e.g. N+1 query, sync-in-loop, repeated
214
+ recompute, string concat in loop), with an inline code reference.
215
+ </if>
216
+
217
+ - <if condition="<getopt-option-performance/> is equal `true`">
218
+ In <trade-off/>, state the *cost* of the optimization (e.g.
219
+ readability, additional memory for speed, added complexity), so
220
+ the user can make an informed decision; use *none* if there is no
221
+ meaningful trade-off.
222
+ </if>
81
223
 
82
224
  - *Additionally*, persist all reported problems in a *single*
83
225
  `ase_kv_batch` call to the `ase` MCP server with `transactional`
@@ -85,17 +227,19 @@ code, for problems in its *logic* and *semantics* and its related
85
227
  starts with one `{ command: "clear" }` entry, followed by one
86
228
  `{ command: "set", key: "ase-issue-P<n/>", val: "<title/>:
87
229
  <description/>" }` entry per reported problem.
88
- </step>
89
230
 
90
- 3. <step id="STEP 3: Give Final Hint">
91
- Finally, in this STEP 3, output the following <template/> to give a
92
- final hint:
231
+ Finally, output the following <template/> to give a final hint:
93
232
 
94
233
  <template>
95
234
  ⧉ **ASE**: ☻ skill: **<skill-name/>**, ▶ status: **skill finished**
96
235
  ⧉ **ASE**: ↪ hint: **For deeper analysis, suggestions on solution approaches and then final problem resolution, use `/ase-code-resolve P{n}` in the same or even a different session.**
97
236
  </template>
237
+
238
+ You *MUST* not output anything else in this STEP 3,
239
+ especially not any further explanations.
240
+
98
241
  </step>
99
242
 
100
243
  </flow>
101
244
 
245
+ </output>
@@ -7,19 +7,41 @@
7
7
 
8
8
  `ase-code-analyze`
9
9
  [`--help`|`-h`]
10
+ [`--performance`|`-p`]
11
+ [`--security`|`-s`]
12
+ [`--severity`|`-S`=(`LOW`|`MEDIUM`|`HIGH`)]
10
13
  *source-reference*
11
14
 
12
15
  ## DESCRIPTION
13
16
 
14
17
  The `ase-code-analyze` skill analyzes the source code of the referenced
15
- location, and its directly related source code, for problems in its
16
- *logic*, *semantics*, and related *control flow*.
18
+ location, and its directly related source code, for problems. It is
19
+ *read-only* and advisory: it reports problems but applies *no* changes.
20
+
21
+ The *analysis lens* depends on the selected options:
22
+
23
+ - **default** (neither `--performance` nor `--security`): problems in
24
+ its *logic*, *semantics*, and related *control flow*.
25
+
26
+ - `--performance`|`-p`: problems in *performance* and *efficiency*.
27
+
28
+ - `--security`|`-s`: problems in *security*.
29
+
30
+ The `--performance` and `--security` options are *mutually exclusive*.
31
+
32
+ The `--severity`|`-S`=(`LOW`|`MEDIUM`|`HIGH`) option sets a *severity
33
+ floor* (default `LOW`): problems below the chosen threshold are silently
34
+ suppressed (neither reported nor persisted), ordered `LOW` < `MEDIUM` <
35
+ `HIGH`. The default `LOW` keeps all problems; `ACCEPTED` problems are
36
+ never suppressed. Surviving problems are renumbered contiguously as
37
+ `P<n>`.
17
38
 
18
39
  The skill investigates the code base silently, reports each detected
19
- problem as a `PROBLEM` entry with severity (`LOW`, `MEDIUM`, `HIGH`),
20
- inline file/line references, and persists results in the `ase` MCP
21
- key/value store as `ase-issue-P<n>` entries so they can later be
22
- resolved via `ase-code-resolve P<n>`.
40
+ problem as a `PROBLEM` entry with severity (`LOW`, `MEDIUM`, `HIGH`) and
41
+ inline file/line references (in the performance lens, each entry
42
+ additionally carries an *evidence* and a *trade-off* line), and persists
43
+ results in the `ase` MCP key/value store as `ase-issue-P<n>` entries so
44
+ they can later be resolved via `ase-code-resolve P<n>`.
23
45
 
24
46
  ## ARGUMENTS
25
47
 
@@ -29,7 +51,7 @@ resolved via `ase-code-resolve P<n>`.
29
51
 
30
52
  ## EXAMPLES
31
53
 
32
- Analyze a specific source file:
54
+ Analyze a specific source file for logic/semantic problems:
33
55
 
34
56
  ```text
35
57
  ❯ /ase-code-analyze src/server.ts
@@ -41,6 +63,24 @@ Analyze a directory of code:
41
63
  ❯ /ase-code-analyze src/handlers/
42
64
  ```
43
65
 
66
+ Analyze a source file for performance/efficiency opportunities only:
67
+
68
+ ```text
69
+ ❯ /ase-code-analyze --performance src/server.ts
70
+ ```
71
+
72
+ Analyze a source file for security aspects only:
73
+
74
+ ```text
75
+ ❯ /ase-code-analyze -s src/handlers/
76
+ ```
77
+
78
+ Analyze a directory, reporting only `MEDIUM` and `HIGH` problems:
79
+
80
+ ```text
81
+ ❯ /ase-code-analyze -S MEDIUM src/handlers/
82
+ ```
83
+
44
84
  ## SEE ALSO
45
85
 
46
86
  `ase-code-resolve`, `ase-code-refactor`, `ase-code-lint`,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-code-lint
3
- argument-hint: "[--help|-h] [--auto|-a] <source-reference>"
3
+ argument-hint: "[--help|-h] [--auto|-a] [--severity|-S=(LOW|MEDIUM|HIGH)] <source-reference>"
4
4
  description: >
5
5
  Lint source code for potential code quality problems.
6
6
  Use when the user wants to "lint" or "check" source code.
@@ -20,7 +20,7 @@ Lint Source Code
20
20
 
21
21
  <expand name="getopt"
22
22
  arg1="ase-code-lint"
23
- arg2="--auto|-a">
23
+ arg2="--auto|-a --severity|-S=(LOW|MEDIUM|HIGH)">
24
24
  $ARGUMENTS
25
25
  </expand>
26
26
 
@@ -59,6 +59,14 @@ related to a set of code quality aspects.
59
59
  Parse the single result message of the `Agent` tool as a JSON array
60
60
  and set <problems/> to that list.
61
61
 
62
+ Then *apply the severity floor* selected via <getopt-option-severity/>
63
+ (default `LOW`): define the ordinal rank `LOW`=1, `MEDIUM`=2,
64
+ `HIGH`=3. *Keep* a problem in <problems/> if and only if its
65
+ `severity` field is `ACCEPTED` *or* `rank(severity)` is greater than
66
+ or equal to `rank(<getopt-option-severity/>)`; *silently drop* all
67
+ other problems. With the default floor `LOW`, all problems are kept.
68
+ `ACCEPTED` problems are *never* dropped.
69
+
62
70
  You *MUST* *NOT* output anything else in this step 1.
63
71
 
64
72
  </step>
@@ -8,6 +8,7 @@
8
8
  `ase-code-lint`
9
9
  [`--help`|`-h`]
10
10
  [`--auto`|`-a`]
11
+ [`--severity`|`-S`=(`LOW`|`MEDIUM`|`HIGH`)]
11
12
  *source-reference*
12
13
 
13
14
  ## DESCRIPTION
@@ -29,6 +30,12 @@ automatically.
29
30
  Automatically apply every proposed correction without asking the
30
31
  user via the interactive dialog.
31
32
 
33
+ `--severity`|`-S`=(`LOW`|`MEDIUM`|`HIGH`):
34
+ Set the *severity floor* (default `LOW`): findings below the chosen
35
+ threshold are silently suppressed, ordered `LOW` < `MEDIUM` <
36
+ `HIGH`. The default `LOW` keeps all findings; `ACCEPTED` findings are
37
+ never suppressed.
38
+
32
39
  ## ARGUMENTS
33
40
 
34
41
  *source-reference*:
@@ -48,6 +55,12 @@ Lint a directory and automatically apply all corrections:
48
55
  ❯ /ase-code-lint --auto src/handlers/
49
56
  ```
50
57
 
58
+ Lint a directory, reporting only `MEDIUM` and `HIGH` findings:
59
+
60
+ ```text
61
+ ❯ /ase-code-lint -S MEDIUM src/handlers/
62
+ ```
63
+
51
64
  ## SEE ALSO
52
65
 
53
66
  `ase-code-analyze`, `ase-code-resolve`, `ase-code-refactor`,
@@ -109,7 +109,7 @@ explicitly requested by this procedure via outputs based on a <template/>!
109
109
  where `Ls` is the start line and `Le` is the end line.
110
110
 
111
111
  - A *verbatim* <evidence/> snippet, copied exactly from
112
- <source/> (but with all newlines replaces with spaces
112
+ <source/> (but with all newlines replaced with spaces
113
113
  and multiple spaces collapsed into a single space), that
114
114
  *proves* the point. The cited snippet *MUST* prove the
115
115
  point verbatim. If it does not, *re-investigate and re-cite
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-meta-brainstorm
3
- argument-hint: "[--help|-h] <topic>"
3
+ argument-hint: "[--help|-h] [--count|-c=12] <topic>"
4
4
  description: >
5
5
  Collaboratively brainstorm a topic by diverging on ideas, converging
6
6
  through clustering and scoring, and distilling a shortlist with
@@ -15,13 +15,20 @@ effort: high
15
15
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
16
16
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
17
17
  @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
18
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
18
19
 
19
20
  <skill name="ase-meta-brainstorm">
20
21
  Collaboratively Brainstorm a Topic
21
22
  </skill>
22
23
 
24
+ <expand name="getopt"
25
+ arg1="ase-meta-brainstorm"
26
+ arg2="--count|-c=12">
27
+ $ARGUMENTS
28
+ </expand>
29
+
23
30
  <objective>
24
- Collaboratively brainstorm the topic <topic>$ARGUMENTS</topic> by first
31
+ Collaboratively brainstorm the topic <topic><getopt-arguments/></topic> by first
25
32
  *diverging* into a broad space of candidate ideas, then *converging*
26
33
  through clustering and scoring, and finally distilling a *shortlist*
27
34
  with a single recommended direction.
@@ -88,7 +95,7 @@ Honor the following tenets throughout the brainstorming:
88
95
  that must be pinned down for the brainstorming to be reasonably
89
96
  grounded.
90
97
 
91
- Notice: you are intentionally constraint to just 1-3 unknowns,
98
+ Notice: you are intentionally constrained to just 1-3 unknowns,
92
99
  as too much upfront intent clarification kills the brainstorming
93
100
  of ideas later. So, you *MUST* reduce the clarifications of the
94
101
  unknowns to the absolute minimum!
@@ -152,8 +159,9 @@ Honor the following tenets throughout the brainstorming:
152
159
  variety in outcome.
153
160
 
154
161
  Do still *not* judge, rank, or prune ideas in this step. Generate
155
- ideas until you either reach at least 12 distinct candidate ideas or
156
- have clearly exhausted the meaningfully distinct space.
162
+ ideas until you either reach at least <getopt-option-count/> distinct
163
+ candidate ideas or have clearly exhausted the meaningfully distinct
164
+ space.
157
165
 
158
166
  Store each candidate idea in <idea-N/> with the format
159
167
  `**<idea-name-N/>**: <idea-statement-N/>` (where <idea-name-N/> is a
@@ -7,6 +7,7 @@
7
7
 
8
8
  `ase-meta-brainstorm`
9
9
  [`--help`|`-h`]
10
+ [`--count`|`-c=12`]
10
11
  *topic*
11
12
 
12
13
  ## DESCRIPTION
@@ -16,9 +17,9 @@ session on a *topic* *before* any implementation begins. It first
16
17
  *clarifies intent* by exploring the project context and interviewing
17
18
  the user - one grounded, multiple-choice question at a time - about
18
19
  purpose, constraints, scope, and success criteria. It then *diverges*
19
- into a broad space of candidate ideas pursued from deliberately diverse
20
- angles (MVP-first, risk-first, UX-first, reuse-first, and wildcard),
21
- without judging them.
20
+ into a broad space of candidate ideas (at least `--count`, default 12)
21
+ pursued from deliberately diverse angles (MVP-first, risk-first,
22
+ UX-first, reuse-first, and wildcard), without judging them.
22
23
 
23
24
  Next it *converges* by clustering the ideas into coherent themes,
24
25
  pruning speculative or out-of-scope ones via *YAGNI*, and scoring the
@@ -32,6 +33,13 @@ On completion the skill offers a *next step*: stop, or hand the
32
33
  recommended direction off to the `ase-task-edit`, `ase-code-craft`, or
33
34
  `ase-task-preflight` skills.
34
35
 
36
+ ## OPTIONS
37
+
38
+ `--count`|`-c=12`:
39
+ The *minimum* number of candidate ideas to generate in the *diverge*
40
+ phase before converging (default: 12). Raise it for a broader idea
41
+ space, lower it for a quicker, narrower session.
42
+
35
43
  ## ARGUMENTS
36
44
 
37
45
  *topic*:
@@ -46,6 +54,12 @@ Brainstorm an approach for a new feature:
46
54
  ❯ /ase-meta-brainstorm an offline-first sync layer for the mobile app
47
55
  ```
48
56
 
57
+ Brainstorm with a broader idea space of at least 20 candidates:
58
+
59
+ ```text
60
+ ❯ /ase-meta-brainstorm --count 20 an offline-first sync layer
61
+ ```
62
+
49
63
  ## SEE ALSO
50
64
 
51
65
  `ase-meta-evaluate`, `ase-meta-quorum`, `ase-meta-diaboli`
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-meta-diaboli
3
- argument-hint: "[--help|-h] <thesis>"
3
+ argument-hint: "[--help|-h] [--count|-c <count>] <thesis>"
4
4
  description: >
5
5
  Challenge a thesis by playing "Devil’s Advocate" (latin: "Advocatus
6
6
  Diaboli"). Use when the user wants a thesis or statement
@@ -12,25 +12,40 @@ effort: xhigh
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-meta-diaboli">
17
18
  Play "Devil's Advocate"
18
19
  </skill>
19
20
 
21
+ <expand name="getopt"
22
+ arg1="ase-meta-diaboli"
23
+ arg2="--count|-c=10">
24
+ $ARGUMENTS
25
+ </expand>
26
+
20
27
  <objective>
21
28
  Play "Devil’s Advocate" (latin: "Advocatus Diaboli") by relentlessly
22
- challenging or criticising the thesis: <thesis>$ARGUMENTS</thesis>
29
+ challenging or criticising the thesis: <thesis><getopt-arguments/></thesis>
23
30
  </objective>
24
31
 
25
- 1. **Repeat Thesis**:
32
+ Determine the minimum number of *anti-theses* to surface: set <count/>
33
+ to <getopt-option-count/>; if <getopt-option-count/> is *non-numeric* or
34
+ *less than or equal to 0*, use the default *10* instead.
35
+
36
+ <flow>
37
+
38
+ 1. <step id="STEP 1: Repeat Thesis">
26
39
 
27
40
  Output the thesis with the following <template/>:
28
41
 
29
42
  <template>
30
- <ase-tpl-bullet-secondary/> **THESIS**: <thesis/>
43
+ <ase-tpl-bullet-normal/> **THESIS**: <thesis/>
31
44
  </template>
32
45
 
33
- 2. **Determine Anti-Theses**:
46
+ </step>
47
+
48
+ 2. <step id="STEP 2: Determine Anti-Theses">
34
49
 
35
50
  Reason on the thesis in <thesis/> by playing *Devil's Advocate*
36
51
  (latin: *Advocatus Diaboli*) by relentlessly challenging or
@@ -103,11 +118,11 @@ effort: xhigh
103
118
  For each Anti-Thesis or Counter-Argument rank it on a Likert scale
104
119
  of 0 (weak) to 10 (strong). Repeat the process of finding more
105
120
  Anti-Theses or Counter-Arguments until you EITHER have found at
106
- least 10 Anti-Theses or Counter-Arguments with at least a rank
107
- of 7 OR you have already checked a total of 50 Anti-Theses or
108
- Counter-Arguments.
121
+ least <count/> Anti-Theses or Counter-Arguments with at least a rank
122
+ of 7 OR you have already checked a total of <count/> x 5 Anti-Theses
123
+ or Counter-Arguments.
109
124
 
110
- Then, for the top-10 highest-ranked Anti-Theses or
125
+ Then, for the top-<count/> highest-ranked Anti-Theses or
111
126
  Counter-Arguments, sort them by their rank from highest to lowest,
112
127
  store each in <antithesis-N/> with the format `**<aspect-N/>**
113
128
  (rank: <rank-N/>/10): <statement-N/>` (where <aspect-N/> is a short
@@ -120,7 +135,9 @@ effort: xhigh
120
135
  <ase-tpl-bullet-signal/> **ANTITHESIS**: <antithesis-N/>
121
136
  </template>
122
137
 
123
- 3. **Dialectical Reasoning**:
138
+ </step>
139
+
140
+ 3. <step id="STEP 3: Dialectical Reasoning">
124
141
 
125
142
  Following the Hegelian dialectics of...
126
143
 
@@ -150,3 +167,9 @@ effort: xhigh
150
167
  <ase-tpl-bullet-normal/> **SYNTHESIS**: <synthesis/>
151
168
  </template>
152
169
 
170
+ Do not output any further explanations.
171
+
172
+ </step>
173
+
174
+ </flow>
175
+
@@ -7,6 +7,7 @@
7
7
 
8
8
  `ase-meta-diaboli`
9
9
  [`--help`|`-h`]
10
+ [`--count`|`-c` *count*]
10
11
  *thesis*
11
12
 
12
13
  ## DESCRIPTION
@@ -20,20 +21,31 @@ cases, *Reductio Ad Absurdum*, exposing hidden costs, and pre-mortem
20
21
  thinking - while targeting the claim rather than its proponent and
21
22
  yielding where the argument genuinely holds.
22
23
 
23
- The skill iterates until it has found at least ten anti-theses
24
+ The skill iterates until it has found at least *count* anti-theses
24
25
  (counter-arguments) each ranked at least 7 on a 0 (weak) to 10
25
- (strong) Likert scale, reports the top ten sorted from strongest to
26
+ (strong) Likert scale, reports the top *count* sorted from strongest to
26
27
  weakest, and finally applies *Hegelian dialectics* (*Thesis* +
27
28
  *Antithesis* → *Synthesis*) to derive a single-sentence *SYNTHESIS*
28
29
  that preserves what is true in both the thesis and its antitheses
29
30
  while discarding what is false.
30
31
 
32
+ The `--count`/`-c` *count* option sets the minimum number of strong
33
+ anti-theses to surface (default *10*), raising or lowering the floor of
34
+ counter-arguments hunted for, sorted, and reported in the single
35
+ challenge pass. A `0`, negative, or non-numeric value falls back to the
36
+ default *10*.
37
+
31
38
  The intent is constructive: stress-testing the thesis in good faith to
32
39
  arrive at a better final decision, not obstructing or merely being
33
40
  contrarian.
34
41
 
35
42
  ## ARGUMENTS
36
43
 
44
+ `--count`, `-c` *count*:
45
+ Surface at least *count* strong anti-theses (default *10*) before
46
+ sorting and reporting the top *count* and deriving the *SYNTHESIS*. An
47
+ invalid or non-positive *count* reverts to the default *10*.
48
+
37
49
  *thesis*:
38
50
  The statement, claim, or position to be relentlessly challenged.
39
51
  It may be technical, factual, or opinion-based; the skill attacks
@@ -53,6 +65,12 @@ Stress-test a design decision:
53
65
  ❯ /ase-meta-diaboli We should rewrite the service in Rust.
54
66
  ```
55
67
 
68
+ Surface at least fifteen anti-theses:
69
+
70
+ ```text
71
+ ❯ /ase-meta-diaboli --count 15 We should rewrite the service in Rust.
72
+ ```
73
+
56
74
  ## SEE ALSO
57
75
 
58
76
  `ase-meta-why`, `ase-meta-evaluate`, `ase-meta-quorum`,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-meta-review
3
- argument-hint: "[--help|-h]"
3
+ argument-hint: "[--help|-h] [--severity|-S=(LOW|MEDIUM|HIGH)]"
4
4
  description: >
5
5
  Perform a holistic, human-reviewer-style critique of the currently
6
6
  staged Git changes and emit an approve/reject verdict with
@@ -17,11 +17,19 @@ allowed-tools:
17
17
 
18
18
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
19
19
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
20
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
21
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
20
22
 
21
23
  <skill name="ase-meta-review">
22
24
  Review Staged Changes
23
25
  </skill>
24
26
 
27
+ <expand name="getopt"
28
+ arg1="ase-meta-review"
29
+ arg2="--severity|-S=(LOW|MEDIUM|HIGH)">
30
+ $ARGUMENTS
31
+ </expand>
32
+
25
33
  <objective>
26
34
  Review the currently staged Git changes the way an *experienced human
27
35
  reviewer* would - judging them *holistically* against the change's *own
@@ -98,7 +106,17 @@ explicitly requested by this procedure via outputs based on a <template/>!
98
106
  Then *derive* the overall <verdict/> from <findings/>: set
99
107
  <verdict/> to `REJECT - DEMANDS CHANGES` if *any* finding in
100
108
  <findings/> has a `severity` field of `HIGH`; otherwise set
101
- <verdict/> to `APPROVE`.
109
+ <verdict/> to `APPROVE`. The verdict is derived *before* the
110
+ severity floor below, so a suppressed `HIGH` finding still drives the
111
+ verdict.
112
+
113
+ Then *apply the severity floor* selected via <getopt-option-severity/>
114
+ (default `LOW`): define the ordinal rank `LOW`=1, `MEDIUM`=2,
115
+ `HIGH`=3. *Keep* a finding in <findings/> if and only if its
116
+ `severity` field is `ACCEPTED` *or* `rank(severity)` is greater than
117
+ or equal to `rank(<getopt-option-severity/>)`; *silently drop* all
118
+ other findings. With the default floor `LOW`, all findings are kept.
119
+ `ACCEPTED` findings are *never* dropped.
102
120
 
103
121
  You *MUST* *NOT* output anything else in this STEP 2.
104
122
 
@@ -6,6 +6,8 @@
6
6
  ## SYNOPSIS
7
7
 
8
8
  `ase-meta-review`
9
+ [`--help`|`-h`]
10
+ [`--severity`|`-S`=(`LOW`|`MEDIUM`|`HIGH`)]
9
11
 
10
12
  ## DESCRIPTION
11
13
 
@@ -51,10 +53,20 @@ inspects *logic and semantics*, `ase-meta-diff` narrates *what changed*
51
53
  `ase-meta-review` renders a *reviewer's judgement* on a concrete diff
52
54
  before it is committed.
53
55
 
56
+ ## OPTIONS
57
+
58
+ `--severity`|`-S`=(`LOW`|`MEDIUM`|`HIGH`):
59
+ Set the *severity floor* (default `LOW`): findings below the chosen
60
+ threshold are silently suppressed, ordered `LOW` < `MEDIUM` <
61
+ `HIGH`. The default `LOW` keeps all findings; `ACCEPTED` findings are
62
+ never suppressed. The floor only affects the rendered findings table;
63
+ the overall *verdict* is still derived from all findings, so a
64
+ suppressed `HIGH` finding still yields a *REJECT* verdict.
65
+
54
66
  ## ARGUMENTS
55
67
 
56
- The `ase-meta-review` skill takes no arguments; it always reviews the
57
- currently *staged* Git changes.
68
+ The `ase-meta-review` skill takes no positional arguments; it always
69
+ reviews the currently *staged* Git changes.
58
70
 
59
71
  ## EXAMPLES
60
72
 
@@ -64,6 +76,12 @@ Review the currently staged changes before committing:
64
76
  ❯ /ase-meta-review
65
77
  ```
66
78
 
79
+ Review the staged changes, reporting only `MEDIUM` and `HIGH` findings:
80
+
81
+ ```text
82
+ ❯ /ase-meta-review -S MEDIUM
83
+ ```
84
+
67
85
  ## SEE ALSO
68
86
 
69
87
  `ase-meta-diff`, `ase-meta-commit`, `ase-code-lint`, `ase-code-analyze`,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-meta-steelman
3
- argument-hint: "[--help|-h] <thesis>"
3
+ argument-hint: "[--help|-h] [--count|-c <count>] [--rounds|-r <rounds>] <thesis>"
4
4
  description: >
5
5
  Build the strongest possible case for a thesis by playing
6
6
  "Steelman" (Latin spirit: "Advocatus Dei"). Use when the user
@@ -12,25 +12,57 @@ effort: xhigh
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-meta-steelman">
17
18
  Build the "Steelman" Argument
18
19
  </skill>
19
20
 
21
+ <expand name="getopt"
22
+ arg1="ase-meta-steelman"
23
+ arg2="--count|-c=10 --rounds|-r=1">
24
+ $ARGUMENTS
25
+ </expand>
26
+
20
27
  <objective>
21
28
  Build the "Steelman" argument by constructing the strongest
22
- possible case for the thesis: <thesis>$ARGUMENTS</thesis>
29
+ possible case for the thesis: <thesis><getopt-arguments/></thesis>
23
30
  </objective>
24
31
 
25
- 1. **Repeat Thesis**:
32
+ Determine the number of *rounds* to perform: set <rounds/> to
33
+ <getopt-option-rounds/>; if <getopt-option-rounds/> is *non-numeric* or
34
+ *less than or equal to 0*, use the default *1* instead.
35
+
36
+ Determine the minimum number of *pro-theses* to surface: set <count/>
37
+ to <getopt-option-count/>; if <getopt-option-count/> is *non-numeric* or
38
+ *less than or equal to 0*, use the default *10* instead.
39
+
40
+ <flow>
41
+
42
+ 1. <step id="STEP 1: Repeat Thesis">
43
+
44
+ Begin a *round* of fortification and consolidating reasoning. On
45
+ the first visit, set <i>1</i> (set round counter to one); on each
46
+ subsequent visit (via the jump back in the last step), <i/> has
47
+ already been incremented.
48
+
49
+ <if condition="<rounds/> is greater than 1">
50
+ Indicate the current round with the following <template/>:
51
+
52
+ <template>
53
+ <ase-tpl-bullet-secondary/> **ROUND**: <i/>/<rounds/>
54
+ </template>
55
+ </if>
26
56
 
27
57
  Output the thesis with the following <template/>:
28
58
 
29
59
  <template>
30
- <ase-tpl-bullet-secondary/> **THESIS**: <thesis/>
60
+ <ase-tpl-bullet-normal/> **THESIS**: <thesis/>
31
61
  </template>
32
62
 
33
- 2. **Determine Pro-Theses**:
63
+ </step>
64
+
65
+ 2. <step id="STEP 2: Determine Pro-Theses">
34
66
 
35
67
  Reason on the thesis in <thesis/> by playing *Steelman* (Latin
36
68
  spirit: "Advocatus Dei") - building the strongest possible case
@@ -108,11 +140,11 @@ effort: xhigh
108
140
  For each Pro-Thesis or Supporting-Argument rank it on a Likert
109
141
  scale of 0 (weak) to 10 (strong). Repeat the process of finding
110
142
  more Pro-Theses or Supporting-Arguments until you EITHER have found
111
- at least 10 Pro-Theses or Supporting-Arguments with at least a rank
112
- of 7 OR you have already checked a total of 50 Pro-Theses or
113
- Supporting-Arguments.
143
+ at least <count/> Pro-Theses or Supporting-Arguments with at least a
144
+ rank of 7 OR you have already checked a total of <count/> x 5
145
+ Pro-Theses or Supporting-Arguments.
114
146
 
115
- Then, for the top-10 highest-ranked Pro-Theses or
147
+ Then, for the top-<count/> highest-ranked Pro-Theses or
116
148
  Supporting-Arguments, sort them by their rank from highest to lowest,
117
149
  store each in <prothesis-N/> with the format `**<aspect-N/>**
118
150
  (rank: <rank-N/>/10): <statement-N/>` (where <aspect-N/> is a short
@@ -124,8 +156,9 @@ effort: xhigh
124
156
  <template>
125
157
  <ase-tpl-bullet-signal/> **PRO-THESIS**: <prothesis-N/>
126
158
  </template>
159
+ </step>
127
160
 
128
- 3. **Consolidating Reasoning**:
161
+ 3. <step id="STEP 3: Consolidating Reasoning">
129
162
 
130
163
  Following the consolidation of...
131
164
 
@@ -149,7 +182,7 @@ effort: xhigh
149
182
  while honestly bounding where it holds. The fortification reinforces
150
183
  the position by sharpening it.
151
184
 
152
- ...finally derive a strong single-sentence (not more than 40 words)
185
+ ...then derive a strong single-sentence (not more than 40 words)
153
186
  fortification of the <thesis/> and all found <prothesis-N/> - the
154
187
  strongest defensible form of the thesis - store it in <fortification/>,
155
188
  and then finally output the following <template/>:
@@ -157,3 +190,21 @@ effort: xhigh
157
190
  <template>
158
191
  <ase-tpl-bullet-normal/> **FORTIFICATION**: <fortification/>
159
192
  </template>
193
+
194
+ Finally, decide whether to perform a further round:
195
+
196
+ <if condition="<i/> is less than <rounds/>">
197
+ Carry the result forward to the next round: set
198
+ <thesis><fortification/></thesis> (the fortification becomes the
199
+ thesis to be strengthened next), set <i/> to <i/> + 1 (increment the
200
+ round counter), and then *CONTINUE* the *LOOP* at **STEP 1**!
201
+ </if>
202
+
203
+ <if condition="<i/> is greater than or equal to <rounds/>">
204
+ All <rounds/> rounds are complete; *STOP* the loop here.
205
+ Do not output any further explanations.
206
+ </if>
207
+
208
+ </step>
209
+
210
+ </flow>
@@ -7,6 +7,8 @@
7
7
 
8
8
  `ase-meta-steelman`
9
9
  [`--help`|`-h`]
10
+ [`--count`|`-c` *count*]
11
+ [`--rounds`|`-r` *rounds*]
10
12
  *thesis*
11
13
 
12
14
  ## DESCRIPTION
@@ -21,20 +23,44 @@ surfacing the upside, and pre-parade thinking - while crediting the
21
23
  claim rather than the proponent's authority and conceding where the
22
24
  thesis genuinely falls short.
23
25
 
24
- The skill iterates until it has found at least ten pro-theses
26
+ The skill iterates until it has found at least *count* pro-theses
25
27
  (supporting arguments) each ranked at least 7 on a 0 (weak) to 10
26
- (strong) Likert scale, reports the top ten sorted from strongest to
28
+ (strong) Likert scale, reports the top *count* sorted from strongest to
27
29
  weakest, and finally consolidates them (*Thesis* + *Pro-Theses* →
28
30
  *Fortification*) to derive a single-sentence *FORTIFICATION* that
29
31
  consolidates everything genuinely strengthening the thesis while
30
32
  honestly bounding where it holds.
31
33
 
34
+ The `--rounds`/`-r` *rounds* option turns the single defense pass into an
35
+ *iterative chain* of *rounds* rounds (default *1*): each round's
36
+ *FORTIFICATION* becomes the *thesis* of the next round, so the position
37
+ is progressively re-fortified and sharpened. A `0`, negative, or
38
+ non-numeric value falls back to the default *1*; with a single round the
39
+ output is identical to running without the option.
40
+
41
+ The `--count`/`-c` *count* option sets the minimum number of strong
42
+ pro-theses to surface (default *10*), raising or lowering the floor of
43
+ supporting arguments hunted for, sorted, and reported in each defense
44
+ pass. A `0`, negative, or non-numeric value falls back to the default
45
+ *10*.
46
+
32
47
  The intent is constructive: building the best honest case for the
33
48
  thesis to arrive at a better final decision, not overselling or merely
34
49
  cheerleading.
35
50
 
36
51
  ## ARGUMENTS
37
52
 
53
+ `--count`, `-c` *count*:
54
+ Surface at least *count* strong pro-theses (default *10*) per defense
55
+ pass before sorting and reporting the top *count* and deriving the
56
+ *FORTIFICATION*. An invalid or non-positive *count* reverts to the
57
+ default *10*.
58
+
59
+ `--rounds`, `-r` *rounds*:
60
+ Run *rounds* iterative defense rounds (default *1*), feeding each
61
+ round's *FORTIFICATION* in as the next round's *thesis*. An invalid
62
+ or non-positive *rounds* reverts to the default *1*.
63
+
38
64
  *thesis*:
39
65
  The statement, claim, or position to be charitably strengthened.
40
66
  It may be technical, factual, or opinion-based; the skill defends
@@ -54,6 +80,12 @@ Build the case for a design decision:
54
80
  ❯ /ase-meta-steelman We should rewrite the service in Rust.
55
81
  ```
56
82
 
83
+ Strengthen across five iterative rounds:
84
+
85
+ ```text
86
+ ❯ /ase-meta-steelman --rounds 5 We should rewrite the service in Rust.
87
+ ```
88
+
57
89
  ## SEE ALSO
58
90
 
59
91
  `ase-meta-diaboli`, `ase-meta-why`, `ase-meta-evaluate`,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-meta-why
3
- argument-hint: "[--help|-h] <fact>"
3
+ argument-hint: "[--help|-h] [--depth|-d <N>] <fact>"
4
4
  description: >
5
5
  Five-Whys Root-Cause Analysis.
6
6
  user-invocable: true
@@ -10,16 +10,23 @@ effort: high
10
10
 
11
11
  @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
12
12
  @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
13
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
13
14
 
14
15
  <skill name="ase-meta-why">
15
16
  Five-Whys Root-Cause Analysis
16
17
  </skill>
17
18
 
19
+ <expand name="getopt"
20
+ arg1="ase-meta-why"
21
+ arg2="--depth|-d=5">
22
+ $ARGUMENTS
23
+ </expand>
24
+
18
25
  <objective>
19
26
  Apply the *Five-Whys* *root-cause analysis* technique to investigate
20
27
  the following problem:
21
28
 
22
- <problem>Why $ARGUMENTS?</problem>
29
+ <problem>Why <getopt-arguments/>?</problem>
23
30
 
24
31
  For this, iteratively ask "why" to drill down from symptoms to the root-cause.
25
32
  This helps to identify the fundamental reason behind a problem rather than just
@@ -39,20 +46,26 @@ addressing surface-level symptoms.
39
46
  Find the root-cause of <problem/> by following the following iteration cycle.
40
47
  Start with a <question/> set equal to the <problem/>.
41
48
 
42
- <for items="1 2 3 4 5">
49
+ Determine the *maximum chain length* from <getopt-option-depth/>: if
50
+ <getopt-option-depth/> is *non-numeric* or *less than or equal to 0*,
51
+ use the default *5* instead.
52
+
53
+ Start with <n>1</n> (set iteration counter to one).
54
+ <while condition="<n/> is less than or equal to <getopt-option-depth/>">
43
55
  Ask <question/> and document the answer in <answer/> with the following template:
44
56
  Don't stop at symptoms, keep digging for systemic issues.
45
57
  Multiple root-causes may exist -- explore different branches.
46
58
  Consider technical, domain-specific, process-related, or organizational causes.
47
59
 
48
60
  <template>
49
- <ase-tpl-bullet-secondary/> **WHY <item/>**: <answer/>
61
+ <ase-tpl-bullet-secondary/> **WHY <n/>**: <answer/>
50
62
  </template>
51
63
 
52
64
  Then, for the next iteration set <question/> now to be the last <answer/>.
53
- The magic is NOT in exactly 5 "Why" -- you can <break/> the iteration
54
- when you already reached the root-cause.
55
- </for>
65
+ The magic is NOT in exactly <getopt-option-depth/> "Why" -- you can <break/>
66
+ the iteration when you already reached the root-cause.
67
+ Finally, set <n/> to <n/> + 1 (increment iteration counter).
68
+ </while>
56
69
  </step>
57
70
 
58
71
  3. <step id="STEP 3: Report Solution">
@@ -7,20 +7,27 @@
7
7
 
8
8
  `ase-meta-why`
9
9
  [`--help`|`-h`]
10
+ [`--depth`|`-d` *N*]
10
11
  *fact*
11
12
 
12
13
  ## DESCRIPTION
13
14
 
14
15
  The `ase-meta-why` skill applies the *Five-Whys* *root-cause
15
16
  analysis* technique to the supplied *fact*. The skill iteratively
16
- asks "why" - up to five times - to drill down from surface symptoms
17
- to the underlying root cause, considering technical, domain-specific,
18
- process-related, and organizational causes. After identifying the
19
- root cause it proposes a *SOLUTION* that addresses it, optionally
20
- including concrete source code changes.
17
+ asks "why" - up to *N* times (see `--depth`, default five) - to drill
18
+ down from surface symptoms to the underlying root cause, considering
19
+ technical, domain-specific, process-related, and organizational
20
+ causes. After identifying the root cause it proposes a *SOLUTION* that
21
+ addresses it, optionally including concrete source code changes.
21
22
 
22
23
  ## ARGUMENTS
23
24
 
25
+ `--depth`|`-d` *N*:
26
+ The *maximum* number of "why" iterations (the Five-Whys chain
27
+ length), acting as an *upper bound* only - the analysis still stops
28
+ early once the root cause is reached. Defaults to *5*. A non-numeric
29
+ or non-positive value falls back to the default.
30
+
24
31
  *fact*:
25
32
  The observed *fact* (symptom, problem, or surprising outcome)
26
33
  whose root cause should be investigated. The skill implicitly
@@ -34,6 +41,12 @@ Investigate the root cause of a build failure:
34
41
  ❯ /ase-meta-why the CI build is intermittently failing on macOS runners
35
42
  ```
36
43
 
44
+ Drill down deeper with a tunable chain length of seven:
45
+
46
+ ```text
47
+ ❯ /ase-meta-why -d 7 the production latency spiked after the last deploy
48
+ ```
49
+
37
50
  ## SEE ALSO
38
51
 
39
52
  `ase-code-analyze`, `ase-code-resolve`, `ase-arch-analyze`.
@@ -117,7 +117,7 @@ Procedure
117
117
 
118
118
  - **Fuzzy Language**:
119
119
  When the user uses vague or overloaded terms instead of a precise
120
- or canonical terms.
120
+ or canonical term.
121
121
 
122
122
  - **Conflicting Terminology**:
123
123
  When the user uses a term that conflicts with the existing