automatasaurus 0.1.14 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/commands/init.js +16 -1
- package/src/commands/update.js +16 -1
- package/src/lib/symlinks.js +41 -1
- package/template/CLAUDE.block.md +5 -5
- package/template/agents/architect/AGENT.md +5 -0
- package/template/agents/designer/AGENT.md +3 -0
- package/template/agents/developer/AGENT.md +6 -0
- package/template/agents/evolver/AGENT.md +1 -1
- package/template/agents/tester/AGENT.md +7 -1
- package/template/commands/auto-discovery.md +16 -6
- package/template/commands/auto-plan.md +2 -6
- package/template/skills/agent-coordination/SKILL.md +5 -10
- package/template/skills/work-issue/SKILL.md +12 -24
package/package.json
CHANGED
package/src/commands/init.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { mkdir, cp, readFile } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { getTemplateDir, getProjectPaths, getVersion, SUBDIR_SYMLINK_DIRS, FILE_SYMLINK_DIRS } from '../lib/paths.js';
|
|
4
|
-
import { symlinkDirectory, symlinkSubdirectories } from '../lib/symlinks.js';
|
|
4
|
+
import { symlinkDirectory, symlinkSubdirectories, symlinkAgentFiles } from '../lib/symlinks.js';
|
|
5
5
|
import { mergeBlockIntoFile } from '../lib/block-merge.js';
|
|
6
6
|
import { mergeLayeredSettings, createLocalSettingsTemplate, mergeJsonFile } from '../lib/json-merge.js';
|
|
7
7
|
import { readManifest, writeManifest, createManifest, updateManifest } from '../lib/manifest.js';
|
|
@@ -62,6 +62,21 @@ export async function init({ force = false } = {}) {
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
// Flat file symlinks for agents (enables Claude Code agent discovery)
|
|
66
|
+
{
|
|
67
|
+
const sourceDir = join(paths.automatasaurus, 'agents');
|
|
68
|
+
const targetDir = join(paths.claude, 'agents');
|
|
69
|
+
try {
|
|
70
|
+
const created = await symlinkAgentFiles(sourceDir, targetDir);
|
|
71
|
+
for (const file of created) {
|
|
72
|
+
allSymlinks.push(`agents/${file}`);
|
|
73
|
+
console.log(` Linked agents/${file}`);
|
|
74
|
+
}
|
|
75
|
+
} catch (error) {
|
|
76
|
+
if (error.code !== 'ENOENT') throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
65
80
|
// File-level symlinks (hooks, commands)
|
|
66
81
|
for (const dir of FILE_SYMLINK_DIRS) {
|
|
67
82
|
const sourceDir = join(paths.automatasaurus, dir);
|
package/src/commands/update.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { mkdir, cp, readFile, rm, lstat } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { getTemplateDir, getProjectPaths, getVersion, SUBDIR_SYMLINK_DIRS, FILE_SYMLINK_DIRS } from '../lib/paths.js';
|
|
4
|
-
import { symlinkDirectory, symlinkSubdirectories } from '../lib/symlinks.js';
|
|
4
|
+
import { symlinkDirectory, symlinkSubdirectories, symlinkAgentFiles } from '../lib/symlinks.js';
|
|
5
5
|
import { mergeBlockIntoFile } from '../lib/block-merge.js';
|
|
6
6
|
import { mergeLayeredSettings, createLocalSettingsTemplate, mergeJsonFile } from '../lib/json-merge.js';
|
|
7
7
|
import { readManifest, writeManifest, updateManifest } from '../lib/manifest.js';
|
|
@@ -97,6 +97,21 @@ export async function update({ force = false } = {}) {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
+
// Flat file symlinks for agents (enables Claude Code agent discovery)
|
|
101
|
+
{
|
|
102
|
+
const sourceDir = join(paths.automatasaurus, 'agents');
|
|
103
|
+
const targetDir = join(paths.claude, 'agents');
|
|
104
|
+
try {
|
|
105
|
+
const created = await symlinkAgentFiles(sourceDir, targetDir);
|
|
106
|
+
for (const file of created) {
|
|
107
|
+
allSymlinks.push(`agents/${file}`);
|
|
108
|
+
}
|
|
109
|
+
console.log(` Updated agents/ flat files (${created.length} files)`);
|
|
110
|
+
} catch (error) {
|
|
111
|
+
if (error.code !== 'ENOENT') throw error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
100
115
|
// File-level symlinks (hooks, commands)
|
|
101
116
|
for (const dir of FILE_SYMLINK_DIRS) {
|
|
102
117
|
const sourceDir = join(paths.automatasaurus, dir);
|
package/src/lib/symlinks.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { symlink, unlink, readlink, mkdir, readdir, stat } from 'node:fs/promises';
|
|
1
|
+
import { symlink, unlink, readlink, mkdir, readdir, stat, access } from 'node:fs/promises';
|
|
2
2
|
import { join, dirname, relative } from 'node:path';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -125,3 +125,43 @@ export async function symlinkSubdirectories(sourceDir, targetDir) {
|
|
|
125
125
|
|
|
126
126
|
return created;
|
|
127
127
|
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Create flat file symlinks for agent AGENT.md files.
|
|
131
|
+
* For each agent subdirectory containing AGENT.md, creates:
|
|
132
|
+
* targetDir/{name}.md -> sourceDir/{name}/AGENT.md
|
|
133
|
+
*
|
|
134
|
+
* This enables Claude Code's flat-file agent discovery while
|
|
135
|
+
* preserving subdirectory symlinks for PROJECT.md support.
|
|
136
|
+
*/
|
|
137
|
+
export async function symlinkAgentFiles(sourceDir, targetDir) {
|
|
138
|
+
await mkdir(targetDir, { recursive: true });
|
|
139
|
+
|
|
140
|
+
const created = [];
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
const entries = await readdir(sourceDir, { withFileTypes: true });
|
|
144
|
+
|
|
145
|
+
for (const entry of entries) {
|
|
146
|
+
if (!entry.isDirectory()) continue;
|
|
147
|
+
|
|
148
|
+
const agentMdPath = join(sourceDir, entry.name, 'AGENT.md');
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
await access(agentMdPath);
|
|
152
|
+
} catch {
|
|
153
|
+
continue; // No AGENT.md in this subdirectory
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const target = join(targetDir, `${entry.name}.md`);
|
|
157
|
+
await createSymlink(agentMdPath, target);
|
|
158
|
+
created.push(`${entry.name}.md`);
|
|
159
|
+
}
|
|
160
|
+
} catch (error) {
|
|
161
|
+
if (error.code !== 'ENOENT') {
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return created;
|
|
167
|
+
}
|
package/template/CLAUDE.block.md
CHANGED
|
@@ -48,10 +48,10 @@ The following agents are available in `.claude/agents/`:
|
|
|
48
48
|
| Agent | Role | Model | Review Status |
|
|
49
49
|
|-------|------|-------|---------------|
|
|
50
50
|
| `architect` | System design, ADRs, stuck-issue analysis, PR review | Opus | **Required** |
|
|
51
|
-
| `evolver` | PROJECT.md generation, context synthesis |
|
|
52
|
-
| `designer` | UI/UX specs, accessibility, design review |
|
|
53
|
-
| `developer` | Implementation, PRs, addressing feedback |
|
|
54
|
-
| `tester` | QA, Playwright, verification |
|
|
51
|
+
| `evolver` | PROJECT.md generation, context synthesis | Opus | N/A |
|
|
52
|
+
| `designer` | UI/UX specs, accessibility, design review | Opus | If UI changes |
|
|
53
|
+
| `developer` | Implementation, PRs, addressing feedback | Opus | N/A |
|
|
54
|
+
| `tester` | QA, Playwright, verification | Opus | **Required** |
|
|
55
55
|
|
|
56
56
|
**Note:** Commands handle orchestration. Agents are autonomous workers invoked by commands.
|
|
57
57
|
|
|
@@ -255,7 +255,7 @@ When the `/auto-work-issue` or `/auto-work-all` commands spawn agents, they:
|
|
|
255
255
|
3. **Read the agent's report** after the Task returns
|
|
256
256
|
4. **Include report summary** in the next agent's briefing
|
|
257
257
|
|
|
258
|
-
|
|
258
|
+
Claude Code auto-loads each agent's system prompt from `.claude/agents/{name}.md` when spawned with matching `subagent_type`. Agents follow a **briefing protocol**:
|
|
259
259
|
1. Read the briefing file first
|
|
260
260
|
2. Do their work
|
|
261
261
|
3. Write a report before completing
|
|
@@ -3,12 +3,17 @@ name: architect
|
|
|
3
3
|
description: Software Architect for system design, technical decisions, and code review. Use for reviewing discovery plans, reviewing PRs, or analyzing stuck issues. Required reviewer for all PRs.
|
|
4
4
|
tools: Read, Edit, Write, Grep, Glob, Bash, WebSearch
|
|
5
5
|
model: opus
|
|
6
|
+
skills:
|
|
7
|
+
- code-review
|
|
6
8
|
---
|
|
7
9
|
|
|
8
10
|
# Architect Agent
|
|
9
11
|
|
|
10
12
|
You are a senior Software Architect responsible for technical vision and structural integrity of the codebase.
|
|
11
13
|
|
|
14
|
+
## Project Context
|
|
15
|
+
If `.claude/agents/architect/PROJECT.md` exists, read it before starting any task. It contains project-specific context, conventions, and guidance tailored to your role.
|
|
16
|
+
|
|
12
17
|
## Responsibilities
|
|
13
18
|
|
|
14
19
|
1. **Discovery Review**: Review discovery plans for technical feasibility
|
|
@@ -9,6 +9,9 @@ model: opus
|
|
|
9
9
|
|
|
10
10
|
You are a UI/UX Designer responsible for creating intuitive, accessible, and visually coherent user experiences.
|
|
11
11
|
|
|
12
|
+
## Project Context
|
|
13
|
+
If `.claude/agents/designer/PROJECT.md` exists, read it before starting any task. It contains project-specific context, conventions, and guidance tailored to your role.
|
|
14
|
+
|
|
12
15
|
## Design Philosophy
|
|
13
16
|
|
|
14
17
|
When creating or reviewing designs, apply these principles:
|
|
@@ -3,12 +3,18 @@ name: developer
|
|
|
3
3
|
description: Developer persona for implementing features, fixing bugs, and writing code. Use when writing code, implementing designs, fixing issues, or creating pull requests.
|
|
4
4
|
tools: Read, Edit, Write, Bash, Grep, Glob
|
|
5
5
|
model: opus
|
|
6
|
+
skills:
|
|
7
|
+
- pr-writing
|
|
8
|
+
permissionMode: acceptEdits
|
|
6
9
|
---
|
|
7
10
|
|
|
8
11
|
# Developer Agent
|
|
9
12
|
|
|
10
13
|
You are a Software Developer responsible for implementing features, fixing bugs, and maintaining code quality.
|
|
11
14
|
|
|
15
|
+
## Project Context
|
|
16
|
+
If `.claude/agents/developer/PROJECT.md` exists, read it before starting any task. It contains project-specific context, conventions, and guidance tailored to your role.
|
|
17
|
+
|
|
12
18
|
## First Steps
|
|
13
19
|
|
|
14
20
|
Before writing code:
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: evolver
|
|
3
3
|
description: Generate project-specific context files for sub-agents after planning. Synthesizes discovery and implementation plan into tailored guidance for each agent.
|
|
4
4
|
tools: Read, Write, Glob
|
|
5
|
-
model:
|
|
5
|
+
model: opus
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Evolver Agent
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tester
|
|
3
3
|
description: QA/Tester agent that EXECUTES browser tests using Playwright MCP. Does not write test plans - actually navigates, clicks, and verifies using mcp__playwright__* tools. Unit tests alone are NOT sufficient. Escalates if app cannot run.
|
|
4
|
-
tools: Read, Edit, Write, Bash, Grep, Glob
|
|
4
|
+
tools: Read, Edit, Write, Bash, Grep, Glob
|
|
5
5
|
model: opus
|
|
6
|
+
mcpServers:
|
|
7
|
+
playwright: {}
|
|
8
|
+
permissionMode: acceptEdits
|
|
6
9
|
---
|
|
7
10
|
|
|
8
11
|
# Tester Agent
|
|
9
12
|
|
|
13
|
+
## Project Context
|
|
14
|
+
If `.claude/agents/tester/PROJECT.md` exists, read it before starting any task. It contains project-specific context, conventions, and guidance tailored to your role.
|
|
15
|
+
|
|
10
16
|
## Your Role: QA Engineer (Not a Developer)
|
|
11
17
|
|
|
12
18
|
**You are a QA Engineer.** Your job is to TEST the software by actually using it - clicking buttons, filling forms, navigating pages, and verifying behavior.
|
|
@@ -223,16 +223,26 @@ After creating discovery.md, get feedback from specialist agents:
|
|
|
223
223
|
|
|
224
224
|
### Architect Review
|
|
225
225
|
```
|
|
226
|
-
Use the
|
|
227
|
-
|
|
228
|
-
|
|
226
|
+
Use the Task tool with:
|
|
227
|
+
subagent_type: "architect"
|
|
228
|
+
model: "opus"
|
|
229
|
+
description: "Architect review discovery plan"
|
|
230
|
+
prompt: |
|
|
231
|
+
Review this discovery plan for technical feasibility.
|
|
232
|
+
Focus on: architecture fit, scalability, security implications, technology choices.
|
|
233
|
+
The discovery plan is at: [path to discovery.md]
|
|
229
234
|
```
|
|
230
235
|
|
|
231
236
|
### Designer Review
|
|
232
237
|
```
|
|
233
|
-
Use the
|
|
234
|
-
|
|
235
|
-
|
|
238
|
+
Use the Task tool with:
|
|
239
|
+
subagent_type: "designer"
|
|
240
|
+
model: "opus"
|
|
241
|
+
description: "Designer review discovery plan"
|
|
242
|
+
prompt: |
|
|
243
|
+
Review this discovery plan for UI/UX considerations.
|
|
244
|
+
Focus on: user flows, accessibility, responsive design, missing UI requirements.
|
|
245
|
+
The discovery plan is at: [path to discovery.md]
|
|
236
246
|
```
|
|
237
247
|
|
|
238
248
|
Present the feedback to the user. Refine the discovery document based on feedback.
|
|
@@ -82,14 +82,10 @@ Before implementation begins, spawn the Designer agent to establish the visual f
|
|
|
82
82
|
|
|
83
83
|
```
|
|
84
84
|
Use the Task tool with:
|
|
85
|
-
subagent_type: "
|
|
86
|
-
model: "
|
|
85
|
+
subagent_type: "designer"
|
|
86
|
+
model: "opus"
|
|
87
87
|
description: "Create design language"
|
|
88
88
|
prompt: |
|
|
89
|
-
You are the Designer agent. Load your role from .claude/agents/designer/AGENT.md
|
|
90
|
-
|
|
91
|
-
**[Designer]**
|
|
92
|
-
|
|
93
89
|
Establish the design language and style guide for this project.
|
|
94
90
|
|
|
95
91
|
1. Check for existing design documentation:
|
|
@@ -216,9 +216,8 @@ Agent: {role}
|
|
|
216
216
|
- PR created with "Closes #{number}"
|
|
217
217
|
|
|
218
218
|
3. Use Task tool with:
|
|
219
|
+
subagent_type: "developer"
|
|
219
220
|
prompt: |
|
|
220
|
-
You are the Developer agent. Load your role from .claude/agents/developer/AGENT.md
|
|
221
|
-
|
|
222
221
|
Read orchestration/issues/{number}-{slug}/BRIEFING-implement.md first.
|
|
223
222
|
|
|
224
223
|
After completing your work, write your report to:
|
|
@@ -254,9 +253,8 @@ Agent: {role}
|
|
|
254
253
|
- OR ❌ CHANGES REQUESTED - Architect
|
|
255
254
|
|
|
256
255
|
2. Use Task tool with:
|
|
256
|
+
subagent_type: "architect"
|
|
257
257
|
prompt: |
|
|
258
|
-
You are the Architect agent. Load your role from .claude/agents/architect/AGENT.md
|
|
259
|
-
|
|
260
258
|
Read orchestration/issues/{number}-{slug}/BRIEFING-architect-review.md first.
|
|
261
259
|
|
|
262
260
|
After completing your review, write your report to:
|
|
@@ -286,9 +284,8 @@ Agent: {role}
|
|
|
286
284
|
Post design specifications as issue comment following AGENT.md template.
|
|
287
285
|
|
|
288
286
|
2. Use Task tool with:
|
|
287
|
+
subagent_type: "designer"
|
|
289
288
|
prompt: |
|
|
290
|
-
You are the Designer agent. Load your role from .claude/agents/designer/AGENT.md
|
|
291
|
-
|
|
292
289
|
Read orchestration/issues/{number}-{slug}/BRIEFING-design-specs.md first.
|
|
293
290
|
|
|
294
291
|
After completing your specs, write your report to:
|
|
@@ -324,9 +321,8 @@ Agent: {role}
|
|
|
324
321
|
- OR N/A - No UI changes
|
|
325
322
|
|
|
326
323
|
2. Use Task tool with:
|
|
324
|
+
subagent_type: "designer"
|
|
327
325
|
prompt: |
|
|
328
|
-
You are the Designer agent. Load your role from .claude/agents/designer/AGENT.md
|
|
329
|
-
|
|
330
326
|
Read orchestration/issues/{number}-{slug}/BRIEFING-designer-review.md first.
|
|
331
327
|
|
|
332
328
|
After completing your review, write your report to:
|
|
@@ -362,9 +358,8 @@ Agent: {role}
|
|
|
362
358
|
- OR ❌ CHANGES REQUESTED - Tester
|
|
363
359
|
|
|
364
360
|
2. Use Task tool with:
|
|
361
|
+
subagent_type: "tester"
|
|
365
362
|
prompt: |
|
|
366
|
-
You are the Tester agent. Load your role from .claude/agents/tester/AGENT.md
|
|
367
|
-
|
|
368
363
|
Read orchestration/issues/{number}-{slug}/BRIEFING-test.md first.
|
|
369
364
|
|
|
370
365
|
After completing verification, write your report to:
|
|
@@ -167,12 +167,10 @@ Post design specifications as an issue comment following your AGENT.md template,
|
|
|
167
167
|
|
|
168
168
|
```
|
|
169
169
|
Use the Task tool with:
|
|
170
|
-
subagent_type: "
|
|
171
|
-
model: "
|
|
170
|
+
subagent_type: "designer"
|
|
171
|
+
model: "opus"
|
|
172
172
|
description: "Designer specs for issue #{ISSUE_NUMBER}"
|
|
173
173
|
prompt: |
|
|
174
|
-
You are the Designer agent. Load your role from .claude/agents/designer/AGENT.md
|
|
175
|
-
|
|
176
174
|
Read orchestration/issues/{ISSUE_NUMBER}-{slug}/BRIEFING-design-specs.md first.
|
|
177
175
|
|
|
178
176
|
After completing your work, write your report to:
|
|
@@ -227,12 +225,10 @@ Implement issue #{ISSUE_NUMBER}: {title}
|
|
|
227
225
|
|
|
228
226
|
```
|
|
229
227
|
Use the Task tool with:
|
|
230
|
-
subagent_type: "
|
|
231
|
-
model: "
|
|
228
|
+
subagent_type: "developer"
|
|
229
|
+
model: "opus"
|
|
232
230
|
description: "Implement issue #{ISSUE_NUMBER}"
|
|
233
231
|
prompt: |
|
|
234
|
-
You are the Developer agent. Load your role from .claude/agents/developer/AGENT.md
|
|
235
|
-
|
|
236
232
|
Read orchestration/issues/{ISSUE_NUMBER}-{slug}/BRIEFING-implement.md first.
|
|
237
233
|
|
|
238
234
|
After completing your work, write your report to:
|
|
@@ -345,12 +341,10 @@ Spawn all reviewers in parallel (single message, multiple Task calls):
|
|
|
345
341
|
```
|
|
346
342
|
# Architect review
|
|
347
343
|
Use the Task tool with:
|
|
348
|
-
subagent_type: "
|
|
349
|
-
model: "
|
|
344
|
+
subagent_type: "architect"
|
|
345
|
+
model: "opus"
|
|
350
346
|
description: "Architect review PR #{pr_number}"
|
|
351
347
|
prompt: |
|
|
352
|
-
You are the Architect agent. Load your role from .claude/agents/architect/AGENT.md
|
|
353
|
-
|
|
354
348
|
Read orchestration/issues/{ISSUE_NUMBER}-{slug}/BRIEFING-architect-review.md first.
|
|
355
349
|
|
|
356
350
|
After completing your review, write your report to:
|
|
@@ -358,12 +352,10 @@ Use the Task tool with:
|
|
|
358
352
|
|
|
359
353
|
# Designer review (if UI)
|
|
360
354
|
Use the Task tool with:
|
|
361
|
-
subagent_type: "
|
|
362
|
-
model: "
|
|
355
|
+
subagent_type: "designer"
|
|
356
|
+
model: "opus"
|
|
363
357
|
description: "Designer review PR #{pr_number}"
|
|
364
358
|
prompt: |
|
|
365
|
-
You are the Designer agent. Load your role from .claude/agents/designer/AGENT.md
|
|
366
|
-
|
|
367
359
|
Read orchestration/issues/{ISSUE_NUMBER}-{slug}/BRIEFING-designer-review.md first.
|
|
368
360
|
|
|
369
361
|
After completing your review, write your report to:
|
|
@@ -371,12 +363,10 @@ Use the Task tool with:
|
|
|
371
363
|
|
|
372
364
|
# Tester verification
|
|
373
365
|
Use the Task tool with:
|
|
374
|
-
subagent_type: "
|
|
375
|
-
model: "
|
|
366
|
+
subagent_type: "tester"
|
|
367
|
+
model: "opus"
|
|
376
368
|
description: "Tester verify PR #{pr_number}"
|
|
377
369
|
prompt: |
|
|
378
|
-
You are the Tester agent. Load your role from .claude/agents/tester/AGENT.md
|
|
379
|
-
|
|
380
370
|
Read orchestration/issues/{ISSUE_NUMBER}-{slug}/BRIEFING-test.md first.
|
|
381
371
|
|
|
382
372
|
After completing verification, write your report to:
|
|
@@ -437,12 +427,10 @@ Address review feedback on PR #{pr_number}.
|
|
|
437
427
|
|
|
438
428
|
```
|
|
439
429
|
Use the Task tool with:
|
|
440
|
-
subagent_type: "
|
|
441
|
-
model: "
|
|
430
|
+
subagent_type: "developer"
|
|
431
|
+
model: "opus"
|
|
442
432
|
description: "Address feedback PR #{pr_number}"
|
|
443
433
|
prompt: |
|
|
444
|
-
You are the Developer agent. Load your role from .claude/agents/developer/AGENT.md
|
|
445
|
-
|
|
446
434
|
Read orchestration/issues/{ISSUE_NUMBER}-{slug}/BRIEFING-address-feedback.md first.
|
|
447
435
|
|
|
448
436
|
After completing fixes, write your report to:
|