@emiliosp/pi-maestro 0.13.0 → 0.14.0

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/ADR.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  An Architecture Decision Record (ADR) explains an important architectural choice, its context, and its consequences. This file contains one numbered record per decision.
4
4
 
5
- Requirements and routine project rules belong in the [roadmap](https://linear.app/emilio-spatola/team/MAESTRO/overview) or other relevant documentation.
5
+ Requirements and routine project rules belong in the [roadmap](ROADMAP.md) or other relevant documentation.
6
6
 
7
7
  When a new decision replaces an accepted decision, add a new record, mark the earlier record as superseded, and link both records.
8
8
 
@@ -168,7 +168,7 @@ approval.
168
168
 
169
169
  ### Status
170
170
 
171
- Accepted. Implemented.
171
+ Superseded by [ADR-007](#adr-007-maintain-the-roadmap-in-the-repository).
172
172
 
173
173
  ### Context
174
174
 
@@ -190,3 +190,60 @@ commit-pinned links to repository evidence. Removing the local roadmap also remo
190
190
  ### Evidence
191
191
 
192
192
  [Linear roadmap](https://linear.app/emilio-spatola/team/MAESTRO/overview) and [repository instructions](AGENTS.md).
193
+
194
+ ## ADR-007: Maintain the roadmap in the repository
195
+
196
+ ### Status
197
+
198
+ Accepted. Supersedes [ADR-006](#adr-006-maintain-the-roadmap-in-linear).
199
+
200
+ ### Context
201
+
202
+ The `owner` reported excessive token use when accessing Linear and requested restoration of the Markdown roadmap. The `owner` also explicitly prohibited changes to the
203
+ Linear project.
204
+
205
+ ### Decision
206
+
207
+ Maintain the roadmap in `ROADMAP.md` as the source of truth. Restore project items from Linear through read-only access, preserving existing `MAESTRO` identifiers, scope,
208
+ and evidence. Do not transfer Linear onboarding or test issues.
209
+
210
+ Keep Linear unchanged as historical reference. Routine roadmap reading and maintenance use local files, not MCP.
211
+
212
+ ### Consequences
213
+
214
+ Planning no longer requires Linear access. Repository instructions, documentation audit guidance, links, and published package contents refer to the local roadmap. Later
215
+ roadmap changes do not need synchronization with Linear.
216
+
217
+ Conflicting imported status and acceptance evidence remain explicit rather than being treated as proof of final `owner` acceptance.
218
+
219
+ ### Evidence
220
+
221
+ [Roadmap](ROADMAP.md) and [repository instructions](AGENTS.md).
222
+
223
+ ## ADR-008: Use Pi's registry for model availability
224
+
225
+ ### Status
226
+
227
+ Accepted. Implemented.
228
+
229
+ ### Context
230
+
231
+ Maestro's model format regex rejected OpenRouter IDs containing additional slashes. The `owner` selected Pi as the source of truth for models and explicitly retained the
232
+ activation availability check because it uses Pi's registry.
233
+
234
+ ### Decision
235
+
236
+ Treat configured models as strings without a separate format regex. During activation, match each complete `provider/model` identifier against
237
+ `context.modelRegistry.getAvailable()`, preserving slashes inside model IDs. Pass the configured identifier unchanged through `pi-subagents`.
238
+
239
+ Keep Maestro's configuration structure, version, path, thinking-level, and timeout validation.
240
+
241
+ ### Consequences
242
+
243
+ A model absent from Pi's available registry prevents activation. `Maestro` maintains no separate model catalog or authentication check. Provider or authentication
244
+ failures during delegation still use the existing `run` failure path. Workflow recovery and phase transitions remain unchanged.
245
+
246
+ ### Evidence
247
+
248
+ [Configuration](docs/configuration.md#model-access), [activation checks](src/maestro/checks/assertEnvironment.ts), and
249
+ [delegation](src/tools/utils/pi-subagent-delegation.ts).
package/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
3
3
  This file summarizes meaningful changes to the codebase, including behavior, data formats, architecture, and development tools. Git tags identify version boundaries;
4
4
  GitHub Releases are not required.
5
5
 
6
+ ## 0.14.0
7
+
8
+ 1. Removed Maestro's model format regex while retaining activation checks against Pi's available model registry. Complete identifiers, including
9
+ `openrouter/~openai/gpt-mini-latest`, are matched without truncation and passed unchanged to `pi-subagents`. Maestro's other configuration validation remains
10
+ unchanged.
11
+
12
+ ## 0.13.1
13
+
14
+ 1. Restored `ROADMAP.md` as the planning source of truth from the current Linear issues, retaining their identifiers and recorded evidence. Updated repository guidance,
15
+ documentation links, and package contents so roadmap maintenance no longer requires Linear. Linear data remains unchanged.
16
+
6
17
  ## 0.13.0
7
18
 
8
19
  1. Automatically turn off `Maestro` after successfully delivering the final summary of a completed workflow, including when Git is unavailable and simplification is
package/README.md CHANGED
@@ -101,7 +101,8 @@ Activate `Maestro`:
101
101
  /maestro
102
102
  ```
103
103
 
104
- During activation, `Maestro` checks project trust, configuration, models, and agent availability. If a check fails, `Maestro` stays disabled and reports the problem.
104
+ During activation, `Maestro` checks project trust, configuration, models, and agent availability. Model availability comes from Pi's model registry. If a check fails,
105
+ `Maestro` stays disabled and reports the problem.
105
106
 
106
107
  The `owner` follows this workflow:
107
108
 
@@ -153,6 +154,6 @@ The reading order is:
153
154
 
154
155
  1. [Mission](MISSION.md): purpose, scope, and `owner` responsibilities.
155
156
  2. [Tech stack](TECH_STACK.md): runtime technologies and development tools.
156
- 3. [Roadmap](https://linear.app/emilio-spatola/team/MAESTRO/overview): completed outcomes and planned priorities maintained in Linear.
157
+ 3. [Roadmap](ROADMAP.md): completed outcomes and planned work maintained in the repository.
157
158
  4. [Changelog](CHANGELOG.md): meaningful codebase changes and breaking changes.
158
159
  5. [Architecture decision records](ADR.md): architectural choices, context, consequences, and evidence.
package/ROADMAP.md ADDED
@@ -0,0 +1,415 @@
1
+ # Roadmap
2
+
3
+ This file is the source of truth for planned outcomes and recorded completion. Roadmap entries are not permission to implement them. The `owner` selects work and approves
4
+ its `specification` before implementation starts. Detailed requirements, technical decisions, and `acceptance criteria` belong in that `specification`.
5
+
6
+ Backlog items have no agreed order or date. The `owner` approves priority and scope changes.
7
+
8
+ Completed entries preserve recorded outcomes and evidence, which may describe behavior later changed. Completion requires `owner` acceptance, not only passing checks or
9
+ reaching `candidate-ready`. Linear onboarding and test issues are not project roadmap items and are omitted.
10
+
11
+ ## Overview
12
+
13
+ | ID | Item | Status |
14
+ | ---------- | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- |
15
+ | MAESTRO-6 | [Display specs in a browser](#maestro-6-display-specs-in-a-browser) | Backlog |
16
+ | MAESTRO-7 | [Route builder failures through owner escalations](#maestro-7-route-builder-failures-through-owner-escalations) | Completed |
17
+ | MAESTRO-8 | [Store escalations and owner decisions in builder handoffs](#maestro-8-store-escalations-and-owner-decisions-in-builder-handoffs) | Completed |
18
+ | MAESTRO-9 | [Format glossary terms consistently](#maestro-9-format-glossary-terms-consistently) | Completed |
19
+ | MAESTRO-10 | [Improve status presentation and activation feedback](#maestro-10-improve-status-presentation-and-activation-feedback) | Completed |
20
+ | MAESTRO-11 | [Introduce Maestro at activation](#maestro-11-introduce-maestro-at-activation) | Completed |
21
+ | MAESTRO-12 | [Verify code quality against AGENTS.md instructions](#maestro-12-verify-code-quality-against-agentsmd-instructions) | Completed |
22
+ | MAESTRO-13 | [Check subagent extensions at activation](#maestro-13-check-subagent-extensions-at-activation) | Completed |
23
+ | MAESTRO-14 | [Rename the test support directory](#maestro-14-rename-the-test-support-directory) | Completed |
24
+ | MAESTRO-15 | [Match handoff criteria to the approved spec](#maestro-15-match-handoff-criteria-to-the-approved-spec) | Completed |
25
+ | MAESTRO-16 | [Route finding-driven spec revisions through drafting-spec](#maestro-16-route-finding-driven-spec-revisions-through-drafting-spec) | Completed |
26
+ | MAESTRO-17 | [Keep acceptance criterion numbering continuous](#maestro-17-keep-acceptance-criterion-numbering-continuous) | Completed |
27
+ | MAESTRO-18 | [Record escalation resolutions when the spec changes](#maestro-18-record-escalation-resolutions-when-the-spec-changes) | Completed |
28
+ | MAESTRO-19 | [Guide initial configuration](#maestro-19-guide-initial-configuration) | Backlog |
29
+ | MAESTRO-20 | [Rename the npm package](#maestro-20-rename-the-npm-package) | Backlog |
30
+ | MAESTRO-21 | [Label acceptance criterion coverage](#maestro-21-label-acceptance-criterion-coverage) | Completed |
31
+ | MAESTRO-22 | [Avoid acceptance criteria already covered by tests](#maestro-22-avoid-acceptance-criteria-already-covered-by-tests) | Completed |
32
+ | MAESTRO-23 | [Change agent models before a builder run](#maestro-23-change-agent-models-before-a-builder-run) | Backlog |
33
+ | MAESTRO-24 | [Add a simplifier with one clear purpose per agent](#maestro-24-add-a-simplifier-with-one-clear-purpose-per-agent) | Completed |
34
+ | MAESTRO-25 | [Define workflow reconciliation](#maestro-25-define-workflow-reconciliation) | Backlog |
35
+ | MAESTRO-26 | [Exit Maestro mode automatically at workflow completion](#maestro-26-exit-maestro-mode-automatically-at-workflow-completion) | Implemented, acceptance not confirmed |
36
+ | MAESTRO-27 | [Make verifier and simplifier phases optional](#maestro-27-make-verifier-and-simplifier-phases-optional) | Backlog |
37
+
38
+ ## Backlog
39
+
40
+ ### MAESTRO-6: Display specs in a browser
41
+
42
+ #### Objective
43
+
44
+ Display the `spec` documents in a browser to improve readability and help the `owner` understand the proposed change, requirements, and `acceptance criteria`.
45
+
46
+ #### Completed when
47
+
48
+ The `owner` can read the `spec` documents in a browser with formatting designed for human comprehension.
49
+
50
+ ### MAESTRO-19: Guide initial configuration
51
+
52
+ #### Objective
53
+
54
+ Help the `owner` create `Maestro` configuration through an interview. `Maestro` asks questions and writes the agreed configuration.
55
+
56
+ #### Completed when
57
+
58
+ The `owner` can create a valid project configuration without writing the file manually.
59
+
60
+ ### MAESTRO-20: Rename the npm package
61
+
62
+ #### Objective
63
+
64
+ Rename `@emiliosp/pi-maestro` to `pi-maestro-sdd`. The `owner` installs the package under the new name. This item changes the package identity, not the development
65
+ workflow.
66
+
67
+ Compatibility with installations under the old name must be decided in the `specification`. No `specification` is approved yet.
68
+
69
+ #### Completed when
70
+
71
+ Package metadata and installation documentation use the new name. The package is available under that name.
72
+
73
+ ### MAESTRO-23: Change agent models before a builder run
74
+
75
+ #### Objective
76
+
77
+ Let the `owner` change the `builder` and `verifier` models during `spec` preparation and the `ready-for-builder` phase. The selected models apply to subsequent `runs`.
78
+
79
+ #### Completed when
80
+
81
+ The `owner` can select available models in those phases. `Maestro` uses the selections.
82
+
83
+ ### MAESTRO-25: Define workflow reconciliation
84
+
85
+ #### Objective
86
+
87
+ Explore how `Maestro` can reconcile saved `artifacts` and workflow state. The recovery scope is not yet defined.
88
+
89
+ #### Completed when
90
+
91
+ Not yet defined. The `owner` must define the intended outcome, recovery boundaries, and completion condition before this item can move forward.
92
+
93
+ ### MAESTRO-27: Make verifier and simplifier phases optional
94
+
95
+ #### Objective
96
+
97
+ Make the `builder` the only required agent phase. Let the `owner` independently enable or disable the `verifier` and `simplifier` phases.
98
+
99
+ This request concerns agent execution phases, not removal of `spec` preparation or approval.
100
+
101
+ #### Completed when
102
+
103
+ 1. The `builder` remains mandatory.
104
+ 2. The `owner` can select any of these combinations: `builder` only; `builder` and `verifier`; `builder` and `simplifier`; or all three.
105
+ 3. Disabled phases are not delegated and do not block workflow completion.
106
+ 4. The workflow reaches `candidate-ready` after the selected phases complete and any required `owner` decisions are resolved.
107
+ 5. The final summary clearly identifies skipped phases and does not describe skipped verification as passed.
108
+
109
+ #### Decisions to define in the spec
110
+
111
+ 1. Where and when phase selection is configured.
112
+ 2. Default selections.
113
+ 3. Whether selections can change after a workflow starts.
114
+
115
+ #### Context
116
+
117
+ [MAESTRO-24](#maestro-24-add-a-simplifier-with-one-clear-purpose-per-agent) introduced the `simplifier`. Its existing Git-unavailable skip is not an explicit `owner`
118
+ choice. This issue adds independent optionality for both post-`builder` agent phases.
119
+
120
+ ## Implemented, acceptance not confirmed
121
+
122
+ ### MAESTRO-26: Exit Maestro mode automatically at workflow completion
123
+
124
+ Implemented in `0.13.0`. `Maestro` automatically turns off after successfully delivering the final summary of a completed workflow, including when Git is unavailable and
125
+ simplification is skipped. Live tools, status, instructions, and active `spec` selection are cleared; saved workflow files and other extensions remain unchanged.
126
+ Intermediate phases and interrupted workflows do not trigger automatic exit.
127
+
128
+ Linear marks this item Done, but its description still says final `owner` acceptance is pending. Acceptance is not inferred from that status or the release.
129
+
130
+ #### Evidence
131
+
132
+ [Changelog](CHANGELOG.md#0130), [merged PR #43](https://github.com/emilioSp/pi-maestro/pull/43),
133
+ [specification](.specs/20261030-145712-automatically-exit-maestro-mode-at-workflow-completion/spec.md), and
134
+ [original issue](https://linear.app/emilio-spatola/issue/MAESTRO-26/feat-exit-maestro-mode-automatically-at-workflow-completion).
135
+
136
+ ## Completed
137
+
138
+ These entries were recorded as Done in Linear. Their historical verification evidence does not independently establish final `owner` acceptance.
139
+
140
+ ### MAESTRO-7: Route builder failures through owner escalations
141
+
142
+ Route reportable `builder` problems through `owner` `escalations` instead of a terminal failure phase.
143
+
144
+ Released in `0.9.0`. The `builder` reports only `done` or `escalation`. Reportable technical problems use the existing `owner` `escalation` process. Individual `probe`
145
+ results retain `failed`. Execution errors and missing or invalid saved results still stop the workflow without automatic recovery.
146
+
147
+ All 8 `acceptance criteria` passed with no `verifier` `findings`. The saved workflow reached `candidate-ready`.
148
+
149
+ #### Evidence
150
+
151
+ [Specification](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261013-101454-route-builder-failures-through-owner-escalations/spec.md),
152
+ [verifier report](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261013-101454-route-builder-failures-through-owner-escalations/handoffs/verifier/V1.json),
153
+ and [merged PR #32](https://github.com/emilioSp/pi-maestro/pull/32).
154
+
155
+ ### MAESTRO-8: Store escalations and owner decisions in builder handoffs
156
+
157
+ Keep `escalation` questions and `owner` answers together in numbered `builder` `handoffs`.
158
+
159
+ Numbered `builder` `handoffs` contain multiple `escalation` questions and their `owner` resolutions. The `owner` resolves all current questions in one batch. Earlier
160
+ `handoffs` remain available as history. All 10 `acceptance criteria` passed with no `verifier` `findings`. The saved workflow reached `candidate-ready`.
161
+
162
+ #### Evidence
163
+
164
+ [Specification](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261008-132344-store-escalations-in-builder-handoffs/spec.md),
165
+ [verifier report](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261008-132344-store-escalations-in-builder-handoffs/handoffs/verifier/V1.json),
166
+ and [merged PR #27](https://github.com/emilioSp/pi-maestro/pull/27).
167
+
168
+ ### MAESTRO-9: Format glossary terms consistently
169
+
170
+ Apply glossary formatting across documentation and record its exclusions.
171
+
172
+ Applied glossary formatting across the documentation and recorded its exclusions in `AGENTS.md` and the documentation audit skill. The approved change document uses the
173
+ term `spec`. The `owner` confirmed completion.
174
+
175
+ #### Evidence
176
+
177
+ [Glossary](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/docs/glossary.md) and
178
+ [workflow documentation](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/docs/workflow.md).
179
+
180
+ ### MAESTRO-10: Improve status presentation and activation feedback
181
+
182
+ Show clearer status and configured agent details without adding model context.
183
+
184
+ The status bar uses phase icons, theme colors, and shortened `spec` IDs. Successful activation shows the configured `builder` and `verifier` settings without adding the
185
+ notice to session history or model context. All 12 `acceptance criteria` passed with no `verifier` `findings`. The saved workflow reached `candidate-ready`.
186
+
187
+ #### Evidence
188
+
189
+ [Specification](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261007-170438-update-maestro-status-bar-with-agent-models-theme-colors-and-phase-icons/spec.md),
190
+ [verifier report](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261007-170438-update-maestro-status-bar-with-agent-models-theme-colors-and-phase-icons/handoffs/verifier/V1.json),
191
+ and [merged PR #26](https://github.com/emilioSp/pi-maestro/pull/26).
192
+
193
+ ### MAESTRO-11: Introduce Maestro at activation
194
+
195
+ Introduce `Maestro` at activation and load relevant documentation only when needed.
196
+
197
+ Implemented in `0.9.1`. Successful activation introduces `Maestro` and invites the `owner` to ask how it works. The UI-only notice retains the configured agent details
198
+ and does not add session history or start a model request.
199
+
200
+ Active instructions identify absolute paths to the installed README and documentation directory. `Maestro` reads relevant documentation on demand without automatically
201
+ loading its contents.
202
+
203
+ All 6 `acceptance criteria` passed with no `verifier` `findings`. The saved workflow reached `candidate-ready`.
204
+
205
+ #### Evidence
206
+
207
+ [Specification](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261013-171954-introduce-maestro-at-activation/spec.md),
208
+ [verifier report](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261013-171954-introduce-maestro-at-activation/handoffs/verifier/V1.json),
209
+ and [merged PR #33](https://github.com/emilioSp/pi-maestro/pull/33).
210
+
211
+ ### MAESTRO-12: Verify code quality against AGENTS.md instructions
212
+
213
+ Historical outcome: the extra review described below was removed by [MAESTRO-24](#maestro-24-add-a-simplifier-with-one-clear-purpose-per-agent) in `0.11.0`.
214
+
215
+ Require the `verifier` to review affected code against applicable `AGENTS.md` code-quality directives.
216
+
217
+ Implemented in `0.9.2`. `Verifier` guidance now requires code-quality review only for code affected by the approved change when applicable `AGENTS.md` directives exist.
218
+ All existing duties remain unchanged, including independent verification of every `acceptance criterion`.
219
+
220
+ Instruction-violation `findings` identify the instruction file, quote the rule, and explain the violating code through existing evidence fields. Missing files or
221
+ code-quality directives cause only the added review to be skipped. Personal style preferences are not requirements.
222
+
223
+ All 5 `acceptance criteria` passed through independent inspection of the written guidance, with no `verifier` `findings`. No additional model trials were performed. The
224
+ saved workflow reached `candidate-ready`.
225
+
226
+ #### Evidence
227
+
228
+ [Specification](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261013-185941-verify-code-quality-against-agents-md-instructions/spec.md),
229
+ [verifier report](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261013-185941-verify-code-quality-against-agents-md-instructions/handoffs/verifier/V1.json),
230
+ and [merged PR #34](https://github.com/emilioSp/pi-maestro/pull/34).
231
+
232
+ ### MAESTRO-13: Check subagent extensions at activation
233
+
234
+ Require a successful parent `pi-subagents` availability reply before activation.
235
+
236
+ Implemented in `0.9.3`. Activation requires a matching successful version 1 `ping` reply from the parent `pi-subagents` extension within 2000 ms. A failed or invalid
237
+ reply, emission error, or timeout prevents activation and reports the installation requirement. The check starts no agent and makes no model request. It confirms parent
238
+ extension availability, not child execution readiness.
239
+
240
+ All 7 `acceptance criteria` passed using controlled replies and code inspection, with no `verifier` `findings`. The saved workflow reached `candidate-ready`.
241
+
242
+ A later integration test requested by the `owner` directly checks the environment check's failed-reply error. This test addition is outside the completed independent
243
+ verification.
244
+
245
+ #### Evidence
246
+
247
+ [Specification](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261013-194407-check-pi-subagents-availability-with-ping-at-activation/spec.md),
248
+ [verifier report](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261013-194407-check-pi-subagents-availability-with-ping-at-activation/handoffs/verifier/V1.json),
249
+ and [merged PR #35](https://github.com/emilioSp/pi-maestro/pull/35).
250
+
251
+ ### MAESTRO-14: Rename the test support directory
252
+
253
+ Rename `test/` to `tests/` and update affected references.
254
+
255
+ Renamed `test/` to `tests/` at the owner's request. Updated imports, fixture paths, lint configuration, and project instructions. This follows the global instruction to
256
+ keep fixtures under `tests/fixtures`. Source tests remain next to their source files. Historical `handoffs` retain their recorded paths.
257
+
258
+ #### Evidence
259
+
260
+ [Test support](https://github.com/emilioSp/pi-maestro/tree/839ab9eb9753df22804d750657a616a9959c2c47/tests/support/),
261
+ [fixtures](https://github.com/emilioSp/pi-maestro/tree/839ab9eb9753df22804d750657a616a9959c2c47/tests/fixtures/), and
262
+ [lint configuration](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.oxlintrc.json).
263
+
264
+ ### MAESTRO-15: Match handoff criteria to the approved spec
265
+
266
+ Require every approved `spec` criterion ID in each submitted `builder` and `verifier` `handoff`.
267
+
268
+ Implemented in `0.9.5` with the narrower scope approved by the `owner`. Both `handoff` submissions require every `acceptance criterion` ID from the approved `spec` before
269
+ saving a report or changing phase. Extra report IDs remain allowed. Existing report validation is unchanged, and no new check rejects duplicate `spec` IDs.
270
+
271
+ Both `acceptance criteria` passed independent verification with no `findings`. The saved workflow reached `candidate-ready`.
272
+
273
+ Later changes requested by the `owner` extracted the shared check and replaced repeated integration scenarios with unit tests. One missing-ID integration test remains per
274
+ role. These changes are outside the completed independent verification. The final `npm run check` passed all 227 tests and coverage thresholds.
275
+
276
+ #### Evidence
277
+
278
+ [Specification](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261013-211629-match-handoff-criteria-to-the-approved-spec/spec.md),
279
+ [verifier report](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261013-211629-match-handoff-criteria-to-the-approved-spec/handoffs/verifier/V1.json),
280
+ and [merged PR #37](https://github.com/emilioSp/pi-maestro/pull/37).
281
+
282
+ ### MAESTRO-16: Route finding-driven spec revisions through drafting-spec
283
+
284
+ Record `finding` decisions before `spec` revision and require renewed `GREEN FLAG` before another `builder` `run`.
285
+
286
+ Implemented the approved revision route. `Maestro` records every current `finding` decision before returning to `drafting-spec` when revision is required. The `owner`
287
+ reviews the same revised `spec` and gives renewed `GREEN FLAG` before separate approval and another `builder` `run`. Revision takes priority in mixed batches. Direct
288
+ approval from `finding-decisions` is rejected.
289
+
290
+ Later event naming cleanup identifies `builder` and `owner` actions explicitly. Both revision routes use `OWNER_REQUEST_SPEC_REVISION` without changing the phase flow.
291
+ Batch resolution uses `RESOLVE_ESCALATIONS`, and the status label refers to `escalations` in the plural. The saved decision phases are named `escalation-decisions` and
292
+ `finding-decisions`.
293
+
294
+ #### Evidence
295
+
296
+ [Specification](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261015-154812-route-finding-driven-spec-revisions-through-drafting-spec/spec.md)
297
+ and
298
+ [resolution integration tests](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/src/tools/main/resolve-findings.integration.test.ts).
299
+
300
+ ### MAESTRO-17: Keep acceptance criterion numbering continuous
301
+
302
+ Reject gaps in `acceptance criterion` numbering before approving a `spec`.
303
+
304
+ Implemented in `0.9.4`. `Spec` approval rejects numbered `acceptance criterion` headings that do not start at `AC1` and continue without gaps. Rejection leaves saved
305
+ files unchanged.
306
+
307
+ `Maestro` corrects numbering and affected references without changing criterion order or requirements, then retries with the existing `GREEN FLAG`. No additional `owner`
308
+ approval is required.
309
+
310
+ All 3 `acceptance criteria` passed with no `verifier` `findings`. The saved workflow reached `candidate-ready`.
311
+
312
+ #### Evidence
313
+
314
+ [Specification](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261013-202811-check-acceptance-criterion-numbering-before-builder-execution/spec.md),
315
+ [verifier report](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261013-202811-check-acceptance-criterion-numbering-before-builder-execution/handoffs/verifier/V1.json),
316
+ and [merged PR #36](https://github.com/emilioSp/pi-maestro/pull/36).
317
+
318
+ ### MAESTRO-18: Record escalation resolutions when the spec changes
319
+
320
+ #### Objective
321
+
322
+ Save every current `escalation` answer in the original `builder` `handoff`, whether the `spec` stays unchanged or requires revision. Each `resolution` records the owner's
323
+ chosen solution and reason. A decision requiring revision also identifies the `escalation` and describes the agreed `spec` change.
324
+
325
+ #### Agreed flow
326
+
327
+ `Maestro` records the complete decision batch through `maestro_resolve_escalations` before changing phase.
328
+
329
+ | Decision | Next phase and action |
330
+ | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
331
+ | No `spec` change | `escalation-decisions` → `ready-for-builder`. The `builder` continues under the approved `spec`, without renewed approval. |
332
+ | `Spec` change required | `escalation-decisions` → `drafting-spec`. The `owner` and `Maestro` revise and review the same `spec`. |
333
+ | Revised `spec` receives renewed `GREEN FLAG` | `drafting-spec` → `ready-for-builder` through separate `maestro_mark_spec_ready` approval. |
334
+
335
+ Direct `spec` approval from `escalation-decisions` is rejected. Recording answers does not move to `ready-for-verifier`; that phase requires a completed `builder` `pass`.
336
+
337
+ #### Implementation boundaries
338
+
339
+ Reuse the existing resolution operation and `handoff` fields. Do not add a parallel decision store, tool, or workflow phase. Define both resolution transitions explicitly
340
+ in `src/workflow/transitions.ts` and apply them through `transitionWorkflow`. Direct phase assignment elsewhere is banned. Preserve initial `spec` approval, `verifier`
341
+ `finding` decisions, existing batch validation, and historical `handoffs`.
342
+
343
+ #### Completed when
344
+
345
+ Saved `resolutions`, workflow phases, tool results, agent instructions, and human documentation follow the agreed flow. Verification checks both observable behavior and
346
+ use of the central transition definitions for each resolution branch. Passing behavior tests alone is not enough. The new `spec` includes coverage labels and omits
347
+ `acceptance criteria` already covered by tests of the same scenario.
348
+
349
+ ### MAESTRO-21: Label acceptance criterion coverage
350
+
351
+ Historical outcome: the `Coverage` field described below was removed in `0.12.0`. See [changelog](CHANGELOG.md#0120).
352
+
353
+ Label each `acceptance criterion` as success, failure, or unchanged behavior.
354
+
355
+ Implemented with [MAESTRO-22](#maestro-22-avoid-acceptance-criteria-already-covered-by-tests) as one task, as selected by the `owner`. The `spec` template and `Maestro`
356
+ guidance require one `Coverage` label per `acceptance criterion`:
357
+
358
+ | Label | Purpose |
359
+ | ----------- | -------------------------------------------- |
360
+ | `success` | A valid action produces the required result. |
361
+ | `failure` | An invalid action is correctly rejected. |
362
+ | `unchanged` | The change preserves existing behavior. |
363
+
364
+ Use `unchanged` when the criterion explicitly checks behavior that the change must preserve. Labels describe scenarios, not test outcomes. A `failure` scenario passes
365
+ when the invalid action is correctly rejected. A `spec` does not need all three categories. `Maestro` includes labels when presenting criteria to the `owner` and checks
366
+ them against scenarios and `expected results` during review. Approval validation and `handoff` formats remain unchanged.
367
+
368
+ The existing creation integration test now checks that the generated `spec` includes the coverage field. The final `npm run check` passed all 238 tests and coverage
369
+ thresholds. No model trials were performed.
370
+
371
+ #### Evidence
372
+
373
+ [Spec template](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/templates/spec.md),
374
+ [Maestro guidance](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/src/maestro/instructions/getMaestroInstructions.ts),
375
+ [creation integration test](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/src/specs/create.integration.test.ts), and
376
+ [workflow documentation](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/docs/workflow.md#acceptance-criteria).
377
+
378
+ ### MAESTRO-22: Avoid acceptance criteria already covered by tests
379
+
380
+ Omit `acceptance criteria` whose exact scenarios already have test coverage.
381
+
382
+ Implemented with [MAESTRO-21](#maestro-21-label-acceptance-criterion-coverage). `Maestro` inspects existing tests before writing `acceptance criteria`. It omits a
383
+ criterion only when a test covers the same starting conditions, action, and `expected result`. Partial or uncertain coverage does not justify omission. Similar tests do
384
+ not count.
385
+
386
+ During `spec` review, `Maestro` removes criteria whose exact scenarios already have test coverage. It keeps numbering continuous from `AC1` and updates affected
387
+ references. Required behavior remains documented in the requirements and constraints. The same rules apply during `spec` revisions. No automatic approval check was added.
388
+
389
+ Verification consisted of inspecting the written guidance and running `npm run check`. No model trials were performed.
390
+
391
+ #### Evidence
392
+
393
+ [Maestro guidance](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/src/maestro/instructions/getMaestroInstructions.ts),
394
+ [spec template](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/templates/spec.md), and
395
+ [workflow documentation](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/docs/workflow.md#acceptance-criteria).
396
+
397
+ ### MAESTRO-24: Add a simplifier with one clear purpose per agent
398
+
399
+ Run the `simplifier` after accepted verification, with a Git-only file scope and separate report.
400
+
401
+ Completed under the
402
+ [specification](https://github.com/emilioSp/pi-maestro/blob/839ab9eb9753df22804d750657a616a9959c2c47/.specs/20261016-090319-add-a-dedicated-simplifier-after-verification/spec.md).
403
+ The `owner` confirmed completion. The `builder` implements the approved `spec`. The `verifier` checks its `acceptance criteria`. The `simplifier` refactors accepted code
404
+ for clarity. The extra code-quality review introduced in [MAESTRO-12](#maestro-12-verify-code-quality-against-agentsmd-instructions) is removed from the verifier's
405
+ instructions.
406
+
407
+ Successful verification and rejection of all current `findings` save `simplifier-running`. `Maestro` calls `maestro_run_simplifier` without another approval or
408
+ verification cycle. Only that tool checks Git readiness. If Git is unavailable, it warns and saves `candidate-ready` without delegation or a `simplifier` `handoff`.
409
+
410
+ The `simplifier` selects all uncommitted code changes, including pre-existing staged, unstaged, and untracked files. It preserves observable behavior and the accepted
411
+ check baseline. Rejected `findings` remain rejected, not passed. Required caller updates can include initially unchanged files. Unrelated refactoring, index changes, and
412
+ automatic commits are excluded.
413
+
414
+ A completed `pass` saves the fixed, unnumbered `handoffs/simplifier/S.json`, then saves `candidate-ready`. The report contains refactored files, a summary, and notes. No
415
+ refactoring is required when selected code is already clear. Maestro's final summary separates this report from independent `verifier` evidence.
@@ -39,19 +39,22 @@ For example, if Pi starts in `/work/app/src`, `Maestro` reads `/work/app/src/.pi
39
39
  | `version` | Yes, when the file exists | `1.0.0` | Configuration format version. Only `1.0.0` is supported. |
40
40
  | `specDirectory` | No | `.specs` | Relative path below the project root. |
41
41
  | `builder` | No | `Builder` defaults | Overrides supported `builder` fields. |
42
- | `builder.model` | No | `openai-codex/gpt-5.6-luna` | Full `provider/model` identifier. |
42
+ | `builder.model` | No | `openai-codex/gpt-5.6-luna` | Model string passed unchanged to Pi. |
43
43
  | `builder.thinking` | No | `max` | One supported thinking level. |
44
44
  | `builder.timeoutMinutes` | No | `60` | Integer from `1` to `1440`. Applies to each `builder` `run`. |
45
45
  | `verifier` | No | `Verifier` defaults | Overrides supported `verifier` fields. |
46
- | `verifier.model` | No | `openai-codex/gpt-6.1-sol` | Full `provider/model` identifier. |
46
+ | `verifier.model` | No | `openai-codex/gpt-6.1-sol` | Model string passed unchanged to Pi. |
47
47
  | `verifier.thinking` | No | `high` | One supported thinking level. |
48
48
  | `verifier.timeoutMinutes` | No | `60` | Integer from `1` to `1440`. Applies to each `verifier` `run`. |
49
49
  | `simplifier` | No | `Simplifier` defaults | Overrides supported `simplifier` fields. |
50
- | `simplifier.model` | No | `openai-codex/gpt-6.1-sol` | Full `provider/model` identifier. |
50
+ | `simplifier.model` | No | `openai-codex/gpt-6.1-sol` | Model string passed unchanged to Pi. |
51
51
  | `simplifier.thinking` | No | `high` | One supported thinking level. |
52
52
  | `simplifier.timeoutMinutes` | No | `60` | Integer from `1` to `1440`. Applies to each `simplifier` `run`. |
53
53
 
54
- Model identifiers use the full `provider/model` form shown in the defaults. `Maestro` accepts these thinking levels:
54
+ Model values use the full `provider/model` identifier supplied by Pi's model registry, such as `openrouter/~openai/gpt-mini-latest`. Model IDs may contain additional
55
+ slashes. `Maestro` does not apply a separate format rule; it matches the complete identifier against Pi's available models and passes it unchanged through `pi-subagents`.
56
+
57
+ `Maestro` accepts these thinking levels:
55
58
 
56
59
  ```text
57
60
  off
@@ -95,7 +98,8 @@ For example, `specDirectory: "planning/specs"` places `specs` in `<project-root>
95
98
 
96
99
  ## Model access
97
100
 
98
- `Maestro` checks all three configured models during activation. Each model must exist and have valid authentication.
101
+ During activation, `Maestro` checks all three configured models against `context.modelRegistry.getAvailable()`. Pi's registry is the source of truth for model
102
+ availability; `Maestro` does not maintain a separate model list or authentication check. A missing model stops activation and identifies the full configured identifier.
99
103
 
100
- A model error stops activation and identifies the affected model. The `owner` can correct the model identifier or authenticate the provider, then run `/maestro` again.
101
- Agent names and context are described in [Subagent integration](subagent-integration.md#roles-and-context).
104
+ The `owner` can correct the identifier or authenticate the provider in Pi, then retry `/maestro`. Authentication or provider errors during delegation still appear as
105
+ `run` failures. Agent names and context are described in [Subagent integration](subagent-integration.md#roles-and-context).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emiliosp/pi-maestro",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "A spec-driven multiagent development workflow for Pi.",
5
5
  "keywords": [
6
6
  "orchestration",
@@ -28,6 +28,7 @@
28
28
  "docs/",
29
29
  "MISSION.md",
30
30
  "TECH_STACK.md",
31
+ "ROADMAP.md",
31
32
  "CHANGELOG.md",
32
33
  "ADR.md",
33
34
  "README.md",
@@ -39,7 +39,7 @@ const formatError = (error: SchemaValidationError): string => {
39
39
  }
40
40
 
41
41
  if (path.endsWith('model')) {
42
- return `Invalid model identifier at "${path}". Must use "provider/model" format.`;
42
+ return `Invalid model at "${path}": expected a string.`;
43
43
  }
44
44
 
45
45
  if (path === 'builder' || path === 'verifier' || path === 'simplifier') {
@@ -23,8 +23,6 @@ export const THINKING_LEVELS = {
23
23
 
24
24
  export type ThinkingLevel = (typeof THINKING_LEVELS)[keyof typeof THINKING_LEVELS];
25
25
 
26
- export const MODEL_PATTERN = '^[^/\\s]+/[^/\\s]+$';
27
-
28
26
  export const SUPPORTED_CONFIG_VERSION = '1.0.0';
29
27
 
30
28
  export const MIN_TIMEOUT_MINUTES = 1;
@@ -43,7 +41,7 @@ export const ThinkingSchema = Type.Union([
43
41
 
44
42
  export const PartialAgentConfigSchema = Type.Object(
45
43
  {
46
- model: Type.Optional(Type.String({ pattern: MODEL_PATTERN })),
44
+ model: Type.Optional(Type.String()),
47
45
  thinking: Type.Optional(ThinkingSchema),
48
46
  timeoutMinutes: Type.Optional(
49
47
  Type.Integer({
@@ -68,7 +66,7 @@ export const MaestroConfigInputSchema = Type.Object(
68
66
 
69
67
  export const ResolvedAgentConfigSchema = Type.Object(
70
68
  {
71
- model: Type.String({ pattern: MODEL_PATTERN }),
69
+ model: Type.String(),
72
70
  thinking: ThinkingSchema,
73
71
  timeoutMinutes: Type.Integer({
74
72
  minimum: MIN_TIMEOUT_MINUTES,
@@ -57,9 +57,7 @@ function assertModelsAvailable({ context, config }: AssertModelsAvailableInput):
57
57
  const availableModels = context.modelRegistry.getAvailable();
58
58
 
59
59
  for (const model of [config.builder.model, config.verifier.model, config.simplifier.model]) {
60
- const [provider, id] = model.split('/');
61
-
62
- if (!availableModels.some((entry) => entry.provider === provider && entry.id === id)) {
60
+ if (!availableModels.some((entry) => `${entry.provider}/${entry.id}` === model)) {
63
61
  throw new Error(`Configured model is not available: "${model}".`);
64
62
  }
65
63
  }