@emiliosp/pi-maestro 0.4.5 → 0.5.1
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/README.md +1 -1
- package/agents/builder.md +10 -26
- package/agents/verifier.md +11 -29
- package/docs/workflow.md +6 -9
- package/package.json +1 -1
- package/src/artifacts/builder-handoff/assertBuilderHandoff.ts +5 -12
- package/src/artifacts/builder-handoff/schema.ts +0 -13
- package/src/artifacts/verifier-handoff/assertVerifierHandoff.ts +5 -11
- package/src/maestro/instructions/getMaestroInstructions.ts +14 -6
- package/src/tools/child/record-builder-handoff.ts +1 -1
- package/templates/spec.md +2 -5
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ Four principles hold the workflow together:
|
|
|
12
12
|
|
|
13
13
|
- The approved spec is the contract for the builder and verifier.
|
|
14
14
|
- No agent approves its own work.
|
|
15
|
-
- Every acceptance criterion is checked independently.
|
|
15
|
+
- Every acceptance criterion is checked independently.
|
|
16
16
|
- An agent never decides for the owner, and never guesses.
|
|
17
17
|
|
|
18
18
|
## The roles
|
package/agents/builder.md
CHANGED
|
@@ -54,49 +54,33 @@ Record significant discoveries without an owner decision in handoff `notes`. Do
|
|
|
54
54
|
## Prove every acceptance criterion
|
|
55
55
|
|
|
56
56
|
Run every probe, including on repair passes. Previous evidence does not replace this pass's results.
|
|
57
|
-
The spec defines probe scenarios, expected results, and
|
|
57
|
+
The spec defines probe scenarios, expected results, and concrete examples.
|
|
58
58
|
Choose test code, fixtures, mocks, and commands that cover each approved scenario.
|
|
59
59
|
These execution details are your responsibility, not missing owner decisions. Follow any explicit execution constraints in the approved spec.
|
|
60
|
-
|
|
61
|
-
Do not
|
|
62
|
-
Only for criteria with a selected breakage, choose a safe temporary change and use this sequence:
|
|
63
|
-
|
|
64
|
-
1. Run the executable probe against the implementation and observe the expected result.
|
|
65
|
-
2. Apply the chosen safe, temporary breakage in the current checkout.
|
|
66
|
-
3. Run the same probe and confirm that the breakage causes the expected behavior to fail.
|
|
67
|
-
4. Restore the implementation to its pre-breakage state. Remove temporary files and undo temporary staging changes.
|
|
68
|
-
5. Run the same probe again and confirm that the expected result returns.
|
|
69
|
-
|
|
70
|
-
Never apply breakage to production data or services. Restore each breakage before testing the next criterion.
|
|
71
|
-
Do not change approved probe scenarios, expected results, broken behavior, or design decisions to obtain passing results.
|
|
72
|
-
Keep the executable probe unchanged throughout each pass, fail, pass sequence.
|
|
60
|
+
Run each executable probe against the implementation and compare the observed result with the expected result.
|
|
61
|
+
Do not change approved probe scenarios, expected results, examples, or design decisions to obtain passing results.
|
|
73
62
|
If the implementation fails, repair it within the contract and repeat the proof for affected criteria.
|
|
74
|
-
If the contract needs clarification or revision, escalate instead of inventing a replacement probe
|
|
63
|
+
If the contract needs clarification or revision, escalate instead of inventing a replacement probe.
|
|
75
64
|
For visual claims, use the specified reproducible procedure and compare with prototypes when required.
|
|
76
65
|
Run applicable repository checks. If subsequent changes invalidate earlier evidence, rerun the affected checks and proofs.
|
|
77
66
|
|
|
78
|
-
For each criterion, record its exact `id`, actual command or procedure in `probe`,
|
|
79
|
-
|
|
80
|
-
Use `probeStatus: passed` when the probe passes. If breakage is required, it must pass both before breakage and after restoration.
|
|
67
|
+
For each criterion, record its exact `id`, actual command or procedure in `probe`, and `probeStatus`.
|
|
68
|
+
Use `probeStatus: passed` when the observed result matches the expected result.
|
|
81
69
|
Use `failed` for an observed probe failure and `not-run` for an unexecuted probe.
|
|
82
|
-
Use `breakageStatus: confirmed` only when the specified breakage makes the same probe detect the broken behavior.
|
|
83
|
-
Use `not-confirmed` when that detection fails and `not-run` when a required breakage check was not executed.
|
|
84
|
-
Use `not-required` only when the approved spec does not require a breakage check. Never use it to hide an unexecuted required check.
|
|
85
|
-
Do not claim confirmed breakage from an unrelated command or environment failure.
|
|
86
70
|
Include every spec criterion once. Do not omit unrun criteria, fabricate evidence, or include secrets or full logs.
|
|
87
71
|
|
|
88
72
|
## Record exactly one outcome
|
|
89
73
|
|
|
90
|
-
Before any terminal tool call, restore
|
|
74
|
+
Before any terminal tool call, restore temporary verification changes and remove temporary verification files. Keep the implementation work.
|
|
91
75
|
Choose the outcome from the actual result:
|
|
92
76
|
|
|
93
|
-
1. `done`: Implementation and required checks are complete. Every criterion has `probeStatus: passed
|
|
77
|
+
1. `done`: Implementation and required checks are complete. Every criterion has `probeStatus: passed`. Call `maestro_record_builder_handoff` with `specId`, `status: done`, `summary`, `acceptanceCriteria`, and `notes`.
|
|
94
78
|
2. Escalation: An owner decision is required. Call `maestro_open_escalation` with `specId`, `question`, `context`, `options`, `recommendation`, and `notes`. Include evidence in the context. Give each option an ID, description, consequences, and next step. Use `recommendation: null` unless evidence supports a specific option. Do not also submit a builder handoff.
|
|
95
79
|
3. `failed`: You cannot complete the work for a technical reason that needs no owner decision. Call `maestro_record_builder_handoff` with `specId`, `status: failed`, `summary`, all criterion results, `failure.reason`, and `notes`. Report actual statuses, including `not-run` where applicable.
|
|
96
80
|
|
|
97
81
|
After a successful terminal call, commit the implementation and generated protocol files together through Bash and Git.
|
|
98
82
|
For `done` or `failed`, include `workflow.json` and `handoffs/builder.json`. For escalation, include `workflow.json` and the generated escalation file.
|
|
99
|
-
Inspect the staged changes before committing. Do not include temporary
|
|
83
|
+
Inspect the staged changes before committing. Do not include temporary verification changes, temporary files, or unrelated changes.
|
|
100
84
|
Confirm that the checkout is clean, then return a concise outcome and commit ID to Maestro. Stop the pass.
|
|
101
85
|
Do not wait for an escalation answer, run the verifier, or continue implementation after the terminal call.
|
|
102
86
|
|
|
@@ -106,7 +90,7 @@ If a terminal call fails, inspect the error, current phase, and artifacts before
|
|
|
106
90
|
If validation rejected the submission without writing it, correct the payload to match the tool schema and actual evidence.
|
|
107
91
|
If the tool partially wrote an artifact or changed phase before an error, report it and stop. Do not resubmit.
|
|
108
92
|
Never change honest statuses or omit criteria merely to make a payload pass validation.
|
|
109
|
-
The tool rejects `failed` when a nonempty criterion list contains only `passed` probes
|
|
93
|
+
The tool rejects `failed` when a nonempty criterion list contains only `passed` probes.
|
|
110
94
|
If another technical failure prevents completion in that case, report this protocol limitation to Maestro instead of falsifying criterion results.
|
|
111
95
|
If the terminal call succeeded but the commit failed, address the Git error without submitting a second outcome.
|
|
112
96
|
Do not delete a terminal artifact, edit workflow state, or use a different outcome to bypass an error.
|
package/agents/verifier.md
CHANGED
|
@@ -38,30 +38,17 @@ Do not run `git commit` or change the candidate to make verification succeed.
|
|
|
38
38
|
## Regenerate every proof
|
|
39
39
|
|
|
40
40
|
Verify every acceptance criterion from the candidate, including criteria checked in earlier runs.
|
|
41
|
-
Do not trust the builder's results or silently change the approved behavior, probe scenarios, expected results, or
|
|
42
|
-
Read executable probes
|
|
41
|
+
Do not trust the builder's results or silently change the approved behavior, probe scenarios, expected results, or examples.
|
|
42
|
+
Read executable probes from the candidate and builder handoff. Independently check that they cover the approved scenarios.
|
|
43
43
|
The spec need not prescribe test code, fixtures, mocks, commands, or exact code edits. Missing execution details alone are not a contract gap.
|
|
44
44
|
Use temporary verification files when needed to execute an approved scenario. Do not repair committed tests or weaken their coverage.
|
|
45
45
|
If the builder's checks miss required behavior, record a finding even if your own probe passes.
|
|
46
46
|
Follow any explicit execution constraints in the approved spec.
|
|
47
|
-
|
|
48
|
-
If
|
|
49
|
-
|
|
50
|
-
If the builder skipped a required breakage, record a finding even if your own check succeeds.
|
|
51
|
-
Only for criteria with a selected breakage, use this sequence:
|
|
52
|
-
|
|
53
|
-
1. Run the executable probe against the candidate and record the observed result.
|
|
54
|
-
2. Apply a safe, temporary change that causes the specified broken behavior in the current checkout.
|
|
55
|
-
3. Run the same probe and record whether it detects the specified broken behavior.
|
|
56
|
-
4. Restore the candidate, including temporary files and staged changes.
|
|
57
|
-
5. Run the same probe again and record the observed result after restoration.
|
|
58
|
-
|
|
59
|
-
Keep the executable probe unchanged throughout each pass, fail, pass sequence.
|
|
60
|
-
Never apply breakage to production data or services. Restore each breakage before testing the next criterion.
|
|
61
|
-
If a probe fails, record a finding. Do not repair the candidate to continue the sequence.
|
|
62
|
-
If a probe or required breakage is unsafe, undefined, or impossible to execute, record the limitation as a finding.
|
|
47
|
+
Run each executable probe against the candidate and compare the observed result with the expected result.
|
|
48
|
+
If a probe fails, record a finding. Do not repair the candidate.
|
|
49
|
+
If a probe is unsafe, undefined, or impossible to execute, record the limitation as a finding.
|
|
63
50
|
Continue with other criteria that can be checked safely. Do not stop the entire review at the first finding.
|
|
64
|
-
Use temporary files only as needed for the specified probes
|
|
51
|
+
Use temporary files only as needed for the specified probes. Remove them before handoff.
|
|
65
52
|
For visual claims, produce reproducible evidence through the spec's procedure, including prototype comparisons when required.
|
|
66
53
|
|
|
67
54
|
Follow applicable repository commands and technical rules. Do not invent required commands.
|
|
@@ -69,20 +56,15 @@ Inspect check scripts before execution. Do not use automatic fixes to repair the
|
|
|
69
56
|
If a required check changes files, record that effect and restore those changes before further verification.
|
|
70
57
|
A result obtained only after an automatic fix does not prove that the candidate passes.
|
|
71
58
|
|
|
72
|
-
For each criterion, record its exact `id`, actual command or procedure in `probe`,
|
|
73
|
-
|
|
74
|
-
Use `probeStatus: passed` when the probe passes. If breakage is required, it must pass both before breakage and after restoration.
|
|
59
|
+
For each criterion, record its exact `id`, actual command or procedure in `probe`, and `probeStatus`.
|
|
60
|
+
Use `probeStatus: passed` when the observed result matches the expected result.
|
|
75
61
|
Use `failed` for an observed probe failure and `not-run` for an unexecuted probe.
|
|
76
|
-
Use `breakageStatus: confirmed` only when the specified breakage makes the same probe detect the broken behavior.
|
|
77
|
-
Use `not-confirmed` when that detection fails and `not-run` when a required breakage check was not executed.
|
|
78
|
-
Use `not-required` only when the approved spec does not require a breakage check. Never use it to hide an unexecuted required check.
|
|
79
|
-
An existing baseline failure or unrelated environment error does not confirm breakage.
|
|
80
62
|
Include every spec criterion once. Never omit unrun criteria or fabricate evidence.
|
|
81
63
|
|
|
82
64
|
## Record findings, not decisions
|
|
83
65
|
|
|
84
66
|
Record technical issues supported by fresh evidence. Do not add requirements, style preferences, or unrelated improvements.
|
|
85
|
-
Give every criterion with a probe other than `passed`
|
|
67
|
+
Give every criterion with a probe other than `passed` at least one related finding.
|
|
86
68
|
Report required repository check failures as findings, even when every acceptance criterion passes.
|
|
87
69
|
Do not copy an earlier rejection into a new finding. Only the owner can reject current findings through Maestro.
|
|
88
70
|
|
|
@@ -96,12 +78,12 @@ For each finding, follow the tool schema:
|
|
|
96
78
|
6. Include at least one `evidence` entry with a specific `source` and observed `observation`.
|
|
97
79
|
7. Set `rejection: null`.
|
|
98
80
|
|
|
99
|
-
Use `findings: []` only when every probe passes
|
|
81
|
+
Use `findings: []` only when every probe passes and no other technical findings remain.
|
|
100
82
|
Keep summaries and notes concise. Do not include full logs or secrets.
|
|
101
83
|
|
|
102
84
|
## Restore and submit
|
|
103
85
|
|
|
104
|
-
Before handoff, restore every temporary change from probes
|
|
86
|
+
Before handoff, restore every temporary change from probes and repository checks.
|
|
105
87
|
Compare both staged and unstaged files with the supplied candidate commit. Inspect untracked files as well.
|
|
106
88
|
Remove only temporary files created during this pass. Do not overwrite unrelated changes or use blanket cleanup commands.
|
|
107
89
|
All files outside the tool-owned `workflow.json` and `handoffs/verifier.json` must match the candidate.
|
package/docs/workflow.md
CHANGED
|
@@ -46,9 +46,7 @@ The owner has final authority over:
|
|
|
46
46
|
|
|
47
47
|
The builder works on the current branch with a fresh context.
|
|
48
48
|
|
|
49
|
-
It reads the active spec, implements the approved change, and runs every
|
|
50
|
-
|
|
51
|
-
The builder checks every criterion. For the criteria the owner selects in the spec, it also introduces a temporary fault to prove that the check detects it.
|
|
49
|
+
It reads the active spec, implements the approved change, and runs every probe against its expected result.
|
|
52
50
|
|
|
53
51
|
The builder ends a run with one of these outcomes:
|
|
54
52
|
|
|
@@ -64,7 +62,7 @@ It reads the active spec and available artifacts. Historical artifacts provide c
|
|
|
64
62
|
|
|
65
63
|
Before the verifier starts, Maestro commits a `verifier-running` checkpoint. That checkpoint is the candidate commit.
|
|
66
64
|
|
|
67
|
-
The verifier does not repair product code. It independently
|
|
65
|
+
The verifier does not repair product code. It independently runs every probe against its expected result. It restores all temporary changes before reporting its results.
|
|
68
66
|
|
|
69
67
|
## Main flow
|
|
70
68
|
|
|
@@ -167,12 +165,11 @@ Probe
|
|
|
167
165
|
Expected result
|
|
168
166
|
What the probe must observe.
|
|
169
167
|
|
|
170
|
-
|
|
171
|
-
|
|
168
|
+
Example
|
|
169
|
+
Specific starting conditions, input or action, and the exact expected result.
|
|
172
170
|
```
|
|
173
171
|
|
|
174
|
-
|
|
175
|
-
The owner selects a breakage check during spec preparation when a proof, that the test detects a specific error, is needed.
|
|
172
|
+
The builder and verifier each run every probe and compare the observed result with the expected result.
|
|
176
173
|
|
|
177
174
|
## Escalations
|
|
178
175
|
|
|
@@ -249,5 +246,5 @@ The default spec directory contains:
|
|
|
249
246
|
```
|
|
250
247
|
|
|
251
248
|
- `builder.json` and `verifier.json` represent the current handoffs and can be overwritten by later runs.
|
|
252
|
-
- Builder handoff `notes` contain
|
|
249
|
+
- Builder handoff `notes` contain significant discoveries that did not require an owner decision. Maestro summarizes the relevant results at the end.
|
|
253
250
|
- Earlier versions of all artifacts remain in Git commits.
|
package/package.json
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
|
|
6
6
|
import { Value } from 'typebox/value';
|
|
7
7
|
import {
|
|
8
|
-
BREAKAGE_STATUSES,
|
|
9
8
|
BUILDER_HANDOFF_STATUSES,
|
|
10
9
|
type BuilderAcceptanceCriterion,
|
|
11
10
|
type BuilderHandoff,
|
|
@@ -20,21 +19,17 @@ const hasUniqueAcceptanceCriterionIds = (
|
|
|
20
19
|
new Set(acceptanceCriteria.map((criterion) => criterion.id)).size ===
|
|
21
20
|
acceptanceCriteria.length;
|
|
22
21
|
|
|
23
|
-
const
|
|
22
|
+
const hasOnlyPassedProbes = (
|
|
24
23
|
acceptanceCriteria: BuilderAcceptanceCriterion[],
|
|
25
24
|
): boolean =>
|
|
26
25
|
acceptanceCriteria.every(
|
|
27
|
-
(criterion) =>
|
|
28
|
-
criterion.probeStatus === PROBE_STATUSES.PASSED &&
|
|
29
|
-
(criterion.breakageStatus === BREAKAGE_STATUSES.CONFIRMED ||
|
|
30
|
-
criterion.breakageStatus === BREAKAGE_STATUSES.NOT_REQUIRED),
|
|
26
|
+
(criterion) => criterion.probeStatus === PROBE_STATUSES.PASSED,
|
|
31
27
|
);
|
|
32
28
|
|
|
33
29
|
const hasValidFailedChecks = (
|
|
34
30
|
acceptanceCriteria: BuilderAcceptanceCriterion[],
|
|
35
31
|
): boolean =>
|
|
36
|
-
acceptanceCriteria.length === 0 ||
|
|
37
|
-
!hasOnlyCompletedChecks(acceptanceCriteria);
|
|
32
|
+
acceptanceCriteria.length === 0 || !hasOnlyPassedProbes(acceptanceCriteria);
|
|
38
33
|
|
|
39
34
|
function assertBuilderHandoffSchema(
|
|
40
35
|
input: unknown,
|
|
@@ -72,11 +67,9 @@ export function assertBuilderHandoff(
|
|
|
72
67
|
|
|
73
68
|
if (
|
|
74
69
|
handoff.status === BUILDER_HANDOFF_STATUSES.DONE &&
|
|
75
|
-
!
|
|
70
|
+
!hasOnlyPassedProbes(handoff.acceptanceCriteria)
|
|
76
71
|
) {
|
|
77
|
-
throw new Error(
|
|
78
|
-
'Done builder handoff requires every probe to pass and every breakage check to be confirmed or not required.',
|
|
79
|
-
);
|
|
72
|
+
throw new Error('Done builder handoff requires every probe to pass.');
|
|
80
73
|
}
|
|
81
74
|
|
|
82
75
|
if (
|
|
@@ -24,28 +24,15 @@ export const PROBE_STATUSES = {
|
|
|
24
24
|
NOT_RUN: 'not-run',
|
|
25
25
|
} as const;
|
|
26
26
|
|
|
27
|
-
export const BREAKAGE_STATUSES = {
|
|
28
|
-
CONFIRMED: 'confirmed',
|
|
29
|
-
NOT_CONFIRMED: 'not-confirmed',
|
|
30
|
-
NOT_RUN: 'not-run',
|
|
31
|
-
NOT_REQUIRED: 'not-required',
|
|
32
|
-
} as const;
|
|
33
|
-
|
|
34
27
|
export type ProbeStatus = (typeof PROBE_STATUSES)[keyof typeof PROBE_STATUSES];
|
|
35
28
|
|
|
36
|
-
export type BreakageStatus =
|
|
37
|
-
(typeof BREAKAGE_STATUSES)[keyof typeof BREAKAGE_STATUSES];
|
|
38
|
-
|
|
39
29
|
const ProbeStatusSchema = StringEnum(Object.values(PROBE_STATUSES));
|
|
40
30
|
|
|
41
|
-
const BreakageStatusSchema = StringEnum(Object.values(BREAKAGE_STATUSES));
|
|
42
|
-
|
|
43
31
|
export const BuilderAcceptanceCriterionSchema = Type.Object(
|
|
44
32
|
{
|
|
45
33
|
id: Type.String({ minLength: 1 }),
|
|
46
34
|
probe: Type.String({ minLength: 1 }),
|
|
47
35
|
probeStatus: ProbeStatusSchema,
|
|
48
|
-
breakageStatus: BreakageStatusSchema,
|
|
49
36
|
},
|
|
50
37
|
{ additionalProperties: false },
|
|
51
38
|
);
|
|
@@ -4,22 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { Value } from 'typebox/value';
|
|
7
|
-
import {
|
|
8
|
-
BREAKAGE_STATUSES,
|
|
9
|
-
type BuilderAcceptanceCriterion,
|
|
10
|
-
PROBE_STATUSES,
|
|
11
|
-
} from '#artifacts/builder-handoff/schema.ts';
|
|
7
|
+
import { PROBE_STATUSES } from '#artifacts/builder-handoff/schema.ts';
|
|
12
8
|
import {
|
|
13
9
|
type VerifierHandoff,
|
|
14
10
|
VerifierHandoffSchema,
|
|
15
11
|
} from '#artifacts/verifier-handoff/schema.ts';
|
|
16
12
|
import { isValidSpecId } from '#ids/isValidSpecId.ts';
|
|
17
13
|
|
|
18
|
-
const hasCompletedChecks = (criterion: BuilderAcceptanceCriterion): boolean =>
|
|
19
|
-
criterion.probeStatus === PROBE_STATUSES.PASSED &&
|
|
20
|
-
(criterion.breakageStatus === BREAKAGE_STATUSES.CONFIRMED ||
|
|
21
|
-
criterion.breakageStatus === BREAKAGE_STATUSES.NOT_REQUIRED);
|
|
22
|
-
|
|
23
14
|
function assertVerifierHandoffSchema(
|
|
24
15
|
input: unknown,
|
|
25
16
|
): asserts input is VerifierHandoff {
|
|
@@ -89,7 +80,10 @@ export function assertVerifierHandoff(
|
|
|
89
80
|
);
|
|
90
81
|
|
|
91
82
|
for (const criterion of handoff.acceptanceCriteria) {
|
|
92
|
-
if (
|
|
83
|
+
if (
|
|
84
|
+
criterion.probeStatus !== PROBE_STATUSES.PASSED &&
|
|
85
|
+
!findingCriteria.has(criterion.id)
|
|
86
|
+
) {
|
|
93
87
|
throw new Error(
|
|
94
88
|
`Verifier handoff incomplete acceptance criterion "${criterion.id}" requires a finding.`,
|
|
95
89
|
);
|
|
@@ -30,10 +30,9 @@ Wait for each tool result before taking the next workflow action. Do not launch
|
|
|
30
30
|
3. Ask one focused question at a time. Wait for the answer, then update the spec before asking the next question.
|
|
31
31
|
4. Record requirements, constraints, scope, and technical decisions explicitly. Do not invent requirements or silently resolve owner decisions.
|
|
32
32
|
5. Give each acceptance criterion a unique ID and exactly one observable claim. Describe its probe scenario and expected result in plain language. Include a concrete example in every criterion, both in spec.md and when presenting it to the owner.
|
|
33
|
-
6.
|
|
34
|
-
7.
|
|
35
|
-
8.
|
|
36
|
-
9. Ask the owner to commit spec.md, its prototypes, and workflow.json. Do not start the builder until the checkout is clean.
|
|
33
|
+
6. Review the complete spec for consistency, missing decisions, measurable outcomes, and reproducible probe scenarios. Remove repetition and unnecessary implementation details. Resolve gaps with the owner.
|
|
34
|
+
7. Request explicit approval. Only after approval, call maestro_mark_spec_ready with the active specId.
|
|
35
|
+
8. Ask the owner to commit spec.md, its prototypes, and workflow.json. Do not start the builder until the checkout is clean.
|
|
37
36
|
|
|
38
37
|
Write spec.md for the owner. Keep detail proportional to the change and state each requirement once.
|
|
39
38
|
Use the template topics as guidance. Omit empty subsections instead of filling them with Not applicable.
|
|
@@ -41,10 +40,19 @@ Keep behavior, scope, constraints, and approved architectural decisions in the s
|
|
|
41
40
|
Keep probes as starting conditions and actions or observations, with measurable expected results.
|
|
42
41
|
Each example must show specific starting conditions, an input or action, and the exact observable result expected from that scenario.
|
|
43
42
|
Use concrete values or states, not a restatement of the claim. Keep examples within the criterion's scope and approved behavior.
|
|
44
|
-
Every probe remains mandatory for builder and verifier.
|
|
45
|
-
|
|
43
|
+
Every probe remains mandatory for builder and verifier.
|
|
44
|
+
The builder chooses test code, fixtures, mocks, and commands.
|
|
46
45
|
Do not copy agent procedures, repository rules, investigation logs, or workflow history into the spec.
|
|
47
46
|
|
|
47
|
+
During spec preparation and revisions, identify the decisions and unresolved facts that each open question depends on.
|
|
48
|
+
Ask a question only after its prerequisite decisions are settled and the relevant investigation is complete.
|
|
49
|
+
After each owner answer or investigation result, update the remaining questions and remove those that no longer apply.
|
|
50
|
+
If an earlier decision changes, review the decisions that depend on it.
|
|
51
|
+
|
|
52
|
+
Before requesting approval for an initial or revised spec, check that all decisions needed for the agreed scope are explicit.
|
|
53
|
+
Resolve open decisions with the owner before requesting approval. Do not leave necessary decisions as implicit assumptions.
|
|
54
|
+
Do not extend this check to routine implementation choices that belong to the builder.
|
|
55
|
+
|
|
48
56
|
During spec preparation and revisions, investigate each technical decision before presenting options or recommending an answer. Do not wait for the owner to request code analysis.
|
|
49
57
|
Trace the relevant code and data flow across affected components, including transformations that limit the available data.
|
|
50
58
|
Use repository evidence to explain each option's feasibility, required changes, scope, and effects on existing behavior.
|
|
@@ -18,7 +18,7 @@ export const BUILDER_HANDOFF_TOOL = {
|
|
|
18
18
|
NAME: 'maestro_record_builder_handoff',
|
|
19
19
|
LABEL: 'Record Builder Handoff',
|
|
20
20
|
DESCRIPTION:
|
|
21
|
-
'Record the builder pass as done or failed. Put
|
|
21
|
+
'Record the builder pass as done or failed. Put significant discoveries that do not require an owner decision in notes. After success, commit the implementation, handoff, and workflow state together with Bash and Git.',
|
|
22
22
|
} as const;
|
|
23
23
|
|
|
24
24
|
const BuilderHandoffContentFields = {
|
package/templates/spec.md
CHANGED
|
@@ -52,17 +52,14 @@ Leave local implementation choices, test code, fixtures, mocks, and commands to
|
|
|
52
52
|
1. Probe: <starting conditions and action or observation, without prescribing test implementation>
|
|
53
53
|
2. Expected result: <observable and measurable outcome>
|
|
54
54
|
3. Example: <specific starting conditions, concrete input or action, and exact expected result for this probe, not a restatement of the claim>
|
|
55
|
-
4. Breakage: Not required. <Only when selected with the owner: describe the wrong behavior that a safe temporary change must cause and the probe must detect.>
|
|
56
55
|
|
|
57
56
|
<!--
|
|
58
57
|
Example:
|
|
59
58
|
Probe: Save a change to an item's title, then reopen the item.
|
|
60
59
|
Expected result: The saved title is still present.
|
|
61
60
|
Example: An item's title is "Draft". Change it to "Ready", save, and reopen the item. The title is "Ready".
|
|
62
|
-
Breakage (if selected): Discard the title change instead of saving it.
|
|
63
61
|
|
|
64
|
-
|
|
65
|
-
The builder
|
|
66
|
-
The builder chooses executable checks and safe temporary changes. The verifier checks their coverage independently.
|
|
62
|
+
The builder and verifier each run every probe.
|
|
63
|
+
The builder chooses executable checks. The verifier checks their coverage independently.
|
|
67
64
|
Keep execution evidence in handoffs, not in this spec.
|
|
68
65
|
-->
|