@emiliosp/pi-maestro 0.4.4 → 0.5.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/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. You select which criteria also need a temporary fault to prove error detection.
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 any selected breakage checks.
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
- If the spec says Breakage: Not required or omits breakage, run the probe without a temporary breakage or restoration rerun.
61
- Do not add breakage checks or skip selected ones on your own. Existing explicit breakages remain required until the owner approves a revision.
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 or breakage.
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`, `probeStatus`, and `breakageStatus`.
79
- For selected breakages, record the criterion ID, temporary change, and observed failure in handoff `notes` so the verifier can reproduce them.
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 all temporary breakages and remove temporary verification files. Keep the implementation work.
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` and `breakageStatus: confirmed` or `not-required`, as specified by the approved spec. Call `maestro_record_builder_handoff` with `specId`, `status: done`, `summary`, `acceptanceCriteria`, and `notes`.
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 breakages, temporary files, or unrelated changes.
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 and `confirmed` or `not-required` breakages.
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.
@@ -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 broken behavior.
42
- Read executable probes and breakage details from the candidate and builder handoff. Independently check that they cover the approved scenarios.
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
- Check breakage selection against the approved spec, not the builder's status alone.
48
- If the spec says Breakage: Not required or omits breakage, run the probe without a temporary breakage or restoration rerun.
49
- Do not add breakage checks or skip selected ones on your own. Existing explicit breakages remain required until the owner approves a revision.
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 and breakages. Remove them before handoff.
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`, `probeStatus`, and `breakageStatus`.
73
- For selected breakages, record the criterion ID, temporary change, and observed failure in handoff `notes`.
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` or breakage other than `confirmed` or `not-required` at least one related finding.
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, every required breakage is confirmed, and no other technical findings remain.
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, breakages, and repository checks.
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 acceptance criterion.
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 checks every criterion and repeats the fault checks the owner selected in the spec. It restores all temporary changes before reporting its results.
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
- Breakage
171
- How to prove that the probe detects a broken behavior.
168
+ Example
169
+ Specific starting conditions, input or action, and the exact expected result.
172
170
  ```
173
171
 
174
- Breakage checks are not required by default.
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 evidence for selected fault checks and significant discoveries that did not require an owner decision. Maestro summarizes the relevant results at the end.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emiliosp/pi-maestro",
3
- "version": "0.4.4",
3
+ "version": "0.5.0",
4
4
  "description": "A spec-driven multiagent development workflow for Pi.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -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 hasOnlyCompletedChecks = (
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
- !hasOnlyCompletedChecks(handoff.acceptanceCriteria)
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 (!hasCompletedChecks(criterion) && !findingCriteria.has(criterion.id)) {
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
  );
@@ -29,18 +29,19 @@ Wait for each tool result before taking the next workflow action. Do not launch
29
29
  2. Read the repository and applicable AGENTS.md files. Investigate the affected behavior before asking the owner for missing information.
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
- 5. Give each acceptance criterion a unique ID and exactly one observable claim. Describe its probe scenario and expected result in plain language.
33
- 6. Select breakage checks explicitly with the owner only where proving error detection adds value. Otherwise write Breakage: Not required. For selected checks, describe the broken behavior and require the same probe to pass, fail during breakage, and pass after restoration.
34
- 7. 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.
35
- 8. Request explicit approval. Only after approval, call maestro_mark_spec_ready with the active specId.
36
- 9. Ask the owner to commit spec.md, its prototypes, and workflow.json. Do not start the builder until the checkout is clean.
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. 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.
40
39
  Keep behavior, scope, constraints, and approved architectural decisions in the spec. Leave routine implementation choices to the builder.
41
40
  Keep probes as starting conditions and actions or observations, with measurable expected results.
42
- Every probe remains mandatory for builder and verifier. Breakage checks are not required by default; do not add them to every criterion automatically.
43
- Describe selected breakages as wrong behavior to detect, not code edits. The builder chooses test code, fixtures, mocks, commands, and safe temporary changes.
41
+ Each example must show specific starting conditions, an input or action, and the exact observable result expected from that scenario.
42
+ Use concrete values or states, not a restatement of the claim. Keep examples within the criterion's scope and approved behavior.
43
+ Every probe remains mandatory for builder and verifier.
44
+ The builder chooses test code, fixtures, mocks, and commands.
44
45
  Do not copy agent procedures, repository rules, investigation logs, or workflow history into the spec.
45
46
 
46
47
  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.
@@ -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 selected breakage evidence and 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.',
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
@@ -51,16 +51,15 @@ Leave local implementation choices, test code, fixtures, mocks, and commands to
51
51
 
52
52
  1. Probe: <starting conditions and action or observation, without prescribing test implementation>
53
53
  2. Expected result: <observable and measurable outcome>
54
- 3. 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.>
54
+ 3. Example: <specific starting conditions, concrete input or action, and exact expected result for this probe, not a restatement of the claim>
55
55
 
56
56
  <!--
57
57
  Example:
58
- Probe: Save a change, then reopen the item.
59
- Expected result: The saved change is still present.
60
- Breakage (if selected): Discard the change instead of saving it.
58
+ Probe: Save a change to an item's title, then reopen the item.
59
+ Expected result: The saved title is still present.
60
+ Example: An item's title is "Draft". Change it to "Ready", save, and reopen the item. The title is "Ready".
61
61
 
62
- Breakage checks are not required by default. Select them with the owner only when proving error detection adds value.
63
- The builder and verifier each run every probe. For selected breakages only, they also run the same probe during breakage and after restoration.
64
- 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.
65
64
  Keep execution evidence in handoffs, not in this spec.
66
65
  -->