@rse/ase 0.9.60 → 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.60",
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.60",
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.60",
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.60",
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.60",
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
  ---------
@@ -50,12 +51,13 @@ which shows the established <todo-what/> and <todo-how/>, where a still
50
51
  empty <todo-what/> or <todo-how/> renders as `(none)`:
51
52
 
52
53
  <template>
53
- <ase-tpl-boxed title="EDIT TODO" subtitle="<arg1/>">
54
+ <ase-tpl-head title="EDIT TODO" subtitle="<arg1/>"/>
54
55
 
55
56
  **WHAT**: <todo-what/>
57
+
56
58
  **HOW**: <todo-how/>
57
59
 
58
- </ase-tpl-boxed>
60
+ <ase-tpl-foot title="EDIT TODO" subtitle="<arg1/>"/>
59
61
  </template>
60
62
 
61
63
  </define>
@@ -113,7 +115,32 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
113
115
 
114
116
  </if>
115
117
 
116
- 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
117
144
  domain-specific, non-implementation-detail information -- and
118
145
  <todo-how/> -- the remaining information -- discarding all
119
146
  <todo-what/>/<todo-how/> content of any previous iteration.
@@ -121,11 +148,11 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
121
148
  and during later implementation just interpret the query best-effort.
122
149
  Do not output anything.
123
150
 
124
- 3. Expand the following:
151
+ 4. Expand the following:
125
152
 
126
153
  <expand name="todo-box" arg1="current state (after querying)"></expand>
127
154
 
128
- 4. Set <query></query> (clear the query, so every further `--loop`
155
+ 5. Set <query></query> (clear the query, so every further `--loop`
129
156
  iteration asks for a fresh one). Do not output anything.
130
157
 
131
158
  4. **State: discovering:**
@@ -143,85 +170,16 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
143
170
 
144
171
  1. Understand what "grilling" is about:
145
172
 
146
- - GOAL:
147
-
148
- Interactively interviewing the user *relentlessly* about every
149
- *essential aspect* of the edit query in <todo-what/> and
150
- <todo-how/> *until* reaching a shared understanding and no
151
- major decisions/questions are left open.
152
-
153
- This especially means that you *MUST* clarify as many aspects as
154
- necessary to ensure that for at least the most important decisions,
155
- during a subsequent implementation, no essential freedom of choice
156
- exists any longer.
157
-
158
- - FOCUS:
159
-
160
- Focusing on the following outside-in *Focus Areas*, in order of
161
- descending importance for the grilling operation:
162
-
163
- 1. *DOMAIN*: Aspects affecting domain-specifics. These
164
- aspects *MUST* be clarified, as they are about
165
- the "what" of the solution and they
166
- non-technically shape the solution noticeably.
167
-
168
- 2. *INTERFACE*: Aspects affecting externally observable
169
- behavior or interfaces, especially aspects about user (UI)
170
- and machine (API) interfaces. These aspects *MUST* be
171
- clarified, as they are externally visible and
172
- shape the boundary of the solution.
173
-
174
- 3. *ARCHITECTURE*: Aspects affecting software and system
175
- architecture, especially decisions on structure, wiring,
176
- placement, or dependencies. These aspects *SHOULD*
177
- be clarified, as they technically shape the solution noticeably.
178
-
179
- 4. *IMPLEMENTATION*: Aspects affecting any other
180
- implementation details, especially how the edit query
181
- is realized in the code base. These aspects *CAN* be
182
- clarified, as they shape technical inner details only.
183
-
184
- - INDICATORS:
185
-
186
- Check the following indicators for identifying problematic
187
- aspects:
188
-
189
- - *Fuzzy Language*:
190
- When the user uses vague or overloaded terms instead of
191
- a precise or canonical term.
192
-
193
- - *Conflicting Terminology*:
194
- When the user uses a term that conflicts with the
195
- existing terminology in the code base.
196
-
197
- - *Conflicting Code*:
198
- When the user states how something works, check whether the
199
- current code state really agrees.
200
-
201
- - *Non-Concrete Scenarios*:
202
- When domain relationships are being discussed,
203
- stress-test them with specific scenarios. Theoretically
204
- invent realistic scenarios that probe edge cases and
205
- force the user to be precise about the boundaries
206
- between concepts.
207
-
208
- - *Unspecified Architecture Patterns*:
209
- When the realization of the functionality is known to
210
- be reasonably realizable with more than one decent
211
- architecture pattern, but no such pattern was
212
- mentioned.
213
-
214
- - *Unspecified Dependencies*:
215
- When the realization of functionality usually is known
216
- to be supported by the use of frameworks or libraries,
217
- but no dependencies on such solutions were mentioned.
173
+ <expand name="grill-understanding" arg1="the edit query in <todo-what/> and <todo-how/>"></expand>
218
174
 
219
175
  2. Perform <getopt-option-grill-rounds/> grilling *rounds*,
220
176
  numbered <m/> (1-<getopt-option-grill-rounds/>).
221
177
 
222
178
  For each round:
223
179
 
224
- 1. Explicitly start *from scratch* from *only* the current
180
+ 1. INITIALIZE TODO:
181
+
182
+ Explicitly start *from scratch* from *only* the current
225
183
  <todo-what/> and <todo-how/> and *forget* all information
226
184
  gathered in previous rounds. Set <round-id/> to
227
185
  `GRILLING ROUND <m/>/<getopt-option-grill-rounds/>` if
@@ -229,46 +187,81 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
229
187
  `GRILLING` otherwise (a single round needs no round
230
188
  numbering). Do not output anything.
231
189
 
232
- 2. Determine the questions <question-N/>, chosen to
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
233
195
  resolve the open points related to the above understanding
234
196
  of grilling, by focusing on the mentioned *Focus Areas*.
235
197
 
236
- For each <question-N/> determine its <focus-area-N/> and a
237
- <topic-N/>, a 1-2 word hint describing what the question is
238
- about. Render <focus-area-N/> in the tables below as
239
- `**DOMAIN** (MUST)`, `**INTERFACE** (MUST)`,
240
- `**ARCHITECTURE** (SHOULD)`, or `**IMPLEMENTATION** (MAY)`
241
- correspondingly.
242
-
243
- Use the format `Shall...?` for questions of
244
- focus area *DOMAIN* and *INTERFACE*, the format `Should...?`
245
- for questions of focus area *ARCHITECTURE*, and the format
246
- `May...?` for questions of focus area *IMPLEMENTATION*.
247
-
248
- In every <question-N/>, encode all *literal aspects* -- file
249
- and directory paths, identifiers, symbols, types, commands,
250
- options, configuration keys, and literal values -- with
251
- backticks.
252
-
253
- 3. Finally, *sort* the questions by descending
254
- focus area order -- first all `DOMAIN`, then all
255
- `INTERFACE`, then all `ARCHITECTURE`, and then all
256
- `IMPLEMENTATION` ones -- and renumber <N/> according to this
257
- order. Truncate the list after a maximum of 10 questions and
258
- set <n/> to the number of remaining questions. Do not output
259
- anything.
260
-
261
- 4. For all remaining <question-N/>, check the code base
262
- and your world knowledge to find *two to four*
263
- grounded answer alternatives <answer-N-K/> with a
264
- brief label <answer-N-K-label/> and a description
265
- <answer-N-K-description/> which reflects the current
266
- <todo-what/>/<todo-how/> understanding by prefixing its
267
- description with `✻ **CURRENT** ✻`. Assemble a <answer-N/>
268
- out of `**<answer-N-1-label/>**: <answer-N-1-description/> ─◇─
269
- **<answer-N-2-label/>**: <answer-N-2-description/> ─◇─ [...]`.
270
-
271
- 5. In the following, you *MUST* *NOT* use your built-in
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/>[, ...]`.
255
+
256
+ Keep every assembled <answer-N/> at most *240 characters*
257
+ long -- drop the least relevant alternative and compact the
258
+ descriptions until it fits -- as a longer answer overflows
259
+ its table cell and silently degrades the entire table into a
260
+ plain text rendering.
261
+
262
+ 6. INTERACTIVE DIALOG:
263
+
264
+ In the following, you *MUST* *NOT* use your built-in
272
265
  <user-dialog-tool/> tool! Instead, you *MUST* just show a
273
266
  custom dialog according to the expanded `custom-dialog`
274
267
  definition. You *MUST* closely follow this definition. The
@@ -276,8 +269,8 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
276
269
  `SKIP GRILLING` and `STOP SKILL`, dispatched as follows:
277
270
 
278
271
  - If a <result/> is `SKIP GRILLING` or `CANCEL`, ask no
279
- further questions, continue with item 6 below (merging
280
- 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
281
274
  remaining rounds and continue with the *implementing*
282
275
  state.
283
276
 
@@ -292,18 +285,26 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
292
285
  1. Output only the following <template/> -- it lists *all*
293
286
  questions of the round up-front, one table row per
294
287
  aspect, so the subsequent dialog only has to ask for the
295
- combined answer. Align all column edges of the table. If
296
- <getopt-option-grill-rounds/> is equal `1`, *omit* the
297
- leading `<round-id/>` line:
288
+ combined answer. Align all column edges of the table.
289
+
290
+ In every table cell you *MUST* escape each literal pipe
291
+ character outside a code span as `\|` and you *MUST*
292
+ open *and* close every backtick code span within the
293
+ *same* cell -- an unescaped pipe or an unbalanced
294
+ backtick run splits the cell and silently degrades the
295
+ entire table into a plain text rendering:
298
296
 
299
297
  <template>
300
- ⧉ **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
+ | [...] | [...] |
301
305
 
302
- | ASPECT | FOCUS AREA | TOPIC | **QUESTION** ┈─▶ **ANSWERS** |
303
- | -------- | --------------- | ----------- | --------------------------------- |
304
- | 1/<n/> | <focus-area-1/> | <topic-1/> | **<question-1/>** ┈─▶ <answer-1/> |
305
- | 2/<n/> | <focus-area-2/> | <topic-2/> | **<question-2/>** ┈─▶ <answer-2/> |
306
- | [...] | [...] | [...] | [...] |
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
307
308
  </template>
308
309
 
309
310
  2. Show a custom dialog. Its only answer options are the
@@ -311,7 +312,7 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
311
312
  *one* free-text reply:
312
313
 
313
314
  <expand name="custom-dialog" arg1="--other">
314
- <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)
315
316
  SKIP GRILLING: skip all remaining grilling and continue with the implementation
316
317
  STOP SKILL: stop the entire skill immediately
317
318
  </expand>
@@ -322,11 +323,15 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
322
323
  combined free-text answers to all questions of the
323
324
  round.
324
325
 
325
- 6. Merge all gathered answers of the round -- the combined
326
- 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
327
330
  <todo-how/>. Do not output anything.
328
331
 
329
- 7. Set <round-suffix/> to
332
+ 8. SHOW CURRENT TODO:
333
+
334
+ Set <round-suffix/> to
330
335
  ` round <m/>/<getopt-option-grill-rounds/>` if
331
336
  <getopt-option-grill-rounds/> is greater than 1, or to
332
337
  empty otherwise, and expand the following -- this
@@ -343,6 +348,10 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
343
348
  `resolve`: Set <task-kind/> to `CRAFTING`, `REFACTORING`,
344
349
  or `RESOLVING` correspondingly.
345
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
+
346
355
  - Else (`auto`): *Infer* the <task-kind/> from <todo-what/> and
347
356
  <todo-how/>: set to `RESOLVING` if the edit predominantly
348
357
  fixes a defect, set to `REFACTORING` if it predominantly
@@ -427,7 +436,15 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
427
436
  user keeps full control over the final commit.
428
437
  </if>
429
438
 
430
- 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
431
448
  change summary, a list of modified artifacts, a rationale, or a
432
449
  unified diff of the changes -- *independent* of
433
450
  <ase-project-boxing/>, whose exposure rules are explicitly
@@ -447,7 +464,7 @@ empty <todo-what/> or <todo-how/> renders as `(none)`:
447
464
  1. Verify whether the implementation fulfills <todo-what/> and
448
465
  <todo-how/> by running available verification commands
449
466
  (build, tests, linter, type-checker)
450
- <if condition=" <worktree-dir/> is not empty">
467
+ <if condition="<worktree-dir/> is not empty">
451
468
  , each with <worktree-dir/> as its working directory
452
469
  </if>.
453
470
 
@@ -55,7 +55,7 @@ implementation until it passes). The *querying* state and every
55
55
  All questions of a round are announced together below a
56
56
  `GRILLING ROUND K/L` line (the announcement line and round numbering
57
57
  are omitted when only a single round is performed) as an
58
- `ASPECT`/`FOCUS AREA`/`TOPIC`/`QUESTION` table with one row per
58
+ `#`/`FOCUS TOPIC`/`QUESTION` table with one row per
59
59
  question, each row carrying two to four grounded answer alternatives
60
60
  (with the alternative reflecting the current understanding marked as
61
61
  `CURRENT`). They are then asked in *one* batch via a single
@@ -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).