@unbrained/pm-cli 2026.9.28 → 2026.9.30

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.
Files changed (118) hide show
  1. package/.agents/skills/pm-developer/references/GRAPH_AND_RELATIONSHIPS.md +7 -6
  2. package/.agents/skills/pm-user/references/BACKLOG_SHAPING.md +1 -1
  3. package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +26 -3
  4. package/.claude-plugin/marketplace.json +2 -2
  5. package/CHANGELOG.md +26 -0
  6. package/dist/cli/error-guidance.js +1 -1
  7. package/dist/cli/help-json-payload.js +2 -2
  8. package/dist/cli/main.js +2 -2
  9. package/dist/cli/runtime/invocation-options.d.ts +3 -1
  10. package/dist/cli/runtime/invocation-options.js +1 -1
  11. package/dist/cli-bundle/bundle-manifest.json +152 -152
  12. package/dist/cli-bundle/chunks/{chunk-UT7GRGHY.js → chunk-6XTJLOKW.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-VMJLM7P2.js → chunk-6YEET7XI.js} +22 -22
  14. package/dist/cli-bundle/chunks/{chunk-NEUIVBFO.js → chunk-A6NDNRCK.js} +3 -3
  15. package/dist/cli-bundle/chunks/{chunk-GLH2LNRH.js → chunk-BNAT4EYR.js} +9 -9
  16. package/dist/cli-bundle/chunks/{chunk-CPOWTIIS.js → chunk-BTCE36JS.js} +2 -2
  17. package/dist/cli-bundle/chunks/{chunk-35DME35A.js → chunk-BX4LEJX4.js} +2 -2
  18. package/dist/cli-bundle/chunks/{chunk-A2G5OG6W.js → chunk-EGAIIWI3.js} +2 -2
  19. package/dist/cli-bundle/chunks/chunk-FYTXVVZG.js +2 -0
  20. package/dist/cli-bundle/chunks/{chunk-ZFHJP7YD.js → chunk-O23CQ5T4.js} +31 -29
  21. package/dist/cli-bundle/chunks/{chunk-NBDB3SRC.js → chunk-UIAH7UFK.js} +67 -67
  22. package/dist/cli-bundle/chunks/{chunk-OYCCWPBM.js → chunk-USTAFHIM.js} +2 -2
  23. package/dist/cli-bundle/chunks/{chunk-PR4UAMI5.js → chunk-XRN3JYNN.js} +85 -85
  24. package/dist/cli-bundle/chunks/{chunk-PLNNUAFZ.js → chunk-YM342ELM.js} +2 -2
  25. package/dist/cli-bundle/chunks/{register-list-query-N6RP6PSP.js → register-list-query-SYNBVMNG.js} +2 -2
  26. package/dist/cli-bundle/chunks/{register-mutation-CY7JGQE6.js → register-mutation-4GSUK23D.js} +2 -2
  27. package/dist/cli-bundle/chunks/{register-operations-53HAD3QP.js → register-operations-7FCJUC4Z.js} +2 -2
  28. package/dist/cli-bundle/chunks/{register-setup-NVX6374E.js → register-setup-YTWW2KL5.js} +2 -2
  29. package/dist/cli-bundle/focused-chunks/{chunk-BRLXKRI2.js → chunk-3CAZ7Z4R.js} +4 -4
  30. package/dist/cli-bundle/focused-chunks/{chunk-K7GSZ7YZ.js → chunk-4AORVUT4.js} +2 -2
  31. package/dist/cli-bundle/focused-chunks/{chunk-AZA4AEOR.js → chunk-AKB3JN57.js} +33 -33
  32. package/dist/cli-bundle/focused-chunks/{chunk-OVVCXTIE.js → chunk-EFD4ATS7.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/{chunk-IJXZQE3D.js → chunk-EVMH4SKN.js} +2 -2
  34. package/dist/cli-bundle/focused-chunks/{chunk-IWLMQLBO.js → chunk-IDB6E3ZV.js} +28 -28
  35. package/dist/cli-bundle/focused-chunks/{chunk-YZB7IPR6.js → chunk-IQBFYQF2.js} +2 -2
  36. package/dist/cli-bundle/focused-chunks/{chunk-BGWF6CMP.js → chunk-KZULQIAG.js} +2 -2
  37. package/dist/cli-bundle/focused-chunks/{chunk-ZMQTIS3L.js → chunk-MOUCTR72.js} +2 -2
  38. package/dist/cli-bundle/focused-chunks/{chunk-6IVQPNYN.js → chunk-OMBDUJWZ.js} +2 -2
  39. package/dist/cli-bundle/focused-chunks/{chunk-DTLRXY77.js → chunk-RIJQQOEZ.js} +2 -2
  40. package/dist/cli-bundle/focused-chunks/{chunk-A5O3VYWV.js → chunk-T4PZJQG4.js} +2 -2
  41. package/dist/cli-bundle/focused-chunks/{chunk-V7OPZRL6.js → chunk-UPOMLSW7.js} +14 -14
  42. package/dist/cli-bundle/focused-chunks/{chunk-5KJXX2TZ.js → chunk-XB5Q2P7Z.js} +2 -2
  43. package/dist/cli-bundle/focused-chunks/{chunk-ONDNR3VU.js → chunk-XUCXRZZZ.js} +2 -2
  44. package/dist/cli-bundle/focused-chunks/{chunk-Y5Z3XNGY.js → chunk-ZJ3CLTV4.js} +2 -2
  45. package/dist/cli-bundle/main.js +22 -22
  46. package/dist/cli-bundle/sdk-authoring.js +1 -1
  47. package/dist/cli-bundle/sdk-contracts.js +1 -1
  48. package/dist/cli-bundle/sdk-core.js +22 -21
  49. package/dist/cli-bundle/sdk-governance.js +1 -1
  50. package/dist/cli-bundle/sdk-graph.js +1 -1
  51. package/dist/cli-bundle/sdk-merge.js +38 -38
  52. package/dist/cli-bundle/sdk-query.js +1 -1
  53. package/dist/cli-bundle/sdk-runtime.js +1 -1
  54. package/dist/cli-bundle/sdk-testing.js +1 -1
  55. package/dist/cli-bundle/sdk.js +2 -2
  56. package/dist/core/extensions/extension-types.d.ts +13 -0
  57. package/dist/core/extensions/extension-types.js +1 -1
  58. package/dist/core/history/replay.js +1 -1
  59. package/dist/core/history/workspace-history.d.ts +17 -0
  60. package/dist/core/history/workspace-history.js +1 -1
  61. package/dist/core/output/mutation-projection.js +1 -1
  62. package/dist/core/telemetry/runtime.js +2 -2
  63. package/dist/sdk/cli-contracts/command-aliases.js +1 -1
  64. package/dist/sdk/extension-command-context.d.ts +1 -7
  65. package/dist/sdk/extension-command-context.js +1 -1
  66. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  67. package/dist/sdk/index.d.ts +1 -0
  68. package/dist/sdk/index.js +1 -1
  69. package/dist/sdk/lifecycle/plan-mutation-receipt.d.ts +53 -0
  70. package/dist/sdk/lifecycle/plan-mutation-receipt.js +2 -0
  71. package/dist/sdk/lifecycle/plan.d.ts +3 -0
  72. package/dist/sdk/lifecycle/plan.js +1 -1
  73. package/dist/sdk/lifecycle/update.d.ts +2 -0
  74. package/dist/sdk/lifecycle/update.js +1 -1
  75. package/dist/sdk/linked-artifacts.js +1 -1
  76. package/dist/sdk/merge/install.js +1 -1
  77. package/dist/sdk/public-surface.json +1 -1
  78. package/dist/sdk/runtime/actions.js +1 -1
  79. package/dist/sdk/runtime-input.d.ts +2 -0
  80. package/dist/sdk/runtime-input.js +1 -1
  81. package/dist/sdk/runtime.js +1 -1
  82. package/dist/sdk/similarity-scoring.js +1 -1
  83. package/dist/sdk/structured-mutations.js +1 -1
  84. package/dist/sdk/telemetry.d.ts +2 -0
  85. package/dist/sdk/telemetry.js +3 -1
  86. package/dist/sdk/testing.js +1 -1
  87. package/docs/CLI_GRAMMAR.md +18 -1
  88. package/docs/ECOSYSTEM_PLANNING_REVIEW.md +270 -0
  89. package/docs/MERGE_SAFETY.md +11 -6
  90. package/docs/README.md +2 -0
  91. package/docs/RELEASE_RELIABILITY.md +26 -4
  92. package/docs/SDK_AUDITED_MUTATIONS.md +52 -0
  93. package/docs/SDK_EVIDENCE_TRACEABILITY.md +34 -0
  94. package/docs/agent-task-token-baseline.json +28 -2
  95. package/docs/agent-task-transcripts.json +137 -14
  96. package/docs/ecosystem-review-2026-09-28.json +3159 -0
  97. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +4 -3
  98. package/marketplace.json +2 -2
  99. package/package.json +1 -1
  100. package/packages/pm-beads/package.json +1 -1
  101. package/packages/pm-calendar/package.json +1 -1
  102. package/packages/pm-command-kit/package.json +1 -1
  103. package/packages/pm-digital-twin/package.json +1 -1
  104. package/packages/pm-governance-audit/package.json +1 -1
  105. package/packages/pm-guide-shell/package.json +1 -1
  106. package/packages/pm-kanban/package.json +1 -1
  107. package/packages/pm-lifecycle-hooks/package.json +1 -1
  108. package/packages/pm-linked-test-adapters/package.json +1 -1
  109. package/packages/pm-search-advanced/package.json +1 -1
  110. package/packages/pm-templates/package.json +1 -1
  111. package/packages/pm-todos/package.json +1 -1
  112. package/packages/pm-vcs/package.json +1 -1
  113. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  114. package/plugins/pm-claude/package.json +2 -2
  115. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  116. package/plugins/pm-codex/package.json +2 -2
  117. package/plugins/pm-codex/plugin.json +1 -1
  118. package/dist/cli-bundle/chunks/chunk-YERBAGQD.js +0 -2
@@ -0,0 +1,52 @@
1
+ # Audited SDK Settings and Item Updates
2
+
3
+ The extension settings contract is tracked by
4
+ [pm-wtqltn](../.agents/pm/issues/pm-wtqltn.toon). Full-item JSON annotation
5
+ integrity is tracked by [pm-2589e6](../.agents/pm/issues/pm-2589e6.toon).
6
+
7
+ ## Extension settings
8
+
9
+ An extension command receives a host-bound `sdk` in its `run` context. Use
10
+ `sdk.mutateWorkspaceSettings` to change the current project's `settings.json`.
11
+ The host chooses the tracker path and author, validates the complete result,
12
+ serializes concurrent changes under the workspace lock, and records the change
13
+ in workspace history. A copied extension needs no local SDK installation.
14
+
15
+ ```ts
16
+ api.registerCommand({
17
+ name: "example hints",
18
+ flags: [{ long: "--operation-id", value_name: "id", value_type: "string" }],
19
+ run: ({ sdk, options }) =>
20
+ sdk.mutateWorkspaceSettings({
21
+ operationId: options.operationId,
22
+ mutate: (current) => ({
23
+ ...current,
24
+ ux: { ...current.ux, deprecation_hints: true },
25
+ }),
26
+ }),
27
+ });
28
+ ```
29
+
30
+ Supply a stable `operationId` for a logical operation within its registered
31
+ command. The host scopes the ID to that command, so another command can use
32
+ the same ID independently. Retrying an already recorded operation returns
33
+ `replayed: true` without invoking `mutate`, writing settings, or appending
34
+ another history event. `dryRun: true` calculates `changed` without changing settings or history;
35
+ the same operation ID can then be used for the real mutation. A normal return
36
+ also reports `changed` and `dry_run`. Invalid results fail before writing, and
37
+ a history-append failure restores the previous settings bytes. The callback
38
+ must derive its complete next settings object from the locked `current` value.
39
+ The host applies the standard settings serializer, including legacy format
40
+ coercion and collection-name sanitization, and runs active `onWrite` hooks
41
+ after a changed write.
42
+
43
+ ## Full-item JSON updates
44
+
45
+ `pm update <id> --stdin-json` accepts a full item read document. New comments,
46
+ notes, and learnings in that document are appended through the normal item
47
+ mutation. Persisted entries are an audit trail: changing or removing one in
48
+ the submitted document now fails with
49
+ `stdin_json_persisted_annotation_changed` before any item fields are written.
50
+ This check also applies when the only submitted change is an annotation. Use
51
+ `pm comments`, `pm notes`, or `pm learnings` with `--edit` to correct an
52
+ existing entry; those commands write a history event for the correction.
@@ -103,12 +103,46 @@ Replacement requires at least one corresponding `--file` or `--doc` value and ca
103
103
 
104
104
  Repeating an already-present `pm files --add` or `pm docs --add` batch is a true no-op: `changed` is false, the item file is not rewritten, and append-only history receives no synthetic mutation entry.
105
105
 
106
+ An explicit non-empty replacement note updates the existing path/scope entry
107
+ atomically. A bare-path retry preserves its note; a different scope identifies
108
+ a separate link. The same rule applies to glob additions and standalone
109
+ `--note`. Migration collisions first retain the established last matching
110
+ entry; an explicit note revision then applies to that surviving identity.
111
+ This fixes [pm-zqxlfs](../.agents/pm/issues/pm-zqxlfs.toon):
112
+
113
+ ```bash
114
+ pm files <id> --add path=src/new.ts,note="verified current implementation"
115
+ pm docs <id> --add docs/new.md --note "verified current contract"
116
+ ```
117
+
106
118
  Audited history redaction participates in the same projection transaction as
107
119
  ordinary item mutation. After rewriting an item and its history stream, pm
108
120
  invalidates drift verification state and incrementally refreshes the metadata
109
121
  index before releasing the derived-index lock. A warmed index therefore cannot
110
122
  pair pre-redaction item content with post-redaction history during validation.
111
123
 
124
+ ## Compact Plan mutation receipts
125
+
126
+ Tracked by [pm-hqy7lr](../.agents/pm/issues/pm-hqy7lr.toon).
127
+ CLI and MCP Plan mutations return identity, action, step identity when available,
128
+ complete step counts, materialization/skip/warning counts, and an inspection
129
+ command. They omit bodies, resume context, and unrelated steps, so a single-step
130
+ update does not grow with the Plan. `pm plan show <id> --depth deep` retrieves
131
+ the complete current Plan without repeating a mutation. The omission receipt
132
+ explicitly distinguishes this acknowledgement from a full read.
133
+ Local CLI/SDK recovery commands include the resolved `--pm-path`, safely quoted,
134
+ so they inspect the same tracker even with a non-default root. MCP receipts
135
+ omit the server-resolved filesystem root in both compact and full output.
136
+ For MCP recovery, call `pm_plan` with `subcommand: "show"`, `depth: "deep"`,
137
+ the receipt ID, and the original request's workspace selection (`path` or `cwd`).
138
+
139
+ SDK `runPlan` retains its full typed result and adds `mutation_receipt` for
140
+ consumers that need a compact acknowledgement. Existing full transport output
141
+ is available with CLI `--full-changed-fields` or MCP `fullChangedFields: true`.
142
+ The named `PlanMutationReceipt` type is exported from `@unbrained/pm-cli/sdk`.
143
+ CLI `--no-changed-fields` also selects a compact Plan receipt.
144
+ Read-only `plan show` retains its existing projection behavior.
145
+
112
146
  ## Operational receipts
113
147
 
114
148
  Linked tests recognize compound acquisition failures such as “could not acquire … lock” together with contention context such as “already running” or “held by another” as `infra_collision`. Generic assertion text mentioning a lock or timeout remains `assertion_failure`, preventing false infrastructure classifications. A command refused by clone-local provenance policy is classified separately as `trust_refusal`, so reports do not misstate a pre-execution safety decision as an assertion failure.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 4,
3
3
  "transcript_version": 2,
4
- "transcript_digest": "sha256:b8a6aea318c41e6a40dbcaf8094da8397ca747515a7df249d35c1f21ad94a307",
4
+ "transcript_digest": "sha256:6d4041acfaa4075dde1972d6127a74f18916f7661738b4f5d5fd47a61c179a78",
5
5
  "estimator": "ceil(utf8_bytes / 4)",
6
6
  "measurement_scope": "output_before_token_accounting",
7
7
  "published_with_release": true,
@@ -259,7 +259,33 @@
259
259
  "accounting_mode": "self_reported"
260
260
  }
261
261
  ]
262
+ },
263
+ {
264
+ "id": "plan-execution-mutations",
265
+ "max_estimated_tokens": 848,
266
+ "steps": [
267
+ {
268
+ "id": "create-plan",
269
+ "max_estimated_tokens": 21,
270
+ "accounting_mode": "self_reported"
271
+ },
272
+ {
273
+ "id": "add-step",
274
+ "max_estimated_tokens": 275,
275
+ "accounting_mode": "self_reported"
276
+ },
277
+ {
278
+ "id": "complete-step",
279
+ "max_estimated_tokens": 274,
280
+ "accounting_mode": "self_reported"
281
+ },
282
+ {
283
+ "id": "inspect-plan",
284
+ "max_estimated_tokens": 278,
285
+ "accounting_mode": "self_reported"
286
+ }
287
+ ]
262
288
  }
263
289
  ],
264
- "composite_max_estimated_tokens": 13034
290
+ "composite_max_estimated_tokens": 13882
265
291
  }
@@ -17,13 +17,22 @@
17
17
  ],
18
18
  "capability_evidence": {
19
19
  "workspace_state": [
20
- { "step_id": "context", "field_path": "summary.active_items" }
20
+ {
21
+ "step_id": "context",
22
+ "field_path": "summary.active_items"
23
+ }
21
24
  ],
22
25
  "active_ownership": [
23
- { "step_id": "context", "field_path": "activity" }
26
+ {
27
+ "step_id": "context",
28
+ "field_path": "activity"
29
+ }
24
30
  ],
25
31
  "actionable_work": [
26
- { "step_id": "context", "field_path": "hierarchy" }
32
+ {
33
+ "step_id": "context",
34
+ "field_path": "hierarchy"
35
+ }
27
36
  ]
28
37
  }
29
38
  },
@@ -36,13 +45,22 @@
36
45
  ],
37
46
  "capability_evidence": {
38
47
  "workspace_state": [
39
- { "step_id": "next", "field_path": "summary.in_progress" }
48
+ {
49
+ "step_id": "next",
50
+ "field_path": "summary.in_progress"
51
+ }
40
52
  ],
41
53
  "active_ownership": [
42
- { "step_id": "next", "field_path": "held_by_others" }
54
+ {
55
+ "step_id": "next",
56
+ "field_path": "held_by_others"
57
+ }
43
58
  ],
44
59
  "actionable_work": [
45
- { "step_id": "next", "field_path": "recommended.id" }
60
+ {
61
+ "step_id": "next",
62
+ "field_path": "recommended.id"
63
+ }
46
64
  ]
47
65
  }
48
66
  },
@@ -55,12 +73,23 @@
55
73
  ],
56
74
  "capability_evidence": {
57
75
  "workspace_state": [
58
- { "step_id": "context", "field_path": "summary.active_items" }
76
+ {
77
+ "step_id": "context",
78
+ "field_path": "summary.active_items"
79
+ }
59
80
  ],
60
81
  "active_ownership": [
61
- { "step_id": "in-progress", "field_path": "items" }
82
+ {
83
+ "step_id": "in-progress",
84
+ "field_path": "items"
85
+ }
62
86
  ],
63
- "actionable_work": [{ "step_id": "open", "field_path": "items" }]
87
+ "actionable_work": [
88
+ {
89
+ "step_id": "open",
90
+ "field_path": "items"
91
+ }
92
+ ]
64
93
  }
65
94
  }
66
95
  ]
@@ -186,7 +215,9 @@
186
215
  "expected_accounting_mode": "self_reported",
187
216
  "required_fields": ["code", "refusal", "recovery"],
188
217
  "expected_error_code": "unknown_context_intent",
189
- "expected_field_values": { "recovery.recovery_mode": "compact" },
218
+ "expected_field_values": {
219
+ "recovery.recovery_mode": "compact"
220
+ },
190
221
  "expected_refusal_surface": "--for"
191
222
  },
192
223
  {
@@ -266,7 +297,9 @@
266
297
  "expected_output_kind": "entity",
267
298
  "expected_accounting_mode": "self_reported",
268
299
  "required_fields": ["item.id", "item.status"],
269
- "expected_field_values": { "item.status": "open" }
300
+ "expected_field_values": {
301
+ "item.status": "open"
302
+ }
270
303
  },
271
304
  {
272
305
  "id": "close",
@@ -283,7 +316,9 @@
283
316
  "expected_output_kind": "entity",
284
317
  "expected_accounting_mode": "self_reported",
285
318
  "required_fields": ["item.id", "item.status"],
286
- "expected_field_values": { "item.status": "closed" }
319
+ "expected_field_values": {
320
+ "item.status": "closed"
321
+ }
287
322
  }
288
323
  ]
289
324
  },
@@ -329,7 +364,9 @@
329
364
  "expected_output_kind": "collection",
330
365
  "expected_accounting_mode": "self_reported",
331
366
  "required_fields": ["rows", "outcome", "exit_code"],
332
- "expected_field_values": { "outcome": "partial_effect" }
367
+ "expected_field_values": {
368
+ "outcome": "partial_effect"
369
+ }
333
370
  },
334
371
  {
335
372
  "id": "no-effect",
@@ -347,7 +384,93 @@
347
384
  "expected_output_kind": "collection",
348
385
  "expected_accounting_mode": "self_reported",
349
386
  "required_fields": ["rows", "outcome", "exit_code"],
350
- "expected_field_values": { "outcome": "no_effect" }
387
+ "expected_field_values": {
388
+ "outcome": "no_effect"
389
+ }
390
+ }
391
+ ]
392
+ },
393
+ {
394
+ "id": "plan-execution-mutations",
395
+ "description": "Create a Plan, add and complete a step, then inspect its durable evidence without echoing the full Plan on each mutation.",
396
+ "steps": [
397
+ {
398
+ "id": "create-plan",
399
+ "args": [
400
+ "create",
401
+ "--id",
402
+ "pm-transcript-plan",
403
+ "--type",
404
+ "Plan",
405
+ "--title",
406
+ "Transcript execution Plan",
407
+ "--create-mode",
408
+ "progressive"
409
+ ],
410
+ "expected_exit_code": 0,
411
+ "expected_output_kind": "mutation_receipt",
412
+ "expected_accounting_mode": "self_reported",
413
+ "required_fields": ["id", "status"]
414
+ },
415
+ {
416
+ "id": "add-step",
417
+ "args": [
418
+ "plan",
419
+ "add-step",
420
+ "pm-transcript-plan",
421
+ "--step-title",
422
+ "Verify result",
423
+ "--step-body",
424
+ "Durable execution context retained for later inspection."
425
+ ],
426
+ "expected_exit_code": 0,
427
+ "expected_output_kind": "diagnostic",
428
+ "expected_accounting_mode": "self_reported",
429
+ "required_fields": [
430
+ "id",
431
+ "step.id",
432
+ "steps_summary.total",
433
+ "inspection_command"
434
+ ],
435
+ "expected_field_values": {
436
+ "kind": "plan_mutation",
437
+ "steps_summary.total": 1
438
+ }
439
+ },
440
+ {
441
+ "id": "complete-step",
442
+ "args": [
443
+ "plan",
444
+ "complete-step",
445
+ "pm-transcript-plan",
446
+ "plan-step-001",
447
+ "--step-evidence",
448
+ "Verified result"
449
+ ],
450
+ "expected_exit_code": 0,
451
+ "expected_output_kind": "diagnostic",
452
+ "expected_accounting_mode": "self_reported",
453
+ "required_fields": [
454
+ "id",
455
+ "step.status",
456
+ "steps_summary.completed",
457
+ "omission_receipt"
458
+ ],
459
+ "expected_field_values": {
460
+ "step.status": "completed",
461
+ "steps_summary.completed": 1
462
+ }
463
+ },
464
+ {
465
+ "id": "inspect-plan",
466
+ "args": ["plan", "show", "pm-transcript-plan", "--depth", "deep"],
467
+ "expected_exit_code": 0,
468
+ "expected_output_kind": "diagnostic",
469
+ "expected_accounting_mode": "self_reported",
470
+ "required_fields": ["plan.steps", "plan.steps_summary.completed"],
471
+ "expected_field_values": {
472
+ "plan.steps_summary.completed": 1
473
+ }
351
474
  }
352
475
  ]
353
476
  }