@rse/ase 0.9.44 → 0.9.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dst/ase-setup.js +50 -0
  2. package/package.json +3 -3
  3. package/plugin/.claude-plugin/plugin.json +1 -1
  4. package/plugin/.codex-plugin/plugin.json +1 -1
  5. package/plugin/.github/plugin/plugin.json +1 -1
  6. package/plugin/agents/ase-code-lint.md +11 -0
  7. package/plugin/agents/ase-docs-proofread.md +8 -0
  8. package/plugin/agents/ase-meta-chat.md +13 -7
  9. package/plugin/agents/ase-meta-search.md +0 -1
  10. package/plugin/etc/stx.conf +6 -1
  11. package/plugin/meta/ase-common-task.md +145 -0
  12. package/plugin/meta/ase-constitution.md +4 -1
  13. package/plugin/meta/ase-dialog.md +7 -7
  14. package/plugin/meta/ase-format-arch.md +4 -4
  15. package/plugin/meta/ase-format-spec.md +23 -23
  16. package/plugin/meta/ase-format-task.md +1 -1
  17. package/plugin/meta/ase-persona.md +3 -3
  18. package/plugin/meta/ase-skill.md +2 -2
  19. package/plugin/meta/ase-tenets.md +4 -4
  20. package/plugin/package.json +1 -1
  21. package/plugin/skills/ase-arch-analyze/SKILL.md +2 -3
  22. package/plugin/skills/ase-code-craft/SKILL.md +23 -9
  23. package/plugin/skills/ase-code-craft/help.md +5 -4
  24. package/plugin/skills/ase-code-lint/SKILL.md +19 -3
  25. package/plugin/skills/ase-code-refactor/SKILL.md +23 -9
  26. package/plugin/skills/ase-code-refactor/help.md +5 -4
  27. package/plugin/skills/ase-code-resolve/SKILL.md +22 -8
  28. package/plugin/skills/ase-code-resolve/help.md +6 -5
  29. package/plugin/skills/ase-docs-distill/SKILL.md +6 -6
  30. package/plugin/skills/ase-docs-proofread/SKILL.md +18 -3
  31. package/plugin/skills/ase-meta-changelog/SKILL.md +5 -2
  32. package/plugin/skills/ase-meta-commit/SKILL.md +4 -4
  33. package/plugin/skills/ase-meta-compat/SKILL.md +3 -3
  34. package/plugin/skills/ase-meta-diaboli/SKILL.md +2 -2
  35. package/plugin/skills/ase-meta-eli5/SKILL.md +116 -0
  36. package/plugin/skills/ase-meta-eli5/help.md +61 -0
  37. package/plugin/skills/ase-meta-evaluate/SKILL.md +6 -9
  38. package/plugin/skills/ase-meta-intent/SKILL.md +157 -0
  39. package/plugin/skills/ase-meta-intent/help.md +56 -0
  40. package/plugin/skills/ase-meta-proximity/SKILL.md +224 -0
  41. package/plugin/skills/ase-meta-proximity/help.md +78 -0
  42. package/plugin/skills/ase-meta-quorum/SKILL.md +33 -4
  43. package/plugin/skills/ase-meta-search/SKILL.md +1 -1
  44. package/plugin/skills/ase-meta-steelman/SKILL.md +3 -3
  45. package/plugin/skills/ase-meta-why/SKILL.md +1 -1
  46. package/plugin/skills/ase-sync-export/SKILL.md +7 -7
  47. package/plugin/skills/ase-sync-import/SKILL.md +20 -16
  48. package/plugin/skills/ase-sync-reconcile/SKILL.md +9 -9
  49. package/plugin/skills/ase-task-condense/SKILL.md +34 -79
  50. package/plugin/skills/ase-task-edit/SKILL.md +41 -49
  51. package/plugin/skills/ase-task-grill/SKILL.md +10 -12
  52. package/plugin/skills/ase-task-id/SKILL.md +7 -3
  53. package/plugin/skills/ase-task-implement/SKILL.md +18 -111
  54. package/plugin/skills/ase-task-list/SKILL.md +3 -0
  55. package/plugin/skills/ase-task-preflight/SKILL.md +22 -115
  56. package/plugin/skills/ase-task-reboot/SKILL.md +27 -63
  57. package/plugin/skills/ase-task-view/SKILL.md +7 -7
package/dst/ase-setup.js CHANGED
@@ -453,6 +453,29 @@ export default class SetupCommand {
453
453
  await this.mcpRemove(tool, spec.server, scope);
454
454
  };
455
455
  }
456
+ /* build a chat-model MCP handler which bridges to a locally
457
+ installed AI agent harness CLI via the mcp-to-harness stdio
458
+ scaffold; the API key environment variable carries no key at all,
459
+ but instead the harness model identifier, with the special value
460
+ "default" selecting the default model of the harness */
461
+ harnessMcpHandler(harness) {
462
+ return async (spec, tool, scope, action, _envKey, envVal) => {
463
+ if (action === "activate")
464
+ await this.mcpAdd(tool, spec.server, {}, {
465
+ type: "stdio", command: [
466
+ "npx", "-y", "mcp-to-harness",
467
+ "--service", spec.name,
468
+ "--mcp-tool", "query",
469
+ "--harness", harness,
470
+ ...(envVal !== "default" ? [
471
+ "--harness-model", envVal
472
+ ] : [])
473
+ ]
474
+ }, scope);
475
+ else
476
+ await this.mcpRemove(tool, spec.server, scope);
477
+ };
478
+ }
456
479
  /* registry of pre-defined MCP servers: maps each server id onto its
457
480
  dedicated handler which performs the activate/deactivate operation */
458
481
  mcpServers = [
@@ -510,6 +533,33 @@ export default class SetupCommand {
510
533
  skills: ["ase-meta-chat", "ase-meta-quorum"],
511
534
  handler: this.chatMcpHandler({ url: "https://api.z.ai/api/paas/v4/", api: "completion", model: "glm-5.1" }, { model: "z-ai/glm-5.1" })
512
535
  },
536
+ {
537
+ id: "anthropic-claude",
538
+ name: "Anthropic Claude",
539
+ version: "latest",
540
+ env: ["ANTHROPIC_CLAUDE"],
541
+ server: "chat-anthropic-claude",
542
+ skills: ["ase-meta-chat", "ase-meta-quorum"],
543
+ handler: this.harnessMcpHandler("claude")
544
+ },
545
+ {
546
+ id: "openai-codex",
547
+ name: "OpenAI Codex",
548
+ version: "latest",
549
+ env: ["OPENAI_CODEX"],
550
+ server: "chat-openai-codex",
551
+ skills: ["ase-meta-chat", "ase-meta-quorum"],
552
+ handler: this.harnessMcpHandler("codex")
553
+ },
554
+ {
555
+ id: "github-copilot",
556
+ name: "GitHub Copilot",
557
+ version: "latest",
558
+ env: ["GITHUB_COPILOT"],
559
+ server: "chat-github-copilot",
560
+ skills: ["ase-meta-chat", "ase-meta-quorum"],
561
+ handler: this.harnessMcpHandler("copilot")
562
+ },
513
563
  {
514
564
  id: "brave",
515
565
  name: "Brave",
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.44",
9
+ "version": "0.9.46",
10
10
  "license": "Apache-2.0",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -42,12 +42,12 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "commander": "15.0.0",
45
- "@dotenvx/dotenvx": "2.15.1",
45
+ "@dotenvx/dotenvx": "2.17.2",
46
46
  "yaml": "2.9.0",
47
47
  "valibot": "1.4.2",
48
48
  "execa": "10.0.0",
49
49
  "mkdirp": "3.0.1",
50
- "@hapi/hapi": "21.4.9",
50
+ "@hapi/hapi": "21.4.10",
51
51
  "beautiful-mermaid": "1.1.3",
52
52
  "cli-table3": "0.6.5",
53
53
  "chalk": "5.6.2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ase",
3
- "version": "0.9.44",
3
+ "version": "0.9.46",
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.44",
3
+ "version": "0.9.46",
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.44",
3
+ "version": "0.9.46",
4
4
  "description": "Agentic Software Engineering (ASE)",
5
5
  "keywords": [ "agentic", "software", "engineering" ],
6
6
  "homepage": "https://ase.tools",
@@ -303,6 +303,17 @@ Workflow
303
303
  which should be changed. Set <new-text/> to the lines of the
304
304
  new code in <file/> which will replace it.
305
305
 
306
+ Keep the hunk *minimal*: <old-text/> and <new-text/>
307
+ *MUST* *NOT* share any common leading or trailing
308
+ lines - *strip* such lines, as they are *unchanged*
309
+ context and not part of the change. When two changed
310
+ regions are separated by unchanged lines, emit *two
311
+ separate* change hunks instead of one large hunk which
312
+ re-states the unchanged lines. Render a *moved* block
313
+ as one pure-deletion hunk at its old location plus one
314
+ pure-insertion hunk at its new location - *never* by
315
+ deleting and re-adding the unchanged lines in between.
316
+
306
317
  3. Set <context-before/> to exactly *up to two* lines of
307
318
  *unchanged* code context which occurs in <file/>
308
319
  directly *before* <old-text/>, i.e., the lines (<line/>
@@ -42,6 +42,14 @@ Workflow
42
42
  should be changed. Set <new-text/> to the lines of the
43
43
  new text which will replace it.
44
44
 
45
+ Keep the change *minimal*: <old-text/> and <new-text/>
46
+ *MUST* *NOT* share any common leading or trailing
47
+ lines - *strip* such lines, as they are *unchanged*
48
+ context and not part of the change. When two changed
49
+ regions are separated by unchanged lines, report them
50
+ as *two separate* problems instead of one large change
51
+ which re-states the unchanged lines.
52
+
45
53
  4. Set <description/> to an ultra-brief and concise
46
54
  Markdown-formatted description of the problem with
47
55
  a hint of what is wrong and why it is wrong. In
@@ -9,6 +9,9 @@ tools:
9
9
  - "mcp__chat-xai-grok__query"
10
10
  - "mcp__chat-zai-glm__query"
11
11
  - "mcp__chat-alibaba-qwen__query"
12
+ - "mcp__chat-anthropic-claude__query"
13
+ - "mcp__chat-openai-codex__query"
14
+ - "mcp__chat-github-copilot__query"
12
15
  ---
13
16
 
14
17
  @../meta/ase-control.md
@@ -20,19 +23,22 @@ tools:
20
23
 
21
24
  2. Set <server></server> (set to empty).
22
25
 
23
- <if condition="<llm/> is equal 'chatgpt'"> <server>chat-openai-chatgpt</server></if>
24
- <if condition="<llm/> is equal 'gemini'"> <server>chat-google-gemini</server> </if>
25
- <if condition="<llm/> is equal 'deepseek'"><server>chat-deepseek</server> </if>
26
- <if condition="<llm/> is equal 'grok'"> <server>chat-xai-grok</server> </if>
27
- <if condition="<llm/> is equal 'glm'"> <server>chat-zai-glm</server> </if>
28
- <if condition="<llm/> is equal 'qwen'"> <server>chat-alibaba-qwen</server> </if>
26
+ <if condition="<llm/> is equal 'chatgpt'"> <server>chat-openai-chatgpt</server> </if>
27
+ <if condition="<llm/> is equal 'gemini'"> <server>chat-google-gemini</server> </if>
28
+ <if condition="<llm/> is equal 'deepseek'"><server>chat-deepseek</server> </if>
29
+ <if condition="<llm/> is equal 'grok'"> <server>chat-xai-grok</server> </if>
30
+ <if condition="<llm/> is equal 'glm'"> <server>chat-zai-glm</server> </if>
31
+ <if condition="<llm/> is equal 'qwen'"> <server>chat-alibaba-qwen</server> </if>
32
+ <if condition="<llm/> is equal 'claude'"> <server>chat-anthropic-claude</server></if>
33
+ <if condition="<llm/> is equal 'codex'"> <server>chat-openai-codex</server> </if>
34
+ <if condition="<llm/> is equal 'copilot'"> <server>chat-github-copilot</server> </if>
29
35
 
30
36
  <if condition="<server/> is empty">
31
37
  You *MUST* output the following <template/> and immediately *STOP* processing
32
38
  (do *NOT* continue with any further step and do *NOT* call any MCP tool):
33
39
 
34
40
  <template>
35
- ERROR: unknown LLM `<llm/>` (has to be one of: chatgpt, gemini, deepseek, grok, glm, qwen)
41
+ ERROR: unknown LLM `<llm/>` (has to be one of: chatgpt, gemini, deepseek, grok, glm, qwen, claude, codex, copilot)
36
42
  </template>
37
43
  </if>
38
44
 
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: ase-meta-search
3
3
  description: "Query the Web"
4
- model: sonnet
5
4
  effort: low
6
5
  tools:
7
6
  - "mcp__search-perplexity__perplexity_search"
@@ -11,7 +11,12 @@ lint
11
11
 
12
12
  # [plugin] build project
13
13
  build : lint
14
- true
14
+ ( for name in $(cd skills; ls -1 | grep -v ase-meta-intent | sort); do
15
+ echo "<skill name=\"$name\">"
16
+ cat skills/$name/help.md | sed -e '/^## SEE ALSO/,$d'
17
+ echo "</skill>"
18
+ done
19
+ ) >skills/ase-meta-intent/data.md
15
20
 
16
21
  # [plugin] remove all generated files
17
22
  clean
@@ -0,0 +1,145 @@
1
+
2
+ Task Skill Common Steps
3
+ =======================
4
+
5
+ <define name="task-react-id">
6
+
7
+ 1. <if condition="
8
+ <instruction/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$`
9
+ ">
10
+ Set <ase-task-id><instruction/></ase-task-id> (set task
11
+ id to instruction) and <instruction></instruction> (set
12
+ instruction empty), call the `ase_task_id(id: "<ase-task-id/>",
13
+ session: "<ase-session-id/>")` tool from the `ase` MCP
14
+ server to switch the task, and then only output the
15
+ following <template/>:
16
+
17
+ <template>
18
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **task given**
19
+ </template>
20
+ </if>
21
+
22
+ 2. <elseif condition="
23
+ <instruction/> has the format `<id/>: <text/>` where
24
+ <id/> matches the regexp `^[a-zA-Z][a-zA-Z0-9_-]*$` and
25
+ <text/> is *empty*
26
+ ">
27
+ Set <instruction></instruction> (set instruction to empty)
28
+ and <ase-task-id><id/></ase-task-id> (set task id to
29
+ id) and call the `ase_task_id(id: "<ase-task-id/>", session:
30
+ "<ase-session-id/>")` tool from the `ase` MCP server to
31
+ switch the task, and then only output the following
32
+ <template/>:
33
+
34
+ <template>
35
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ▶ status: **task given**
36
+ </template>
37
+ </elseif>
38
+
39
+ 3. <elseif condition="<instruction/> is NOT empty">
40
+ The argument is neither empty nor a valid task id. As this
41
+ skill only accepts an optional `[<id>]` argument and *never*
42
+ a free-text instruction, only output the following <template/>
43
+ and then immediately *STOP* processing the entire current skill:
44
+
45
+ <template>
46
+ ⧉ **ASE**: ☻ skill: **<arg1/>**, ▶ ERROR: expected single `[<id>]` argument
47
+ </template>
48
+ </elseif>
49
+
50
+ </define>
51
+
52
+ <define name="task-load-content">
53
+
54
+ <if condition="
55
+ <getopt-option-int-reuse-task/> is equal `true`
56
+ *and* a `ase_task_save(id: '<ase-task-id/>', ...)` tool call
57
+ exists earlier in the current session
58
+ ">
59
+ Set <text/> to the `text` argument of the most recent
60
+ `ase_task_save(id: '<ase-task-id/>', ...)` tool call,
61
+ *without* calling `ase_task_load` again. Set <status>plan
62
+ reused</status>. Do not output anything.
63
+ </if>
64
+ <else>
65
+ Call the `ase_task_load(id: "<ase-task-id/>")` tool of the
66
+ `ase` MCP server to load the current task plan content and
67
+ set <text/> to the `text` output field of this `ase_task_load`
68
+ tool call. Do not output anything related to this MCP tool
69
+ call. Set <status>plan loaded</status>.
70
+ </else>
71
+
72
+ - If <text/> starts with `ERROR:` or `WARNING:`:
73
+ Set <task-content></task-content> (set task content to empty).
74
+ Set <words/> to "0".
75
+
76
+ - If <text/> starts NOT with `ERROR:` and NOT with `WARNING:`:
77
+ Set <task-content><text/></task-content> (set task content to text).
78
+ Calculate the number of words <words/> of <task-content/>.
79
+
80
+ Only output the following <template/>:
81
+
82
+ <template>
83
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **<status/>**
84
+ </template>
85
+
86
+ </define>
87
+
88
+ <define name="task-save-content">
89
+
90
+ Update <timestamp-modified/> with the current time in ISO-style
91
+ format, which has to be determined by calling the
92
+ `ase_timestamp(format: "yyyy-LL-dd HH:mm")` tool of the `ase`
93
+ MCP server and use the `text` field of its response. If
94
+ <timestamp-created/> is still unset (because the plan content
95
+ had no `Created:` line), set
96
+ <timestamp-created><timestamp-modified/></timestamp-created>
97
+ (fall back to the modified timestamp). Re-insert the current
98
+ <ase-task-id/>, the original <timestamp-created/>, and the
99
+ refreshed <timestamp-modified/> into <task-content/> and calculate
100
+ the number of words <words/> of <task-content/>.
101
+
102
+ Call the `ase_task_save(id: "<ase-task-id/>", text:
103
+ "<task-content/>")` tool of the `ase` MCP server to save the task
104
+ plan content. Do not output anything related to this MCP call
105
+ except the following <template/>:
106
+
107
+ <template>
108
+ ⧉ **ASE**: ◉ task: **<ase-task-id/>**, ✪ plan: **<words/>** words, ▶ status: **<arg1/>**
109
+ </template>
110
+
111
+ </define>
112
+
113
+ <define name="task-next-select">
114
+
115
+ - If <getopt-option-next/> is not equal to `none`:
116
+ Treat <getopt-option-next/> as a comma-separated chronological
117
+ list of pre-selected next-step tokens. *Split* it on `,`,
118
+ take the *first* token as <head/>, and store the remaining
119
+ tokens (joined back with `,`, or `none` if empty) into
120
+ <getopt-option-next/> so downstream skills can consume the tail.
121
+
122
+ - If <head/> matches the regex `^(<arg2/>)$`:
123
+ Honor the pre-selected token.
124
+ Set <result><head/></result>.
125
+
126
+ - else:
127
+ Only output the following <template/> and then immediately
128
+ *STOP* processing the entire current skill:
129
+
130
+ <template>
131
+ ⧉ **ASE**: ☻ skill: **<arg1/>**, ▶ ERROR: invalid `--next` token: **<head/>**
132
+ </template>
133
+
134
+ - If <getopt-option-next/> is equal to `none`:
135
+
136
+ In the following, you *MUST* *NOT* use your built-in
137
+ <user-dialog-tool/> tool! Instead, you *MUST* just show a
138
+ custom dialog according to the expanded `custom-dialog`
139
+ definition. You *MUST* closely follow this definition:
140
+
141
+ <expand name="custom-dialog" arg1="--no-other">
142
+ <content/>
143
+ </expand>
144
+
145
+ </define>
@@ -34,6 +34,8 @@ Commandments
34
34
  ------------
35
35
 
36
36
  - Be *honest* and *transparent* in all your responses.
37
+ - *Ground* factual and technical claims in verifiable evidence (code base, local files, or web)
38
+ with a reference, rather than unverified model knowledge; state explicitly when a claim cannot be verified.
37
39
  - Before proposing any code changes, explain *WHAT* the proposed changes do and *WHY* it is necessary.
38
40
  - Use *concise* and *type-safe code* only.
39
41
  - Use *precise* and *surgical code changes* only.
@@ -45,7 +47,8 @@ Commandments
45
47
  - Always use *parentheses around arrow function parameters*, even for a single parameter.
46
48
  - Make a line break before the keywords "else", "catch", and "finally".
47
49
  - Try to *vertically align similar operators* on consecutive, similar lines.
48
- - Place spaces after opening and before closing angle brackets and braces.
50
+ - Place spaces after opening and before closing angle brackets
51
+ (except for array access and array types) and braces (except for regular expression ranges).
49
52
  - Use *double-quotes* (`"[...]"`) instead of single-quotes (`'[...]'`) for all strings.
50
53
  - Use K&R coding style with *opening braces* at the end of lines and *closing braces* at the beginning of lines.
51
54
  - When a language has a *more strongly-typed variant*, prefer that variant.
@@ -3,13 +3,13 @@ User Dialog
3
3
  ===========
4
4
 
5
5
  <user-dialog-tool>unknown</user-dialog-tool>
6
- <if condition="<ase-agent-tool/> is 'claude'">
6
+ <if condition="<ase-agent-tool/> is `claude`">
7
7
  <user-dialog-tool>AskUserQuestion</user-dialog-tool>
8
8
  </if>
9
- <if condition="<ase-agent-tool/> is 'copilot'">
9
+ <if condition="<ase-agent-tool/> is `copilot`">
10
10
  <user-dialog-tool>ask_user</user-dialog-tool>
11
11
  </if>
12
- <if condition="<ase-agent-tool/> is 'codex'">
12
+ <if condition="<ase-agent-tool/> is `codex`">
13
13
  <user-dialog-tool>none</user-dialog-tool>
14
14
  </if>
15
15
 
@@ -50,7 +50,7 @@ following procedure:
50
50
  excluding the question label on line 1, and stopping at the first missing line --
51
51
  the same lines the entry loop below renders).
52
52
 
53
- <for items="2 3 4 5 6 7 8 9">
53
+ <for items="2 3 4 5 6 7 8 9 10">
54
54
  Take from <spec/> the line number <item/>.
55
55
  If this line does not exist, <break/>.
56
56
  If this line exists, parse it according to the format `<label/>: <description/>`.
@@ -81,7 +81,7 @@ following procedure:
81
81
  Set <keys><keys/>/**CANCEL**</keys>.
82
82
  </else>
83
83
 
84
- <if condition="<opts/> contains `--other`">
84
+ <if condition="<opts/> contains `--other` and does *not* contain `--no-other`">
85
85
  Set <hint>Please choose *one* option by typing <keys/>, or other free-text instruction.</hint>.
86
86
  </if>
87
87
  <else>
@@ -103,7 +103,7 @@ following procedure:
103
103
  </text>
104
104
 
105
105
  If <n/> is less than 2:
106
- Set <result>ERROR: custom-dialog requires 2-8 answer lines, got <n/></result>
106
+ Set <result>ERROR: custom-dialog requires 2-9 answer lines, got <n/></result>
107
107
  and *SKIP* the following step 2.2 and continue with step 2.3 dispatch.
108
108
 
109
109
  2. Output the following <template/>, end the current turn, wait for the
@@ -134,7 +134,7 @@ following procedure:
134
134
 
135
135
  4. If <result/> is then *NEITHER* one of the "key"
136
136
  *NOR* "label" values from <spec/>:
137
- <if condition="<opts/> contains `--other`">
137
+ <if condition="<opts/> contains `--other` and does *not* contain `--no-other`">
138
138
  Set <result>OTHER: <result/></result>
139
139
  (prefix result with `OTHER: `).
140
140
  </if>
@@ -411,7 +411,7 @@ communicate.
411
411
  the chosen concurrency structure.
412
412
 
413
413
  - In case the unit hosts no functional components, the
414
- entire `- Hosts:` bullet point is omitted.
414
+ entire `- Hosts:` bullet point is omitted.
415
415
 
416
416
  - In case the rationale is not present, the
417
417
  entire `, **BECAUSE** [...]` clause is omitted.
@@ -551,7 +551,7 @@ elements to the runtime platform, hardware, and network topology.
551
551
  the node's placement and platform choice.
552
552
 
553
553
  - In case the node hosts no functional components, the
554
- entire `- Hosts:` bullet point is omitted.
554
+ entire `- Hosts:` bullet point is omitted.
555
555
 
556
556
  - In case the rationale is not present, the
557
557
  entire `, **BECAUSE** [...]` clause is omitted.
@@ -619,7 +619,7 @@ production, defining installation, monitoring, and management concerns.
619
619
  for the operational approach.
620
620
 
621
621
  - In case the element reference is not present, the
622
- entire `- Element:` bullet point is omitted.
622
+ entire `- Element:` bullet point is omitted.
623
623
 
624
624
  - In case the rationale is not present, the
625
625
  entire `, **BECAUSE** [...]` clause is omitted.
@@ -707,7 +707,7 @@ How the Non-Functional Requirements (NR) are addressed.
707
707
  ("why") for the chosen tactic over alternatives.
708
708
 
709
709
  - In case the element reference is not present, the
710
- entire `- Affects:` bullet point is omitted.
710
+ entire `- Affects:` bullet point is omitted.
711
711
 
712
712
  - In case the rationale is not present, the
713
713
  entire `, **BECAUSE** [...]` clause is omitted.
@@ -285,9 +285,6 @@ over time.
285
285
  - <spec-cj-step-name/> is a summary (5-10 words) of the *step* at its
286
286
  <spec-cj-step-touchpoint/>.
287
287
 
288
- - <spec-cj-step-actor/> is a `SPEC-PE-<spec-pe-persona-id/>` reference to the
289
- corresponding **Aspect** of the Personas **Artifact**.
290
-
291
288
  - <spec-cj-step-stage/> is one of:
292
289
 
293
290
  - `Awareness`: Customer is not aware of solution, but has a need.
@@ -297,6 +294,9 @@ over time.
297
294
  - `Retention`: Customer in the long-term stays a customer.
298
295
  - `Advocacy`: Customer is a fan of solution and tells the tribe.
299
296
 
297
+ - <spec-cj-step-actor/> is a `SPEC-PE-<spec-pe-persona-id/>` reference to the
298
+ corresponding **Aspect** of the Personas **Artifact**.
299
+
300
300
  - <spec-cj-step-goal/> is what the actor wants to achieve at this step.
301
301
 
302
302
  - <spec-cj-step-touchpoint/> is where or how the interaction happens
@@ -311,7 +311,7 @@ over time.
311
311
  actor encounters at this step (optional).
312
312
 
313
313
  - In case a <spec-cj-step/> has no pain point at all, the
314
- entire `- Pain Point:` bullet point is omitted.
314
+ entire `- Pain Point:` bullet point is omitted.
315
315
 
316
316
  Functional Requirements (FR)
317
317
  ----------------------------
@@ -518,7 +518,7 @@ constraining the Functional and Non-Functional Requirements.
518
518
  business rule.
519
519
 
520
520
  - In case the rule constrains no specific requirement, the
521
- entire `- Constrains:` bullet point is omitted.
521
+ entire `- Constrains:` bullet point is omitted.
522
522
 
523
523
  - In case the rationale is not present, the
524
524
  entire `, **BECAUSE** [...]` clause is omitted.
@@ -656,24 +656,24 @@ manages, defining how information is organized and connected.
656
656
 
657
657
  With:
658
658
 
659
- - <export-table-1/> is a Markdown table for the attributes with one
660
- row per <spec-dm-attribute-id/>, sorted by <spec-dm-attribute-id/>
661
- -- with the columns:
659
+ - <export-table-1/> is a Markdown table for the attributes with one
660
+ row per <spec-dm-attribute-id/>, sorted by <spec-dm-attribute-id/>
661
+ -- with the columns:
662
662
 
663
- - `Attribute` (`**<spec-dm-attribute-id/>**`)
664
- - `Type` (`<spec-dm-attribute-qualifier/><spec-dm-attribute-type/>`)
665
- - `Description` (`<spec-dm-attribute-description/>, **BECAUSE** <spec-dm-attribute-rationale/>.`)
663
+ - `Attribute` (`**<spec-dm-attribute-id/>**`)
664
+ - `Type` (`<spec-dm-attribute-qualifier/><spec-dm-attribute-type/>`)
665
+ - `Description` (`<spec-dm-attribute-description/>, **BECAUSE** <spec-dm-attribute-rationale/>.`)
666
666
 
667
- - <export-table-2/> is a Markdown table for the relation with one
668
- row per <spec-dm-relation-id/>, sorted by <spec-dm-relation-id/> --
669
- with the columns:
667
+ - <export-table-2/> is a Markdown table for the relation with one
668
+ row per <spec-dm-relation-id/>, sorted by <spec-dm-relation-id/> --
669
+ with the columns:
670
670
 
671
- - `Relation` (`**<spec-dm-relation-id/>**`)
672
- - `Target` (`[<spec-dm-relation-target/>](#<spec-dm-relation-target-id/>) (<spec-dm-relation-cardinality/>)`)
673
- - `Description` (`<spec-dm-relation-description/>, **BECAUSE** <spec-dm-relation-rationale/>.`)
671
+ - `Relation` (`**<spec-dm-relation-id/>**`)
672
+ - `Target` (`[<spec-dm-relation-target/>](#<spec-dm-relation-target-id/>) (<spec-dm-relation-cardinality/>)`)
673
+ - `Description` (`<spec-dm-relation-description/>, **BECAUSE** <spec-dm-relation-rationale/>.`)
674
674
 
675
- - In case a <spec-dm-entity/> has no relations at all, the
676
- entire `### RELATIONS` block (including <export-table-2/>) is omitted.
675
+ - In case a <spec-dm-entity/> has no relations at all, the
676
+ entire `### RELATIONS` block (including <export-table-2/>) is omitted.
677
677
 
678
678
  - Export: `export.svg`
679
679
 
@@ -853,7 +853,7 @@ ambiguities to avoid, shared consistently across all Artifacts.
853
853
  <spec-gl-term-name/> where helpful.
854
854
 
855
855
  - In case a term has no synonyms, the
856
- entire `- Synonyms:` bullet point is omitted.
856
+ entire `- Synonyms:` bullet point is omitted.
857
857
 
858
858
  Use Cases (UC)
859
859
  --------------
@@ -932,7 +932,7 @@ for main, alternative, and exceptional paths.
932
932
  **SCENARIO** blocks of this use case).
933
933
 
934
934
  - In case the use case realizes no specific functional requirement,
935
- the entire `- Requirements:` bullet point is omitted.
935
+ the entire `- Requirements:` bullet point is omitted.
936
936
 
937
937
  - In case a precondition or postcondition is not present, the
938
938
  respective bullet point is omitted.
@@ -1271,13 +1271,13 @@ turn.
1271
1271
 
1272
1272
  - <spec-ds-storyboard-usecase/> is a
1273
1273
  `SPEC-UC-<spec-uc-usecase-id/>` reference to the corresponding
1274
- **Aspect** of the Use Case **Artifact** the storyboard
1274
+ **Aspect** of the Use Cases **Artifact** the storyboard
1275
1275
  visualizes (optional).
1276
1276
 
1277
1277
  - <spec-ds-storyboard-scenario/> is a
1278
1278
  `SPEC-UC-<spec-uc-usecase-id/>-<spec-uc-usecase-scenario-id/>`
1279
1279
  reference to the corresponding scenario **Aspect** of the Use
1280
- Case **Artifact** the storyboard visualizes (optional).
1280
+ Cases **Artifact** the storyboard visualizes (optional).
1281
1281
 
1282
1282
  - <spec-ds-frame-name/>: a short (2-5 word) label for the screen,
1283
1283
  turn, or state depicted by the storyboard frame. Frames are
@@ -59,7 +59,7 @@ You *MUST* honor the following hints on this *task* format:
59
59
  - The <title/> is a short summary of the <summary-what/>, no longer than
60
60
  50 characters.
61
61
 
62
- - The sections `## CHANGES` and `## VERIFICATION` all are just a short
62
+ - The sections `## CHANGES` and `## VERIFICATION` are each just a short
63
63
  list of 1-5 bullet points. Each bullet point is formatted as
64
64
  `- **<aspect/>**: <specification/>` where <aspect/> indicates
65
65
  the aspect of the section and <specification/> is 1-3 sentences
@@ -18,7 +18,7 @@ requested communication style at any time during a session.
18
18
  - If <ase-persona-style/> is `caveman`:
19
19
  You *MUST* use the terse, rough, and stuttering communication style of a *caveman*.
20
20
 
21
- - If <ase-persona-style/> is `writer`, `engineer`, `journalist`, `telegrapher` or `caveman`:
21
+ - If <ase-persona-style/> is `writer`, `engineer`, `journalist`, `telegrapher`, or `caveman`:
22
22
  - You *MUST* *always keep* technical terms exactly, independent of other persona rules below.
23
23
  - You *MUST* *always keep* errors quoted exactly, independent of other persona rules below.
24
24
  - You *MUST* *always keep* code blocks unchanged, independent of other persona rules below.
@@ -28,7 +28,7 @@ requested communication style at any time during a session.
28
28
  - You *MUST* bundle related aspects into paragraphs.
29
29
  - You *MUST* output blank lines between paragraphs.
30
30
 
31
- - If <ase-persona-style/> is `engineer`, `journalist`, `telegrapher` or `caveman`:
31
+ - If <ase-persona-style/> is `engineer`, `journalist`, `telegrapher`, or `caveman`:
32
32
  - You *MUST* use `○` as the bullet point marker symbol in bullet point lists.
33
33
  - You *MUST* *drop* filler words
34
34
  ("just", "really", "basically", "actually", "simply", etc).
@@ -62,7 +62,7 @@ requested communication style at any time during a session.
62
62
  - <keywords/> is only one to four keywords summarizing the <details/>
63
63
  - <details/> is one to four prose sentences explaining the aspect
64
64
 
65
- - If <ase-persona-style/> is `telegrapher` or `caveman`:
65
+ - If <ase-persona-style/> is `telegrapher`, or `caveman`:
66
66
  - You *MUST* *use only* bullet point lists without blank lines between bullet points.
67
67
  - You *MUST* *use only* one bullet point per explanation aspect.
68
68
  - You *MUST* *use* shorter synonyms
@@ -299,7 +299,7 @@ Template Patterns
299
299
 
300
300
  <template>
301
301
 
302
- ╭────────────────────────────────────────────────────────────────────┈┈┈┈┈┈┈┈┈
302
+ ╭───────────────────────────────────────────────────────────────────┈┈┈┈┈┈┈┈┈┈
303
303
 
304
304
  </template>
305
305
 
@@ -330,7 +330,7 @@ Template Patterns
330
330
  <raw-title-len/> is the number of characters in <raw-title/>,
331
331
  and <bar/> is the `─` character repeated exactly max(0, 67 -
332
332
  <raw-title-len/>) times -- clamped to zero so an over-long title
333
- never yields a negative count.
333
+ never yields a negative count):
334
334
 
335
335
  <template>
336
336