@rse/ase 2.0.3 → 2.0.5

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 (198) hide show
  1. package/dst/ase-hook.js +13 -4
  2. package/dst/ase-lib-version.js +14 -5
  3. package/dst/ase-man-catalog.js +229 -0
  4. package/dst/ase-man-render.js +278 -0
  5. package/dst/ase-man-tui.js +636 -0
  6. package/dst/ase-man.js +33 -27
  7. package/dst/ase-setup.js +2 -2
  8. package/dst/ase-spec.js +103 -20
  9. package/dst/ase-task-board-filter.js +5 -4
  10. package/dst/ase-task-board-web-client.js +26 -26
  11. package/dst/man/ase-agent-adhoc.md +1165 -0
  12. package/dst/man/ase-agent-condenser.md +383 -0
  13. package/dst/man/ase-agent-editor.md +441 -0
  14. package/dst/man/ase-agent-estimator.md +477 -0
  15. package/dst/man/ase-agent-fleet.md +358 -0
  16. package/dst/man/ase-agent-implementer.md +521 -0
  17. package/dst/man/ase-agent-integrator.md +449 -0
  18. package/dst/man/ase-agent-qualifier.md +426 -0
  19. package/dst/man/ase-agent-rebooter.md +384 -0
  20. package/dst/man/ase-agent-relay.md +262 -0
  21. package/dst/man/ase-agent-researcher.md +478 -0
  22. package/dst/man/ase-agent.md +628 -0
  23. package/dst/man/ase-artifact-list.md +57 -0
  24. package/dst/man/ase-artifact-name.md +56 -0
  25. package/dst/man/ase-artifact.md +92 -0
  26. package/dst/man/ase-config-delete.md +74 -0
  27. package/dst/man/ase-config-edit.md +83 -0
  28. package/dst/man/ase-config-get.md +70 -0
  29. package/dst/man/ase-config-init.md +110 -0
  30. package/dst/man/ase-config-list.md +68 -0
  31. package/dst/man/ase-config-set.md +92 -0
  32. package/dst/man/ase-config.md +426 -0
  33. package/dst/man/ase-hook-permission-request.md +61 -0
  34. package/dst/man/ase-hook-pre-tool-use.md +96 -0
  35. package/dst/man/ase-hook-session-end.md +71 -0
  36. package/dst/man/ase-hook-session-persona.md +65 -0
  37. package/dst/man/ase-hook-session-start.md +184 -0
  38. package/dst/man/ase-hook-stop.md +52 -0
  39. package/dst/man/ase-hook-user-prompt-submit.md +54 -0
  40. package/dst/man/ase-hook.md +93 -0
  41. package/dst/man/ase-man.md +195 -0
  42. package/dst/man/ase-mcp.md +102 -0
  43. package/dst/man/ase-service-log.md +59 -0
  44. package/dst/man/ase-service-send.md +60 -0
  45. package/dst/man/ase-service-start.md +93 -0
  46. package/dst/man/ase-service-status.md +58 -0
  47. package/dst/man/ase-service-stop.md +52 -0
  48. package/dst/man/ase-service.md +124 -0
  49. package/dst/man/ase-setup-disable.md +67 -0
  50. package/dst/man/ase-setup-enable.md +66 -0
  51. package/dst/man/ase-setup-install.md +116 -0
  52. package/dst/man/ase-setup-mcp.md +213 -0
  53. package/dst/man/ase-setup-status.md +101 -0
  54. package/dst/man/ase-setup-statusline.md +162 -0
  55. package/dst/man/ase-setup-telemetry.md +166 -0
  56. package/dst/man/ase-setup-uninstall.md +85 -0
  57. package/dst/man/ase-setup-update.md +117 -0
  58. package/dst/man/ase-setup.md +156 -0
  59. package/dst/man/ase-spec-export.md +99 -0
  60. package/dst/man/ase-spec-init.md +57 -0
  61. package/dst/man/ase-spec-lint.md +74 -0
  62. package/dst/man/ase-spec-preview.md +57 -0
  63. package/dst/man/ase-spec.md +85 -0
  64. package/dst/man/ase-statusline.md +330 -0
  65. package/dst/man/ase-task-assign.md +138 -0
  66. package/dst/man/ase-task-board.md +651 -0
  67. package/dst/man/ase-task-delete.md +46 -0
  68. package/dst/man/ase-task-edit.md +73 -0
  69. package/dst/man/ase-task-idscheme.md +92 -0
  70. package/dst/man/ase-task-lifecycle.md +92 -0
  71. package/dst/man/ase-task-list.md +86 -0
  72. package/dst/man/ase-task-load.md +48 -0
  73. package/dst/man/ase-task-newid.md +100 -0
  74. package/dst/man/ase-task-purge.md +49 -0
  75. package/dst/man/ase-task-rename.md +69 -0
  76. package/dst/man/ase-task-request.md +108 -0
  77. package/dst/man/ase-task-save.md +78 -0
  78. package/dst/man/ase-task-status.md +79 -0
  79. package/dst/man/ase-task-store.md +377 -0
  80. package/dst/man/ase-task-view.md +50 -0
  81. package/dst/man/ase-task.md +335 -0
  82. package/dst/man/ase-util-compat.md +38 -0
  83. package/dst/man/ase-util-diagram.md +140 -0
  84. package/dst/man/ase-util-meta.md +68 -0
  85. package/dst/man/ase-util-metric.md +74 -0
  86. package/dst/man/ase-util-mint.md +85 -0
  87. package/dst/man/ase-util-worktree.md +109 -0
  88. package/dst/man/ase-util.md +81 -0
  89. package/dst/man/ase.md +228 -0
  90. package/package.json +16 -21
  91. package/plugin/.claude-plugin/plugin.json +1 -1
  92. package/plugin/.codex-plugin/plugin.json +1 -1
  93. package/plugin/.github/plugin/plugin.json +1 -1
  94. package/plugin/agents/ase-code-lint.md +3 -3
  95. package/plugin/agents/ase-docs-proofread.md +3 -3
  96. package/plugin/agents/ase-docs-refine.md +3 -3
  97. package/plugin/agents/ase-spec-lint.md +338 -0
  98. package/plugin/mods/ase-mods-common.ts +444 -0
  99. package/plugin/mods/ase-mods-grill.ts +312 -0
  100. package/plugin/mods/ase-mods-help-browse.ts +405 -0
  101. package/plugin/mods/ase-mods-help-compose.ts +561 -0
  102. package/plugin/mods/ase-mods-help-find.ts +426 -0
  103. package/plugin/mods/ase-mods-help-hint.ts +134 -0
  104. package/plugin/mods/ase-mods-help-show.ts +142 -0
  105. package/plugin/mods/ase-mods.ts +214 -381
  106. package/plugin/mods/claude-code.d.ts +26 -3
  107. package/plugin/skills/ase-code-lint/SKILL.md +15 -15
  108. package/plugin/skills/ase-code-lint/help.md +21 -8
  109. package/plugin/skills/ase-help-intent/SKILL.md +2 -1
  110. package/plugin/skills/ase-help-intent/data.md +214 -9
  111. package/plugin/skills/ase-help-skill/catalog.md +1 -0
  112. package/plugin/skills/ase-meta-workflow/workflow.txt +2 -0
  113. package/plugin/skills/ase-repo-commit/SKILL.md +1 -0
  114. package/plugin/skills/ase-repo-merge/SKILL.md +1 -0
  115. package/plugin/skills/ase-spec-edit/SKILL.md +3 -3
  116. package/plugin/skills/ase-spec-edit/help.md +1 -1
  117. package/plugin/skills/ase-spec-lint/SKILL.md +695 -0
  118. package/plugin/skills/ase-spec-lint/help.md +184 -0
  119. package/plugin/skills/ase-task-implement/SKILL.md +24 -6
  120. package/plugin/skills/ase-task-implement/help.md +11 -1
  121. package/dst/man/ase-agent-adhoc.1 +0 -515
  122. package/dst/man/ase-agent-condenser.1 +0 -193
  123. package/dst/man/ase-agent-editor.1 +0 -212
  124. package/dst/man/ase-agent-estimator.1 +0 -214
  125. package/dst/man/ase-agent-fleet.1 +0 -185
  126. package/dst/man/ase-agent-implementer.1 +0 -233
  127. package/dst/man/ase-agent-integrator.1 +0 -213
  128. package/dst/man/ase-agent-qualifier.1 +0 -214
  129. package/dst/man/ase-agent-rebooter.1 +0 -193
  130. package/dst/man/ase-agent-relay.1 +0 -128
  131. package/dst/man/ase-agent-researcher.1 +0 -217
  132. package/dst/man/ase-agent.1 +0 -264
  133. package/dst/man/ase-artifact-list.1 +0 -38
  134. package/dst/man/ase-artifact-name.1 +0 -39
  135. package/dst/man/ase-artifact.1 +0 -56
  136. package/dst/man/ase-config-delete.1 +0 -45
  137. package/dst/man/ase-config-edit.1 +0 -48
  138. package/dst/man/ase-config-get.1 +0 -46
  139. package/dst/man/ase-config-init.1 +0 -60
  140. package/dst/man/ase-config-list.1 +0 -42
  141. package/dst/man/ase-config-set.1 +0 -52
  142. package/dst/man/ase-config.1 +0 -231
  143. package/dst/man/ase-hook-permission-request.1 +0 -36
  144. package/dst/man/ase-hook-pre-tool-use.1 +0 -59
  145. package/dst/man/ase-hook-session-end.1 +0 -47
  146. package/dst/man/ase-hook-session-persona.1 +0 -37
  147. package/dst/man/ase-hook-session-start.1 +0 -81
  148. package/dst/man/ase-hook-stop.1 +0 -34
  149. package/dst/man/ase-hook-user-prompt-submit.1 +0 -34
  150. package/dst/man/ase-hook.1 +0 -51
  151. package/dst/man/ase-man.1 +0 -67
  152. package/dst/man/ase-mcp.1 +0 -61
  153. package/dst/man/ase-service-log.1 +0 -43
  154. package/dst/man/ase-service-send.1 +0 -47
  155. package/dst/man/ase-service-start.1 +0 -54
  156. package/dst/man/ase-service-status.1 +0 -46
  157. package/dst/man/ase-service-stop.1 +0 -37
  158. package/dst/man/ase-service.1 +0 -85
  159. package/dst/man/ase-setup-disable.1 +0 -44
  160. package/dst/man/ase-setup-enable.1 +0 -45
  161. package/dst/man/ase-setup-install.1 +0 -73
  162. package/dst/man/ase-setup-mcp.1 +0 -124
  163. package/dst/man/ase-setup-status.1 +0 -60
  164. package/dst/man/ase-setup-statusline.1 +0 -92
  165. package/dst/man/ase-setup-telemetry.1 +0 -92
  166. package/dst/man/ase-setup-uninstall.1 +0 -59
  167. package/dst/man/ase-setup-update.1 +0 -64
  168. package/dst/man/ase-setup.1 +0 -93
  169. package/dst/man/ase-spec-export.1 +0 -62
  170. package/dst/man/ase-spec-lint.1 +0 -40
  171. package/dst/man/ase-spec-preview.1 +0 -40
  172. package/dst/man/ase-spec.1 +0 -46
  173. package/dst/man/ase-statusline.1 +0 -189
  174. package/dst/man/ase-task-assign.1 +0 -71
  175. package/dst/man/ase-task-board.1 +0 -384
  176. package/dst/man/ase-task-delete.1 +0 -35
  177. package/dst/man/ase-task-edit.1 +0 -46
  178. package/dst/man/ase-task-idscheme.1 +0 -65
  179. package/dst/man/ase-task-lifecycle.1 +0 -57
  180. package/dst/man/ase-task-list.1 +0 -47
  181. package/dst/man/ase-task-load.1 +0 -36
  182. package/dst/man/ase-task-newid.1 +0 -61
  183. package/dst/man/ase-task-purge.1 +0 -37
  184. package/dst/man/ase-task-rename.1 +0 -44
  185. package/dst/man/ase-task-request.1 +0 -61
  186. package/dst/man/ase-task-save.1 +0 -48
  187. package/dst/man/ase-task-status.1 +0 -55
  188. package/dst/man/ase-task-store.1 +0 -194
  189. package/dst/man/ase-task-view.1 +0 -40
  190. package/dst/man/ase-task.1 +0 -160
  191. package/dst/man/ase-util-compat.1 +0 -25
  192. package/dst/man/ase-util-diagram.1 +0 -76
  193. package/dst/man/ase-util-meta.1 +0 -45
  194. package/dst/man/ase-util-metric.1 +0 -54
  195. package/dst/man/ase-util-mint.1 +0 -59
  196. package/dst/man/ase-util-worktree.1 +0 -72
  197. package/dst/man/ase-util.1 +0 -50
  198. package/dst/man/ase.1 +0 -124
@@ -119,9 +119,9 @@ Workflow
119
119
 
120
120
  6. Set <context-after/> to exactly *up to two* lines of
121
121
  *unchanged* text content which occurs in the document
122
- directly *after* <old-text/>, i.e., the lines (<line/>
123
- + <n/>) and (<line/> + <n/> + 1), where <n/> is the
124
- number of lines in <old-text/>. Reduce to just one line
122
+ directly *after* <old-text/>, i.e., the lines
123
+ (<line/> + <n/>) and (<line/> + <n/> + 1), where <n/> is
124
+ the number of lines in <old-text/>. Reduce to just one line
125
125
  (<line/> + <n/>) if <old-text/> is the second-last
126
126
  line of the document. Set <context-after/> to empty if
127
127
  <old-text/> is the last line in the document.
@@ -0,0 +1,338 @@
1
+ ---
2
+ name: ase-spec-lint
3
+ description: "Specification Lint Investigation"
4
+ effort: high
5
+ ---
6
+
7
+ Your role is an experienced, *expert-level requirements engineer*.
8
+
9
+ Your objective is to *analyze* and *fix* the **SpecBook**-based
10
+ specification (SPEC) for *potential problems* related to a set of
11
+ specification quality aspects.
12
+
13
+ Workflow
14
+ --------
15
+
16
+ 1. Set the requested context: <context>$ARGUMENTS</context>.
17
+ It consists of the following labeled lines:
18
+
19
+ - `ASPECTS:` the comma-separated *aspect set* <aspects/> (a
20
+ non-empty subset of the aspect ids `S01`...`S10`).
21
+ - `FILES:` the space-separated specification files <files/> to
22
+ check, where all problems have to be located.
23
+ - `CORPUS:` the space-separated files <corpus/> of the *entire*
24
+ specification, to be read for comprehension only.
25
+ - `META:` the space-separated files <meta/> of the bundled
26
+ **SpecBook** format contract and **ASE Tenets**.
27
+ - `SCHEMA:` the space-separated files <schema/> of the **SpecBook
28
+ SCHEMA Model** of the project, merged in the given order.
29
+ - `DIAGNOSTICS:` followed by the lines <diagnostics/> of the
30
+ format `- <file/>:<line/>:<column/>: <severity/>: <message/>`,
31
+ each a diagnostic of the syntax linters (*SpecBook* and
32
+ *markdownlint*, the latter with a message prefixed by
33
+ `markdownlint: `) located in <files/>, or the single line
34
+ `(none)`.
35
+
36
+ 2. Use the `Read` tool to read all files of <meta/> to learn the
37
+ **SpecBook** format contract and the **ASE Tenets**, especially the
38
+ **SPECIFYING TENETS**. Then use the `Read` tool to read all files of
39
+ <schema/> to learn the allowed object kinds, properties, nestings,
40
+ and value constraints of the project. Finally, use the `Read` tool
41
+ to read all files of <files/>.
42
+
43
+ If <aspects/> contains any of the *model-wide* aspects `S07`...`S10`,
44
+ additionally read *all* files of <corpus/>, as these aspects can be
45
+ judged on the entire specification model only. Otherwise, read only
46
+ those files of <corpus/> which are needed to really comprehend
47
+ <files/>, like the targets of their `[[xxx]]` references.
48
+
49
+ 3. Set <problems/> to empty.
50
+ Then check the read specification for the following aspects (each
51
+ aspect is uniquely identified by its `aspect` id `S01 - XXX`...`S10
52
+ - XXX`), but *strictly limited* to those aspects whose id is
53
+ contained in the aspect set <aspects/> -- all other aspects are
54
+ *not* checked and their problems are *never* reported:
55
+
56
+ - **S01 - SYNTAX**:
57
+ Report *exactly* one problem per line of <diagnostics/>: the
58
+ linters are authoritative, so neither drop a diagnostic nor
59
+ detect any further syntax problem yourself. Take the
60
+ `<severity/>` `error` as `HIGH` and `warning` as `MEDIUM`.
61
+
62
+ Propose the correction which resolves the diagnostic, e.g. a
63
+ schema-allowed object kind, nesting, property key, or value, a
64
+ uniquely resolvable `[[xxx]]` reference, or the Markdown
65
+ construct the *markdownlint* rule demands.
66
+
67
+ - **S02 - FORMAT**:
68
+ Check for unclean or inconsistently formatted Markdown not
69
+ already covered by <diagnostics/>.
70
+
71
+ The yardstick is the **SpecBook** format contract plus the
72
+ *prevailing* formatting conventions of <corpus/> (the majority
73
+ style). Especially, check the usage of the Complex, Concise, and
74
+ Grouped format variants (sibling objects share their format),
75
+ mixed ATX and Setext headings, the padding behind heading and
76
+ list markers, the indentation of continuation lines, the
77
+ vertical alignment of properties, the blank lines between
78
+ blocks, the line wrapping width, the backquoting of grouped
79
+ names, and the `Created:`/`Modified:` frontmatter block.
80
+
81
+ - **S03 - RATIONALE**:
82
+ Check for statements violating the **Statement with Rationale**
83
+ tenet: descriptions without a `, BECAUSE ` rationale, rationales
84
+ merely restating their statement, and rationales not explaining
85
+ the WHY.
86
+
87
+ Propose a rationale grounded in the surrounding specification
88
+ content (related statements, rationales, and references).
89
+
90
+ - **S04 - AMBIGUITY**:
91
+ Check for statements violating the **Unambiguous and
92
+ Verifiable** tenet: vague qualifiers (e.g. "fast", "robust",
93
+ "user-friendly", "appropriate", "usually", "etc.", "and/or"),
94
+ undefined or overloaded terms, hidden actors, and statements
95
+ whose fulfillment is not decidable.
96
+
97
+ Propose the concrete property, threshold, or scenario actually
98
+ meant, as far as the specification content implies it.
99
+
100
+ - **S05 - ATOMICITY**:
101
+ Check for statements violating the **Atomic Statement** tenet:
102
+ statements joining independent facts with "and"/"or", or
103
+ carrying a rationale which covers only some of their facts.
104
+
105
+ Propose splitting them into separate statements or objects.
106
+
107
+ - **S06 - REALIZATION**:
108
+ Check for statements violating the **Intent over Realization**
109
+ tenet: domain-specific, non-architecture related artifacts
110
+ stating the HOW (implementation steps, algorithms, technologies,
111
+ or code-level details) instead of the WHAT and WHY.
112
+
113
+ Propose rephrasing them as intent, or moving the realization
114
+ detail into an architecture-related artifact of the schema.
115
+
116
+ - **S07 - REDUNDANCY** (model-wide):
117
+ Check for facts violating the **Single Source of Truth** tenet:
118
+ a fact restated in a second object instead of being referenced.
119
+
120
+ Propose replacing the restatement with a `[[xxx]]` reference to
121
+ the owning object.
122
+
123
+ - **S08 - CONSISTENCY** (model-wide):
124
+ Check for contradicting statements, properties, or rationales
125
+ across objects, and for drifting terminology: one concept named
126
+ differently, different concepts named alike, or object names and
127
+ ids following different naming conventions.
128
+
129
+ Propose aligning the contradicting or drifting side to the
130
+ prevailing one.
131
+
132
+ - **S09 - LOGIC** (model-wide):
133
+ Check for *logical gaps* in the specification model, i.e.
134
+ objects whose relationships do not form a coherent whole.
135
+
136
+ Especially, check for unreachable or dead-end states of a
137
+ lifecycle, state transitions without a trigger, entities without
138
+ any relationship or usage, use cases or scenarios without an
139
+ actor, scenarios covering only the happy path, references
140
+ pointing to an object of a semantically wrong kind, cyclic
141
+ hierarchies which have to be acyclic, contradicting
142
+ cardinalities, and objects the schema expects to be referenced
143
+ (its `referenced` and `coverage` fields) but which no object
144
+ references.
145
+
146
+ - **S10 - COMPLETENESS** (model-wide):
147
+ Check whether the specification is *sufficient for an
148
+ implementation*, i.e. whether an implementer could realize it
149
+ without having to guess.
150
+
151
+ Especially, check for open ends (e.g. "TBD", "TODO", "to be
152
+ defined", open questions), objects without any description,
153
+ missing error and edge cases, missing attributes, types, or
154
+ value constraints of data, missing inputs and outputs of
155
+ interfaces, non-functional requirements without a concrete
156
+ threshold, and terms used but nowhere defined. Report only
157
+ *material* gaps -- not every conceivable detail.
158
+
159
+ For the gap-filling aspects `S09` and `S10`, propose a *best-guess*
160
+ content which closes the gap, honoring the schema and the
161
+ surrounding specification content, and explicitly state in the WHY
162
+ part that the proposed content is a *best guess* to be reviewed.
163
+
164
+ Severity guidance: `S01` follows the diagnostic severity. `S02`
165
+ defaults to `LOW`, escalating to `MEDIUM` for an inconsistency
166
+ across many objects. `S03`, `S05`, `S06`, and `S07` default to
167
+ `MEDIUM`. `S04` defaults to `MEDIUM`, escalating to `HIGH` for a
168
+ statement whose meaning is entirely undecidable. `S08` and `S09`
169
+ default to `HIGH`, as they let implementations diverge. `S10`
170
+ defaults to `MEDIUM`, escalating to `HIGH` for a gap blocking an
171
+ entire feature.
172
+
173
+ Be conservative - only report clear, well-grounded issues
174
+ that require an actual *specification change*. Think twice to avoid
175
+ *false positives*.
176
+
177
+ Be focused - only report issues which are located in the files of
178
+ <files/>. Ignore issues which are located in other files of
179
+ <corpus/> which were just read to better comprehend the context. For
180
+ a model-wide issue spanning several files, anchor it in a file of
181
+ <files/>.
182
+
183
+ For *each* found problem:
184
+
185
+ 1. Set <aspect/> to the identifier `S01 - XXX`...`S10 - XXX`,
186
+ indicating the aspect under which the problem was detected.
187
+
188
+ 2. Set <severity/> to the string `LOW`, `MEDIUM`, or `HIGH`,
189
+ indicating the problem severity.
190
+
191
+ 3. Set <description/> to the following <template/>,
192
+ based on a WHAT ("what is the problem detected") and
193
+ WHY ("why is this a problem") part:
194
+
195
+ <template>
196
+ ● **WHAT**: [...]
197
+
198
+ ○ **WHY**: [...]
199
+ </template>
200
+
201
+ For both WHAT and WHY, use just an ultra-brief and concise
202
+ Markdown-formatted description. In each of those descriptions,
203
+ mark up all referenced verbatim object names, ids, kinds,
204
+ property keys, or keywords <words/> from the specification as
205
+ quoted strings containing monospaced text with Markdown based on
206
+ the following <template/>: <template>"`<words/>`"</template>.
207
+
208
+ For all specification references, always use a relative
209
+ filename and append the related single 1-based line number N as
210
+ `:N` or the related 1-based line number range as `:N-M` to the
211
+ end of the filename.
212
+
213
+ 4. Create the change set. For this, set <change-set></change-set>
214
+ (set changes to empty). Every change *MUST* keep the touched
215
+ files conformant to the **SpecBook** format contract and the
216
+ schema. Leave <change-set/> empty *only* if no correction can be
217
+ derived at all (e.g. a diagnostic demanding a decision outside
218
+ the specification).
219
+
220
+ Then, for *each* file which requires a change:
221
+
222
+ 1. Set <file/> to the *relative* filename path of the file.
223
+
224
+ 2. Create the change hunks per file.
225
+ For this, set <change-hunks></change-hunks> (set hunks to empty).
226
+
227
+ Then, for *each* change in <file/>:
228
+
229
+ 1. Set <line/> to the numeric 1-based line number in <file/>.
230
+
231
+ 2. Set <old-text/> to the lines of the old content in
232
+ <file/> which should be changed. Set <new-text/> to the
233
+ lines of the new content in <file/> which will replace
234
+ it.
235
+
236
+ Keep the hunk *minimal*: <old-text/> and <new-text/>
237
+ *MUST* *NOT* share any common leading or trailing
238
+ lines - *strip* such lines, as they are *unchanged*
239
+ context and not part of the change. When two changed
240
+ regions are separated by unchanged lines, emit *two
241
+ separate* change hunks instead of one large hunk which
242
+ re-states the unchanged lines. Render a *moved* block
243
+ as one pure-deletion hunk at its old location plus one
244
+ pure-insertion hunk at its new location - *never* by
245
+ deleting and re-adding the unchanged lines in between.
246
+
247
+ This minimality rule applies *only* to <old-text/> and
248
+ <new-text/>. It *MUST* *NOT* be understood as a reason to
249
+ also drop the surrounding context of the two following
250
+ substeps - that context is *mandatory* and is reported
251
+ *separately* from the changed lines.
252
+
253
+ 3. Set <context-before/> to exactly *up to two* lines of
254
+ *unchanged* content which occurs in <file/> directly
255
+ *before* <old-text/>, i.e., the lines (<line/> - 2) and
256
+ (<line/> - 1). Reduce to just one line (<line/> - 1) if
257
+ <old-text/> is the second line of the file. Set
258
+ <context-before/> to empty if <old-text/> is the first
259
+ line in the file.
260
+
261
+ 4. Set <context-after/> to exactly *up to two* lines of
262
+ *unchanged* content which occurs in <file/> directly
263
+ *after* <old-text/>, i.e., the lines (<line/> + <n/>)
264
+ and (<line/> + <n/> + 1), where <n/> is the number of
265
+ lines in <old-text/>. Reduce to just one line (<line/> +
266
+ <n/>) if <old-text/> is the second-last line of the
267
+ file. Set <context-after/> to empty if <old-text/> is
268
+ the last line in the file.
269
+
270
+ 5. If <change-hunks/> is not empty, set
271
+ <change-hunks><change-hunks/>,</change-hunks> (append a comma).
272
+ Then append the following <template/> to <change-hunks/>:
273
+
274
+ <template>
275
+ {
276
+ "line": <line/>,
277
+ "context_before": <context-before/>,
278
+ "old_text": <old-text/>,
279
+ "new_text": <new-text/>,
280
+ "context_after": <context-after/>
281
+ }
282
+ </template>
283
+
284
+ Here `line` is a *number* and all four other fields are
285
+ *JSON strings* carrying the *verbatim* file lines
286
+ (embedded newlines escaped as `\n`, no line-number
287
+ prefixes, original indentation preserved). The empty
288
+ string `""` is allowed for `context_before` and
289
+ `context_after` *only* at the very start or end of the
290
+ file - for every other hunk both *MUST* carry their
291
+ context lines.
292
+
293
+ 3. If <change-set/> is not empty, set
294
+ <change-set><change-set/>,</change-set> (append a comma).
295
+ Then append the following <template/> to <change-set/>:
296
+
297
+ <template>
298
+ {
299
+ "file": <file/>,
300
+ "change-hunks": [
301
+ <change-hunks/>
302
+ ]
303
+ }
304
+ </template>
305
+
306
+ 5. Set <anchor-file/> to the file and <anchor-line/> to the
307
+ 1-based line number where the problem is located (for a
308
+ non-empty <change-set/>, the `file` of its first entry and the
309
+ `line` of that entry's first hunk).
310
+
311
+ 6. If <problems/> is not empty, set
312
+ <problems><problems/>,</problems> (append a comma).
313
+ Then append the following <template/> to <problems/>:
314
+
315
+ <template>
316
+ {
317
+ "aspect": <aspect/>,
318
+ "severity": <severity/>,
319
+ "description": <description/>,
320
+ "file": <anchor-file/>,
321
+ "line": <anchor-line/>,
322
+ "change-set": [
323
+ <change-set/>
324
+ ]
325
+ }
326
+ </template>
327
+
328
+ 4. You *MUST* *NOT* propose, apply, or render any specification
329
+ changes yourself. Instead, return *exclusively* as the last message
330
+ a single JSON block (no markdown, no prose, no preamble, no summary)
331
+ of the following shape:
332
+
333
+ ```json
334
+ [
335
+ <problems/>
336
+ ]
337
+ ```
338
+