@rse/ase 0.9.61 → 0.9.62

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": "https://ase.tools",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "https://github.com/rse/ase/issues" },
9
- "version": "0.9.61",
9
+ "version": "0.9.62",
10
10
  "license": "Apache-2.0",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.61",
3
+ "version": "0.9.62",
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.61",
3
+ "version": "0.9.62",
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.61",
3
+ "version": "0.9.62",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -15,7 +15,7 @@ Workflow
15
15
  1. Set the requested context: <context>$ARGUMENTS</context>.
16
16
  The *first* whitespace-separated token of <context/> is the
17
17
  comma-separated *aspect set* <aspects/> (a non-empty subset of the
18
- aspect ids `A01`...`A20`). The *remaining* tokens are the source
18
+ aspect ids `A01`...`A21`). The *remaining* tokens are the source
19
19
  code files to check.
20
20
 
21
21
  2. Use the `Read` tool to read all source code files referenced by
@@ -28,7 +28,7 @@ Workflow
28
28
 
29
29
  4. Set <problems/> to empty.
30
30
  Then check the read source code for the following aspects (each
31
- aspect is uniquely identified by its `aspect` id `A01 - XXX`...`A20
31
+ aspect is uniquely identified by its `aspect` id `A01 - XXX`...`A21
32
32
  - XXX`), but *strictly limited* to those aspects whose id is
33
33
  contained in the aspect set <aspects/> -- all other aspects are
34
34
  *not* checked and their problems are *never* reported:
@@ -266,6 +266,50 @@ Workflow
266
266
  *masks* another bug (e.g., unreachable code after a misplaced
267
267
  `return` that skips cleanup logic).
268
268
 
269
+ - **A21 - DOCUMENTATION**:
270
+ Check for *incomplete* and for *excessive* code documentation
271
+ across the following sub-aspects. The yardstick is a *minimal*
272
+ description: one or two lines stating WHAT the construct does,
273
+ optimally written in the *idiomatic documentation convention* of
274
+ the project or the target programming language.
275
+
276
+ - **C1 MISSING-DOCUMENTATION**: functions, methods, classes,
277
+ interfaces, or modules without any documentation comment
278
+ describing their purpose -- *private* and *internal*
279
+ constructs included, not just the public API surface.
280
+ Exclude trivial constructs whose name already fully conveys
281
+ the purpose (plain getters/setters, one-line lambdas,
282
+ delegating overloads) and constructs inheriting the
283
+ documentation of an overridden or implemented declaration.
284
+ Propose *adding* those missing comments.
285
+
286
+ - **C2 EXCESSIVE-DOCUMENTATION**: comments going far beyond
287
+ the minimal description: narrated decision logs ("chose X
288
+ over Y because ..."), change history ("now uses X instead of
289
+ Y"), line-by-line explanations of the obvious, or comment
290
+ blocks substantially longer than the code they describe.
291
+ Propose *condensing* to a brief 1-2 line description (up to
292
+ 4 lines only for genuinely non-obvious constraints).
293
+
294
+ - **C3 RESTATING-DOCUMENTATION**: comments merely repeating
295
+ the code or the identifier verbatim without adding any
296
+ information (e.g., "increment i" above `i++`). Propose
297
+ *removing* them.
298
+
299
+ - **C4 DRIFTED-DOCUMENTATION**: comments contradicting the
300
+ code they describe (stale parameter lists, outdated behavior
301
+ claims). Propose *correcting* the *comment* only -- *never*
302
+ change the code under this aspect.
303
+
304
+ Keep intact comments stating a *constraint the code cannot
305
+ show* (brief WHY-comments on non-obvious decisions) -- they are
306
+ neither excessive nor restating.
307
+
308
+ Severity guidance: C1 defaults to MEDIUM for non-trivial
309
+ constructs, else LOW; C2 and C3 default to LOW, escalating to
310
+ MEDIUM when the noise dominates the file; and C4 defaults to
311
+ MEDIUM (it actively misleads).
312
+
269
313
  Be conservative - only report clear, well-grounded issues
270
314
  that require an actual *code change*. Think twice to avoid
271
315
  *false positives*.
@@ -277,7 +321,7 @@ Workflow
277
321
 
278
322
  For *each* found problem which requires a code change:
279
323
 
280
- 1. Set <aspect/> to the identifier `A01 - XXX`...`A20 - XXX`,
324
+ 1. Set <aspect/> to the identifier `A01 - XXX`...`A21 - XXX`,
281
325
  indicating the aspect under which the problem was detected.
282
326
 
283
327
  2. Set <severity/> to the string `LOW`, `MEDIUM`, or `HIGH`,
@@ -0,0 +1,89 @@
1
+
2
+ Grill Skill Common Steps
3
+ ========================
4
+
5
+ <define name="grill-understanding">
6
+
7
+ - GOAL:
8
+
9
+ Interactively interviewing the user *relentlessly* about every
10
+ *essential aspect* of <arg1/> *until* reaching a shared
11
+ understanding and no major decisions/questions are left open.
12
+
13
+ This especially means that you *MUST* clarify as many aspects as
14
+ necessary to ensure that for at least the most important decisions,
15
+ during a subsequent implementation, no essential freedom of choice
16
+ exists any longer.
17
+
18
+ - FOCUS:
19
+
20
+ Focusing on the following outside-in *Focus Areas*, in order of
21
+ descending importance for the grilling operation:
22
+
23
+ 1. *DOMAIN*: Aspects affecting domain-specifics. These
24
+ aspects *MUST* be clarified, as they are about
25
+ the "what" of the solution and they
26
+ non-technically shape the solution noticeably.
27
+
28
+ 2. *INTERFACE*: Aspects affecting externally observable
29
+ behavior or interfaces, especially aspects about user (UI)
30
+ and machine (API) interfaces. These aspects *MUST* be
31
+ clarified, as they are externally visible and
32
+ shape the boundary of the solution.
33
+
34
+ 3. *ARCHITECTURE*: Aspects affecting software and system
35
+ architecture, especially decisions on structure, wiring,
36
+ placement, or dependencies. These aspects *SHOULD*
37
+ be clarified, as they technically shape the solution noticeably.
38
+
39
+ 4. *IMPLEMENTATION*: Aspects affecting any other
40
+ implementation details, especially how <arg1/>
41
+ is realized in the code base. These aspects *CAN* be
42
+ clarified, as they shape technical inner details only.
43
+
44
+ - SEVERITY:
45
+
46
+ The *Focus Area* indicate the severity of the aspect:
47
+
48
+ - severity *MUST* for *DOMAIN* focus area
49
+ - severity *MUST* for *INTERFACE* focus area
50
+ - severity *SHOULD* for *ARCHITECTURE* focus area
51
+ - severity *MAY* for *IMPLEMENTATION* focus area
52
+
53
+ - INDICATORS:
54
+
55
+ Check the following indicators for identifying problematic
56
+ aspects:
57
+
58
+ - *Fuzzy Language*:
59
+ When the user uses vague or overloaded terms instead of
60
+ a precise or canonical term.
61
+
62
+ - *Conflicting Terminology*:
63
+ When the user uses a term that conflicts with the
64
+ existing terminology in the code base.
65
+
66
+ - *Conflicting Code*:
67
+ When the user states how something works, check whether the
68
+ current code state really agrees.
69
+
70
+ - *Non-Concrete Scenarios*:
71
+ When domain relationships are being discussed,
72
+ stress-test them with specific scenarios. Theoretically
73
+ invent realistic scenarios that probe edge cases and
74
+ force the user to be precise about the boundaries
75
+ between concepts.
76
+
77
+ - *Unspecified Architecture Patterns*:
78
+ When the realization of the functionality is known to
79
+ be reasonably realizable with more than one decent
80
+ architecture pattern, but no such pattern was
81
+ mentioned.
82
+
83
+ - *Unspecified Dependencies*:
84
+ When the realization of functionality usually is known
85
+ to be supported by the use of frameworks or libraries,
86
+ but no dependencies on such solutions were mentioned.
87
+
88
+ </define>
89
+
@@ -36,6 +36,12 @@ following procedure:
36
36
  description. The second and following lines each provide an
37
37
  answer label and an answer description.
38
38
 
39
+ Parse the first line by splitting it at its *first* `: ` into
40
+ <question-label/> (the text before) and <question-description/>
41
+ (the remaining text, *without* the label). The label is rendered
42
+ *only* as the box subtitle below, so <question-description/>
43
+ *MUST* *NOT* repeat it.
44
+
39
45
  Do not output anything in this step!
40
46
 
41
47
  2. Render the custom dialog, collect the user input, and dispatch on the result:
@@ -6,7 +6,7 @@
6
6
  "homepage": "https://ase.tools",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "https://github.com/rse/ase/issues" },
9
- "version": "0.9.61",
9
+ "version": "0.9.62",
10
10
  "license": "Apache-2.0",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -482,7 +482,7 @@ interface quality, quality attributes, and architecture governance.
482
482
  nothing and hence emit no output at all):
483
483
 
484
484
  <ase-tpl-hint level="minimal">
485
- For deeper analysis, suggestions on solution approaches and then final source code changes, use `/ase-code-resolve <id-prefix/>P{n}` or `/ase-code-resolve <id-prefix/>T{n}` in the same or even a different session.
485
+ For deeper analysis, suggestions on solution approaches and then final source code changes, use `/ase-code-resolve <id-prefix/>P{n}` or `/ase-code-resolve <id-prefix/>T{n}`, or for a direct one-shot fix use `/ase-code-edit <id-prefix/>P{n}` or `/ase-code-edit <id-prefix/>T{n}`, in the same or even a different session.
486
486
  </ase-tpl-hint>
487
487
 
488
488
  </step>
@@ -218,7 +218,7 @@ problems in *performance* and *efficiency*, or problems in *security*.
218
218
  nothing and hence emit no output at all):
219
219
 
220
220
  <ase-tpl-hint level="minimal">
221
- For deeper analysis, suggestions on solution approaches and then final problem resolution, use `/ase-code-resolve <id-prefix/>P{n}` in the same or even a different session.
221
+ For deeper analysis, suggestions on solution approaches and then final problem resolution, use `/ase-code-resolve <id-prefix/>P{n}`, or for a direct one-shot fix use `/ase-code-edit <id-prefix/>P{n}`, in the same or even a different session.
222
222
  </ase-tpl-hint>
223
223
 
224
224
  You *MUST* not output anything else in this STEP 3,
@@ -52,7 +52,8 @@ problem as a `PROBLEM` entry with severity (`LOW`, `MEDIUM`, `HIGH`) and
52
52
  inline file/line references (in the performance lens, each entry
53
53
  additionally carries an *evidence* and a *trade-off* line), and persists
54
54
  results in the `ase` MCP key/value store as `ase-issue-P<n>` entries so
55
- they can later be resolved via `ase-code-resolve P<n>`.
55
+ they can later be resolved via `ase-code-resolve P<n>` or directly
56
+ fixed via `ase-code-edit P<n>`.
56
57
 
57
58
  ## ARGUMENTS
58
59
 
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: ase-code-edit
3
- argument-hint: "[--help|-h] [--mode|-m auto|craft|refactor|resolve] [--grill|-g] [--grill-rounds|-r <n>] [--verify|-v] [--worktree|-w] [--loop|-l] [<query>]"
3
+ argument-hint: "[--help|-h] [--mode|-m auto|craft|refactor|resolve] [--grill|-g] [--grill-rounds|-r <n>] [--verify|-v] [--worktree|-w] [--loop|-l] [<query>|<issue-id>]"
4
4
  description: >
5
5
  Edit Source Code: Use when the user wants to "edit" the code base in
6
- one shot from a query, fusing crafting, refactoring, and resolving
7
- with optional grilling, verification, looping, and Git worktree
8
- isolation.
6
+ one shot from a query or a bare analyzer issue id like "P1", fusing
7
+ crafting, refactoring, and resolving with optional grilling,
8
+ verification, looping, and Git worktree isolation.
9
9
  user-invocable: true
10
10
  disable-model-invocation: false
11
11
  effort: xhigh
@@ -33,6 +33,7 @@ resolving in one shot -- through the states *querying*, *discovering*,
33
33
  </objective>
34
34
 
35
35
  @${CLAUDE_SKILL_DIR}/../../meta/ase-tenets.md
36
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-grill.md
36
37
 
37
38
  Procedure
38
39
  ---------
@@ -114,7 +115,32 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
114
115
 
115
116
  </if>
116
117
 
117
- 2. Convert the <query/> *fresh* into <todo-what/> -- the
118
+ 2. <if condition="<query/> matches the regexp `^([a-zA-Z][a-zA-Z0-9_]*-)?[PT]\d+$`">
119
+
120
+ The <query/> is a bare issue identifier (like `P1`, `T1`, or
121
+ `<prefix>-P1`) previously produced by `ase-code-analyze` or
122
+ `ase-arch-analyze`. Set <issue-id><query/></issue-id> and call
123
+ the `ase_kv_get(key: "ase-issue-<issue-id/>")` tool of the
124
+ `ase` MCP server to retrieve the persisted problem description.
125
+ If the returned `text` is non-empty, set <query><text/></query>
126
+ and only output the following <template/>:
127
+
128
+ <template>
129
+ ⧉ **ASE**: ✪ skill: **ase-code-edit**, ⇌ issue: **<issue-id/>**, ▶ status: **issue retrieved**
130
+ </template>
131
+
132
+ Otherwise, set <issue-id></issue-id> (empty) and only output the
133
+ following <template/>, then, under `--loop`, continue with the
134
+ *next* iteration at item 3.1 above, or, without `--loop`,
135
+ immediately *STOP* processing the entire current skill:
136
+
137
+ <template>
138
+ ⧉ **ASE**: ✪ skill: **ase-code-edit**, ▶ ERROR: no analyzer result exists for issue **<query/>**
139
+ </template>
140
+
141
+ </if>
142
+
143
+ 3. Convert the <query/> *fresh* into <todo-what/> -- the
118
144
  domain-specific, non-implementation-detail information -- and
119
145
  <todo-how/> -- the remaining information -- discarding all
120
146
  <todo-what/>/<todo-how/> content of any previous iteration.
@@ -122,11 +148,11 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
122
148
  and during later implementation just interpret the query best-effort.
123
149
  Do not output anything.
124
150
 
125
- 3. Expand the following:
151
+ 4. Expand the following:
126
152
 
127
153
  <expand name="todo-box" arg1="current state (after querying)"></expand>
128
154
 
129
- 4. Set <query></query> (clear the query, so every further `--loop`
155
+ 5. Set <query></query> (clear the query, so every further `--loop`
130
156
  iteration asks for a fresh one). Do not output anything.
131
157
 
132
158
  4. **State: discovering:**
@@ -144,85 +170,16 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
144
170
 
145
171
  1. Understand what "grilling" is about:
146
172
 
147
- - GOAL:
148
-
149
- Interactively interviewing the user *relentlessly* about every
150
- *essential aspect* of the edit query in <todo-what/> and
151
- <todo-how/> *until* reaching a shared understanding and no
152
- major decisions/questions are left open.
153
-
154
- This especially means that you *MUST* clarify as many aspects as
155
- necessary to ensure that for at least the most important decisions,
156
- during a subsequent implementation, no essential freedom of choice
157
- exists any longer.
158
-
159
- - FOCUS:
160
-
161
- Focusing on the following outside-in *Focus Areas*, in order of
162
- descending importance for the grilling operation:
163
-
164
- 1. *DOMAIN*: Aspects affecting domain-specifics. These
165
- aspects *MUST* be clarified, as they are about
166
- the "what" of the solution and they
167
- non-technically shape the solution noticeably.
168
-
169
- 2. *INTERFACE*: Aspects affecting externally observable
170
- behavior or interfaces, especially aspects about user (UI)
171
- and machine (API) interfaces. These aspects *MUST* be
172
- clarified, as they are externally visible and
173
- shape the boundary of the solution.
174
-
175
- 3. *ARCHITECTURE*: Aspects affecting software and system
176
- architecture, especially decisions on structure, wiring,
177
- placement, or dependencies. These aspects *SHOULD*
178
- be clarified, as they technically shape the solution noticeably.
179
-
180
- 4. *IMPLEMENTATION*: Aspects affecting any other
181
- implementation details, especially how the edit query
182
- is realized in the code base. These aspects *CAN* be
183
- clarified, as they shape technical inner details only.
184
-
185
- - INDICATORS:
186
-
187
- Check the following indicators for identifying problematic
188
- aspects:
189
-
190
- - *Fuzzy Language*:
191
- When the user uses vague or overloaded terms instead of
192
- a precise or canonical term.
193
-
194
- - *Conflicting Terminology*:
195
- When the user uses a term that conflicts with the
196
- existing terminology in the code base.
197
-
198
- - *Conflicting Code*:
199
- When the user states how something works, check whether the
200
- current code state really agrees.
201
-
202
- - *Non-Concrete Scenarios*:
203
- When domain relationships are being discussed,
204
- stress-test them with specific scenarios. Theoretically
205
- invent realistic scenarios that probe edge cases and
206
- force the user to be precise about the boundaries
207
- between concepts.
208
-
209
- - *Unspecified Architecture Patterns*:
210
- When the realization of the functionality is known to
211
- be reasonably realizable with more than one decent
212
- architecture pattern, but no such pattern was
213
- mentioned.
214
-
215
- - *Unspecified Dependencies*:
216
- When the realization of functionality usually is known
217
- to be supported by the use of frameworks or libraries,
218
- but no dependencies on such solutions were mentioned.
173
+ <expand name="grill-understanding" arg1="the edit query in <todo-what/> and <todo-how/>"></expand>
219
174
 
220
175
  2. Perform <getopt-option-grill-rounds/> grilling *rounds*,
221
176
  numbered <m/> (1-<getopt-option-grill-rounds/>).
222
177
 
223
178
  For each round:
224
179
 
225
- 1. Explicitly start *from scratch* from *only* the current
180
+ 1. INITIALIZE TODO:
181
+
182
+ Explicitly start *from scratch* from *only* the current
226
183
  <todo-what/> and <todo-how/> and *forget* all information
227
184
  gathered in previous rounds. Set <round-id/> to
228
185
  `GRILLING ROUND <m/>/<getopt-option-grill-rounds/>` if
@@ -230,50 +187,71 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
230
187
  `GRILLING` otherwise (a single round needs no round
231
188
  numbering). Do not output anything.
232
189
 
233
- 2. Determine the very brief but precise questions <question-N/>,
234
- chosen to resolve the open points related to the above
235
- understanding of grilling, by focusing on the mentioned
236
- *Focus Areas*.
237
-
238
- For each <question-N/> determine its <focus-area-N/> and a
239
- <topic-N/>, a 1-2 word hint describing what the question is
240
- about. Render <focus-area-N/> in the tables below as
241
- `**DOMAIN** (MUST)`, `**INTERFACE** (MUST)`,
242
- `**ARCHITECTURE** (SHOULD)`, or `**IMPLEMENTATION** (MAY)`
243
- correspondingly.
244
-
245
- Use the format `Shall...?` for questions of
246
- focus area *DOMAIN* and *INTERFACE*, the format `Should...?`
247
- for questions of focus area *ARCHITECTURE*, and the format
248
- `May...?` for questions of focus area *IMPLEMENTATION*.
249
-
250
- In every <question-N/>, encode all *literal aspects* -- file
251
- and directory paths, identifiers, symbols, types, commands,
252
- options, configuration keys, and literal values -- with
253
- backticks.
254
-
255
- Keep every <question-N/> at most *200 characters* long, as a
256
- longer question overflows its table cell and silently
257
- degrades the entire table into a plain text rendering.
258
-
259
- 3. Finally, *sort* the questions by descending
260
- focus area order -- first all `DOMAIN`, then all
261
- `INTERFACE`, then all `ARCHITECTURE`, and then all
262
- `IMPLEMENTATION` ones -- and renumber <N/> according to this
263
- order. Truncate the list after a maximum of 10 questions and
264
- set <n/> to the number of remaining questions. Do not output
265
- anything.
266
-
267
- 4. For all remaining <question-N/>, check the code base
268
- and your world knowledge to find *two to three*
269
- grounded answer alternatives <answer-N-K/> with a
270
- 1-3 word label <answer-N-K-label/> and an ultra brief description
271
- <answer-N-K-description/> of at most *10 words*. For the answer
272
- which reflects the current
273
- <todo-what/>/<todo-how/> understanding prefixing its
274
- description with `✻ **CURRENT** ✻`. Assemble a <answer-N/>
275
- out of `**A1**: **<answer-N-1-label/>**: <answer-N-1-description/> ─◇─
276
- **A2**: **<answer-N-2-label/>**: <answer-N-2-description/> ─◇─ [...]`.
190
+ 2. DETERMINE QUESTIONS:
191
+
192
+ Determine the questions, comprised of a globally-unique id
193
+ <question-N-id/> of `Q<N/>`, and a very brief but precise
194
+ question text <question-N-text/>. Each question is chosen to
195
+ resolve the open points related to the above understanding
196
+ of grilling, by focusing on the mentioned *Focus Areas*.
197
+
198
+ For <question-N-text/> use the format `Shall...?` for
199
+ questions of focus area `DOMAIN` and `INTERFACE`, the format
200
+ `Should...?` for questions of focus area `ARCHITECTURE`,
201
+ and the format `May...?` for questions of focus area
202
+ `IMPLEMENTATION`.
203
+
204
+ In every <question-N-text/>, encode all *literal aspects*
205
+ -- file and directory paths, identifiers, symbols, types,
206
+ commands, options, configuration keys, and literal values --
207
+ with backticks.
208
+
209
+ Keep every <question-N-text/> at most *200 characters* long
210
+ -- compact the text until it fits --, as a longer question
211
+ overflows its table cell and silently degrades the entire
212
+ table into a plain text rendering.
213
+
214
+ 3. DETERMINE CONTEXT:
215
+
216
+ For each question, determine its focus area
217
+ <context-N-focus/> from the mentioned *Focus Areas*, a 1-3
218
+ word hint <context-N-topic/>, describing what the question
219
+ is about, and a <context-N-severity/>, describing how
220
+ important this question is.
221
+
222
+ Set <context-N-id/> to `DOM` for <context-N-focus/> of
223
+ `DOMAIN`, `IFC` for <context-N-focus/> of `INTERFACE`, `ARC`
224
+ for <context-N-focus/> of `ARCHITECTURE`, and `IMP` for
225
+ <context-N-focus/> of `IMPLEMENTATION`.
226
+
227
+ 4. SORT QUESTIONS:
228
+
229
+ Finally, *sort* the questions by descending focus area
230
+ order -- first all `DOMAIN`, then all `INTERFACE`, then all
231
+ `ARCHITECTURE`, and then all `IMPLEMENTATION` ones -- and
232
+ renumber <N/> according to this order. Truncate the list
233
+ after a maximum of 10 questions and set <n/> to the number
234
+ of remaining questions. Do not output anything.
235
+
236
+ Finally, assemble the <question-N/> out of
237
+ `**<question-N-id/>** ▶ **<context-N-id/>** ▷
238
+ **<context-N-topic/>**: <question-N-text/>`.
239
+
240
+ 5. DETERMINE ANSWERS:
241
+
242
+ For all remaining <question-N/>, check the code base and
243
+ your world knowledge to find *two to three* grounded answer
244
+ alternatives <answer-N-K/> with an id <answer-N-K-id/>
245
+ of `A<K/>`, a 1-3 word label <answer-N-K-label/>, and
246
+ an ultra brief description <answer-N-K-description/> of
247
+ at most *10 words*. For the answer which reflects the
248
+ current <todo-what/>/<todo-how/> understanding, append
249
+ ` ⚑` to its <answer-N-K-label/>.
250
+
251
+ Assemble an <answer-N/> out of `**<answer-N-1-id/>**
252
+ ▶ **<answer-N-1-label/>**: <answer-N-1-description/>,
253
+ **<answer-N-2-id/>** ▶ **<answer-N-2-label/>**:
254
+ <answer-N-2-description/>[, ...]`.
277
255
 
278
256
  Keep every assembled <answer-N/> at most *240 characters*
279
257
  long -- drop the least relevant alternative and compact the
@@ -281,7 +259,9 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
281
259
  its table cell and silently degrades the entire table into a
282
260
  plain text rendering.
283
261
 
284
- 5. In the following, you *MUST* *NOT* use your built-in
262
+ 6. INTERACTIVE DIALOG:
263
+
264
+ In the following, you *MUST* *NOT* use your built-in
285
265
  <user-dialog-tool/> tool! Instead, you *MUST* just show a
286
266
  custom dialog according to the expanded `custom-dialog`
287
267
  definition. You *MUST* closely follow this definition. The
@@ -289,8 +269,8 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
289
269
  `SKIP GRILLING` and `STOP SKILL`, dispatched as follows:
290
270
 
291
271
  - If a <result/> is `SKIP GRILLING` or `CANCEL`, ask no
292
- further questions, continue with item 6 below (merging
293
- the answers gathered so far), and after item 7 skip all
272
+ further questions, continue with item 7 below (merging
273
+ the answers gathered so far), and after item 8 skip all
294
274
  remaining rounds and continue with the *implementing*
295
275
  state.
296
276
 
@@ -305,9 +285,7 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
305
285
  1. Output only the following <template/> -- it lists *all*
306
286
  questions of the round up-front, one table row per
307
287
  aspect, so the subsequent dialog only has to ask for the
308
- combined answer. Align all column edges of the table. If
309
- <getopt-option-grill-rounds/> is equal `1`, *omit* the
310
- leading `<round-id/>` line.
288
+ combined answer. Align all column edges of the table.
311
289
 
312
290
  In every table cell you *MUST* escape each literal pipe
313
291
  character outside a code span as `\|` and you *MUST*
@@ -317,13 +295,16 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
317
295
  entire table into a plain text rendering:
318
296
 
319
297
  <template>
320
- ⧉ **ASE**: <round-id/>:
298
+ ⧉ **ASE**: <round-id/>: *Relentless Interviewing Until Clarity*
299
+
300
+ | QUESTION | ANSWERS |
301
+ | ------------- | ----------- |
302
+ | <question-1/> | <answer-1/> |
303
+ | <question-2/> | <answer-2/> |
304
+ | [...] | [...] |
321
305
 
322
- | # | FOCUS TOPIC | **QUESTION** | **ANSWERS** |
323
- | :----: | ----------------------------- | ----------------- | ----------- |
324
- | **Q1** | <focus-area-1/> ▶ <topic-1/> | **<question-1/>** | <answer-1/> |
325
- | **Q2** | <focus-area-2/> ▶ <topic-2/> | **<question-2/>** | <answer-2/> |
326
- | [..] | [...] | [...] | [...] |
306
+ Legend: **DOM**: Domain (MUST), **IFC**: Interface (MUST), **ARC**: Architecture (SHOULD), **IMP**: Implementation (MAY)
307
+ **Qn**: global question id, **An**: question-local answer id, ⚑: current decision state
327
308
  </template>
328
309
 
329
310
  2. Show a custom dialog. Its only answer options are the
@@ -331,7 +312,7 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
331
312
  *one* free-text reply:
332
313
 
333
314
  <expand name="custom-dialog" arg1="--other">
334
- <round-id/>: What is your (combined) answer to all (or a subset) of the above questions? (keywords are sufficient)
315
+ <round-id/>: What is your (combined) answer to all (or a subset) of the above questions? (keywords or `Qn:An` references are sufficient)
335
316
  SKIP GRILLING: skip all remaining grilling and continue with the implementation
336
317
  STOP SKILL: stop the entire skill immediately
337
318
  </expand>
@@ -342,11 +323,15 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
342
323
  combined free-text answers to all questions of the
343
324
  round.
344
325
 
345
- 6. Merge all gathered answers of the round -- the combined
346
- reply -- *exclusively* back into <todo-what/> and
326
+ 7. MERGE ANSWERS INTO TODO:
327
+
328
+ Merge all gathered answers in <result/> of the round -- the
329
+ combined reply -- *exclusively* back into <todo-what/> and
347
330
  <todo-how/>. Do not output anything.
348
331
 
349
- 7. Set <round-suffix/> to
332
+ 8. SHOW CURRENT TODO:
333
+
334
+ Set <round-suffix/> to
350
335
  ` round <m/>/<getopt-option-grill-rounds/>` if
351
336
  <getopt-option-grill-rounds/> is greater than 1, or to
352
337
  empty otherwise, and expand the following -- this
@@ -363,6 +348,10 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
363
348
  `resolve`: Set <task-kind/> to `CRAFTING`, `REFACTORING`,
364
349
  or `RESOLVING` correspondingly.
365
350
 
351
+ - Else if <issue-id/> is not empty (`auto` with a retrieved
352
+ analyzer issue): Set <task-kind/> to `RESOLVING`, as the
353
+ edit fixes a reported problem.
354
+
366
355
  - Else (`auto`): *Infer* the <task-kind/> from <todo-what/> and
367
356
  <todo-how/>: set to `RESOLVING` if the edit predominantly
368
357
  fixes a defect, set to `REFACTORING` if it predominantly
@@ -447,7 +436,15 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
447
436
  user keeps full control over the final commit.
448
437
  </if>
449
438
 
450
- 4. Output only the following <template/>. You *MUST* *NOT* output a
439
+ 4. <if condition="<issue-id/> is not empty">
440
+ Call the `ase_kv_delete(key: "ase-issue-<issue-id/>")` tool of
441
+ the `ase` MCP server to remove the now-resolved analyzer result
442
+ from the key/value store, then set <issue-id></issue-id> (empty),
443
+ so every further `--loop` iteration starts without an issue.
444
+ Do not output anything.
445
+ </if>
446
+
447
+ 5. Output only the following <template/>. You *MUST* *NOT* output a
451
448
  change summary, a list of modified artifacts, a rationale, or a
452
449
  unified diff of the changes -- *independent* of
453
450
  <ase-project-boxing/>, whose exposure rules are explicitly
@@ -467,7 +464,7 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
467
464
  1. Verify whether the implementation fulfills <todo-what/> and
468
465
  <todo-how/> by running available verification commands
469
466
  (build, tests, linter, type-checker)
470
- <if condition=" <worktree-dir/> is not empty">
467
+ <if condition="<worktree-dir/> is not empty">
471
468
  , each with <worktree-dir/> as its working directory
472
469
  </if>.
473
470
 
@@ -20,7 +20,7 @@ Lint Source Code
20
20
 
21
21
  <expand name="getopt"
22
22
  arg1="ase-code-lint"
23
- arg2="--auto|-a --severity|-S=(LOW|MEDIUM|HIGH) --include|-i=(none|A01|A02|A03|A04|A05|A06|A07|A08|A09|A10|A11|A12|A13|A14|A15|A16|A17|A18|A19|A20)... --exclude|-e=(none|A01|A02|A03|A04|A05|A06|A07|A08|A09|A10|A11|A12|A13|A14|A15|A16|A17|A18|A19|A20)...">
23
+ arg2="--auto|-a --severity|-S=(LOW|MEDIUM|HIGH) --include|-i=(none|A01|A02|A03|A04|A05|A06|A07|A08|A09|A10|A11|A12|A13|A14|A15|A16|A17|A18|A19|A20|A21)... --exclude|-e=(none|A01|A02|A03|A04|A05|A06|A07|A08|A09|A10|A11|A12|A13|A14|A15|A16|A17|A18|A19|A20|A21)...">
24
24
  $ARGUMENTS
25
25
  </expand>
26
26
 
@@ -53,16 +53,16 @@ related to a set of code quality aspects.
53
53
  <getopt-option-include/> and <getopt-option-exclude/> as
54
54
  comma-separated token lists, silently dropping the `none` sentinel
55
55
  and any empty token. If a token <token/> is *not* one of the aspect
56
- ids `A01`...`A20`, only output the following <template/> and then
56
+ ids `A01`...`A21`, only output the following <template/> and then
57
57
  *STOP* the entire flow (do not perform any further steps):
58
58
 
59
59
  <template>
60
60
  ⧉ **ASE**: ✪ skill: **ase-code-lint**, ▶ ERROR: invalid aspect id: **<token/>**
61
61
  </template>
62
62
 
63
- Otherwise set <aspects/> to *all* twenty aspect ids `A01`...`A20`
63
+ Otherwise set <aspects/> to *all* twenty-one aspect ids `A01`...`A21`
64
64
  if both lists are empty, to the *include* list if only it is
65
- non-empty, to all twenty *minus* the *exclude* list if only it is
65
+ non-empty, to all twenty-one *minus* the *exclude* list if only it is
66
66
  non-empty, and to the *include* list *minus* the *exclude* list if
67
67
  both are non-empty. If the resulting <aspects/> is *empty*, only
68
68
  output the following <template/> and then *STOP* the entire flow
@@ -143,7 +143,7 @@ related to a set of code quality aspects.
143
143
 
144
144
  Use the following <template/> to output a summary of the detected
145
145
  problems in <problems/> (if any were found), in the original aspect
146
- ordering `A01 - XXX`...`A20 - XXX`.
146
+ ordering `A01 - XXX`...`A21 - XXX`.
147
147
 
148
148
  <template>
149
149
  <ase-tpl-bullet-secondary/> **LINT SUMMARY**:
@@ -27,22 +27,31 @@ correction interactively (or refine it via a free-text hint, which
27
27
  re-proposes the correction without limit) or - with `--auto` - applies
28
28
  all corrections automatically.
29
29
 
30
- By default all twenty code quality aspects are checked. The `--include`
30
+ By default all twenty-one code quality aspects are checked. The `--include`
31
31
  and `--exclude` options narrow this to an *effective aspect set*: with
32
32
  `--include` only, exactly the listed aspects are checked; with
33
33
  `--exclude` only, all aspects except the listed ones; with both, the
34
34
  included ones minus the excluded ones. An unknown aspect id, or a
35
35
  combination which cancels out to an empty set, aborts the skill with an
36
- error. The twenty aspect ids are:
36
+ error. The twenty-one aspect ids are:
37
37
 
38
38
  ```text
39
- A01 FORMATTING A06 REDUNDANCY A11 TYPING A16 SECURITY
40
- A02 COMPREHENSION A07 PATTERNS A12 ERROR-HANDLING A17 ARCHITECTURE
41
- A03 CLEANLINESS A08 COMPLICATEDNESS A13 MEMORY-LEAK A18 LOGIC
42
- A04 SPELLING A09 CONCISENESS A14 CONCURRENCY A19 FLOW
43
- A05 COMPLEXITY A10 SMELLS A15 PERFORMANCE A20 DEAD-CODE
39
+ A01 FORMATTING A07 PATTERNS A13 MEMORY-LEAK A19 FLOW
40
+ A02 COMPREHENSION A08 COMPLICATEDNESS A14 CONCURRENCY A20 DEAD-CODE
41
+ A03 CLEANLINESS A09 CONCISENESS A15 PERFORMANCE A21 DOCUMENTATION
42
+ A04 SPELLING A10 SMELLS A16 SECURITY
43
+ A05 COMPLEXITY A11 TYPING A17 ARCHITECTURE
44
+ A06 REDUNDANCY A12 ERROR-HANDLING A18 LOGIC
44
45
  ```
45
46
 
47
+ The `A21 DOCUMENTATION` aspect checks the code documentation in *both*
48
+ directions: it flags functions, methods, classes, and modules - *private
49
+ ones included* - which lack a minimal 1-2 line description in the
50
+ idiomatic documentation convention of the target language, *and* it
51
+ flags excessive comments (narrated decision logs, change history,
52
+ line-by-line explanations of the obvious), comments merely restating
53
+ the code, and comments contradicting the code.
54
+
46
55
  ## OPTIONS
47
56
 
48
57
  `--auto`|`-a`:
@@ -60,7 +69,7 @@ A05 COMPLEXITY A10 SMELLS A15 PERFORMANCE A20 DEAD-CODE
60
69
  `--include`|`-i`=*aspect*[`,`...]:
61
70
  Restrict the checked code quality aspects to the given
62
71
  comma-separated list of aspect ids (e.g. `A01,A04`). Without this
63
- option, all twenty aspects are checked.
72
+ option, all twenty-one aspects are checked.
64
73
 
65
74
  `--exclude`|`-e`=*aspect*[`,`...]:
66
75
  Remove the given comma-separated list of aspect ids from the checked
@@ -104,6 +113,12 @@ Lint a directory for all aspects except dead code:
104
113
  ❯ /ase-code-lint --exclude A20 src/handlers/
105
114
  ```
106
115
 
116
+ Lint a directory for the documentation aspect only:
117
+
118
+ ```text
119
+ ❯ /ase-code-lint -i A21 src/handlers/
120
+ ```
121
+
107
122
  ## SEE ALSO
108
123
 
109
124
  [`ase-code-analyze`](../ase-code-analyze/help.md), [`ase-code-resolve`](../ase-code-resolve/help.md), [`ase-code-refactor`](../ase-code-refactor/help.md),
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ase-task-grill
3
- argument-hint: "[--help|-h] [--next|-n <option>[,...]] [<id>]"
3
+ argument-hint: "[--help|-h] [--rounds|-r <n>] [--next|-n <option>[,...]] [<id>]"
4
4
  description: >
5
5
  Interview the user relentlessly about the task plan until reaching a
6
6
  shared understanding, resolving each branch of the question decision
@@ -22,7 +22,7 @@ Iteratively Grill a Task Plan
22
22
 
23
23
  <expand name="getopt"
24
24
  arg1="ase-task-grill"
25
- arg2="--next|-n=(none|DONE|EDIT|IMPLEMENT|PREFLIGHT)... --int-reuse-task">
25
+ arg2="--rounds|-r=1 --next|-n=(none|DONE|EDIT|IMPLEMENT|PREFLIGHT)... --int-reuse-task">
26
26
  $ARGUMENTS
27
27
  </expand>
28
28
 
@@ -33,6 +33,7 @@ task plan until reaching a shared understanding.
33
33
 
34
34
  @${CLAUDE_SKILL_DIR}/../../meta/ase-format-task.md
35
35
  @${CLAUDE_SKILL_DIR}/../../meta/ase-common-task.md
36
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-common-grill.md
36
37
 
37
38
  Procedure
38
39
  ---------
@@ -52,7 +53,15 @@ Set <args>--int-reuse-task</args>.
52
53
  Inherit the always existing <ase-session-id/> from the current context.
53
54
  Do not output anything.
54
55
 
55
- 2. React on task id:
56
+ 2. If <getopt-option-rounds/> is not a positive integer,
57
+ only output the following <template/> and then immediately
58
+ *STOP* processing the entire current skill:
59
+
60
+ <template>
61
+ ⧉ **ASE**: ☻ skill: **ase-task-grill**, ▶ ERROR: invalid `--rounds` value: **<getopt-option-rounds/>**
62
+ </template>
63
+
64
+ 3. React on task id:
56
65
 
57
66
  <expand name="task-react-id" arg1="ase-task-grill"></expand>
58
67
 
@@ -71,62 +80,97 @@ Set <args>--int-reuse-task</args>.
71
80
 
72
81
  3. **Iterate Over Task Plan Aspects:**
73
82
 
74
- Interactively interview the user *relentlessly* about every
75
- *essential aspect* of the task plan in <task-content/> *until* reaching a
76
- shared understanding and no decisions/questions are left open.
77
-
78
- This especially means that you *MUST* clarify as many aspects as
79
- necessary to ensure that for at least the most important decisions,
80
- during a subsequent implementation, no essential freedom of choice
81
- exists any longer.
82
-
83
- For this process, determine the <n/> essential aspects <aspect-N/>
84
- (a one- or two-word-long short identifier like `Foo` or `Bar-Baz`)
85
- and the corresponding decision/question <question-N/> where a shared
86
- understanding is required.
83
+ 1. Understand what "grilling" is about:
87
84
 
88
- Honor also the following checks for identifying the problematic
89
- aspects:
85
+ <expand name="grill-understanding" arg1="the task plan in <task-content/>"></expand>
90
86
 
91
- - **Fuzzy Language**:
92
- When the user uses vague or overloaded terms instead of a precise
93
- or canonical term.
87
+ 2. Perform <getopt-option-rounds/> grilling *rounds*, numbered
88
+ <m/> (1-<getopt-option-rounds/>). Each round starts *from
89
+ scratch* from *only* the *current* <task-content/> -- as
90
+ updated by all previous rounds -- and *forgets* all questions
91
+ and answers gathered in previous rounds.
94
92
 
95
- - **Conflicting Terminology**:
96
- When the user uses a term that conflicts with the existing
97
- terminology in the code base.
93
+ For each round:
98
94
 
99
- - **Conflicting Code**:
100
- When the user states how something works, check whether the
101
- current code state really agrees.
95
+ 1. INITIALIZE ROUND:
102
96
 
103
- - **Non-Concrete Scenarios**:
104
- When domain relationships are being discussed, stress-test them
105
- with specific scenarios. Invent scenarios that probe edge cases
106
- and force the user to be precise about the boundaries between
107
- concepts.
97
+ Set <round-id/> to `GRILLING ROUND <m/>/<getopt-option-rounds/>`
98
+ if <getopt-option-rounds/> is greater than 1, or to
99
+ `GRILLING` otherwise (a single round needs no round
100
+ numbering). Then output only the following <template/>:
108
101
 
109
- Then create a decisions/questions tree for them. Walk down each
110
- branch of this decision tree, resolving dependencies between
111
- decisions one-by-one. Ask the questions <question-N/> and determine
112
- the corresponding answer <answer-N/>, one at a time.
102
+ <template>
103
+ **ASE**: <round-id/>: *Relentless Interviewing Until Clarity*
104
+ </template>
113
105
 
114
- 1. For each question <question-N/> in the iteration cycle <N/>:
106
+ 2. DETERMINE QUESTIONS:
107
+
108
+ Determine the essential aspects <aspect-N/> (a one- or
109
+ two-word-long short identifier like `Foo` or `Bar-Baz`, also
110
+ serving as the topic hint) and the corresponding, very brief
111
+ but precise decision/question <question-N/> where a shared
112
+ understanding is required. Each question is chosen to
113
+ resolve the open points related to the above understanding
114
+ of grilling, by focusing on the mentioned *Focus Areas* and
115
+ checking the mentioned *Indicators*.
116
+
117
+ For <question-N/> use the format `Shall...?` for
118
+ questions of focus area `DOMAIN` and `INTERFACE`, the format
119
+ `Should...?` for questions of focus area `ARCHITECTURE`,
120
+ and the format `May...?` for questions of focus area
121
+ `IMPLEMENTATION`.
122
+
123
+ In every <question-N/>, encode all *literal aspects*
124
+ -- file and directory paths, identifiers, symbols, types,
125
+ commands, options, configuration keys, and literal values --
126
+ with backticks. Do not output anything.
127
+
128
+ 3. DETERMINE CONTEXT:
129
+
130
+ For each question, determine its focus area
131
+ <context-N-focus/> from the mentioned *Focus Areas*.
132
+ <context-N-severity/>, describing how important this
133
+ question is.
134
+
135
+ 4. SORT QUESTIONS:
136
+
137
+ Create a decisions/questions tree for the questions,
138
+ capturing the dependencies between the decisions. Then
139
+ *sort* the questions *primarily* by descending focus area
140
+ order -- first all `DOMAIN`, then all `INTERFACE`, then all
141
+ `ARCHITECTURE`, and then all `IMPLEMENTATION` ones -- and
142
+ *secondarily*, within each focus area, by the decision tree
143
+ order, so that each decision is asked *after* the decisions
144
+ it depends on. Renumber <N/> according to this order.
145
+ Truncate the list after a maximum of 10 questions and set
146
+ <n/> to the number of remaining questions. Do not output
147
+ anything.
148
+
149
+ 5. For each question <question-N/> in the iteration cycle <N/>,
150
+ *one at a time*:
151
+
152
+ 1. Output the following <template/>:
115
153
 
116
- 1. Output the following <template/>:
154
+ <template>
155
+ <ase-tpl-bullet-signal/> ASPECT <N/>/<n/> ▶ **<context-N-focus/>** (<context-N-severity/>) ▷ **<aspect-N/>**
156
+ </template>
117
157
 
118
- <template>
119
- <ase-tpl-bullet-signal/> ASPECT <N/>/<n/>: **<aspect-N/>**, QUESTION: **<question-N/>**
120
- </template>
158
+ 2. Determine the answer alternatives:
121
159
 
122
- 2. Determine the answer alternatives:
160
+ 1. Check the <task-content/> for the answer <answer-N-1/>,
161
+ which reflects the current plan.
123
162
 
124
- 1. Check the <task-content/> for the answer <answer-N-1/>.
163
+ 2. Check the code base and your world knowledge and
164
+ use this information to find *up to three* grounded
165
+ alternative answers <answer-N-K/> (K={2,3,4}), so there
166
+ are between two and four answer options in total.
125
167
 
126
- 2. Check the code base and your world knowledge and
127
- use this information to find *up to three* grounded
128
- alternative answers <answer-N-K/> (K={2,3,4}), so there
129
- are between two and four answer options in total.
168
+ 3. For each <answer-N-K/> (K={1,2,3,4}) determine
169
+ a 1-3 word label <answer-N-K-label/>, and an
170
+ ultra brief description <answer-N-K-description/>
171
+ of at most *10 words*. Prepend `⚑ ` to the
172
+ <answer-N-K-description/> which reflects the current
173
+ plan. Do not output anything.
130
174
 
131
175
  3. In the following, you *MUST* *NOT* use your built-in
132
176
  <user-dialog-tool/> tool! Instead, you *MUST* just show a
@@ -135,30 +179,46 @@ Set <args>--int-reuse-task</args>.
135
179
 
136
180
  Let the user select the <answer-N/> out of the answer
137
181
  alternatives <answer-N-K/> by raising a question with the
138
- following custom dialog, where per alternative <answer-N-K/>
139
- you determine a brief label <answer-N-K-label/> and a
140
- description <answer-N-K-description/>, and you mark the
141
- <answer-N-1/> by prefixing its description with
142
- `⚝ **CURRENT PLAN** ⚝ `. Emit only the answer lines for the
143
- alternatives <answer-N-K/> you actually determined in the
144
- previous step (between two and four lines in total):
182
+ following custom dialog. Emit only the answer lines for
183
+ the alternatives <answer-N-K/> you actually determined in
184
+ the previous step (between two and four lines in total),
185
+ followed by the fixed `SKIP GRILLING` answer option:
145
186
 
146
187
  <expand name="custom-dialog" arg1="--other">
147
188
  <aspect-N/>: <question-N/>
148
- <answer-N-1-label/>: ⚝ **CURRENT PLAN** ⚝ - <answer-N-1-description/>
149
- <answer-N-K-label/>: <answer-N-K-description/>
189
+ <answer-N-1-label/>: <answer-N-1-description/>
190
+ <answer-N-2-label/>: <answer-N-2-description/>
150
191
  [...]
192
+ SKIP GRILLING: skip all remaining grilling and continue with the plan update
151
193
  </expand>
152
194
 
153
- Set <answer-N/> to the selected <result/>.
195
+ Check the <result/> and dispatch accordingly:
196
+
197
+ - If <result/> is `CANCEL`, only output the following
198
+ <template/> and then immediately *STOP* processing
199
+ the entire current skill, leaving the plan *untouched*:
200
+
201
+ <template>
202
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **grilling stopped**
203
+ </template>
204
+
205
+ - If <result/> is `SKIP GRILLING`, ask no further
206
+ questions, continue with item 6 below (updating the
207
+ plan with the answers gathered so far), and after
208
+ item 6 skip all remaining rounds and continue with
209
+ item 3.3 below.
210
+
211
+ - Otherwise, strip any leading `OTHER: ` prefix from
212
+ <result/> and set <answer-N/> to the remainder.
154
213
 
155
214
  4. Output the following <template/>:
156
215
 
157
216
  <template>
158
- <ase-tpl-bullet-normal/> ASPECT <N/>/<n/>: **<aspect-N/>**, ANSWER: **<answer-N/>**
217
+ <ase-tpl-bullet-normal/> ASPECT <N/>/<n/> **<context-N-focus/>** (<context-N-severity/>) ▷ **<aspect-N/>**, ANSWER: **<answer-N/>**
159
218
  </template>
160
219
 
161
- 2. Finally, update <task-content/> based on all answers <answer-N/>.
220
+ 6. Update <task-content/> based on all answers <answer-N/>
221
+ gathered in this round. Do not output anything.
162
222
 
163
223
  3. <if condition="the frontmatter of <task-content/> carries a `Created: <text/>` key">
164
224
  Set <timestamp-created><text/></timestamp-created> (set
@@ -7,6 +7,7 @@
7
7
 
8
8
  `ase-task-grill`
9
9
  [`--help`|`-h`]
10
+ [`--rounds`|`-r` *n*]
10
11
  [`--next`|`-n` *option*[,...]]
11
12
  [*id*]
12
13
 
@@ -16,20 +17,43 @@ The `ase-task-grill` skill *relentlessly interviews* the user about
16
17
  every *essential aspect* of an existing *task plan* until a *shared
17
18
  understanding* is reached and no decisions or questions are left open.
18
19
 
19
- The skill identifies the essential aspects of the plan, builds a
20
- decision tree of the open questions, and walks down each branch
21
- one-by-one. For each aspect it presents up to four *grounded*
22
- alternative answers (the current plan plus alternatives derived from
23
- the code base and world knowledge), marks the current-plan choice, and
24
- lets the user pick via an interactive dialog. It honors checks for
25
- *fuzzy language*, *conflicting terminology*, *conflicting code*, and
26
- *non-concrete scenarios*. Once all aspects are resolved, the plan is
27
- updated and persisted, its `Properties:` frontmatter key gains the value
28
- `grilled`, and the user is offered a hand-off to editing,
29
- implementation, or preflight.
20
+ The skill identifies the essential aspects of the plan and raises up to
21
+ 10 questions per round which resolve its open points. Each question
22
+ carries a `FOCUS-AREA` -- `DOMAIN` (domain-specifics, must be
23
+ clarified), `INTERFACE` (externally observable behavior or UI/API
24
+ interfaces, must be clarified), `ARCHITECTURE` (structure, wiring,
25
+ placement, or dependencies, should be clarified), or `IMPLEMENTATION`
26
+ (inner technical details, can be clarified) -- and a 1-2 word `ASPECT`
27
+ hint. The questions are sorted primarily by descending focus area
28
+ importance (`DOMAIN`, `INTERFACE`, `ARCHITECTURE`, `IMPLEMENTATION`)
29
+ and secondarily by the decision tree of their dependencies, so each
30
+ decision is asked after the decisions it depends on. It honors checks
31
+ for *fuzzy language*, *conflicting terminology*, *conflicting code*,
32
+ *non-concrete scenarios*, *unspecified architecture patterns*, and
33
+ *unspecified dependencies*.
34
+
35
+ In contrast to the batch grilling of `ase-code-edit --grill`, the
36
+ questions are asked *sequentially*, one at a time: each question is
37
+ announced as an `ASPECT n/N ▶ FOCUS ▷ ASPECT, QUESTION` line and then
38
+ raised via an interactive dialog presenting two to four *grounded*
39
+ answer alternatives labeled `A1`-`A4` (the current plan, marked with
40
+ `⚑`, plus alternatives derived from the code base and world knowledge),
41
+ the fixed `SKIP GRILLING` option (skip the remaining questions and
42
+ rounds, keeping the answers gathered so far), and free-text input.
43
+ Cancelling the dialog stops the skill and leaves the plan untouched.
44
+ Once all aspects are resolved, the plan is updated and persisted, its
45
+ `Properties:` frontmatter key gains the value `grilled`, and the user is
46
+ offered a hand-off to editing, implementation, or preflight.
30
47
 
31
48
  ## OPTIONS
32
49
 
50
+ `--rounds`|`-r` *n*:
51
+ The number of grill rounds to apply (default: `1`). Each round
52
+ starts from scratch from only the current plan, as updated by all
53
+ previous rounds, and re-derives its questions from it, forgetting
54
+ all questions and answers of previous rounds. With more than one
55
+ round, each round is announced as `GRILLING ROUND K/L`.
56
+
33
57
  `--next`|`-n` *option*[,...]:
34
58
  Automatically answer the user dialog for the next step (at the end
35
59
  of this skill). *option* is a single token or a *comma-separated
@@ -63,6 +87,12 @@ Grill the task plan under id `hello`:
63
87
  ❯ /ase-task-grill hello
64
88
  ```
65
89
 
90
+ Grill the current task plan in two rounds:
91
+
92
+ ```text
93
+ ❯ /ase-task-grill --rounds 2
94
+ ```
95
+
66
96
  Grill the current task plan and then hand off to editing:
67
97
 
68
98
  ```text
@@ -73,4 +103,4 @@ Grill the current task plan and then hand off to editing:
73
103
 
74
104
  [`ase-task-edit`](../ase-task-edit/help.md), [`ase-task-reboot`](../ase-task-reboot/help.md), [`ase-task-preflight`](../ase-task-preflight/help.md),
75
105
  [`ase-task-implement`](../ase-task-implement/help.md), [`ase-task-view`](../ase-task-view/help.md), [`ase-task-list`](../ase-task-list/help.md),
76
- [`ase-task-rename`](../ase-task-rename/help.md), [`ase-task-delete`](../ase-task-delete/help.md).
106
+ [`ase-task-rename`](../ase-task-rename/help.md), [`ase-task-delete`](../ase-task-delete/help.md), [`ase-code-edit`](../ase-code-edit/help.md).