maestro-flow 0.4.24 → 0.4.26
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/.agents/skills/maestro-impeccable/SKILL.md +5 -1
- package/.agents/skills/maestro-next/SKILL.md +7 -1
- package/.agents/skills/maestro-player/SKILL.md +9 -2
- package/.agents/skills/maestro-tools-execute/SKILL.md +4 -4
- package/.agents/skills/spec-load/SKILL.md +11 -4
- package/.agy/skills/maestro-impeccable/SKILL.md +5 -1
- package/.agy/skills/maestro-next/SKILL.md +7 -1
- package/.agy/skills/maestro-player/SKILL.md +9 -2
- package/.agy/skills/maestro-tools-execute/SKILL.md +4 -4
- package/.agy/skills/spec-load/SKILL.md +11 -4
- package/.claude/commands/maestro-impeccable.md +5 -1
- package/.claude/commands/maestro-next.md +7 -1
- package/.claude/commands/maestro-player.md +9 -2
- package/.claude/commands/maestro-tools-execute.md +4 -4
- package/.claude/commands/spec-load.md +11 -4
- package/.codex/skills/learn-second-opinion/SKILL.md +1 -1
- package/.codex/skills/maestro-milestone-audit/SKILL.md +11 -9
- package/.codex/skills/maestro-ui-codify/SKILL.md +3 -3
- package/.codex/skills/quality-debug/SKILL.md +31 -25
- package/.codex/skills/security-audit/SKILL.md +17 -1
- package/.codex/skills/team-review/SKILL.md +2 -2
- package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.js +9 -1
- package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.test.d.ts +1 -0
- package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.test.js +346 -0
- package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.test.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/routes/specs.js +96 -25
- package/dashboard/dist-server/dashboard/src/server/routes/specs.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.d.ts +1 -0
- package/dashboard/dist-server/dashboard/src/shared/constants.js +1 -0
- package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
- package/dashboard/dist-server/src/graph/types.d.ts +98 -0
- package/dashboard/dist-server/src/graph/types.js +19 -1
- package/dashboard/dist-server/src/graph/types.js.map +1 -1
- package/dist/src/agents/cli-agent-runner.d.ts +2 -0
- package/dist/src/agents/cli-agent-runner.d.ts.map +1 -1
- package/dist/src/agents/cli-agent-runner.js +3 -0
- package/dist/src/agents/cli-agent-runner.js.map +1 -1
- package/dist/src/commands/delegate.d.ts +2 -0
- package/dist/src/commands/delegate.d.ts.map +1 -1
- package/dist/src/commands/delegate.js +3 -1
- package/dist/src/commands/delegate.js.map +1 -1
- package/dist/src/commands/kg.d.ts.map +1 -1
- package/dist/src/commands/kg.js +345 -2
- package/dist/src/commands/kg.js.map +1 -1
- package/dist/src/commands/spec.d.ts.map +1 -1
- package/dist/src/commands/spec.js +177 -38
- package/dist/src/commands/spec.js.map +1 -1
- package/dist/src/commands/wiki.d.ts.map +1 -1
- package/dist/src/commands/wiki.js +51 -9
- package/dist/src/commands/wiki.js.map +1 -1
- package/dist/src/config/cli-tools-config.d.ts +18 -0
- package/dist/src/config/cli-tools-config.d.ts.map +1 -1
- package/dist/src/config/cli-tools-config.js +31 -0
- package/dist/src/config/cli-tools-config.js.map +1 -1
- package/dist/src/graph/db/connection.d.ts +22 -0
- package/dist/src/graph/db/connection.d.ts.map +1 -0
- package/dist/src/graph/db/connection.js +113 -0
- package/dist/src/graph/db/connection.js.map +1 -0
- package/dist/src/graph/db/index.d.ts +4 -0
- package/dist/src/graph/db/index.d.ts.map +1 -0
- package/dist/src/graph/db/index.js +4 -0
- package/dist/src/graph/db/index.js.map +1 -0
- package/dist/src/graph/db/migrations.d.ts +5 -0
- package/dist/src/graph/db/migrations.d.ts.map +1 -0
- package/dist/src/graph/db/migrations.js +18 -0
- package/dist/src/graph/db/migrations.js.map +1 -0
- package/dist/src/graph/db/queries.d.ts +50 -0
- package/dist/src/graph/db/queries.d.ts.map +1 -0
- package/dist/src/graph/db/queries.js +313 -0
- package/dist/src/graph/db/queries.js.map +1 -0
- package/dist/src/graph/db/schema.sql +131 -0
- package/dist/src/graph/facade.d.ts +53 -0
- package/dist/src/graph/facade.d.ts.map +1 -0
- package/dist/src/graph/facade.js +172 -0
- package/dist/src/graph/facade.js.map +1 -0
- package/dist/src/graph/graph-queries.d.ts +24 -0
- package/dist/src/graph/graph-queries.d.ts.map +1 -0
- package/dist/src/graph/graph-queries.js +173 -0
- package/dist/src/graph/graph-queries.js.map +1 -0
- package/dist/src/graph/index.d.ts +8 -0
- package/dist/src/graph/index.d.ts.map +1 -1
- package/dist/src/graph/index.js +9 -0
- package/dist/src/graph/index.js.map +1 -1
- package/dist/src/graph/loader.d.ts +8 -0
- package/dist/src/graph/loader.d.ts.map +1 -1
- package/dist/src/graph/loader.js +20 -0
- package/dist/src/graph/loader.js.map +1 -1
- package/dist/src/graph/migration.d.ts +8 -0
- package/dist/src/graph/migration.d.ts.map +1 -0
- package/dist/src/graph/migration.js +134 -0
- package/dist/src/graph/migration.js.map +1 -0
- package/dist/src/graph/search/index.d.ts +4 -0
- package/dist/src/graph/search/index.d.ts.map +1 -0
- package/dist/src/graph/search/index.js +3 -0
- package/dist/src/graph/search/index.js.map +1 -0
- package/dist/src/graph/search/query-parser.d.ts +11 -0
- package/dist/src/graph/search/query-parser.d.ts.map +1 -0
- package/dist/src/graph/search/query-parser.js +111 -0
- package/dist/src/graph/search/query-parser.js.map +1 -0
- package/dist/src/graph/search/query-utils.d.ts +12 -0
- package/dist/src/graph/search/query-utils.d.ts.map +1 -0
- package/dist/src/graph/search/query-utils.js +184 -0
- package/dist/src/graph/search/query-utils.js.map +1 -0
- package/dist/src/graph/sync/content-hash.d.ts +7 -0
- package/dist/src/graph/sync/content-hash.d.ts.map +1 -0
- package/dist/src/graph/sync/content-hash.js +33 -0
- package/dist/src/graph/sync/content-hash.js.map +1 -0
- package/dist/src/graph/sync/incremental-sync.d.ts +23 -0
- package/dist/src/graph/sync/incremental-sync.d.ts.map +1 -0
- package/dist/src/graph/sync/incremental-sync.js +338 -0
- package/dist/src/graph/sync/incremental-sync.js.map +1 -0
- package/dist/src/graph/sync/index.d.ts +7 -0
- package/dist/src/graph/sync/index.d.ts.map +1 -0
- package/dist/src/graph/sync/index.js +5 -0
- package/dist/src/graph/sync/index.js.map +1 -0
- package/dist/src/graph/sync/watch-policy.d.ts +2 -0
- package/dist/src/graph/sync/watch-policy.d.ts.map +1 -0
- package/dist/src/graph/sync/watch-policy.js +38 -0
- package/dist/src/graph/sync/watch-policy.js.map +1 -0
- package/dist/src/graph/sync/watcher.d.ts +44 -0
- package/dist/src/graph/sync/watcher.d.ts.map +1 -0
- package/dist/src/graph/sync/watcher.js +153 -0
- package/dist/src/graph/sync/watcher.js.map +1 -0
- package/dist/src/graph/traversal.d.ts +37 -0
- package/dist/src/graph/traversal.d.ts.map +1 -0
- package/dist/src/graph/traversal.js +335 -0
- package/dist/src/graph/traversal.js.map +1 -0
- package/dist/src/graph/types.d.ts +98 -0
- package/dist/src/graph/types.d.ts.map +1 -1
- package/dist/src/graph/types.js +19 -1
- package/dist/src/graph/types.js.map +1 -1
- package/dist/src/utils/update-notices.js +21 -0
- package/dist/src/utils/update-notices.js.map +1 -1
- package/package.json +4 -2
- package/workflows/analyze.md +19 -13
|
@@ -147,7 +147,11 @@ Layer 1 did not match. Check for chain-level keywords — even if the prompt als
|
|
|
147
147
|
| design system, tokens, design foundation, design infrastructure | foundation |
|
|
148
148
|
| real-time, live, browser | live |
|
|
149
149
|
|
|
150
|
-
Ambiguous + no `-y
|
|
150
|
+
Ambiguous + no `-y`:
|
|
151
|
+
|
|
152
|
+
ask_user (single-select, header: "意图确认"):
|
|
153
|
+
- Options: top 2-3 matched chains from Layer 2 table, each with label = chain name, description = matched keywords
|
|
154
|
+
- Last option: **"直接构建"** — skip chain, route to Layer 3 craft
|
|
151
155
|
|
|
152
156
|
### Layer 3: Concrete build task → Direct craft
|
|
153
157
|
|
|
@@ -220,7 +220,13 @@ brainstorm → blueprint → init → analyze-macro → roadmap
|
|
|
220
220
|
执行参数: <args>
|
|
221
221
|
```
|
|
222
222
|
|
|
223
|
-
`--dry-run` 展示后结束;`-y` 直接 S_EXECUTE
|
|
223
|
+
`--dry-run` 展示后结束;`-y` 直接 S_EXECUTE;否则:
|
|
224
|
+
|
|
225
|
+
ask_user (single-select, header: "执行确认"):
|
|
226
|
+
- **执行推荐** (Recommended) — run top pick with shown args
|
|
227
|
+
- **选择备选** — pick from alternative commands
|
|
228
|
+
- **修改参数** — adjust args before executing
|
|
229
|
+
- **取消** — do nothing
|
|
224
230
|
|
|
225
231
|
</presentation>
|
|
226
232
|
|
|
@@ -147,13 +147,20 @@ S_COMPLETE:
|
|
|
147
147
|
- **skill/command**: `invoke_skill(skill, resolved_args)` → extract session_id, output_path, artifacts
|
|
148
148
|
- **cli**: `shell(run_in_background: true)` → STOP, wait for callback → `maestro delegate output <id>`
|
|
149
149
|
- **agent**: `delegate_subagent(subagent_type, resolved_args)`
|
|
150
|
-
- **checkpoint**: write checkpoint snapshot. If auto_continue==false:
|
|
150
|
+
- **checkpoint**: write checkpoint snapshot. If auto_continue==false:
|
|
151
|
+
ask_user (single-select, header: "Checkpoint"):
|
|
152
|
+
- **Continue** — proceed to next step
|
|
153
|
+
- **Pause** — save progress, exit (resume with `-c`)
|
|
154
|
+
- **Abort** — stop workflow
|
|
151
155
|
4. Set step status="completed" (or "skipped"/"failed"), write status.json
|
|
152
156
|
|
|
153
157
|
### A_COMPLETE_SESSION
|
|
154
158
|
|
|
155
159
|
Set status="completed", completed_at. Display summary: session, template, steps completed, context, per-step results, artifacts, session dir.
|
|
156
|
-
ask_user
|
|
160
|
+
ask_user (single-select, header: "完成"):
|
|
161
|
+
- **Keep session** — preserve artifacts for reference
|
|
162
|
+
- **Run again** — re-execute with same template
|
|
163
|
+
- **Done** — clean up and exit
|
|
157
164
|
|
|
158
165
|
</actions>
|
|
159
166
|
|
|
@@ -73,10 +73,10 @@ maestro wiki load <knowhow-id>
|
|
|
73
73
|
|
|
74
74
|
### Step 3: Confirm Execution
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
- Execute
|
|
78
|
-
- Adjust parameters
|
|
79
|
-
- View only
|
|
76
|
+
ask_user (single-select, header: "执行方式"):
|
|
77
|
+
- **Execute as-is** (Recommended) — run all steps with current parameters
|
|
78
|
+
- **Adjust parameters** — modify scope or parameters before executing
|
|
79
|
+
- **View only** — display steps without executing
|
|
80
80
|
|
|
81
81
|
### Step 4: Step-by-Step Execution
|
|
82
82
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spec-load
|
|
3
3
|
description: Load specs and lessons for current context
|
|
4
|
-
argument-hint: "[--category <category>] [--keyword <word>]"
|
|
4
|
+
argument-hint: "[--scope <scope>] [--category <category>] [--keyword <word>]"
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- read_file
|
|
7
7
|
- shell
|
|
@@ -11,8 +11,9 @@ allowed-tools:
|
|
|
11
11
|
<!-- Open-standard mirror generated by scripts/build-agents-standard.mjs — do not edit; re-run after editing .claude/ source. -->
|
|
12
12
|
|
|
13
13
|
<purpose>
|
|
14
|
-
Load relevant specs filtered by category (file-level) and/or keyword (entry-level).
|
|
14
|
+
Load relevant specs filtered by scope, category (file-level) and/or keyword (entry-level).
|
|
15
15
|
Category-based loading: loads the category's primary doc in full + matching entries from other files.
|
|
16
|
+
By default, loads from both global (~/.maestro/specs/) and project (.workflow/specs/) layers.
|
|
16
17
|
</purpose>
|
|
17
18
|
|
|
18
19
|
<required_reading>
|
|
@@ -23,6 +24,11 @@ Category-based loading: loads the category's primary doc in full + matching entr
|
|
|
23
24
|
$ARGUMENTS -- optional flags and keyword
|
|
24
25
|
|
|
25
26
|
**Flags:**
|
|
27
|
+
- `--scope <scope>` — Load scope (default: global + project merged):
|
|
28
|
+
- `project`: project baseline only (.workflow/specs/)
|
|
29
|
+
- `global`: global + project merged (~/.maestro/specs/ + .workflow/specs/)
|
|
30
|
+
- `team`: project + team shared (.workflow/collab/specs/)
|
|
31
|
+
- `personal`: project + team + personal (requires uid)
|
|
26
32
|
- `--category <category>` — Load by category: primary category doc (full) + cross-file entries with matching category attr. Categories: coding, arch, test, review, debug, learning, ui.
|
|
27
33
|
- `--keyword <word>` — Filter by keyword within entries
|
|
28
34
|
|
|
@@ -40,7 +46,8 @@ $ARGUMENTS -- optional flags and keyword
|
|
|
40
46
|
|
|
41
47
|
**Examples:**
|
|
42
48
|
```
|
|
43
|
-
/spec-load --category coding # coding全文 + 跨文件coding条目
|
|
49
|
+
/spec-load --category coding # coding全文 + 跨文件coding条目 (global + project)
|
|
50
|
+
/spec-load --scope global --category arch # 明确包含全局 arch 规范
|
|
44
51
|
/spec-load --category review # review-standards + quality-rules + 跨文件review条目
|
|
45
52
|
/spec-load --category coding --keyword auth
|
|
46
53
|
/spec-load --keyword auth
|
|
@@ -59,7 +66,7 @@ Follow '~/.maestro/workflows/specs-load.md' completely.
|
|
|
59
66
|
<error_codes>
|
|
60
67
|
| Code | Severity | Description | Stage |
|
|
61
68
|
|------|----------|-------------|-------|
|
|
62
|
-
| E001 |
|
|
69
|
+
| E001 | warning | `.workflow/specs/` not initialized -- run `/spec-setup` first (global specs still available) | detect_context |
|
|
63
70
|
| W001 | warning | No matching specs found for keyword -- showing all specs in category instead | load_specs |
|
|
64
71
|
</error_codes>
|
|
65
72
|
|
|
@@ -146,7 +146,11 @@ Layer 1 did not match. Check for chain-level keywords — even if the prompt als
|
|
|
146
146
|
| design system, tokens, design foundation, design infrastructure | foundation |
|
|
147
147
|
| real-time, live, browser | live |
|
|
148
148
|
|
|
149
|
-
Ambiguous + no `-y
|
|
149
|
+
Ambiguous + no `-y`:
|
|
150
|
+
|
|
151
|
+
ask_question (single-select, header: "意图确认"):
|
|
152
|
+
- Options: top 2-3 matched chains from Layer 2 table, each with label = chain name, description = matched keywords
|
|
153
|
+
- Last option: **"直接构建"** — skip chain, route to Layer 3 craft
|
|
150
154
|
|
|
151
155
|
### Layer 3: Concrete build task → Direct craft
|
|
152
156
|
|
|
@@ -216,7 +216,13 @@ brainstorm → blueprint → init → analyze-macro → roadmap
|
|
|
216
216
|
执行参数: <args>
|
|
217
217
|
```
|
|
218
218
|
|
|
219
|
-
`--dry-run` 展示后结束;`-y` 直接 S_EXECUTE
|
|
219
|
+
`--dry-run` 展示后结束;`-y` 直接 S_EXECUTE;否则:
|
|
220
|
+
|
|
221
|
+
ask_question (single-select, header: "执行确认"):
|
|
222
|
+
- **执行推荐** (Recommended) — run top pick with shown args
|
|
223
|
+
- **选择备选** — pick from alternative commands
|
|
224
|
+
- **修改参数** — adjust args before executing
|
|
225
|
+
- **取消** — do nothing
|
|
220
226
|
|
|
221
227
|
</presentation>
|
|
222
228
|
|
|
@@ -146,13 +146,20 @@ S_COMPLETE:
|
|
|
146
146
|
- **skill/command**: `Skill(skill, resolved_args)` → extract session_id, output_path, artifacts
|
|
147
147
|
- **cli**: `run_command(run_in_background: true)` → STOP, wait for callback → `maestro delegate output <id>`
|
|
148
148
|
- **agent**: `invoke_subagent([{ TypeName: "<TypeName>", Role: "<Role>", Prompt: "<Prompt>", Workspace: "inherit" }])`
|
|
149
|
-
- **checkpoint**: write checkpoint snapshot. If auto_continue==false:
|
|
149
|
+
- **checkpoint**: write checkpoint snapshot. If auto_continue==false:
|
|
150
|
+
ask_question (single-select, header: "Checkpoint"):
|
|
151
|
+
- **Continue** — proceed to next step
|
|
152
|
+
- **Pause** — save progress, exit (resume with `-c`)
|
|
153
|
+
- **Abort** — stop workflow
|
|
150
154
|
4. Set step status="completed" (or "skipped"/"failed"), write status.json
|
|
151
155
|
|
|
152
156
|
### A_COMPLETE_SESSION
|
|
153
157
|
|
|
154
158
|
Set status="completed", completed_at. Display summary: session, template, steps completed, context, per-step results, artifacts, session dir.
|
|
155
|
-
ask_question
|
|
159
|
+
ask_question (single-select, header: "完成"):
|
|
160
|
+
- **Keep session** — preserve artifacts for reference
|
|
161
|
+
- **Run again** — re-execute with same template
|
|
162
|
+
- **Done** — clean up and exit
|
|
156
163
|
|
|
157
164
|
</actions>
|
|
158
165
|
|
|
@@ -73,10 +73,10 @@ maestro wiki load <knowhow-id>
|
|
|
73
73
|
|
|
74
74
|
### Step 3: Confirm Execution
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
- Execute
|
|
78
|
-
- Adjust parameters
|
|
79
|
-
- View only
|
|
76
|
+
ask_question (single-select, header: "执行方式"):
|
|
77
|
+
- **Execute as-is** (Recommended) — run all steps with current parameters
|
|
78
|
+
- **Adjust parameters** — modify scope or parameters before executing
|
|
79
|
+
- **View only** — display steps without executing
|
|
80
80
|
|
|
81
81
|
### Step 4: Step-by-Step Execution
|
|
82
82
|
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spec-load
|
|
3
3
|
description: Load specs and lessons for current context
|
|
4
|
-
argument-hint: [--category <category>] [--keyword <word>]
|
|
4
|
+
argument-hint: [--scope <scope>] [--category <category>] [--keyword <word>]
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- grep_search
|
|
7
7
|
- run_command
|
|
8
8
|
- view_file
|
|
9
9
|
---
|
|
10
10
|
<purpose>
|
|
11
|
-
Load relevant specs filtered by category (file-level) and/or keyword (entry-level).
|
|
11
|
+
Load relevant specs filtered by scope, category (file-level) and/or keyword (entry-level).
|
|
12
12
|
Category-based loading: loads the category's primary doc in full + matching entries from other files.
|
|
13
|
+
By default, loads from both global (~/.maestro/specs/) and project (.workflow/specs/) layers.
|
|
13
14
|
</purpose>
|
|
14
15
|
|
|
15
16
|
<required_reading>
|
|
@@ -20,6 +21,11 @@ Category-based loading: loads the category's primary doc in full + matching entr
|
|
|
20
21
|
$ARGUMENTS -- optional flags and keyword
|
|
21
22
|
|
|
22
23
|
**Flags:**
|
|
24
|
+
- `--scope <scope>` — Load scope (default: global + project merged):
|
|
25
|
+
- `project`: project baseline only (.workflow/specs/)
|
|
26
|
+
- `global`: global + project merged (~/.maestro/specs/ + .workflow/specs/)
|
|
27
|
+
- `team`: project + team shared (.workflow/collab/specs/)
|
|
28
|
+
- `personal`: project + team + personal (requires uid)
|
|
23
29
|
- `--category <category>` — Load by category: primary category doc (full) + cross-file entries with matching category attr. Categories: coding, arch, test, review, debug, learning, ui.
|
|
24
30
|
- `--keyword <word>` — Filter by keyword within entries
|
|
25
31
|
|
|
@@ -37,7 +43,8 @@ $ARGUMENTS -- optional flags and keyword
|
|
|
37
43
|
|
|
38
44
|
**Examples:**
|
|
39
45
|
```
|
|
40
|
-
/spec-load --category coding # coding全文 + 跨文件coding条目
|
|
46
|
+
/spec-load --category coding # coding全文 + 跨文件coding条目 (global + project)
|
|
47
|
+
/spec-load --scope global --category arch # 明确包含全局 arch 规范
|
|
41
48
|
/spec-load --category review # review-standards + quality-rules + 跨文件review条目
|
|
42
49
|
/spec-load --category coding --keyword auth
|
|
43
50
|
/spec-load --keyword auth
|
|
@@ -56,7 +63,7 @@ Follow '~/.maestro/workflows/specs-load.md' completely.
|
|
|
56
63
|
<error_codes>
|
|
57
64
|
| Code | Severity | Description | Stage |
|
|
58
65
|
|------|----------|-------------|-------|
|
|
59
|
-
| E001 |
|
|
66
|
+
| E001 | warning | `.workflow/specs/` not initialized -- run `/spec-setup` first (global specs still available) | detect_context |
|
|
60
67
|
| W001 | warning | No matching specs found for keyword -- showing all specs in category instead | load_specs |
|
|
61
68
|
</error_codes>
|
|
62
69
|
|
|
@@ -145,7 +145,11 @@ Layer 1 did not match. Check for chain-level keywords — even if the prompt als
|
|
|
145
145
|
| design system, tokens, design foundation, design infrastructure | foundation |
|
|
146
146
|
| real-time, live, browser | live |
|
|
147
147
|
|
|
148
|
-
Ambiguous + no `-y
|
|
148
|
+
Ambiguous + no `-y`:
|
|
149
|
+
|
|
150
|
+
AskUserQuestion (single-select, header: "意图确认"):
|
|
151
|
+
- Options: top 2-3 matched chains from Layer 2 table, each with label = chain name, description = matched keywords
|
|
152
|
+
- Last option: **"直接构建"** — skip chain, route to Layer 3 craft
|
|
149
153
|
|
|
150
154
|
### Layer 3: Concrete build task → Direct craft
|
|
151
155
|
|
|
@@ -218,7 +218,13 @@ brainstorm → blueprint → init → analyze-macro → roadmap
|
|
|
218
218
|
执行参数: <args>
|
|
219
219
|
```
|
|
220
220
|
|
|
221
|
-
`--dry-run` 展示后结束;`-y` 直接 S_EXECUTE
|
|
221
|
+
`--dry-run` 展示后结束;`-y` 直接 S_EXECUTE;否则:
|
|
222
|
+
|
|
223
|
+
AskUserQuestion (single-select, header: "执行确认"):
|
|
224
|
+
- **执行推荐** (Recommended) — run top pick with shown args
|
|
225
|
+
- **选择备选** — pick from alternative commands
|
|
226
|
+
- **修改参数** — adjust args before executing
|
|
227
|
+
- **取消** — do nothing
|
|
222
228
|
|
|
223
229
|
</presentation>
|
|
224
230
|
|
|
@@ -145,13 +145,20 @@ S_COMPLETE:
|
|
|
145
145
|
- **skill/command**: `Skill(skill, resolved_args)` → extract session_id, output_path, artifacts
|
|
146
146
|
- **cli**: `Bash(run_in_background: true)` → STOP, wait for callback → `maestro delegate output <id>`
|
|
147
147
|
- **agent**: `Agent(subagent_type, resolved_args)`
|
|
148
|
-
- **checkpoint**: write checkpoint snapshot. If auto_continue==false:
|
|
148
|
+
- **checkpoint**: write checkpoint snapshot. If auto_continue==false:
|
|
149
|
+
AskUserQuestion (single-select, header: "Checkpoint"):
|
|
150
|
+
- **Continue** — proceed to next step
|
|
151
|
+
- **Pause** — save progress, exit (resume with `-c`)
|
|
152
|
+
- **Abort** — stop workflow
|
|
149
153
|
4. Set step status="completed" (or "skipped"/"failed"), write status.json
|
|
150
154
|
|
|
151
155
|
### A_COMPLETE_SESSION
|
|
152
156
|
|
|
153
157
|
Set status="completed", completed_at. Display summary: session, template, steps completed, context, per-step results, artifacts, session dir.
|
|
154
|
-
AskUserQuestion
|
|
158
|
+
AskUserQuestion (single-select, header: "完成"):
|
|
159
|
+
- **Keep session** — preserve artifacts for reference
|
|
160
|
+
- **Run again** — re-execute with same template
|
|
161
|
+
- **Done** — clean up and exit
|
|
155
162
|
|
|
156
163
|
</actions>
|
|
157
164
|
|
|
@@ -71,10 +71,10 @@ maestro wiki load <knowhow-id>
|
|
|
71
71
|
|
|
72
72
|
### Step 3: Confirm Execution
|
|
73
73
|
|
|
74
|
-
|
|
75
|
-
- Execute
|
|
76
|
-
- Adjust parameters
|
|
77
|
-
- View only
|
|
74
|
+
AskUserQuestion (single-select, header: "执行方式"):
|
|
75
|
+
- **Execute as-is** (Recommended) — run all steps with current parameters
|
|
76
|
+
- **Adjust parameters** — modify scope or parameters before executing
|
|
77
|
+
- **View only** — display steps without executing
|
|
78
78
|
|
|
79
79
|
### Step 4: Step-by-Step Execution
|
|
80
80
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spec-load
|
|
3
3
|
description: Load specs and lessons for current context
|
|
4
|
-
argument-hint: "[--category <category>] [--keyword <word>]"
|
|
4
|
+
argument-hint: "[--scope <scope>] [--category <category>] [--keyword <word>]"
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- Read
|
|
7
7
|
- Bash
|
|
@@ -9,8 +9,9 @@ allowed-tools:
|
|
|
9
9
|
- Grep
|
|
10
10
|
---
|
|
11
11
|
<purpose>
|
|
12
|
-
Load relevant specs filtered by category (file-level) and/or keyword (entry-level).
|
|
12
|
+
Load relevant specs filtered by scope, category (file-level) and/or keyword (entry-level).
|
|
13
13
|
Category-based loading: loads the category's primary doc in full + matching entries from other files.
|
|
14
|
+
By default, loads from both global (~/.maestro/specs/) and project (.workflow/specs/) layers.
|
|
14
15
|
</purpose>
|
|
15
16
|
|
|
16
17
|
<required_reading>
|
|
@@ -21,6 +22,11 @@ Category-based loading: loads the category's primary doc in full + matching entr
|
|
|
21
22
|
$ARGUMENTS -- optional flags and keyword
|
|
22
23
|
|
|
23
24
|
**Flags:**
|
|
25
|
+
- `--scope <scope>` — Load scope (default: global + project merged):
|
|
26
|
+
- `project`: project baseline only (.workflow/specs/)
|
|
27
|
+
- `global`: global + project merged (~/.maestro/specs/ + .workflow/specs/)
|
|
28
|
+
- `team`: project + team shared (.workflow/collab/specs/)
|
|
29
|
+
- `personal`: project + team + personal (requires uid)
|
|
24
30
|
- `--category <category>` — Load by category: primary category doc (full) + cross-file entries with matching category attr. Categories: coding, arch, test, review, debug, learning, ui.
|
|
25
31
|
- `--keyword <word>` — Filter by keyword within entries
|
|
26
32
|
|
|
@@ -38,7 +44,8 @@ $ARGUMENTS -- optional flags and keyword
|
|
|
38
44
|
|
|
39
45
|
**Examples:**
|
|
40
46
|
```
|
|
41
|
-
/spec-load --category coding # coding全文 + 跨文件coding条目
|
|
47
|
+
/spec-load --category coding # coding全文 + 跨文件coding条目 (global + project)
|
|
48
|
+
/spec-load --scope global --category arch # 明确包含全局 arch 规范
|
|
42
49
|
/spec-load --category review # review-standards + quality-rules + 跨文件review条目
|
|
43
50
|
/spec-load --category coding --keyword auth
|
|
44
51
|
/spec-load --keyword auth
|
|
@@ -57,7 +64,7 @@ Follow '~/.maestro/workflows/specs-load.md' completely.
|
|
|
57
64
|
<error_codes>
|
|
58
65
|
| Code | Severity | Description | Stage |
|
|
59
66
|
|------|----------|-------------|-------|
|
|
60
|
-
| E001 |
|
|
67
|
+
| E001 | warning | `.workflow/specs/` not initialized -- run `/spec-setup` first (global specs still available) | detect_context |
|
|
61
68
|
| W001 | warning | No matching specs found for keyword -- showing all specs in category instead | load_specs |
|
|
62
69
|
</error_codes>
|
|
63
70
|
|
|
@@ -64,7 +64,7 @@ Wave 1: 3 persona agents in parallel (filter `wave==1 AND status=="pending"`). W
|
|
|
64
64
|
"summary": { "type": "string", "maxLength": 500 },
|
|
65
65
|
"error": { "type": "string" }
|
|
66
66
|
},
|
|
67
|
-
"required": ["id", "result_status", "summary"]
|
|
67
|
+
"required": ["id", "result_status", "findings", "summary"]
|
|
68
68
|
}
|
|
69
69
|
```
|
|
70
70
|
|
|
@@ -44,7 +44,7 @@ id,title,description,scope,check_targets,deps,wave,status,findings,gaps_found,se
|
|
|
44
44
|
| `check_targets` | Input | Specific verification commands/grep patterns |
|
|
45
45
|
| `deps` | Input | Dependencies (empty — all wave 1) |
|
|
46
46
|
| `wave` | Computed | Wave number (always 1 — single parallel wave) |
|
|
47
|
-
| `status` | Lifecycle | `pending` (initial) → `
|
|
47
|
+
| `status` | Lifecycle | `pending` (initial) → `completed`/`failed` (set by merge step from worker's `result_status`) |
|
|
48
48
|
| `findings` | Lifecycle | Detailed findings per dimension (max 500 chars; merged) |
|
|
49
49
|
| `gaps_found` | Lifecycle | Semicolon-separated list of integration gaps (merged) |
|
|
50
50
|
| `severity` | Lifecycle | `critical` / `warning` / `info` per gap (merged) |
|
|
@@ -105,18 +105,19 @@ spawn_agents_on_csv({
|
|
|
105
105
|
type: "object",
|
|
106
106
|
properties: {
|
|
107
107
|
id: { type: "string" },
|
|
108
|
-
result_status: { type: "string", enum: ["
|
|
108
|
+
result_status: { type: "string", enum: ["completed", "failed"] },
|
|
109
|
+
audit_verdict: { type: "string", enum: ["pass", "fail", "warning"], description: "Audit check outcome" },
|
|
109
110
|
findings: { type: "string", maxLength: 500 },
|
|
110
111
|
gaps_found: { type: "string", description: "Semicolon-separated list of gaps" },
|
|
111
112
|
severity: { type: "string", enum: ["critical", "warning", "info", ""] },
|
|
112
113
|
error: { type: "string" }
|
|
113
114
|
},
|
|
114
|
-
required: ["id", "result_status", "findings", "severity"]
|
|
115
|
+
required: ["id", "result_status", "audit_verdict", "findings", "severity"]
|
|
115
116
|
}
|
|
116
117
|
})
|
|
117
118
|
```
|
|
118
119
|
|
|
119
|
-
4. Merge results into master `tasks.csv`: map `result_status` → master `status` column, copy `findings`, `gaps_found`, `severity`, `error`. Delete temporary files (`wave-1.csv`, `wave-1-results.csv`) after merge.
|
|
120
|
+
4. Merge results into master `tasks.csv`: map `result_status` → master `status` column, copy `audit_verdict`, `findings`, `gaps_found`, `severity`, `error`. Delete temporary files (`wave-1.csv`, `wave-1-results.csv`) after merge.
|
|
120
121
|
|
|
121
122
|
#### Integration Checker Worker Contract (AUDIT_INTEGRATION_INSTRUCTION)
|
|
122
123
|
|
|
@@ -134,9 +135,9 @@ REQUIRED STEPS:
|
|
|
134
135
|
5. Call report_agent_job_result EXACTLY ONCE
|
|
135
136
|
|
|
136
137
|
TERMINATION CONTRACT (mandatory — NO worker may end without calling report_agent_job_result):
|
|
137
|
-
- Pass path → no gaps found → result_status=pass, severity="info"
|
|
138
|
-
- Warning path → minor gaps → result_status=warning, severity="warning"
|
|
139
|
-
- Fail path → critical contract drift or broken dependencies → result_status=fail, severity="critical"
|
|
138
|
+
- Pass path → no gaps found → result_status=completed, audit_verdict=pass, severity="info"
|
|
139
|
+
- Warning path → minor gaps → result_status=completed, audit_verdict=warning, severity="warning"
|
|
140
|
+
- Fail path → critical contract drift or broken dependencies → result_status=completed, audit_verdict=fail, severity="critical"
|
|
140
141
|
- Failure path → cannot read scope, tool error → result_status=failed with error message
|
|
141
142
|
- Timeout path → near 600s, finalize current findings → report with what was collected
|
|
142
143
|
- NEVER skip report_agent_job_result.
|
|
@@ -144,7 +145,8 @@ TERMINATION CONTRACT (mandatory — NO worker may end without calling report_age
|
|
|
144
145
|
OUTPUT (must match output_schema):
|
|
145
146
|
{
|
|
146
147
|
"id": "<your row id>",
|
|
147
|
-
"result_status": "
|
|
148
|
+
"result_status": "completed" | "failed",
|
|
149
|
+
"audit_verdict": "pass" | "warning" | "fail",
|
|
148
150
|
"findings": "<one-sentence summary, max 500 chars>",
|
|
149
151
|
"gaps_found": "<semicolon-separated list of gaps, each with file:line; empty if pass>",
|
|
150
152
|
"severity": "critical" | "warning" | "info" | "",
|
|
@@ -157,7 +159,7 @@ CONSTRAINTS:
|
|
|
157
159
|
- Do NOT call spawn_agents_on_csv (no recursion).
|
|
158
160
|
```
|
|
159
161
|
5. Parse `gaps_found` from all workers — aggregate into `.workflow/milestones/{milestone}/audit-report.md`
|
|
160
|
-
6. Any worker with `
|
|
162
|
+
6. Any worker with `audit_verdict == fail` and `severity == critical` → milestone verdict = FAIL
|
|
161
163
|
|
|
162
164
|
### Step 6: Verdict
|
|
163
165
|
|
|
@@ -90,9 +90,9 @@ id,wave,title,description,agent_type,deps
|
|
|
90
90
|
| `agent_type` | Input | Agent type: discover/extract-style/extract-animation/extract-layout/package/knowhow |
|
|
91
91
|
| `deps` | Input | Semicolon-separated dependency task IDs |
|
|
92
92
|
| `result_status` | Output | `completed` / `failed` (returned via output_schema) |
|
|
93
|
-
| `findings` | Output | Key findings summary (max 500 chars) |
|
|
94
|
-
| `output_path` | Output | Path to generated artifact |
|
|
95
|
-
| `error` | Output | Error message if failed |
|
|
93
|
+
| `findings` | Output | Key findings summary (max 500 chars, via output_schema) |
|
|
94
|
+
| `output_path` | Output | Path to generated artifact (via output_schema) |
|
|
95
|
+
| `error` | Output | Error message if failed (via output_schema) |
|
|
96
96
|
|
|
97
97
|
### Session Structure
|
|
98
98
|
|
|
@@ -110,7 +110,9 @@ id,title,description,hypothesis,deps,context_from,wave,status,findings,evidence_
|
|
|
110
110
|
| `deps` | Input | Semicolon-separated dependency task IDs (wave 2 depends on wave 1) |
|
|
111
111
|
| `context_from` | Input | Semicolon-separated task IDs whose findings this task needs |
|
|
112
112
|
| `wave` | Input | Wave number (1 = investigation, 2 = fix attempt) |
|
|
113
|
-
| `status` | Lifecycle | `pending` (initial) → `
|
|
113
|
+
| `status` | Lifecycle | `pending` (initial) → `completed`/`failed`/`skipped` (set by merge step from worker's `result_status`) |
|
|
114
|
+
| `hypothesis_verdict` | Lifecycle | Wave 1 only: `confirmed`/`refuted`/`inconclusive` (merged from worker output) |
|
|
115
|
+
| `fix_result` | Lifecycle | Wave 2 only: `fixed`/`fix_failed` (merged from worker output) |
|
|
114
116
|
| `findings` | Lifecycle | Key findings summary (max 500 chars; merged from worker output) |
|
|
115
117
|
| `evidence_for` | Lifecycle | Evidence supporting the hypothesis (wave 1; merged) |
|
|
116
118
|
| `evidence_against` | Lifecycle | Evidence refuting the hypothesis (wave 1; merged) |
|
|
@@ -250,21 +252,22 @@ spawn_agents_on_csv({
|
|
|
250
252
|
output_schema: {
|
|
251
253
|
type: "object",
|
|
252
254
|
properties: {
|
|
253
|
-
id:
|
|
254
|
-
result_status:
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
255
|
+
id: { type: "string" },
|
|
256
|
+
result_status: { type: "string", enum: ["completed", "failed"] },
|
|
257
|
+
hypothesis_verdict: { type: "string", enum: ["confirmed", "refuted", "inconclusive"], description: "Investigation outcome" },
|
|
258
|
+
findings: { type: "string", maxLength: 500 },
|
|
259
|
+
evidence_for: { type: "string" },
|
|
260
|
+
evidence_against: { type: "string" },
|
|
261
|
+
error: { type: "string" }
|
|
259
262
|
},
|
|
260
|
-
required: ["id", "result_status", "findings"]
|
|
263
|
+
required: ["id", "result_status", "hypothesis_verdict", "findings"]
|
|
261
264
|
}
|
|
262
265
|
})
|
|
263
266
|
```
|
|
264
267
|
|
|
265
|
-
3. **Merge**: for each row in `wave-1-results.csv`, look up master row by `id` and write `master.status = result_status`, then copy `findings`, `evidence_for`, `evidence_against`, `error`. Delete `wave-1.csv` and `wave-1-results.csv`.
|
|
268
|
+
3. **Merge**: for each row in `wave-1-results.csv`, look up master row by `id` and write `master.status = result_status`, then copy `hypothesis_verdict`, `findings`, `evidence_for`, `evidence_against`, `error`. Delete `wave-1.csv` and `wave-1-results.csv`.
|
|
266
269
|
4. **Wave 2 gating** (read from MASTER `tasks.csv` after merge, NOT from wave-1-results.csv):
|
|
267
|
-
- For each `FIX-H{N}` row: read its `context_from` hypothesis ID (e.g., `H{N}`) from master; if master `H{N}.
|
|
270
|
+
- For each `FIX-H{N}` row: read its `context_from` hypothesis ID (e.g., `H{N}`) from master; if master `H{N}.hypothesis_verdict != "confirmed"`, set `FIX-H{N}.status = "skipped"` (with findings = "upstream hypothesis_verdict={H{N}.hypothesis_verdict}").
|
|
268
271
|
- Only rows where `status == "pending"` proceed to wave 2.
|
|
269
272
|
|
|
270
273
|
#### Wave 1 Worker Contract (WAVE1_INVESTIGATION_INSTRUCTION)
|
|
@@ -281,23 +284,24 @@ REQUIRED STEPS:
|
|
|
281
284
|
1. Read shared discoveries: {sessionFolder}/discoveries.ndjson (may be empty)
|
|
282
285
|
2. Scan codebase for evidence using Read/Grep/Glob (read-only investigation)
|
|
283
286
|
3. Classify the hypothesis based on evidence collected:
|
|
284
|
-
- confirmed → strong evidence supports the hypothesis (file:line proof)
|
|
285
|
-
- refuted → strong evidence contradicts the hypothesis
|
|
286
|
-
- inconclusive → insufficient evidence within time budget; do NOT guess
|
|
287
|
-
- failed → tool error / cannot read files / blocked by environment
|
|
287
|
+
- confirmed → strong evidence supports the hypothesis (file:line proof) → result_status=completed, hypothesis_verdict=confirmed
|
|
288
|
+
- refuted → strong evidence contradicts the hypothesis → result_status=completed, hypothesis_verdict=refuted
|
|
289
|
+
- inconclusive → insufficient evidence within time budget; do NOT guess → result_status=completed, hypothesis_verdict=inconclusive
|
|
290
|
+
- failed → tool error / cannot read files / blocked by environment → result_status=failed
|
|
288
291
|
4. Append discoveries to {sessionFolder}/discoveries.ndjson if reusable (root_cause / hypothesis_evidence types)
|
|
289
292
|
5. Call report_agent_job_result EXACTLY ONCE with the verdict
|
|
290
293
|
|
|
291
294
|
TERMINATION CONTRACT (mandatory — NO worker may end without calling report_agent_job_result):
|
|
292
|
-
- Success path → result_status = confirmed | refuted, with evidence
|
|
293
|
-
- Timeout path → if approaching {max_runtime_seconds}, STOP investigation and report inconclusive
|
|
294
|
-
- Failure path → on any unrecoverable error,
|
|
295
|
+
- Success path → result_status=completed, hypothesis_verdict = confirmed | refuted, with evidence
|
|
296
|
+
- Timeout path → if approaching {max_runtime_seconds}, STOP investigation and report result_status=completed, hypothesis_verdict=inconclusive
|
|
297
|
+
- Failure path → on any unrecoverable error, result_status=failed with error message
|
|
295
298
|
- NEVER continue indefinitely. NEVER exit silently. NEVER omit the call.
|
|
296
299
|
|
|
297
300
|
OUTPUT (return via report_agent_job_result; must match output_schema):
|
|
298
301
|
{
|
|
299
302
|
"id": "<your row id>",
|
|
300
|
-
"result_status": "
|
|
303
|
+
"result_status": "completed" | "failed",
|
|
304
|
+
"hypothesis_verdict": "confirmed" | "refuted" | "inconclusive",
|
|
301
305
|
"findings": "<one-sentence summary, max 500 chars>",
|
|
302
306
|
"evidence_for": "<bullet list of file:line refs supporting, or empty>",
|
|
303
307
|
"evidence_against": "<bullet list of file:line refs refuting, or empty>",
|
|
@@ -328,18 +332,19 @@ spawn_agents_on_csv({
|
|
|
328
332
|
type: "object",
|
|
329
333
|
properties: {
|
|
330
334
|
id: { type: "string" },
|
|
331
|
-
result_status: { type: "string", enum: ["
|
|
335
|
+
result_status: { type: "string", enum: ["completed", "failed"] },
|
|
336
|
+
fix_result: { type: "string", enum: ["fixed", "fix_failed"], description: "Fix attempt outcome" },
|
|
332
337
|
findings: { type: "string", maxLength: 500 },
|
|
333
338
|
fix_applied: { type: "string" },
|
|
334
339
|
verified: { type: "string", enum: ["true", "false"] },
|
|
335
340
|
error: { type: "string" }
|
|
336
341
|
},
|
|
337
|
-
required: ["id", "result_status", "findings", "verified"]
|
|
342
|
+
required: ["id", "result_status", "fix_result", "findings", "verified"]
|
|
338
343
|
}
|
|
339
344
|
})
|
|
340
345
|
```
|
|
341
346
|
|
|
342
|
-
4. **Merge**: write `master.status = result_status`, copy `findings`, `fix_applied`, `verified`, `error`. Delete `wave-2.csv` and `wave-2-results.csv`.
|
|
347
|
+
4. **Merge**: write `master.status = result_status`, copy `fix_result`, `findings`, `fix_applied`, `verified`, `error`. Delete `wave-2.csv` and `wave-2-results.csv`.
|
|
343
348
|
|
|
344
349
|
#### Wave 2 Worker Contract (WAVE2_FIX_INSTRUCTION)
|
|
345
350
|
|
|
@@ -359,16 +364,17 @@ REQUIRED STEPS:
|
|
|
359
364
|
5. Call report_agent_job_result EXACTLY ONCE
|
|
360
365
|
|
|
361
366
|
TERMINATION CONTRACT (mandatory):
|
|
362
|
-
- Success path → fix applied AND verified → result_status=fixed, verified="true"
|
|
363
|
-
- Partial path → fix applied but verification failed → result_status=fix_failed, verified="false"
|
|
364
|
-
- Timeout path → approaching {max_runtime_seconds} with no fix applied → result_status=fix_failed with error="timeout"
|
|
367
|
+
- Success path → fix applied AND verified → result_status=completed, fix_result=fixed, verified="true"
|
|
368
|
+
- Partial path → fix applied but verification failed → result_status=completed, fix_result=fix_failed, verified="false"
|
|
369
|
+
- Timeout path → approaching {max_runtime_seconds} with no fix applied → result_status=completed, fix_result=fix_failed with error="timeout"
|
|
365
370
|
- Failure path → cannot apply fix (file missing, parse error, etc.) → result_status=failed
|
|
366
371
|
- NEVER continue indefinitely. NEVER exit silently. NEVER omit the call.
|
|
367
372
|
|
|
368
373
|
OUTPUT (return via report_agent_job_result; must match output_schema):
|
|
369
374
|
{
|
|
370
375
|
"id": "<your row id>",
|
|
371
|
-
"result_status": "
|
|
376
|
+
"result_status": "completed" | "failed",
|
|
377
|
+
"fix_result": "fixed" | "fix_failed",
|
|
372
378
|
"findings": "<one-sentence summary of what was changed, max 500 chars>",
|
|
373
379
|
"fix_applied": "<file:line description of the change>",
|
|
374
380
|
"verified": "true" | "false",
|
|
@@ -141,7 +141,23 @@ one agent per module. Use `request_user_input` to confirm critical module list b
|
|
|
141
141
|
|
|
142
142
|
**STRIDE spawn contract**:
|
|
143
143
|
- CSV columns: `id, module_path, threats_to_assess, deps, wave, status` (initial `status="pending"`); filter `wave==2 AND status=="pending"`.
|
|
144
|
-
-
|
|
144
|
+
- `output_schema`:
|
|
145
|
+
|
|
146
|
+
```json
|
|
147
|
+
{
|
|
148
|
+
"type": "object",
|
|
149
|
+
"properties": {
|
|
150
|
+
"id": { "type": "string" },
|
|
151
|
+
"result_status": { "type": "string", "enum": ["completed", "failed"] },
|
|
152
|
+
"findings": { "type": "string", "maxLength": 500 },
|
|
153
|
+
"severity_counts": { "type": "string", "description": "JSON: {critical, high, medium, low}" },
|
|
154
|
+
"top_issues": { "type": "string", "description": "JSON array: [{stride_category, threat, severity, file:line, mitigation}]" },
|
|
155
|
+
"error": { "type": "string" }
|
|
156
|
+
},
|
|
157
|
+
"required": ["id", "result_status", "findings"]
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
145
161
|
- Same termination contract as the OWASP spawn above (mandatory `report_agent_job_result`, read-only, no recursion, timeout → partial findings, etc.).
|
|
146
162
|
- Merge: `result_status` → master `status`; copy `findings`, `severity_counts`, `top_issues`, `error`.
|
|
147
163
|
|
|
@@ -187,7 +187,7 @@ You MUST call report_agent_job_result EXACTLY ONCE before exiting. NO exceptions
|
|
|
187
187
|
"findings": "<key findings, max 500 chars>",
|
|
188
188
|
"files_modified": "<semicolon-separated paths or empty>",
|
|
189
189
|
"finding_count": "<integer or empty>",
|
|
190
|
-
"verdict": "
|
|
190
|
+
"verdict": "APPROVE" | "CONDITIONAL" | "BLOCK" | "" (REV only),
|
|
191
191
|
"error": "<message if not completed>"
|
|
192
192
|
}
|
|
193
193
|
|
|
@@ -207,7 +207,7 @@ You MUST call report_agent_job_result EXACTLY ONCE before exiting. NO exceptions
|
|
|
207
207
|
"findings": { "type": "string", "maxLength": 500 },
|
|
208
208
|
"files_modified": { "type": "string" },
|
|
209
209
|
"finding_count": { "type": "string" },
|
|
210
|
-
"verdict": { "type": "string", "enum": ["
|
|
210
|
+
"verdict": { "type": "string", "enum": ["APPROVE", "CONDITIONAL", "BLOCK", ""] },
|
|
211
211
|
"error": { "type": "string" }
|
|
212
212
|
},
|
|
213
213
|
"required": ["id", "result_status", "findings"]
|