maestro-flow 0.4.8 → 0.4.10
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/.agy/agents/cli-explore-agent.md +186 -0
- package/.agy/agents/conceptual-planning-agent.md +244 -0
- package/.agy/agents/impeccable-agent.md +97 -0
- package/.agy/agents/team-supervisor.md +142 -0
- package/.agy/agents/team-worker.md +236 -0
- package/.agy/agents/ui-design-agent.md +286 -0
- package/.agy/agents/workflow-analyzer.md +114 -0
- package/.agy/agents/workflow-codebase-mapper.md +76 -0
- package/.agy/agents/workflow-collab-planner.md +142 -0
- package/.agy/agents/workflow-debugger.md +102 -0
- package/.agy/agents/workflow-executor.md +131 -0
- package/.agy/agents/workflow-external-researcher.md +86 -0
- package/.agy/agents/workflow-integration-checker.md +82 -0
- package/.agy/agents/workflow-nyquist-auditor.md +84 -0
- package/.agy/agents/workflow-phase-researcher.md +84 -0
- package/.agy/agents/workflow-plan-checker.md +89 -0
- package/.agy/agents/workflow-planner.md +194 -0
- package/.agy/agents/workflow-project-researcher.md +73 -0
- package/.agy/agents/workflow-research-synthesizer.md +70 -0
- package/.agy/agents/workflow-reviewer.md +81 -0
- package/.agy/agents/workflow-roadmapper.md +81 -0
- package/.agy/agents/workflow-verifier.md +119 -0
- package/.agy/skills/codify-to-knowhow/SKILL.md +172 -0
- package/.agy/skills/codify-to-knowhow/phases/01-load-manifest.md +101 -0
- package/.agy/skills/codify-to-knowhow/phases/02-generate-knowhow.md +97 -0
- package/.agy/skills/codify-to-knowhow/phases/03-generate-specs.md +92 -0
- package/.agy/skills/codify-to-knowhow/phases/04-index-verify.md +119 -0
- package/.agy/skills/learn-decompose/SKILL.md +118 -0
- package/.agy/skills/learn-follow/SKILL.md +129 -0
- package/.agy/skills/learn-investigate/SKILL.md +154 -0
- package/.agy/skills/learn-retro/SKILL.md +159 -0
- package/.agy/skills/learn-second-opinion/SKILL.md +124 -0
- package/.agy/skills/maestro/SKILL.md +221 -0
- package/.agy/skills/maestro-amend/SKILL.md +162 -0
- package/.agy/skills/maestro-analyze/SKILL.md +135 -0
- package/.agy/skills/maestro-brainstorm/SKILL.md +118 -0
- package/.agy/skills/maestro-collab/SKILL.md +174 -0
- package/.agy/skills/maestro-composer/SKILL.md +180 -0
- package/.agy/skills/maestro-execute/SKILL.md +133 -0
- package/.agy/skills/maestro-fork/SKILL.md +88 -0
- package/.agy/skills/maestro-guard/SKILL.md +101 -0
- package/.agy/skills/maestro-help/SKILL.md +267 -0
- package/.agy/skills/maestro-help/index/catalog.json +184 -0
- package/.agy/skills/maestro-help/phases/01-parse-intent.md +122 -0
- package/.agy/skills/maestro-help/phases/02-search-present.md +181 -0
- package/.agy/skills/maestro-help/phases/03-workflow-guide.md +186 -0
- package/.agy/skills/maestro-impeccable/SKILL.md +250 -0
- package/.agy/skills/maestro-init/SKILL.md +80 -0
- package/.agy/skills/maestro-learn/SKILL.md +142 -0
- package/.agy/skills/maestro-merge/SKILL.md +66 -0
- package/.agy/skills/maestro-milestone-audit/SKILL.md +70 -0
- package/.agy/skills/maestro-milestone-complete/SKILL.md +77 -0
- package/.agy/skills/maestro-milestone-release/SKILL.md +98 -0
- package/.agy/skills/maestro-overlay/SKILL.md +177 -0
- package/.agy/skills/maestro-plan/SKILL.md +172 -0
- package/.agy/skills/maestro-player/SKILL.md +176 -0
- package/.agy/skills/maestro-quick/SKILL.md +67 -0
- package/.agy/skills/maestro-ralph/SKILL.md +546 -0
- package/.agy/skills/maestro-ralph-execute/SKILL.md +255 -0
- package/.agy/skills/maestro-roadmap/SKILL.md +170 -0
- package/.agy/skills/maestro-tools-execute/SKILL.md +119 -0
- package/.agy/skills/maestro-tools-register/SKILL.md +159 -0
- package/.agy/skills/maestro-ui-codify/SKILL.md +81 -0
- package/.agy/skills/maestro-update/SKILL.md +175 -0
- package/.agy/skills/maestro-verify/SKILL.md +111 -0
- package/.agy/skills/manage-codebase-rebuild/SKILL.md +77 -0
- package/.agy/skills/manage-codebase-refresh/SKILL.md +59 -0
- package/.agy/skills/manage-harvest/SKILL.md +96 -0
- package/.agy/skills/manage-issue/SKILL.md +72 -0
- package/.agy/skills/manage-issue-discover/SKILL.md +83 -0
- package/.agy/skills/manage-knowhow/SKILL.md +76 -0
- package/.agy/skills/manage-knowhow-capture/SKILL.md +78 -0
- package/.agy/skills/manage-learn/SKILL.md +64 -0
- package/.agy/skills/manage-status/SKILL.md +51 -0
- package/.agy/skills/manage-wiki/SKILL.md +61 -0
- package/.agy/skills/quality-auto-test/SKILL.md +135 -0
- package/.agy/skills/quality-debug/SKILL.md +122 -0
- package/.agy/skills/quality-refactor/SKILL.md +69 -0
- package/.agy/skills/quality-retrospective/SKILL.md +79 -0
- package/.agy/skills/quality-review/SKILL.md +130 -0
- package/.agy/skills/quality-sync/SKILL.md +53 -0
- package/.agy/skills/quality-test/SKILL.md +119 -0
- package/.agy/skills/security-audit/SKILL.md +157 -0
- package/.agy/skills/skill-iter-tune/SKILL.md +381 -0
- package/.agy/skills/skill-iter-tune/phases/01-setup.md +144 -0
- package/.agy/skills/skill-iter-tune/phases/02-execute.md +292 -0
- package/.agy/skills/skill-iter-tune/phases/03-evaluate.md +312 -0
- package/.agy/skills/skill-iter-tune/phases/04-improve.md +198 -0
- package/.agy/skills/skill-iter-tune/phases/05-report.md +166 -0
- package/.agy/skills/skill-iter-tune/specs/evaluation-criteria.md +63 -0
- package/.agy/skills/skill-iter-tune/templates/eval-prompt.md +134 -0
- package/.agy/skills/skill-iter-tune/templates/execute-prompt.md +97 -0
- package/.agy/skills/spec-add/SKILL.md +67 -0
- package/.agy/skills/spec-load/SKILL.md +70 -0
- package/.agy/skills/spec-remove/SKILL.md +50 -0
- package/.agy/skills/spec-setup/SKILL.md +47 -0
- package/.agy/skills/team-coordinate/SKILL.md +267 -0
- package/.agy/skills/team-coordinate/roles/coordinator/commands/analyze-task.md +247 -0
- package/.agy/skills/team-coordinate/roles/coordinator/commands/dispatch.md +131 -0
- package/.agy/skills/team-coordinate/roles/coordinator/commands/monitor.md +348 -0
- package/.agy/skills/team-coordinate/roles/coordinator/role.md +362 -0
- package/.agy/skills/team-coordinate/specs/knowledge-transfer.md +111 -0
- package/.agy/skills/team-coordinate/specs/pipelines.md +97 -0
- package/.agy/skills/team-coordinate/specs/quality-gates.md +112 -0
- package/.agy/skills/team-coordinate/specs/role-spec-template.md +198 -0
- package/.agy/skills/team-executor/SKILL.md +180 -0
- package/.agy/skills/team-executor/roles/executor/commands/monitor.md +235 -0
- package/.agy/skills/team-executor/roles/executor/role.md +171 -0
- package/.agy/skills/team-executor/specs/session-schema.md +264 -0
- package/.agy/skills/team-lifecycle-v4/SKILL.md +189 -0
- package/.agy/skills/team-lifecycle-v4/roles/analyst/role.md +92 -0
- package/.agy/skills/team-lifecycle-v4/roles/coordinator/commands/analyze.md +56 -0
- package/.agy/skills/team-lifecycle-v4/roles/coordinator/commands/dispatch.md +56 -0
- package/.agy/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +206 -0
- package/.agy/skills/team-lifecycle-v4/roles/coordinator/role.md +130 -0
- package/.agy/skills/team-lifecycle-v4/roles/executor/commands/fix.md +35 -0
- package/.agy/skills/team-lifecycle-v4/roles/executor/commands/implement.md +62 -0
- package/.agy/skills/team-lifecycle-v4/roles/executor/role.md +64 -0
- package/.agy/skills/team-lifecycle-v4/roles/planner/role.md +82 -0
- package/.agy/skills/team-lifecycle-v4/roles/reviewer/commands/review-code.md +34 -0
- package/.agy/skills/team-lifecycle-v4/roles/reviewer/commands/review-spec.md +44 -0
- package/.agy/skills/team-lifecycle-v4/roles/reviewer/role.md +65 -0
- package/.agy/skills/team-lifecycle-v4/roles/supervisor/role.md +188 -0
- package/.agy/skills/team-lifecycle-v4/roles/tester/role.md +84 -0
- package/.agy/skills/team-lifecycle-v4/roles/writer/role.md +92 -0
- package/.agy/skills/team-lifecycle-v4/specs/knowledge-transfer.md +114 -0
- package/.agy/skills/team-lifecycle-v4/specs/pipelines.md +140 -0
- package/.agy/skills/team-lifecycle-v4/specs/quality-gates.md +130 -0
- package/.agy/skills/team-lifecycle-v4/templates/architecture.md +254 -0
- package/.agy/skills/team-lifecycle-v4/templates/epics.md +196 -0
- package/.agy/skills/team-lifecycle-v4/templates/product-brief.md +133 -0
- package/.agy/skills/team-lifecycle-v4/templates/requirements.md +224 -0
- package/.agy/skills/team-quality-assurance/SKILL.md +148 -0
- package/.agy/skills/team-quality-assurance/roles/analyst/role.md +85 -0
- package/.agy/skills/team-quality-assurance/roles/coordinator/commands/analyze.md +72 -0
- package/.agy/skills/team-quality-assurance/roles/coordinator/commands/dispatch.md +111 -0
- package/.agy/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +235 -0
- package/.agy/skills/team-quality-assurance/roles/coordinator/role.md +143 -0
- package/.agy/skills/team-quality-assurance/roles/executor/role.md +62 -0
- package/.agy/skills/team-quality-assurance/roles/generator/role.md +65 -0
- package/.agy/skills/team-quality-assurance/roles/scout/role.md +72 -0
- package/.agy/skills/team-quality-assurance/roles/strategist/role.md +69 -0
- package/.agy/skills/team-quality-assurance/specs/pipelines.md +115 -0
- package/.agy/skills/team-quality-assurance/specs/team-config.json +131 -0
- package/.agy/skills/team-review/SKILL.md +149 -0
- package/.agy/skills/team-review/roles/coordinator/commands/analyze.md +71 -0
- package/.agy/skills/team-review/roles/coordinator/commands/dispatch.md +91 -0
- package/.agy/skills/team-review/roles/coordinator/commands/monitor.md +209 -0
- package/.agy/skills/team-review/roles/coordinator/role.md +132 -0
- package/.agy/skills/team-review/roles/fixer/role.md +74 -0
- package/.agy/skills/team-review/roles/reviewer/role.md +66 -0
- package/.agy/skills/team-review/roles/scanner/role.md +77 -0
- package/.agy/skills/team-review/specs/dimensions.md +82 -0
- package/.agy/skills/team-review/specs/finding-schema.json +82 -0
- package/.agy/skills/team-review/specs/pipelines.md +102 -0
- package/.agy/skills/team-review/specs/team-config.json +27 -0
- package/.agy/skills/team-tech-debt/SKILL.md +133 -0
- package/.agy/skills/team-tech-debt/roles/assessor/role.md +76 -0
- package/.agy/skills/team-tech-debt/roles/coordinator/commands/analyze.md +47 -0
- package/.agy/skills/team-tech-debt/roles/coordinator/commands/dispatch.md +156 -0
- package/.agy/skills/team-tech-debt/roles/coordinator/commands/monitor.md +198 -0
- package/.agy/skills/team-tech-debt/roles/coordinator/role.md +123 -0
- package/.agy/skills/team-tech-debt/roles/executor/role.md +76 -0
- package/.agy/skills/team-tech-debt/roles/planner/role.md +68 -0
- package/.agy/skills/team-tech-debt/roles/scanner/role.md +90 -0
- package/.agy/skills/team-tech-debt/roles/validator/role.md +78 -0
- package/.agy/skills/team-tech-debt/specs/pipelines.md +47 -0
- package/.agy/skills/team-tech-debt/specs/team-config.json +129 -0
- package/.agy/skills/team-testing/SKILL.md +144 -0
- package/.agy/skills/team-testing/roles/analyst/role.md +101 -0
- package/.agy/skills/team-testing/roles/coordinator/commands/analyze.md +70 -0
- package/.agy/skills/team-testing/roles/coordinator/commands/dispatch.md +108 -0
- package/.agy/skills/team-testing/roles/coordinator/commands/monitor.md +242 -0
- package/.agy/skills/team-testing/roles/coordinator/role.md +134 -0
- package/.agy/skills/team-testing/roles/executor/role.md +95 -0
- package/.agy/skills/team-testing/roles/generator/role.md +95 -0
- package/.agy/skills/team-testing/roles/strategist/role.md +81 -0
- package/.agy/skills/team-testing/specs/pipelines.md +101 -0
- package/.agy/skills/team-testing/specs/team-config.json +93 -0
- package/.agy/skills/wiki-connect/SKILL.md +64 -0
- package/.agy/skills/wiki-digest/SKILL.md +70 -0
- package/.agy/skills/workflow-skill-designer/SKILL.md +506 -0
- package/.agy/skills/workflow-skill-designer/phases/01-requirements-analysis.md +356 -0
- package/.agy/skills/workflow-skill-designer/phases/02-orchestrator-design.md +444 -0
- package/.agy/skills/workflow-skill-designer/phases/03-phase-design.md +458 -0
- package/.agy/skills/workflow-skill-designer/phases/04-validation.md +471 -0
- package/dashboard/dist/assets/{ArtifactsPage-CVh0Z2I2.js → ArtifactsPage-BLvAqQlQ.js} +1 -1
- package/dashboard/dist/assets/{ChatInput-CBI3qHQQ.js → ChatInput-DU9YGZKX.js} +1 -1
- package/dashboard/dist/assets/{ChatPage-BjJ9CYox.js → ChatPage-DYHfheXC.js} +1 -1
- package/dashboard/dist/assets/{CollabPage-CprGGO9y.js → CollabPage-CSlmvEa-.js} +1 -1
- package/dashboard/dist/assets/{ExecutionPanel-CClxD7cH.js → ExecutionPanel-RYWf0dYC.js} +1 -1
- package/dashboard/dist/assets/{KanbanPage-copqjdPg.js → KanbanPage-N55Iv0-X.js} +1 -1
- package/dashboard/dist/assets/{MaestroCoordinatePage-CioZjQ9N.js → MaestroCoordinatePage-BxwZ6yy5.js} +1 -1
- package/dashboard/dist/assets/{MarkdownRenderer-CtUhoxCT.js → MarkdownRenderer-ZGtOY7Ti.js} +1 -1
- package/dashboard/dist/assets/{McpPage-BcPPcJpr.js → McpPage-Im6s4pGR.js} +1 -1
- package/dashboard/dist/assets/{MeetingRoomPage-BgmAKxU-.js → MeetingRoomPage-CxHRn1xx.js} +1 -1
- package/dashboard/dist/assets/{OutputPanel-DgT3gMyp.js → OutputPanel-DaL8c1i5.js} +1 -1
- package/dashboard/dist/assets/{ProblemsPanel-BmG7rxoG.js → ProblemsPanel-BQTd5812.js} +1 -1
- package/dashboard/dist/assets/{RequirementBoardPage-k8YoeQ0r.js → RequirementBoardPage-22y9u1qh.js} +1 -1
- package/dashboard/dist/assets/{RequirementPage-Da2354px.js → RequirementPage-_mO743Xm.js} +1 -1
- package/dashboard/dist/assets/{RoomsPage-BtqDiYaU.js → RoomsPage-CExTbOGr.js} +1 -1
- package/dashboard/dist/assets/{SpecsPage-ByPVH_M3.js → SpecsPage-gr4KX51-.js} +1 -1
- package/dashboard/dist/assets/{TeamsPage-sFDLN30L.js → TeamsPage-BxEXLb5g.js} +1 -1
- package/dashboard/dist/assets/{TreeBrowser-oEx8YJXV.js → TreeBrowser-CVtPF5C9.js} +1 -1
- package/dashboard/dist/assets/{WorkflowPage-JrX7CVHh.js → WorkflowPage-BoN18Lhs.js} +1 -1
- package/dashboard/dist/assets/{arrow-left-DYvgSdIH.js → arrow-left-C5ROg97G.js} +1 -1
- package/dashboard/dist/assets/{check-jcgYBWVR.js → check-Bs8PM0tQ.js} +1 -1
- package/dashboard/dist/assets/{chevron-right-DvZ5sMOg.js → chevron-right-SmErd_1F.js} +1 -1
- package/dashboard/dist/assets/{circle-DYT-zoRZ.js → circle-CjpslL_D.js} +1 -1
- package/dashboard/dist/assets/{circle-alert-Bfbv3gt4.js → circle-alert-CuzAg2fd.js} +1 -1
- package/dashboard/dist/assets/{circle-check-D82WnpbI.js → circle-check-BIkDU5D5.js} +1 -1
- package/dashboard/dist/assets/{circle-check-big-CPVD1GKF.js → circle-check-big-CYctV8bK.js} +1 -1
- package/dashboard/dist/assets/{code-B3bKFGI4.js → code-DoB7rfxt.js} +1 -1
- package/dashboard/dist/assets/{columns-3-BeMAQCix.js → columns-3-Ch5KIyRa.js} +1 -1
- package/dashboard/dist/assets/{download-BCtpoWYB.js → download-DadtG2Nr.js} +1 -1
- package/dashboard/dist/assets/{folder-CTj6SNNu.js → folder-B8ODoZfb.js} +1 -1
- package/dashboard/dist/assets/{index-BxR_3IbJ.js → index-BL4h1OKY.js} +1 -1
- package/dashboard/dist/assets/{index-DpcPd-UG.js → index-DQIlX2w_.js} +4 -4
- package/dashboard/dist/assets/{index-CWBJLu42.js → index-DaFwSmVJ.js} +10 -10
- package/dashboard/dist/assets/{list-BMv8pIQn.js → list-CI-XIPZh.js} +1 -1
- package/dashboard/dist/assets/{loader-DdM4VOgF.js → loader-DpdMoQvh.js} +1 -1
- package/dashboard/dist/assets/{minus-D15s2E__.js → minus-BVbfXGrC.js} +1 -1
- package/dashboard/dist/assets/{pen-line-DO6o4xWz.js → pen-line-CR8GaHt-.js} +1 -1
- package/dashboard/dist/assets/{pencil-qGxg9jOe.js → pencil-I7GE0y29.js} +1 -1
- package/dashboard/dist/assets/{proxy-DOffTzwA.js → proxy-CcYyZZWI.js} +1 -1
- package/dashboard/dist/assets/{refresh-cw-C9UNdLCy.js → refresh-cw-BG9V_T4R.js} +1 -1
- package/dashboard/dist/assets/{rows-2-CifAA5SL.js → rows-2-DP6NjQFk.js} +1 -1
- package/dashboard/dist/assets/{search-pe7pU1YN.js → search-b78eLlw2.js} +1 -1
- package/dashboard/dist/assets/{shallow-r7YynQYA.js → shallow-CJEesgtu.js} +1 -1
- package/dashboard/dist/assets/{table-Bh772iIw.js → table-B_lk-a1d.js} +1 -1
- package/dashboard/dist/assets/{team-types-C_HqX2p2.js → team-types-Se7f9LfJ.js} +1 -1
- package/dashboard/dist/assets/{terminal-EpmtGBlw.js → terminal-DXx4tvzq.js} +1 -1
- package/dashboard/dist/assets/{trash-2-Xen46iNQ.js → trash-2-CVh9mnRj.js} +1 -1
- package/dashboard/dist/assets/{users-BLueDPxF.js → users-Da9zGME5.js} +1 -1
- package/dashboard/dist/assets/{zap-DsQCPF61.js → zap-C0zaC7gJ.js} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/adapter-factory.js +4 -0
- package/dashboard/dist-server/dashboard/src/server/agents/adapter-factory.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/agy-adapter.d.ts +39 -0
- package/dashboard/dist-server/dashboard/src/server/agents/agy-adapter.js +423 -0
- package/dashboard/dist-server/dashboard/src/server/agents/agy-adapter.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.d.ts +6 -0
- package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.js +109 -0
- package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.js +2 -0
- package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
- package/dashboard/dist-server/shared/agent-types.d.ts +1 -1
- package/dist/shared/agent-types.d.ts +1 -1
- package/dist/shared/agent-types.d.ts.map +1 -1
- 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/hooks.d.ts +64 -0
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +107 -0
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/install.d.ts.map +1 -1
- package/dist/src/commands/install.js +17 -3
- package/dist/src/commands/install.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +53 -0
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/config/cli-tools-config.d.ts +19 -5
- package/dist/src/config/cli-tools-config.d.ts.map +1 -1
- package/dist/src/config/cli-tools-config.js +77 -32
- package/dist/src/config/cli-tools-config.js.map +1 -1
- package/dist/src/config/cli-tools-defaults.json +2 -1
- package/dist/src/core/component-defs.d.ts.map +1 -1
- package/dist/src/core/component-defs.js +53 -0
- package/dist/src/core/component-defs.js.map +1 -1
- package/dist/src/tui/install-ui/InstallExecution.d.ts.map +1 -1
- package/dist/src/tui/install-ui/InstallExecution.js +5 -3
- package/dist/src/tui/install-ui/InstallExecution.js.map +1 -1
- package/dist/src/utils/update-notices.d.ts +62 -0
- package/dist/src/utils/update-notices.d.ts.map +1 -0
- package/dist/src/utils/update-notices.js +178 -0
- package/dist/src/utils/update-notices.js.map +1 -0
- package/package.json +84 -82
- package/shared/agent-types.ts +1 -1
- package/workflows/agy-instructions.md +124 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Phase 1: Setup
|
|
2
|
+
|
|
3
|
+
Initialize workspace, backup skills, parse inputs.
|
|
4
|
+
|
|
5
|
+
## Objective
|
|
6
|
+
|
|
7
|
+
- Parse skill path(s) and test scenario from user input
|
|
8
|
+
- Validate all skill paths exist and contain SKILL.md
|
|
9
|
+
- Create isolated workspace directory structure
|
|
10
|
+
- Backup original skill files
|
|
11
|
+
- Initialize iteration-state.json
|
|
12
|
+
|
|
13
|
+
## Execution
|
|
14
|
+
|
|
15
|
+
### Step 1.1: Parse Input
|
|
16
|
+
|
|
17
|
+
Parse `$ARGUMENTS` to extract skill paths and test scenario.
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
// Parse skill paths (first argument or comma-separated)
|
|
21
|
+
const args = $ARGUMENTS.trim();
|
|
22
|
+
const pathMatch = args.match(/^([^\s]+)/);
|
|
23
|
+
const rawPaths = pathMatch ? pathMatch[1].split(',') : [];
|
|
24
|
+
|
|
25
|
+
// Parse test scenario
|
|
26
|
+
const scenarioMatch = args.match(/(?:--scenario|--test)\s+"([^"]+)"/);
|
|
27
|
+
const scenarioText = scenarioMatch ? scenarioMatch[1] : args.replace(rawPaths.join(','), '').trim();
|
|
28
|
+
|
|
29
|
+
// Record chain order (preserves input order for chain mode)
|
|
30
|
+
const chainOrder = rawPaths.map(p => p.startsWith('.claude/') ? p.split('/').pop() : p);
|
|
31
|
+
|
|
32
|
+
// If no scenario, ask user
|
|
33
|
+
if (!scenarioText) {
|
|
34
|
+
const response = ask_question({
|
|
35
|
+
questions: [{
|
|
36
|
+
question: "Please describe the test scenario for evaluating this skill:",
|
|
37
|
+
header: "Test Scenario",
|
|
38
|
+
multiSelect: false,
|
|
39
|
+
options: [
|
|
40
|
+
{ label: "General quality test", description: "Evaluate overall skill quality with a generic task" },
|
|
41
|
+
{ label: "Specific scenario", description: "I'll describe a specific test case" }
|
|
42
|
+
]
|
|
43
|
+
}]
|
|
44
|
+
});
|
|
45
|
+
// Use response to construct testScenario
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Step 1.2: Validate Skill Paths
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
const targetSkills = [];
|
|
53
|
+
for (const rawPath of rawPaths) {
|
|
54
|
+
const skillPath = rawPath.startsWith('.claude/') ? rawPath : `.claude/skills/${rawPath}`;
|
|
55
|
+
|
|
56
|
+
// Validate SKILL.md exists
|
|
57
|
+
const skillFiles = grep_search(`${skillPath}/SKILL.md`);
|
|
58
|
+
if (skillFiles.length === 0) {
|
|
59
|
+
throw new Error(`Skill not found at: ${skillPath} -- SKILL.md missing`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Collect all skill files
|
|
63
|
+
const allFiles = grep_search(`${skillPath}/**/*.md`);
|
|
64
|
+
targetSkills.push({
|
|
65
|
+
name: skillPath.split('/').pop(),
|
|
66
|
+
path: skillPath,
|
|
67
|
+
files: allFiles.map(f => f.replace(skillPath + '/', '')),
|
|
68
|
+
primary_file: 'SKILL.md'
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Step 1.3: Create Workspace
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
const ts = Date.now();
|
|
77
|
+
const workDir = `.workflow/.scratchpad/skill-iter-tune-${ts}`;
|
|
78
|
+
|
|
79
|
+
run_command(`mkdir -p "${workDir}/backups" "${workDir}/iterations"`);
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Step 1.4: Backup Original Skills
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
for (const skill of targetSkills) {
|
|
86
|
+
run_command(`cp -r "${skill.path}" "${workDir}/backups/${skill.name}"`);
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Step 1.5: Initialize State
|
|
91
|
+
|
|
92
|
+
Write `iteration-state.json` with initial state:
|
|
93
|
+
|
|
94
|
+
```javascript
|
|
95
|
+
const initialState = {
|
|
96
|
+
status: 'running',
|
|
97
|
+
started_at: new Date().toISOString(),
|
|
98
|
+
updated_at: new Date().toISOString(),
|
|
99
|
+
target_skills: targetSkills,
|
|
100
|
+
test_scenario: {
|
|
101
|
+
description: scenarioText,
|
|
102
|
+
// Parse --requirements and --input-args from $ARGUMENTS if provided
|
|
103
|
+
// e.g., --requirements "clear output,no errors" --input-args "my-skill --scenario test"
|
|
104
|
+
requirements: parseListArg(args, '--requirements') || [],
|
|
105
|
+
input_args: parseStringArg(args, '--input-args') || '',
|
|
106
|
+
success_criteria: parseStringArg(args, '--success-criteria') || 'Produces correct, high-quality output'
|
|
107
|
+
},
|
|
108
|
+
execution_mode: workflowPreferences.executionMode || 'single',
|
|
109
|
+
chain_order: workflowPreferences.executionMode === 'chain'
|
|
110
|
+
? targetSkills.map(s => s.name)
|
|
111
|
+
: [],
|
|
112
|
+
current_iteration: 0,
|
|
113
|
+
max_iterations: workflowPreferences.maxIterations,
|
|
114
|
+
quality_threshold: workflowPreferences.qualityThreshold,
|
|
115
|
+
latest_score: 0,
|
|
116
|
+
score_trend: [],
|
|
117
|
+
converged: false,
|
|
118
|
+
iterations: [],
|
|
119
|
+
errors: [],
|
|
120
|
+
error_count: 0,
|
|
121
|
+
max_errors: 3,
|
|
122
|
+
work_dir: workDir,
|
|
123
|
+
backup_dir: `${workDir}/backups`
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
write_to_file(`${workDir}/iteration-state.json`, JSON.stringify(initialState, null, 2));
|
|
127
|
+
|
|
128
|
+
// Chain mode: create per-skill tracking tasks
|
|
129
|
+
if (initialState.execution_mode === 'chain') {
|
|
130
|
+
for (const skill of targetSkills) {
|
|
131
|
+
TaskCreate({
|
|
132
|
+
subject: `Chain: ${skill.name}`,
|
|
133
|
+
activeForm: `Tracking ${skill.name}`,
|
|
134
|
+
description: `Skill chain member: ${skill.path} | Position: ${targetSkills.indexOf(skill) + 1}/${targetSkills.length}`
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Output
|
|
141
|
+
|
|
142
|
+
- **Variables**: `workDir`, `targetSkills[]`, `testScenario`, `chainOrder` (chain mode)
|
|
143
|
+
- **Files**: `iteration-state.json`, `backups/` directory with skill copies
|
|
144
|
+
- **TodoWrite**: Mark Phase 1 completed, start Iteration Loop. Chain mode: per-skill tracking tasks created
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# Phase 2: Execute Skill
|
|
2
|
+
|
|
3
|
+
> **COMPACT SENTINEL [Phase 2: Execute]**
|
|
4
|
+
> This phase contains 4 execution steps (Step 2.1 -- 2.4).
|
|
5
|
+
> If you can read this sentinel but cannot find the full Step protocol below, context has been compressed.
|
|
6
|
+
> Recovery: `view_file("phases/02-execute.md")`
|
|
7
|
+
|
|
8
|
+
Execute the target skill against the test scenario using `ccw cli --tool claude --mode write`. Claude receives the full skill definition and simulates producing its expected output artifacts.
|
|
9
|
+
|
|
10
|
+
## Objective
|
|
11
|
+
|
|
12
|
+
- Snapshot current skill version before execution
|
|
13
|
+
- Construct execution prompt with full skill content + test scenario
|
|
14
|
+
- Execute via ccw cli Claude
|
|
15
|
+
- Collect output artifacts
|
|
16
|
+
|
|
17
|
+
## Execution
|
|
18
|
+
|
|
19
|
+
### Step 2.1: Snapshot Current Skill
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
const N = state.current_iteration;
|
|
23
|
+
const iterDir = `${state.work_dir}/iterations/iteration-${N}`;
|
|
24
|
+
run_command(`mkdir -p "${iterDir}/skill-snapshot" "${iterDir}/artifacts"`);
|
|
25
|
+
|
|
26
|
+
// Chain mode: create per-skill artifact directories
|
|
27
|
+
if (state.execution_mode === 'chain') {
|
|
28
|
+
for (const skillName of state.chain_order) {
|
|
29
|
+
run_command(`mkdir -p "${iterDir}/artifacts/${skillName}"`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Snapshot current skill state (so we can compare/rollback)
|
|
34
|
+
for (const skill of state.target_skills) {
|
|
35
|
+
run_command(`cp -r "${skill.path}" "${iterDir}/skill-snapshot/${skill.name}"`);
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Step 2.2: Construct Execution Prompt (Single Mode)
|
|
40
|
+
|
|
41
|
+
Read the execute-prompt template and substitute variables.
|
|
42
|
+
|
|
43
|
+
> Skip to Step 2.2b if `state.execution_mode === 'chain'`.
|
|
44
|
+
|
|
45
|
+
```javascript
|
|
46
|
+
// Ref: templates/execute-prompt.md
|
|
47
|
+
|
|
48
|
+
// Build skillContent by reading only executable skill files (SKILL.md, phases/, specs/)
|
|
49
|
+
// Exclude README.md, docs/, and other non-executable files to save tokens
|
|
50
|
+
const skillContent = state.target_skills.map(skill => {
|
|
51
|
+
const skillMd = view_file(`${skill.path}/SKILL.md`);
|
|
52
|
+
const phaseFiles = grep_search(`${skill.path}/phases/*.md`).sort().map(f => ({
|
|
53
|
+
relativePath: f.replace(skill.path + '/', ''),
|
|
54
|
+
content: view_file(f)
|
|
55
|
+
}));
|
|
56
|
+
const specFiles = grep_search(`${skill.path}/specs/*.md`).map(f => ({
|
|
57
|
+
relativePath: f.replace(skill.path + '/', ''),
|
|
58
|
+
content: view_file(f)
|
|
59
|
+
}));
|
|
60
|
+
|
|
61
|
+
return `### File: SKILL.md\n${skillMd}\n\n` +
|
|
62
|
+
phaseFiles.map(f => `### File: ${f.relativePath}\n${f.content}`).join('\n\n') +
|
|
63
|
+
(specFiles.length > 0 ? '\n\n' + specFiles.map(f => `### File: ${f.relativePath}\n${f.content}`).join('\n\n') : '');
|
|
64
|
+
}).join('\n\n---\n\n');
|
|
65
|
+
|
|
66
|
+
// Construct full prompt using template
|
|
67
|
+
const executePrompt = `PURPOSE: Simulate executing the following workflow skill against a test scenario. Produce all expected output artifacts as if the skill were invoked with the given input.
|
|
68
|
+
|
|
69
|
+
SKILL CONTENT:
|
|
70
|
+
${skillContent}
|
|
71
|
+
|
|
72
|
+
TEST SCENARIO:
|
|
73
|
+
Description: ${state.test_scenario.description}
|
|
74
|
+
Input Arguments: ${state.test_scenario.input_args}
|
|
75
|
+
Requirements: ${state.test_scenario.requirements.join('; ')}
|
|
76
|
+
Success Criteria: ${state.test_scenario.success_criteria}
|
|
77
|
+
|
|
78
|
+
TASK:
|
|
79
|
+
1. Study the complete skill structure (SKILL.md + all phase files)
|
|
80
|
+
2. Follow the skill execution flow sequentially
|
|
81
|
+
3. For each phase, produce the artifacts that phase would generate
|
|
82
|
+
4. Write all output artifacts to the current working directory
|
|
83
|
+
5. Create a manifest.json listing all produced artifacts
|
|
84
|
+
|
|
85
|
+
MODE: write
|
|
86
|
+
CONTEXT: @**/*
|
|
87
|
+
EXPECTED: All artifacts written to disk + manifest.json
|
|
88
|
+
CONSTRAINTS: Follow skill flow exactly, produce realistic output, not placeholders`;
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Step 2.3: Execute via ccw cli
|
|
92
|
+
|
|
93
|
+
> **CHECKPOINT**: Before executing CLI, verify:
|
|
94
|
+
> 1. This phase is TodoWrite `in_progress`
|
|
95
|
+
> 2. `iterDir/artifacts/` directory exists
|
|
96
|
+
> 3. Prompt is properly escaped
|
|
97
|
+
|
|
98
|
+
```javascript
|
|
99
|
+
function escapeForShell(str) {
|
|
100
|
+
return str.replace(/"/g, '\\"').replace(/\$/g, '\\$').replace(/`/g, '\\`');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const cliCommand = `ccw cli -p "${escapeForShell(executePrompt)}" --tool claude --mode write --cd "${iterDir}/artifacts"`;
|
|
104
|
+
|
|
105
|
+
// Execute in background, wait for hook callback
|
|
106
|
+
run_command({
|
|
107
|
+
command: cliCommand,
|
|
108
|
+
run_in_background: true,
|
|
109
|
+
timeout: 600000 // 10 minutes max
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// STOP HERE -- wait for hook callback to resume
|
|
113
|
+
// After callback, verify artifacts were produced
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Step 2.2b: Chain Execution Path
|
|
117
|
+
|
|
118
|
+
> Skip this step if `state.execution_mode === 'single'`.
|
|
119
|
+
|
|
120
|
+
In chain mode, execute each skill sequentially. Each skill receives the previous skill's artifacts as input context.
|
|
121
|
+
|
|
122
|
+
```javascript
|
|
123
|
+
// Chain execution: iterate through chain_order
|
|
124
|
+
let previousArtifacts = ''; // Accumulates upstream output
|
|
125
|
+
|
|
126
|
+
for (let i = 0; i < state.chain_order.length; i++) {
|
|
127
|
+
const skillName = state.chain_order[i];
|
|
128
|
+
const skill = state.target_skills.find(s => s.name === skillName);
|
|
129
|
+
const skillArtifactDir = `${iterDir}/artifacts/${skillName}`;
|
|
130
|
+
|
|
131
|
+
// Build this skill's content
|
|
132
|
+
const skillMd = view_file(`${skill.path}/SKILL.md`);
|
|
133
|
+
const phaseFiles = grep_search(`${skill.path}/phases/*.md`).sort().map(f => ({
|
|
134
|
+
relativePath: f.replace(skill.path + '/', ''),
|
|
135
|
+
content: view_file(f)
|
|
136
|
+
}));
|
|
137
|
+
const specFiles = grep_search(`${skill.path}/specs/*.md`).map(f => ({
|
|
138
|
+
relativePath: f.replace(skill.path + '/', ''),
|
|
139
|
+
content: view_file(f)
|
|
140
|
+
}));
|
|
141
|
+
|
|
142
|
+
const singleSkillContent = `### File: SKILL.md\n${skillMd}\n\n` +
|
|
143
|
+
phaseFiles.map(f => `### File: ${f.relativePath}\n${f.content}`).join('\n\n') +
|
|
144
|
+
(specFiles.length > 0 ? '\n\n' + specFiles.map(f => `### File: ${f.relativePath}\n${f.content}`).join('\n\n') : '');
|
|
145
|
+
|
|
146
|
+
// Build chain context from previous skill's artifacts
|
|
147
|
+
const chainInputContext = previousArtifacts
|
|
148
|
+
? `\nPREVIOUS CHAIN OUTPUT (from upstream skill "${state.chain_order[i - 1]}"):\n${previousArtifacts}\n\nIMPORTANT: Use the above output as input context for this skill's execution.\n`
|
|
149
|
+
: '';
|
|
150
|
+
|
|
151
|
+
// Construct per-skill execution prompt
|
|
152
|
+
// Ref: templates/execute-prompt.md
|
|
153
|
+
const chainPrompt = `PURPOSE: Simulate executing the following workflow skill against a test scenario. Produce all expected output artifacts.
|
|
154
|
+
|
|
155
|
+
SKILL CONTENT (${skillName} — chain position ${i + 1}/${state.chain_order.length}):
|
|
156
|
+
${singleSkillContent}
|
|
157
|
+
${chainInputContext}
|
|
158
|
+
TEST SCENARIO:
|
|
159
|
+
Description: ${state.test_scenario.description}
|
|
160
|
+
Input Arguments: ${state.test_scenario.input_args}
|
|
161
|
+
Requirements: ${state.test_scenario.requirements.join('; ')}
|
|
162
|
+
Success Criteria: ${state.test_scenario.success_criteria}
|
|
163
|
+
|
|
164
|
+
TASK:
|
|
165
|
+
1. Study the complete skill structure
|
|
166
|
+
2. Follow the skill execution flow sequentially
|
|
167
|
+
3. Produce all expected artifacts
|
|
168
|
+
4. Write output to the current working directory
|
|
169
|
+
5. Create manifest.json listing all produced artifacts
|
|
170
|
+
|
|
171
|
+
MODE: write
|
|
172
|
+
CONTEXT: @**/*
|
|
173
|
+
CONSTRAINTS: Follow skill flow exactly, produce realistic output`;
|
|
174
|
+
|
|
175
|
+
function escapeForShell(str) {
|
|
176
|
+
return str.replace(/"/g, '\\"').replace(/\$/g, '\\$').replace(/`/g, '\\`');
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const cliCommand = `ccw cli -p "${escapeForShell(chainPrompt)}" --tool claude --mode write --cd "${skillArtifactDir}"`;
|
|
180
|
+
|
|
181
|
+
// Execute in background
|
|
182
|
+
run_command({
|
|
183
|
+
command: cliCommand,
|
|
184
|
+
run_in_background: true,
|
|
185
|
+
timeout: 600000
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
// STOP -- wait for hook callback
|
|
189
|
+
|
|
190
|
+
// After callback: collect artifacts for next skill in chain
|
|
191
|
+
const artifacts = grep_search(`${skillArtifactDir}/**/*`);
|
|
192
|
+
const skillSuccess = artifacts.length > 0;
|
|
193
|
+
|
|
194
|
+
if (skillSuccess) {
|
|
195
|
+
previousArtifacts = artifacts.slice(0, 10).map(f => {
|
|
196
|
+
const relPath = f.replace(skillArtifactDir + '/', '');
|
|
197
|
+
const content = view_file(f, { limit: 100 });
|
|
198
|
+
return `--- ${relPath} ---\n${content}`;
|
|
199
|
+
}).join('\n\n');
|
|
200
|
+
} else {
|
|
201
|
+
// Mid-chain failure: keep previous artifacts for downstream skills
|
|
202
|
+
// Log warning but continue chain — downstream skills receive last successful output
|
|
203
|
+
state.errors.push({
|
|
204
|
+
phase: 'execute',
|
|
205
|
+
message: `Chain skill "${skillName}" (position ${i + 1}) produced no artifacts. Downstream skills will receive upstream output from "${state.chain_order[i - 1] || 'none'}" instead.`,
|
|
206
|
+
timestamp: new Date().toISOString()
|
|
207
|
+
});
|
|
208
|
+
state.error_count++;
|
|
209
|
+
// previousArtifacts remains from last successful skill (or empty if first)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Update per-skill TodoWrite
|
|
213
|
+
// TaskUpdate chain skill task with execution status
|
|
214
|
+
|
|
215
|
+
// Record per-skill execution
|
|
216
|
+
if (!state.iterations[N - 1].execution.chain_executions) {
|
|
217
|
+
state.iterations[N - 1].execution.chain_executions = [];
|
|
218
|
+
}
|
|
219
|
+
state.iterations[N - 1].execution.chain_executions.push({
|
|
220
|
+
skill_name: skillName,
|
|
221
|
+
cli_command: cliCommand,
|
|
222
|
+
artifacts_dir: skillArtifactDir,
|
|
223
|
+
success: skillSuccess
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
// Check error budget: abort chain if too many consecutive failures
|
|
227
|
+
if (state.error_count >= 3) {
|
|
228
|
+
state.errors.push({
|
|
229
|
+
phase: 'execute',
|
|
230
|
+
message: `Chain execution aborted at skill "${skillName}" — error limit reached (${state.error_count} errors).`,
|
|
231
|
+
timestamp: new Date().toISOString()
|
|
232
|
+
});
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Step 2.4: Collect Artifacts
|
|
239
|
+
|
|
240
|
+
After CLI completes (hook callback received):
|
|
241
|
+
|
|
242
|
+
```javascript
|
|
243
|
+
// List produced artifacts
|
|
244
|
+
const artifactFiles = grep_search(`${iterDir}/artifacts/**/*`);
|
|
245
|
+
|
|
246
|
+
// Chain mode: check per-skill artifacts
|
|
247
|
+
if (state.execution_mode === 'chain') {
|
|
248
|
+
const chainSuccess = state.iterations[N - 1].execution.chain_executions?.every(e => e.success) ?? false;
|
|
249
|
+
state.iterations[N - 1].execution.success = chainSuccess;
|
|
250
|
+
state.iterations[N - 1].execution.artifacts_dir = `${iterDir}/artifacts`;
|
|
251
|
+
} else {
|
|
252
|
+
|
|
253
|
+
if (artifactFiles.length === 0) {
|
|
254
|
+
// Execution produced nothing -- record error
|
|
255
|
+
state.iterations[N - 1].execution = {
|
|
256
|
+
cli_command: cliCommand,
|
|
257
|
+
started_at: new Date().toISOString(),
|
|
258
|
+
completed_at: new Date().toISOString(),
|
|
259
|
+
artifacts_dir: `${iterDir}/artifacts`,
|
|
260
|
+
success: false
|
|
261
|
+
};
|
|
262
|
+
state.error_count++;
|
|
263
|
+
// Continue to Phase 3 anyway -- Gemini can evaluate the skill even without artifacts
|
|
264
|
+
} else {
|
|
265
|
+
state.iterations[N - 1].execution = {
|
|
266
|
+
cli_command: cliCommand,
|
|
267
|
+
started_at: new Date().toISOString(),
|
|
268
|
+
completed_at: new Date().toISOString(),
|
|
269
|
+
artifacts_dir: `${iterDir}/artifacts`,
|
|
270
|
+
success: true
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
} // end single mode branch
|
|
275
|
+
|
|
276
|
+
// Update state
|
|
277
|
+
write_to_file(`${state.work_dir}/iteration-state.json`, JSON.stringify(state, null, 2));
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Error Handling
|
|
281
|
+
|
|
282
|
+
| Error | Recovery |
|
|
283
|
+
|-------|----------|
|
|
284
|
+
| CLI timeout (10min) | Record failure, continue to Phase 3 without artifacts |
|
|
285
|
+
| CLI crash | Retry once with simplified prompt (SKILL.md only, no phase files) |
|
|
286
|
+
| No artifacts produced | Continue to Phase 3, evaluation focuses on skill definition quality |
|
|
287
|
+
|
|
288
|
+
## Output
|
|
289
|
+
|
|
290
|
+
- **Files**: `iteration-{N}/skill-snapshot/`, `iteration-{N}/artifacts/`
|
|
291
|
+
- **State**: `iterations[N-1].execution` updated
|
|
292
|
+
- **Next**: Phase 3 (Evaluate)
|