@rse/ase 0.0.59 → 0.0.61

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 (31) hide show
  1. package/package.json +1 -1
  2. package/plugin/.claude-plugin/plugin.json +1 -1
  3. package/plugin/.github/plugin/plugin.json +1 -1
  4. package/plugin/etc/markdownlint.yaml +2 -0
  5. package/plugin/meta/ase-skill.md +80 -37
  6. package/plugin/package.json +1 -1
  7. package/plugin/skills/ase-arch-analyze/SKILL.md +2 -2
  8. package/plugin/skills/ase-arch-discover/SKILL.md +4 -4
  9. package/plugin/skills/ase-code-analyze/SKILL.md +1 -1
  10. package/plugin/skills/ase-code-craft/SKILL.md +10 -4
  11. package/plugin/skills/ase-code-craft/help.md +8 -0
  12. package/plugin/skills/ase-code-explain/SKILL.md +6 -6
  13. package/plugin/skills/ase-code-insight/SKILL.md +4 -4
  14. package/plugin/skills/ase-code-lint/SKILL.md +9 -9
  15. package/plugin/skills/ase-code-refactor/SKILL.md +10 -4
  16. package/plugin/skills/ase-code-refactor/help.md +8 -0
  17. package/plugin/skills/ase-code-resolve/SKILL.md +12 -6
  18. package/plugin/skills/ase-code-resolve/help.md +8 -0
  19. package/plugin/skills/ase-docs-proofread/SKILL.md +5 -5
  20. package/plugin/skills/ase-meta-brainstorm/SKILL.md +220 -0
  21. package/plugin/skills/ase-meta-brainstorm/help.md +51 -0
  22. package/plugin/skills/ase-meta-changes/SKILL.md +5 -5
  23. package/plugin/skills/ase-meta-diaboli/SKILL.md +3 -3
  24. package/plugin/skills/ase-meta-diff/SKILL.md +301 -0
  25. package/plugin/skills/ase-meta-diff/help.md +81 -0
  26. package/plugin/skills/ase-meta-evaluate/SKILL.md +9 -9
  27. package/plugin/skills/ase-meta-why/SKILL.md +3 -3
  28. package/plugin/skills/ase-task-delete/SKILL.md +1 -1
  29. package/plugin/skills/ase-task-edit/SKILL.md +2 -2
  30. package/plugin/skills/ase-task-grill/SKILL.md +2 -2
  31. package/plugin/skills/ase-task-view/SKILL.md +2 -2
@@ -0,0 +1,220 @@
1
+ ---
2
+ name: ase-meta-brainstorm
3
+ argument-hint: "[--help|-h] <topic>"
4
+ description: >
5
+ Collaboratively brainstorm a topic by diverging on ideas, converging
6
+ through clustering and scoring, and distilling a shortlist with
7
+ a recommended direction. Use when the user wants to brainstorm,
8
+ explore ideas, ideate, or figure out *what* to build before *how* to
9
+ build it.
10
+ user-invocable: true
11
+ disable-model-invocation: false
12
+ effort: high
13
+ ---
14
+
15
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
16
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
17
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-dialog.md
18
+
19
+ <skill name="ase-meta-brainstorm">
20
+ Collaboratively Brainstorm a Topic
21
+ </skill>
22
+
23
+ <objective>
24
+ Collaboratively brainstorm the topic <topic>$ARGUMENTS</topic> by first
25
+ *diverging* into a broad space of candidate ideas, then *converging*
26
+ through clustering and scoring, and finally distilling a *shortlist*
27
+ with a single recommended direction.
28
+ </objective>
29
+
30
+ Guiding Tenets
31
+ --------------
32
+
33
+ Honor the following tenets throughout the brainstorming:
34
+
35
+ - **No Assumption of Simplicity**:
36
+ Every topic goes through the full process — a one-line config
37
+ change as much as a new subsystem — because the simplest-looking
38
+ topics often hide the most harmful assumptions.
39
+
40
+ - **Explore Intent First**:
41
+ Understand the *purpose*, *constraints*, and *success criteria*
42
+ behind the topic before generating ideas, because ideas that
43
+ optimize the wrong goal are worse than no ideas.
44
+
45
+ - **Diverge Before Converge**:
46
+ Generate many candidate ideas without judging them first, because
47
+ premature evaluation collapses the space before the good ideas have
48
+ a chance to surface.
49
+
50
+ - **One Question at a Time**:
51
+ Ask a single, preferably multiple-choice question per dialog round,
52
+ because a wall of open questions overwhelms and yields shallow
53
+ answers.
54
+
55
+ - **YAGNI Ruthlessly**:
56
+ Actively prune ideas that serve speculative future needs rather
57
+ than the stated purpose, because unbuilt features still cost
58
+ clarity now.
59
+
60
+ - **Ground in Reality**:
61
+ Cross-check ideas against the existing code base, documented
62
+ context, and your world knowledge, because an idea that contradicts
63
+ what already exists is a defect, not an option.
64
+
65
+ - **Incremental Validation**:
66
+ Seek the user's confirmation at each phase boundary before
67
+ advancing, because converging on a misunderstanding wastes the
68
+ entire downstream effort.
69
+
70
+ <flow>
71
+
72
+ 1. <step id="STEP 1: Restate Topic">
73
+
74
+ Restate the topic to be brainstormed by output the following <template/>:
75
+
76
+ <template>
77
+ <ase-tpl-bullet-secondary/> **TOPIC**: <topic/>
78
+ </template>
79
+
80
+ </step>
81
+
82
+ 2. <step id="STEP 2: Clarify Intent">
83
+
84
+ Before generating any ideas, *explore the project context* (review
85
+ relevant existing files, documentation, and recent changes) and
86
+ determine the <m/> *essential unknowns* about the topic — the
87
+ purpose, constraints, scope boundaries, and success criteria that
88
+ must be pinned down for the brainstorming to be reasonably grounded.
89
+
90
+ For each essential unknown, derive a short 1-3 word facet <facet-M/>
91
+ and a corresponding question <question-M/> whose answer materially
92
+ changes which ideas make sense at all.
93
+
94
+ 1. For each <question-M/> in the iteration cycle <M/> (<M/>=1...<m/>):
95
+
96
+ 1. Output the following <template/>:
97
+
98
+ <template>
99
+ <ase-tpl-bullet-signal/> FACET <M/>/<m/>: **<facet-M/>**, QUESTION: **<question-M/>**
100
+ </template>
101
+
102
+ 2. Determine *up to 4* grounded candidate answers
103
+ <answer-M-K/> (K={1,2,3,4}) from the code base, the documented
104
+ context, and your world knowledge.
105
+
106
+ 3. Use an interactive user dialog with header <facet-M/> and
107
+ question <question-M/>, and let the user select the
108
+ <answer-M/> out of the candidate answers <answer-M-K/> (just
109
+ leave out all answers in case you have determined less than
110
+ 4 potential answers)
111
+
112
+ <expand name="user-dialog">
113
+ <facet-M/>: <question-M/>
114
+ <answer-M-1/>: (first grounded candidate answer)
115
+ <answer-M-2/>: (second grounded candidate answer)
116
+ <answer-M-3/>: (third grounded candidate answer)
117
+ <answer-M-4/>: (forth grounded candidate answer)
118
+ </expand>
119
+
120
+ 4. Output the following <template/>:
121
+
122
+ <template>
123
+ <ase-tpl-bullet-normal/> FACET <M/>/<m/>: **<facet-M/>**, ANSWER: **<answer-M/>**
124
+ </template>
125
+
126
+ 2. If at any point <result/> is `CANCEL`:
127
+ Only output the following <template/> and then immediately *STOP*
128
+ processing the entire current skill:
129
+
130
+ <template>
131
+ ⧉ **ASE**: ✪ skill: **ase-meta-brainstorm**, ▶ status: **brainstorm cancelled**
132
+ </template>
133
+
134
+ </step>
135
+
136
+ 3. <step id="STEP 3: Diverge Idea Space">
137
+
138
+ Generate a *broad* space of candidate ideas that address the
139
+ <topic/> within the constraints established by the answers
140
+ <answer-M/>.
141
+
142
+ Deliberately pursue *diverse angles* — e.g. the minimal/MVP-first
143
+ angle, the robustness/risk-first angle, the user-experience-first
144
+ angle, the reuse-existing-machinery angle, the coolness angle, and
145
+ the unconventional/wildcard angle — because variety in origin yields
146
+ variety in outcome.
147
+
148
+ Do still *not* judge, rank, or prune ideas in this step. Generate
149
+ ideas until you either reach at least 12 distinct candidate ideas or
150
+ have clearly exhausted the meaningfully distinct space.
151
+
152
+ Store each candidate idea in <idea-N/> with the format
153
+ `**<idea-name-N/>**: <idea-statement-N/>` (where <idea-name-N/> is a
154
+ short 1-4 word summary and <idea-statement-N/> is a single-sentence
155
+ statement of not more than 40 words), and output the following
156
+ <template/>:
157
+
158
+ <template>
159
+ <ase-tpl-bullet-normal/> **IDEA <N/>**: <idea-N/>
160
+ </template>
161
+
162
+ </step>
163
+
164
+ 4. <step id="STEP 4: Converge Idea Space">
165
+
166
+ Converge the candidate ideas <idea-N/> into a smaller, structured
167
+ sets and finally into a recommendation.
168
+
169
+ 1. *Cluster*: group the candidate ideas into <c/> coherent clusters
170
+ <cluster-C/> (a short 1-4 word label, C=1...</c>), collapsing
171
+ near-duplicates and discarding ideas pruned by *You Aren't Gonna
172
+ Need It (YAGNI)* (speculative, out-of-scope, or contradicting
173
+ documented context).
174
+
175
+ For each cluster and its contained retained ideas, output the
176
+ following <template/> (<cluster-summary-C/> is a single-sentence
177
+ statement of not more than 40 words):
178
+
179
+ <template>
180
+ <ase-tpl-bullet-secondary/> **IDEA CLUSTER <C/>/<c/>**: <cluster-C/> — <cluster-summary-C/>,
181
+ **IDEAS**: <N/>, <M/>[, ...]
182
+ </template>
183
+
184
+ 2. *Score*: for each retained idea <idea-N/> in the clusters, rank its *fit* against the
185
+ purpose and constraints on a Likert scale of 0 (poor) to 10
186
+ (excellent), considering *value*, *uniqueness*, *risk*, and
187
+ *alignment with the existing code base*. Keep only ideas in the
188
+ clusters with a rank of at least 7.
189
+
190
+ 3. From the scored ideas <idea-N/>, distill a *shortlist* of the top
191
+ 3-4 options, sorted by rank from highest to lowest.
192
+
193
+ For this, draw the shortlist from *distinct* clusters <cluster-C/>
194
+ wherever possible — prefer a diverse shortlist spanning different
195
+ clusters over several high-ranked variations of the same cluster,
196
+ unless one cluster clearly dominates on rank.
197
+
198
+ Store each distilled option in <option-N/> with the format
199
+ `**<option-name-N/>** (rank: <option-rank-N/>/10, cluster:
200
+ <option-cluster-N/>): <option-statement-N/>` (where the statement is
201
+ a single sentence of not more than 40 words capturing the direction
202
+ and its primary trade-off), and output the following <template/>:
203
+
204
+ <template>
205
+ <ase-tpl-bullet-normal/> **DISTILLED IDEA <N/>**: <option-N/>
206
+ </template>
207
+
208
+ 4. Finally, derive a single *recommended idea* — the highest-ranked
209
+ option, or a principled synthesis of the option shortlist that preserves
210
+ what is strongest in each — store its one-sentence rationale (not
211
+ more than 40 words) in <recommendation/>, and output the following
212
+ <template/>:
213
+
214
+ <template>
215
+ <ase-tpl-bullet-signal/> **RECOMMENDED IDEA**: <recommendation/>
216
+ </template>
217
+
218
+ </step>
219
+
220
+ </flow>
@@ -0,0 +1,51 @@
1
+
2
+ ## NAME
3
+
4
+ `ase-meta-brainstorm` - Collaboratively Brainstorm a Topic
5
+
6
+ ## SYNOPSIS
7
+
8
+ `ase-meta-brainstorm`
9
+ [`--help`|`-h`]
10
+ *topic*
11
+
12
+ ## DESCRIPTION
13
+
14
+ The `ase-meta-brainstorm` skill guides a collaborative ideation
15
+ session on a *topic* *before* any implementation begins. It first
16
+ *clarifies intent* by exploring the project context and interviewing
17
+ the user — one grounded, multiple-choice question at a time — about
18
+ purpose, constraints, scope, and success criteria. It then *diverges*
19
+ into a broad space of candidate ideas pursued from deliberately diverse
20
+ angles (MVP-first, risk-first, UX-first, reuse-first, and wildcard),
21
+ without judging them.
22
+
23
+ Next it *converges* by clustering the ideas into coherent themes,
24
+ pruning speculative or out-of-scope ones via *YAGNI*, and scoring the
25
+ survivors on a 0-10 fit scale (keeping only those ranked 7 or higher).
26
+ Finally it distills a *shortlist* of the top 3-4 directions — drawn from
27
+ distinct clusters wherever possible — and derives a single
28
+ *RECOMMENDATION*, being either the highest-ranked option or a principled
29
+ synthesis of the shortlist.
30
+
31
+ On completion the skill offers a *next step*: stop, or hand the
32
+ recommended direction off to the `ase-task-edit`, `ase-code-craft`, or
33
+ `ase-task-preflight` skills.
34
+
35
+ ## ARGUMENTS
36
+
37
+ *topic*:
38
+ The subject to brainstorm — a feature, component, behavior, or
39
+ design question to explore *what* to build before *how*.
40
+
41
+ ## EXAMPLES
42
+
43
+ Brainstorm an approach for a new feature:
44
+
45
+ ```text
46
+ ❯ /ase-meta-brainstorm an offline-first sync layer for the mobile app
47
+ ```
48
+
49
+ ## SEE ALSO
50
+
51
+ `ase-meta-evaluate`, `ase-meta-quorum`, `ase-meta-diaboli`
@@ -63,7 +63,7 @@ Processing
63
63
  following <template/>:
64
64
 
65
65
  <template>
66
- &#x1F535; **CHANGELOG FILE:** `<filename/>`
66
+ <ase-tpl-bullet-normal/> **CHANGELOG FILE:** `<filename/>`
67
67
  </template>
68
68
 
69
69
  </step>
@@ -74,7 +74,7 @@ Processing
74
74
  operation with an output based on the following <template/>:
75
75
 
76
76
  <template>
77
- &#x1F535; **DETERMINE ARTIFACT CHANGES:**
77
+ <ase-tpl-bullet-normal/> **DETERMINE ARTIFACT CHANGES:**
78
78
  </template>
79
79
 
80
80
  To update to entries of the most recent *ChangeLog* section, consult
@@ -102,7 +102,7 @@ Processing
102
102
  operation with an output based on the following <template/>:
103
103
 
104
104
  <template>
105
- &#x1F535; **COMPLETE ENTRIES:**
105
+ <ase-tpl-bullet-normal/> **COMPLETE ENTRIES:**
106
106
  </template>
107
107
 
108
108
  Without immediately modifying the `CHANGELOG.md` file, *complete*
@@ -127,7 +127,7 @@ Processing
127
127
  operation with an output based on the following <template/>:
128
128
 
129
129
  <template>
130
- &#x1F535; **CONSOLIDATE ENTRIES:**
130
+ <ase-tpl-bullet-normal/> **CONSOLIDATE ENTRIES:**
131
131
  </template>
132
132
 
133
133
  Without immediately modifying the `CHANGELOG.md` file, *consolidate*
@@ -147,7 +147,7 @@ Processing
147
147
  operation with an output based on the following <template/>:
148
148
 
149
149
  <template>
150
- &#x1F7E0; **UPDATING CHANGELOG:**
150
+ <ase-tpl-bullet-signal/> **UPDATING CHANGELOG:**
151
151
  </template>
152
152
 
153
153
  Finally, *update* the `CHANGELOG.md` file with the completed,
@@ -27,7 +27,7 @@ effort: xhigh
27
27
  Output the thesis with the following <template/>:
28
28
 
29
29
  <template>
30
- &#x26AA; **THESIS**: <thesis/>
30
+ <ase-tpl-bullet-secondary/> **THESIS**: <thesis/>
31
31
  </template>
32
32
 
33
33
  2. **Determine Anti-Thesis**:
@@ -117,7 +117,7 @@ effort: xhigh
117
117
  <template/>:
118
118
 
119
119
  <template>
120
- &#x1F7E0; **ANTITHESIS**: <antithesis-N/>
120
+ <ase-tpl-bullet-signal/> **ANTITHESIS**: <antithesis-N/>
121
121
  </template>
122
122
 
123
123
  3. **Dialectical Reasoning**:
@@ -147,6 +147,6 @@ effort: xhigh
147
147
  in <synthesis/>, and then finally output the following <template/>:
148
148
 
149
149
  <template>
150
- &#x1F535; **SYNTHESIS**: <synthesis/>
150
+ <ase-tpl-bullet-normal/> **SYNTHESIS**: <synthesis/>
151
151
  </template>
152
152
 
@@ -0,0 +1,301 @@
1
+ ---
2
+ name: ase-meta-diff
3
+ argument-hint: "[--help|-h] [--risk|-r] [--blast|-b]"
4
+ description: >
5
+ Summarize the currently staged Git changes as a human-readable,
6
+ intent-grouped narrative. Use when the user wants a concise and
7
+ brief report of what changed and why. Optionally can show a risk and
8
+ blast radius report.
9
+ user-invocable: true
10
+ disable-model-invocation: false
11
+ effort: high
12
+ allowed-tools:
13
+ - "Bash(git diff *)"
14
+ - "Bash(git grep:*)"
15
+ - "Bash(git ls-files:*)"
16
+ - "Bash(grep:*)"
17
+ - "Agent"
18
+ ---
19
+
20
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
21
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
22
+ @${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
23
+
24
+ <skill name="ase-meta-diff">
25
+ Summarize Diff
26
+ </skill>
27
+
28
+ <expand name="getopt"
29
+ arg1="ase-meta-diff"
30
+ arg2="--risk|-r --blast|-b">
31
+ $ARGUMENTS
32
+ </expand>
33
+
34
+ <objective>
35
+ Summarize the currently staged Git changes into a *concise*,
36
+ *human-readable* narrative of what changed and why, *grouped by
37
+ intent* rather than by file. Optionally *score* the diff against a
38
+ *coupling-criticality-coverage- reversibility* rubric and emit a *graded
39
+ risk report* with *mitigations*. Optionally render a *blast-radius map*.
40
+ </objective>
41
+
42
+ Procedure
43
+ ---------
44
+
45
+ You *MUST* follow the following numbered items *strictly* *sequentially*!
46
+ You *MUST* not skip any numbered item during processing!
47
+
48
+ You *MUST* *NOT* output anything in this entire procedure, *except* when
49
+ explicitly requested by this procedure via outputs based on a <template/>!
50
+
51
+ <flow>
52
+
53
+ 1. <step id="STEP 1: Determine Change Set">
54
+
55
+ 1. Determine the *diff details* by running the corresponding command
56
+ (taken exactly as given) and capturing the full diff output into
57
+ <diff/> for the subsequent analysis:
58
+
59
+ `git diff --cached HEAD`
60
+
61
+ 2. Determine the *diff statistics* by running the corresponding command
62
+ (taken exactly as given) and capturing the full stat output into
63
+ <stat/> for the subsequent analysis:
64
+
65
+ `git diff --cached --numstat HEAD`
66
+
67
+ </step>
68
+
69
+ 2. <step id="STEP 2: Summarize By Intent">
70
+
71
+ 1. <if condition="<diff/> is empty">
72
+ Only output the following <template/> and then *STOP* immediately:
73
+
74
+ <template>
75
+ ⧉ **ASE**: ✪ skill: **ase-meta-diff**, ▶ status: **no changes to summarize**
76
+ </template>
77
+ </if>
78
+
79
+ 2. Analyze the <diff/> and <stat/> and synthesize a *concise* narrative of
80
+ WHAT changed and WHY, *grouped by intent* rather than by file.
81
+ Honor the following intents:
82
+
83
+ - `FEATURE`: new functionality or configuration
84
+ - `IMPROVEMENT`: improved functionality or configuration
85
+ - `BUGFIX`: corrected functionality or configuration
86
+ - `UPDATE`: updated functionality or configuration
87
+ - `CLEANUP`: cleaned up functionality or configuration
88
+ - `REFACTOR`: refactored functionality or configuration
89
+
90
+ 3. <if condition="<diff/> is NOT empty">
91
+ 1. First, output the following header <template/>:
92
+
93
+ <template>
94
+
95
+ <ase-tpl-bullet-normal/> **CHANGE INTENT REPORT**:
96
+
97
+ </template>
98
+
99
+ 2. Render a *two-column table* with one row per discovered
100
+ *intent group* present in the <diff/>. Output the following
101
+ table header <template/>:
102
+
103
+ <template>
104
+ | Intent | Changes (LoC) | Files &amp; Description |
105
+ | ------ | ------------- | ----------------------- |
106
+ </template>
107
+
108
+ 3. For each discovered *intent group*, emit the following row
109
+ <template/>, where <intent/> is the intent label, <changes/>
110
+ is the total number of lines changes per feature in format
111
+ `+N/-M`, <files/> is the list of affected file references,
112
+ and <description/> is a *brief* one-to-two-sentence
113
+ narrative of what changed and why:
114
+
115
+ <template>
116
+ | **<intent/>** | <changes/> | <files/>: <description/> |
117
+ </template>
118
+
119
+ In the <files/> part of the second column, markup all file
120
+ references as code (with backticks), prepend them with `▢ `,
121
+ append ` [+N/-M]` (based on the information in <stat/>) to them,
122
+ and separate them with `, ` (a comma and space). Do *not* repeat
123
+ file references in the <description/>.
124
+
125
+ Keep the overall report *concise* and *brief*. Try to keep the
126
+ number of intent groups (table rows) in the range of 1-10. Do
127
+ *not* output any further explanation.
128
+ </if>
129
+
130
+ </step>
131
+
132
+ 3. <step id="STEP 3: Score Against Risk Rubric (optional)">
133
+
134
+ 1. <if condition="<getopt-option-risk/> is NOT equal `true`">
135
+ Silently *SKIP* this entire step.
136
+ </if>
137
+
138
+ 2. <if condition="<diff/> is empty">
139
+ Silently *SKIP* this entire step (STEP 2 already reported it).
140
+ </if>
141
+
142
+ 3. <if condition="<getopt-option-risk/> is equal `true` and <diff/> is NOT empty">
143
+
144
+ Score the *same* captured <diff/> and <stat/> information
145
+ against the four-axis rubric below. Each axis is scored on an
146
+ integer scale of *1* (lowest risk) to *5* (highest risk) against
147
+ the *fixed anchors* given, and *every* score *MUST* be backed
148
+ by a one-line <evidence/> grounded in the *actual* hunks or the
149
+ read-only repository probe.
150
+
151
+ Probe the repository *read-only* and *heuristically* (via `git
152
+ grep` / `grep` / `git ls-files`, restricted to first-party code)
153
+ only as needed to substantiate the *Coupling* and *Coverage*
154
+ axes (e.g. who imports a touched module, whether touched code has
155
+ adjacent tests). Do not output anything during the probe.
156
+
157
+ Score each axis against these anchors:
158
+
159
+ 1. **COUPLING** — how widely the touched code is depended upon.
160
+ *1*: self-contained, no first-party importers.
161
+ *3*: a handful of dependent modules.
162
+ *5*: a hub touched by many modules or a public interface.
163
+
164
+ 2. **CRITICALITY** — how essential the touched path is.
165
+ *1*: docs, comments, dead/peripheral code.
166
+ *3*: ordinary feature logic.
167
+ *5*: core/security/auth/data-integrity/money path.
168
+
169
+ 3. **COVERAGE** — how well the change is exercised by tests.
170
+ *1*: tests touched in this diff or directly covering the
171
+ changed hunks.
172
+ *3*: adjacent tests exist but are not clearly exercising the
173
+ changed hunks.
174
+ *5*: no tests anywhere near the touched code.
175
+
176
+ 4. **REVERSIBILITY** — how easily the change can be undone.
177
+ *1*: pure code change, revert restores prior state.
178
+ *3*: needs coordinated revert or a config rollback.
179
+ *5*: irreversible-by-revert (schema/data migration, released
180
+ artifact, external side effect).
181
+
182
+ Compute the *aggregate risk* as the *equal-weighted* mean of
183
+ the four risk contributions (Coupling, Criticality, Coverage,
184
+ Reversibility), rounded to one decimal, and map it to a *graded
185
+ band*: *1.0-1.9* → **LOW**, *2.0-2.9* → **MODERATE**, *3.0-3.9*
186
+ → **HIGH**, *4.0-5.0* → **CRITICAL**.
187
+
188
+ Then emit the following <template/>, with the overall band and
189
+ aggregate score, followed by a *three-column table* with one row
190
+ per axis: column 1 is the *axis*, column 2 is the *score*, and
191
+ column 3 is the *evidence* (as a `●` bullet point) plus —
192
+ *only* if the axis reached the mitigation threshold of '>= 4' —
193
+ the *mitigation* (as a second `●` bullet point). If an axis did
194
+ not reach that threshold, omit the ` ● **MITIGATION**:
195
+ <mitigation/>` part from its row. Keep the overall <evidence/>
196
+ and <mitigation/> texts *concise* and *ultra brief*. Do *not*
197
+ output any further explanation.
198
+
199
+ In <evidence/> markup all file references as code (with
200
+ backticks), prepend them with `▢ ` and append ` [+N/-M]` (based
201
+ on the information in <stat/>) to them.
202
+
203
+ <template>
204
+
205
+ <ase-tpl-bullet-signal/> **CHANGE RISK REPORT**: Overall: **<band/>** (<aggregate/>/5)
206
+
207
+ | Axis | Score | Findings |
208
+ | ---- | ----- | -------- |
209
+ </template>
210
+
211
+ For each axis, emit the following row <template/>:
212
+
213
+ <template>
214
+ | **<axis/>** | <score/>/5 | ● **EVIDENCE**: <evidence/> ● **MITIGATION**: <mitigation/> |
215
+ </template>
216
+
217
+ Finally, output the following footer <template/>:
218
+
219
+ <template>
220
+
221
+ </template>
222
+
223
+ </if>
224
+
225
+ </step>
226
+
227
+ 4. <step id="STEP 4: Render Blast-Radius Map (optional)">
228
+
229
+ 1. <if condition="<getopt-option-blast/> is NOT equal `true`">
230
+ Silently *SKIP* this entire step.
231
+ </if>
232
+
233
+ 2. <if condition="<diff/> is empty">
234
+ Silently *SKIP* this entire step (STEP 2 already reported it).
235
+ </if>
236
+
237
+ 3. <if condition="<getopt-option-blast/> is equal `true` and <diff/> is NOT empty">
238
+ From the *same* captured <diff/> and <stat/>, *extract the
239
+ touched modules* — the distinct changed source files (or their
240
+ enclosing modules/ packages, according to the language idiom).
241
+
242
+ Then, for each touched module, *scan its reverse dependencies*
243
+ — the other first-party files that *import* or *reference* it
244
+ across the current project (e.g. by the module's basename,
245
+ exported symbol, or import path). Keep the scan *read-only*
246
+ and *heuristic*; restrict it to first-party code within the
247
+ repository. Do not output anything during the scan.
248
+
249
+ Then build a *blast-radius graph* and render it as a diagram:
250
+
251
+ 1. Build a Mermaid specification <mermaid-spec/> for a `flowchart
252
+ TB` whose *touched* modules are the origin nodes and whose
253
+ *reverse-dependency* edges fan out to the dependent modules
254
+ (origin → dependent).
255
+
256
+ Flag each *touched* node as a problem node per the
257
+ `ase-meta-diagram` anomaly convention — prefix its label
258
+ with `⚑ ` inside quotes, e.g. `T1["⚑ src/core.ts"]`. Keep
259
+ labels ultra short (basenames or module names only).
260
+
261
+ 2. Dispatch the rendering to the `ase-meta-diagram` sub-agent by
262
+ calling the tool `Agent(name: "ase:ase-meta-diagram",
263
+ description: "Diagram Rendering", subagent_type:
264
+ "ase:ase-meta-diagram", prompt: "<mermaid-spec/>")` and capture
265
+ its returned `text` field as <diagram/>.
266
+
267
+ Then emit the following <template/>, showing <diagram/> and
268
+ appending a *brief impact summary* of bullets, where each
269
+ <module/> is a *touched* module and <impact/> is a one-sentence
270
+ note on *what depends on it* and *how far the blast reaches*.
271
+
272
+ In <module/> and <impact/>, markup all file references as code
273
+ (with backticks), prepend them with `▢ ` and append ` [+N/-M]`
274
+ (based on the information in <stat/>) to them.
275
+
276
+ <template>
277
+ <ase-tpl-head title="Hello World"/>
278
+
279
+ <ase-tpl-bullet-signal/> **CHANGE BLAST RADIUS MAP**:
280
+
281
+ ```text
282
+ <diagram/>
283
+ ```
284
+
285
+ <ase-tpl-bullet-signal/> **BLAST**: ⚑ **<module/>**: <impact/>
286
+
287
+ <ase-tpl-bullet-signal/> **BLAST**: ⚑ **<module/>**: <impact/>
288
+
289
+ [...]
290
+
291
+ <ase-tpl-foot/>
292
+ </template>
293
+
294
+ Keep the overall report *concise* and *brief*. Do *not* output
295
+ any further explanation.
296
+ </if>
297
+
298
+ </step>
299
+
300
+ </flow>
301
+