@rse/ase 0.9.6 → 0.9.7

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.
@@ -0,0 +1,235 @@
1
+ /*
2
+ ** Agentic Software Engineering (ASE)
3
+ ** Copyright (c) 2025-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
+ */
6
+ import { z } from "zod";
7
+ /* the reusable functionality */
8
+ export class Markdown {
9
+ /* prepare Markdown for improved rendering by rewriting
10
+ unordered bullet paragraphs -- replacing the "-"/"*" bullet marker with
11
+ "◯" and splitting multi-line inline code spans into per-line single-line
12
+ spans (so each physical line carries its own closed backtick span).
13
+ Fenced code blocks (``` / ~~~) are detected line-wise and passed
14
+ through entirely verbatim, so neither the inline-span splitting nor the
15
+ bullet-marker rewriting ever touches their contents. */
16
+ static prepare(text) {
17
+ if (typeof text !== "string")
18
+ throw new Error("markdown: text must be a string");
19
+ /* segment the input line-wise into alternating non-fenced and
20
+ fenced regions: a fenced code block opens with a line whose first
21
+ non-whitespace content is a run of 3+ backticks or tildes and
22
+ closes with a matching-or-longer run of the same marker; fenced
23
+ regions are emitted verbatim while only non-fenced regions are
24
+ handed to the rewriting passes below */
25
+ const lines = text.split("\n");
26
+ let result = "";
27
+ let buf = "";
28
+ let inFence = false;
29
+ let fenceCh = "";
30
+ let fenceLen = 0;
31
+ const flush = () => {
32
+ if (buf !== "") {
33
+ result += Markdown.rewrite(buf);
34
+ buf = "";
35
+ }
36
+ };
37
+ for (let li = 0; li < lines.length; li++) {
38
+ const line = lines[li];
39
+ const nl = li < lines.length - 1 ? "\n" : "";
40
+ const m = line.match(/^(\s*)(`{3,}|~{3,})/);
41
+ if (!inFence && m) {
42
+ /* a fence-opening line: flush the pending non-fenced buffer,
43
+ enter fenced mode, and emit the opener verbatim */
44
+ flush();
45
+ inFence = true;
46
+ fenceCh = m[2][0];
47
+ fenceLen = m[2].length;
48
+ result += line + nl;
49
+ }
50
+ else if (inFence) {
51
+ /* inside a fenced block: emit verbatim and, on a matching
52
+ closing fence line, leave fenced mode */
53
+ result += line + nl;
54
+ const c = line.match(/^(\s*)(`{3,}|~{3,})\s*$/);
55
+ if (c && c[2][0] === fenceCh && c[2].length >= fenceLen)
56
+ inFence = false;
57
+ }
58
+ else
59
+ /* a regular non-fenced line: accumulate for the passes */
60
+ buf += line + nl;
61
+ }
62
+ flush();
63
+ return result;
64
+ }
65
+ /* apply the inline-span and bullet-marker rewriting passes to a chunk of
66
+ non-fenced Markdown text (see prepare() for fenced-block handling) */
67
+ static rewrite(text) {
68
+ /* PASS 1: rewrite single-backtick inline code spans that carry
69
+ backslash-escaped backticks (`\``) into CommonMark-correct spans. */
70
+ {
71
+ let pre = "";
72
+ let j = 0;
73
+ while (j < text.length) {
74
+ const ch = text[j];
75
+ if (ch !== "`") {
76
+ /* literal backslash-escaped backtick *outside* any span
77
+ is left verbatim for later scanning */
78
+ pre += ch;
79
+ j++;
80
+ continue;
81
+ }
82
+ /* scan an opening single-backtick span, capturing its raw
83
+ inner content up to the matching unescaped close backtick */
84
+ let inner = "";
85
+ let k = j + 1;
86
+ let closed = false;
87
+ let escaped = false;
88
+ while (k < text.length) {
89
+ const c = text[k];
90
+ if (c === "\\" && k + 1 < text.length && text[k + 1] === "`") {
91
+ inner += "\\`";
92
+ escaped = true;
93
+ k += 2;
94
+ continue;
95
+ }
96
+ if (c === "`") {
97
+ closed = true;
98
+ break;
99
+ }
100
+ inner += c;
101
+ k++;
102
+ }
103
+ if (!closed || !escaped) {
104
+ /* not an escaped-backtick span: emit the opening backtick
105
+ verbatim and continue scanning from just after it */
106
+ pre += "`";
107
+ j++;
108
+ continue;
109
+ }
110
+ /* un-escape inner `\`` into literal backticks, then choose a
111
+ fence longer than the longest internal backtick run */
112
+ const content = inner.replace(/\\`/g, "`");
113
+ let maxRun = 0;
114
+ let run = 0;
115
+ for (const c of content) {
116
+ if (c === "`") {
117
+ run++;
118
+ if (run > maxRun)
119
+ maxRun = run;
120
+ }
121
+ else
122
+ run = 0;
123
+ }
124
+ const fence = "`".repeat(maxRun + 1);
125
+ const pad = (content.startsWith("`") || content.endsWith("`")) ? " " : "";
126
+ pre += `${fence}${pad}${content}${pad}${fence}`;
127
+ j = k + 1;
128
+ }
129
+ text = pre;
130
+ }
131
+ /* PASS 2: split multi-line inline code spans by scanning the
132
+ entire text character-by-character while tracking whether we
133
+ are currently inside an active backtick (U+0060) span; on
134
+ every "<newline><whitespaces>" sequence encountered while
135
+ inside a span, close the span before the break and re-open
136
+ it after the indentation, so each physical line becomes its
137
+ own single-line span */
138
+ let out = "";
139
+ let fence = 0;
140
+ let i = 0;
141
+ while (i < text.length) {
142
+ const ch = text[i];
143
+ if (ch === "`") {
144
+ /* measure the full backtick run (a code-span delimiter is a
145
+ *run* of backticks; a span opened by N backticks is closed
146
+ only by a run of exactly N backticks) */
147
+ let n = 0;
148
+ while (i < text.length && text[i] === "`") {
149
+ n++;
150
+ i++;
151
+ }
152
+ if (fence === 0)
153
+ /* open a span of fence width n */
154
+ fence = n;
155
+ else if (n === fence)
156
+ /* close the active span */
157
+ fence = 0;
158
+ out += "`".repeat(n);
159
+ continue;
160
+ }
161
+ if (fence > 0 && (ch === "\r" || ch === "\n")) {
162
+ /* consume optional CR followed by mandatory LF */
163
+ let nl = "";
164
+ if (ch === "\r" && i + 1 < text.length && text[i + 1] === "\n") {
165
+ nl = "\r\n";
166
+ i += 2;
167
+ }
168
+ else if (ch === "\n") {
169
+ nl = "\n";
170
+ i++;
171
+ }
172
+ else {
173
+ /* bare CR: not a recognized newline, pass through */
174
+ out += ch;
175
+ i++;
176
+ continue;
177
+ }
178
+ /* consume the following run of SPACE/TAB whitespace */
179
+ let ws = "";
180
+ while (i < text.length && (text[i] === " " || text[i] === "\t")) {
181
+ ws += text[i];
182
+ i++;
183
+ }
184
+ /* close span before the break, re-open after indentation,
185
+ preserving the active fence width on both sides */
186
+ const bars = "`".repeat(fence);
187
+ out += `${bars}${nl}${ws}${bars}`;
188
+ continue;
189
+ }
190
+ out += ch;
191
+ i++;
192
+ }
193
+ /* PASS 3: replace the leading "-"/"*" marker of every unordered
194
+ bullet paragraph with "◯", preserving the leading indentation
195
+ and the following whitespace; operate line-by-line so only the
196
+ actual list markers (at a line start) are affected */
197
+ out = out
198
+ .split("\n")
199
+ .map((line) => line.replace(/^(\s*)[-*]([ \t]+)/, "$1◯$2"))
200
+ .join("\n");
201
+ return out;
202
+ }
203
+ }
204
+ /* MCP registration entry point */
205
+ export class MarkdownMCP {
206
+ register(mcp) {
207
+ mcp.registerTool("ase_markdown_prepare", {
208
+ title: "ASE markdown prepare",
209
+ description: "Prepare Markdown `text` for improved rendering by rewriting " +
210
+ "unordered bullet paragraphs: replace the `-`/`*` bullet markers with `◯` " +
211
+ "and split multi-line inline code spans into per-line single-line spans. " +
212
+ "Single-backtick spans containing backslash-escaped backticks are rewritten " +
213
+ "into CommonMark-correct spans with a widened backtick fence and literal inner " +
214
+ "backticks. Returns the prepared Markdown as `text`.",
215
+ inputSchema: {
216
+ text: z.string()
217
+ .describe("Markdown text to prepare for improved rendering")
218
+ }
219
+ }, async (args) => {
220
+ try {
221
+ const text = Markdown.prepare(args.text);
222
+ return {
223
+ content: [{ type: "text", text }]
224
+ };
225
+ }
226
+ catch (err) {
227
+ const message = err instanceof Error ? err.message : String(err);
228
+ return {
229
+ isError: true,
230
+ content: [{ type: "text", text: `ERROR: ${message}` }]
231
+ };
232
+ }
233
+ });
234
+ }
235
+ }
@@ -18,6 +18,7 @@ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/
18
18
  import { Config, configSchema, ConfigMCP } from "./ase-config.js";
19
19
  import { DiagramMCP } from "./ase-diagram.js";
20
20
  import { TaskMCP } from "./ase-task.js";
21
+ import { MarkdownMCP } from "./ase-markdown.js";
21
22
  import { ArtifactMCP } from "./ase-artifact.js";
22
23
  import { KVMCP } from "./ase-kv.js";
23
24
  import PersonaMCP from "./ase-persona.js";
@@ -237,6 +238,7 @@ export default class ServiceCommand {
237
238
  new ServiceMCP({ projectId: ctx.projectId, port: ctx.port, startTime }).register(mcp);
238
239
  new DiagramMCP().register(mcp);
239
240
  new TaskMCP(this.log).register(mcp);
241
+ new MarkdownMCP().register(mcp);
240
242
  new ArtifactMCP(this.log).register(mcp);
241
243
  new KVMCP().register(mcp);
242
244
  new PersonaMCP(this.log).register(mcp);
package/dst/ase-task.js CHANGED
@@ -11,6 +11,7 @@ import picomatch from "picomatch";
11
11
  import { isScalar } from "yaml";
12
12
  import { z } from "zod";
13
13
  import { Config, configSchema, parseScope } from "./ase-config.js";
14
+ import { Markdown } from "./ase-markdown.js";
14
15
  /* reusable functionality: persisted task plans under
15
16
  <project>/<basedir>/TASK-<id>.md (driven by the
16
17
  "project.artifact.task.{basedir,files}" configuration) */
@@ -420,7 +421,8 @@ export class TaskMCP {
420
421
  }
421
422
  }, async (args) => {
422
423
  try {
423
- const text = Task.load(this.log, args.id);
424
+ const raw = Task.load(this.log, args.id);
425
+ const text = Markdown.prepare(raw);
424
426
  return {
425
427
  content: [{ type: "text", text }]
426
428
  };
@@ -446,7 +448,8 @@ export class TaskMCP {
446
448
  }
447
449
  }, async (args) => {
448
450
  try {
449
- Task.save(this.log, args.id, args.text);
451
+ const text = Markdown.prepare(args.text);
452
+ Task.save(this.log, args.id, text);
450
453
  return {
451
454
  content: [{ type: "text", text: `task_save: OK: saved task "${args.id}"` }]
452
455
  };
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "homepage": "http://github.com/rse/ase",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "http://github.com/rse/ase/issues" },
9
- "version": "0.9.6",
9
+ "version": "0.9.7",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -18,8 +18,8 @@
18
18
  "devDependencies": {
19
19
  "eslint": "9.39.4",
20
20
  "@eslint/js": "9.39.4",
21
- "@typescript-eslint/parser": "8.60.1",
22
- "@typescript-eslint/eslint-plugin": "8.60.1",
21
+ "@typescript-eslint/parser": "8.61.0",
22
+ "@typescript-eslint/eslint-plugin": "8.61.0",
23
23
  "eslint-plugin-promise": "7.3.0",
24
24
  "eslint-plugin-import": "2.32.0",
25
25
  "neostandard": "0.13.0",
@@ -42,7 +42,7 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "commander": "15.0.0",
45
- "@dotenvx/dotenvx": "1.71.0",
45
+ "@dotenvx/dotenvx": "1.71.2",
46
46
  "yaml": "2.9.0",
47
47
  "valibot": "1.4.1",
48
48
  "execa": "9.6.1",
@@ -60,7 +60,7 @@
60
60
  "shell-quote": "1.8.4",
61
61
  "proper-lockfile": "4.1.2",
62
62
  "write-file-atomic": "8.0.0",
63
- "pacote": "21.5.0",
63
+ "pacote": "21.5.1",
64
64
  "ofetch": "1.5.1",
65
65
  "picomatch": "4.0.4"
66
66
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.6",
3
+ "version": "0.9.7",
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.6",
3
+ "version": "0.9.7",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -6,28 +6,28 @@ Every *task* uses a strict and fixed format:
6
6
 
7
7
  <format>
8
8
 
9
- #TASK <task-id/>: <title/>
9
+ # TASK <task-id/>: <title/>
10
10
 
11
- Created: **<timestamp-created/>**
12
- Modified: **<timestamp-modified/>**
11
+ Created: <timestamp-created/>
12
+ Modified: <timestamp-modified/>
13
13
 
14
- ##CONTEXT
14
+ ## CONTEXT
15
15
 
16
- - **WHAT**: <summary-what/>
16
+ - **WHAT**: <summary-what/>
17
17
 
18
- - **WHY**: <summary-why/>
18
+ - **WHY**: <summary-why/>
19
19
 
20
- ##CHANGES
20
+ ## CHANGES
21
21
 
22
- - [...]
22
+ - [...]
23
23
 
24
- - [...]
24
+ - [...]
25
25
 
26
- ##VERIFICATION
26
+ ## VERIFICATION
27
27
 
28
- - [...]
28
+ - [...]
29
29
 
30
- - [...]
30
+ - [...]
31
31
 
32
32
  </format>
33
33
 
@@ -61,7 +61,7 @@ You *MUST* honor the following hints on this *task* format:
61
61
  - The <title/> is a short summary of the <summary-what/>, no longer than
62
62
  50 characters.
63
63
 
64
- - The sections `※ CHANGES` and `※ VERIFICATION` all are just a short
64
+ - The sections `## CHANGES` and `## VERIFICATION` all are just a short
65
65
  list of 1-5 bullet points. Each bullet point is formatted as
66
66
  `- **<aspect/>**: <specification/>` where <aspect/> indicates
67
67
  the aspect of the section and <specification/> is 1-3 sentences
@@ -69,6 +69,6 @@ You *MUST* honor the following hints on this *task* format:
69
69
  description of the aspect.
70
70
 
71
71
  - In all sections, break all lines with a newline character
72
- after about 120 characters per line for better subsequent
72
+ after about 100 characters per line for better subsequent
73
73
  manual editing.
74
74
 
@@ -6,7 +6,7 @@
6
6
  "homepage": "http://github.com/rse/ase",
7
7
  "repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
8
8
  "bugs": { "url": "http://github.com/rse/ase/issues" },
9
- "version": "0.9.6",
9
+ "version": "0.9.7",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -19,7 +19,7 @@
19
19
  "markdownlint-cli2": "0.22.1",
20
20
  "eslint": "10.4.1",
21
21
  "@eslint/markdown": "8.0.2",
22
- "eslint-markdown": "0.10.0"
22
+ "eslint-markdown": "0.11.0"
23
23
  },
24
24
  "engines": {
25
25
  "npm": ">=10.0.0",
@@ -206,12 +206,12 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
206
206
  inlining its pros/cons derived in sub-step 2:
207
207
 
208
208
  <template>
209
- **APPROACH A<n/>**<annotation/>: *<summary/>*
210
- [...]
211
- [...]
212
- [...]
213
- *pro*: [...]
214
- *con*: [...]
209
+ **APPROACH A<n/>**<annotation/>: *<summary/>*
210
+ [...]
211
+ [...]
212
+ [...]
213
+ *PRO*: [...]
214
+ *CON*: [...]
215
215
  <optional-diagram/>
216
216
  </template>
217
217
 
@@ -278,7 +278,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
278
278
  file, aligned with its existing style and conventions.
279
279
 
280
280
  <if condition="<getopt-option-dry/> is equal `true`">
281
- You *MUST* completely omit the `##VERIFICATION` section
281
+ You *MUST* completely omit the `## VERIFICATION` section
282
282
  (including its heading and all of its bullet points) from
283
283
  <content/>.
284
284
  </if>
@@ -34,7 +34,7 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
34
34
  asking the user via the interactive dialog.
35
35
 
36
36
  `--dry`|`-d`:
37
- Compose the plan *without* the `※ VERIFICATION` section. When
37
+ Compose the plan *without* the `## VERIFICATION` section. When
38
38
  `ase-task-implement` later applies such a plan, it strictly skips
39
39
  the entire verification phase (no build, tests, linter,
40
40
  type-checker, or program execution) once the source files have
@@ -43,7 +43,7 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
43
43
  `--quick`|`-Q`:
44
44
  Shorthand alias for `-a -d -n IMPLEMENT,DELETE`: automatically pick
45
45
  the recommended feature approach, compose the plan *without* the
46
- `※ VERIFICATION` section, immediately hand off to `ase-task-implement`,
46
+ `## VERIFICATION` section, immediately hand off to `ase-task-implement`,
47
47
  and finally `ase-task-delete` the now-consumed plan. This gives a
48
48
  single, fast *one-shot* crafting mode.
49
49
 
@@ -196,12 +196,12 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
196
196
  anything else in this step:
197
197
 
198
198
  <template>
199
- **APPROACH A<n/>**<annotation/>: *<summary/>*
200
- [...]
201
- [...]
202
- [...]
203
- *pro*: [...]
204
- *con*: [...]
199
+ **APPROACH A<n/>**<annotation/>: *<summary/>*
200
+ [...]
201
+ [...]
202
+ [...]
203
+ **PRO*: [...]
204
+ **CON*: [...]
205
205
  <optional-diagram/>
206
206
  </template>
207
207
 
@@ -269,7 +269,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
269
269
  file, aligned with its existing style and conventions.
270
270
 
271
271
  <if condition="<getopt-option-dry/> is equal `true`">
272
- You *MUST* completely omit the `##VERIFICATION` section
272
+ You *MUST* completely omit the `## VERIFICATION` section
273
273
  (including its heading and all of its bullet points) from
274
274
  <content/>.
275
275
  </if>
@@ -34,7 +34,7 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
34
34
  asking the user via the interactive dialog.
35
35
 
36
36
  `--dry`|`-d`:
37
- Compose the plan *without* the `※ VERIFICATION` section. When
37
+ Compose the plan *without* the `## VERIFICATION` section. When
38
38
  `ase-task-implement` later applies such a plan, it strictly skips
39
39
  the entire verification phase (no build, tests, linter,
40
40
  type-checker, or program execution) once the source files have
@@ -43,7 +43,7 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
43
43
  `--quick`|`-Q`:
44
44
  Shorthand alias for `-a -d -n IMPLEMENT,DELETE`: automatically pick
45
45
  the recommended refactoring approach, compose the plan *without* the
46
- `※ VERIFICATION` section, immediately hand off to `ase-task-implement`,
46
+ `## VERIFICATION` section, immediately hand off to `ase-task-implement`,
47
47
  and finally `ase-task-delete` the now-consumed plan. This gives a
48
48
  single, fast *one-shot* refactoring mode.
49
49
 
@@ -245,12 +245,12 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
245
245
  anything else in this step:
246
246
 
247
247
  <template>
248
- **APPROACH A<n/>**<annotation/>: *<summary/>*
249
- [...]
250
- [...]
251
- [...]
252
- *pro*: [...]
253
- *con*: [...]
248
+ **APPROACH A<n/>**<annotation/>: *<summary/>*
249
+ [...]
250
+ [...]
251
+ [...]
252
+ *PRO*: [...]
253
+ *CON*: [...]
254
254
  <optional-diagram/>
255
255
  </template>
256
256
 
@@ -317,7 +317,7 @@ permitted way to persist artifacts is via `ase_task_save(...)`.
317
317
  file, aligned with its existing style and conventions.
318
318
 
319
319
  <if condition="<getopt-option-dry/> is equal `true`">
320
- You *MUST* completely omit the `##VERIFICATION` section
320
+ You *MUST* completely omit the `## VERIFICATION` section
321
321
  (including its heading and all of its bullet points) from
322
322
  <content/>.
323
323
  </if>
@@ -39,7 +39,7 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
39
39
  asking the user via the interactive dialog.
40
40
 
41
41
  `--dry`|`-d`:
42
- Compose the plan *without* the `※ VERIFICATION` section. When
42
+ Compose the plan *without* the `## VERIFICATION` section. When
43
43
  `ase-task-implement` later applies such a plan, it strictly skips
44
44
  the entire verification phase (no build, tests, linter,
45
45
  type-checker, or program execution) once the source files have
@@ -48,7 +48,7 @@ plan via `ase_task_save` and then hands off to `ase-task-edit`,
48
48
  `--quick`|`-Q`:
49
49
  Shorthand alias for `-a -d -n IMPLEMENT,DELETE`: automatically pick
50
50
  the recommended resolution approach, compose the plan *without* the
51
- `※ VERIFICATION` section, immediately hand off to `ase-task-implement`,
51
+ `## VERIFICATION` section, immediately hand off to `ase-task-implement`,
52
52
  and finally `ase-task-delete` the now-consumed plan. This gives a
53
53
  single, fast *one-shot* resolution mode.
54
54
 
@@ -73,7 +73,7 @@ that `CHANGELOG.md` file, aligned with its existing style
73
73
  and conventions.
74
74
 
75
75
  <if condition="<getopt-option-dry/> is equal `true`">
76
- You *MUST* completely omit the `##VERIFICATION` section
76
+ You *MUST* completely omit the `## VERIFICATION` section
77
77
  (including its heading and all of its bullet points) from
78
78
  <content/>.
79
79
  </if>
@@ -318,11 +318,12 @@ Set <content-dirty>true</content-dirty>.
318
318
  </template>
319
319
  </if>
320
320
 
321
- 3. *Render plan*: Only output the following <template/>, so the user
321
+ 3. *Render plan*: Treat <content/> as *verbatim* Markdown.
322
+ Only output the following <template/>, so the user
322
323
  can read the plan and react to it. If <content/> is longer
323
- than 90 lines and a `※ IMPLEMENTATION DRAFT` section (from the
324
+ than 90 lines and a `## IMPLEMENTATION DRAFT` section (from the
324
325
  companion skill `ase-task-preflight`) exists, replace the entire
325
- content of the `※ IMPLEMENTATION DRAFT` section with `[...]`.
326
+ content of the `## IMPLEMENTATION DRAFT` section with `[...]`.
326
327
  Else, do *not* truncate, summarize, or partially show the plan.
327
328
  Use the following <template/>:
328
329
 
@@ -30,7 +30,7 @@ hand-off to implementation or preflight.
30
30
  ignoring *instruction* and stopping skill processing).
31
31
 
32
32
  `--dry`|`-d`:
33
- Generate any *new* plan *without* the `※ VERIFICATION` section.
33
+ Generate any *new* plan *without* the `## VERIFICATION` section.
34
34
  Applies only to freshly generated plans, not to existing plans
35
35
  loaded from disk. When `ase-task-implement` later applies such
36
36
  a plan, it strictly skips the entire verification phase (no
@@ -107,6 +107,11 @@ Procedure
107
107
  *essential aspect* of the task plan in <plan/> *until* reaching a
108
108
  shared understanding and no decisions/questions are left open.
109
109
 
110
+ This especially means, you *MUST* clarify as much aspects as
111
+ necessary to ensure that for at least the most important decisions,
112
+ during a subsequent implementation, no essential freedom of choices
113
+ exist any longer.
114
+
110
115
  For this process, determine the <n/> essential aspects <aspect-N/>
111
116
  (a one or two word long short identifier like `Foo` or `Bar-Baz`)
112
117
  and the corresponding decision/question <question-N/> where a shared
@@ -224,7 +229,8 @@ Procedure
224
229
  2. Check the tool <result/> and dispatch accordingly:
225
230
 
226
231
  - If <result/> is `DONE` or `CANCEL`:
227
- Only output the following <template/> and then *STOP*.
232
+ Only output the following <template/> and then *STOP*,
233
+ without output of any further information.
228
234
 
229
235
  <template>
230
236
  ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **plan updated -- done**
@@ -131,8 +131,8 @@ explicitly requested by this procedure via outputs based on a <template/>!
131
131
  overrules the implementation draft in the `IMPLEMENTATION DRAFT`
132
132
  section of <content/>.
133
133
 
134
- <if condition="<content/> does NOT contain a `##VERIFICATION` section heading">
135
- The task plan deliberately *omits* the `##VERIFICATION`
134
+ <if condition="<content/> does NOT contain a `## VERIFICATION` section heading">
135
+ The task plan deliberately *omits* the `## VERIFICATION`
136
136
  section. You *MUST* therefore *strictly skip* the entire
137
137
  verification phase after modifying the source files: do *NOT*
138
138
  run any build, do *NOT* run any tests, do *NOT* run any linter,
@@ -18,7 +18,7 @@ a task plan by modifying the corresponding *artifacts* with a complete
18
18
  section produced by `ase-task-preflight` is used as a hint - the plain
19
19
  plan content always overrules the draft.
20
20
 
21
- If the task plan deliberately *omits* the `※ VERIFICATION` section
21
+ If the task plan deliberately *omits* the `## VERIFICATION` section
22
22
  (as produced by `ase-code-craft`, `ase-code-refactor`,
23
23
  `ase-code-resolve`, or `ase-task-edit` when invoked with `--dry`),
24
24
  the entire verification phase is strictly skipped: no build, tests,
@@ -126,13 +126,13 @@ explicitly requested by this procedure via outputs based on a <template/>!
126
126
 
127
127
  2. Append this artifact change set <unified-diff/> to the end
128
128
  of the <content/> with the following <template/>. If a section
129
- named `##IMPLEMENTATION DRAFT` already exists from a
129
+ named `## IMPLEMENTATION DRAFT` already exists from a
130
130
  previous run of this skill, *replace* this entire existing
131
131
  section.
132
132
 
133
133
  <template>
134
134
 
135
- ##IMPLEMENTATION DRAFT
135
+ ## IMPLEMENTATION DRAFT
136
136
 
137
137
  ```text
138
138
  <unified-diff/>