@mgiles/perk 3.0.0 → 3.2.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.
Files changed (89) hide show
  1. package/extension/adapters/planAdapterPlannotator.ts +12 -9
  2. package/extension/doors/address.ts +11 -0
  3. package/extension/doors/commitCompact.ts +98 -10
  4. package/extension/doors/draftReviewWaveTools.ts +43 -15
  5. package/extension/doors/dreamWaveTools.ts +489 -0
  6. package/extension/doors/land.ts +6 -0
  7. package/extension/doors/learn.ts +16 -3
  8. package/extension/doors/lifecycleGates.ts +36 -1
  9. package/extension/doors/objectiveReviewBrowser.ts +36 -13
  10. package/extension/doors/objectiveStack.ts +424 -24
  11. package/extension/doors/planReviewBrowser.ts +30 -8
  12. package/extension/doors/plannotatorHandoff.ts +80 -8
  13. package/extension/doors/prReview.ts +158 -50
  14. package/extension/doors/prReviewBrowser.ts +75 -27
  15. package/extension/doors/prReviewDynamic.ts +33 -13
  16. package/extension/doors/ready.ts +209 -17
  17. package/extension/doors/reviewWaveTools.ts +61 -17
  18. package/extension/doors/stackReviewBrowser.ts +573 -0
  19. package/extension/doors/submit.ts +36 -10
  20. package/extension/doors/submitPrReview.ts +116 -19
  21. package/extension/factories/objectiveDraft.ts +95 -27
  22. package/extension/factories/objectiveDreamReport.ts +347 -0
  23. package/extension/factories/objectivePlan.ts +12 -6
  24. package/extension/factories/objectiveSave.ts +77 -1
  25. package/extension/factories/planReview.ts +173 -10
  26. package/extension/index.ts +88 -16
  27. package/extension/substrate/agentScratch.ts +171 -0
  28. package/extension/substrate/bindingDelivery.ts +9 -11
  29. package/extension/substrate/cache.ts +92 -2
  30. package/extension/substrate/command.ts +9 -6
  31. package/extension/substrate/config.ts +10 -3
  32. package/extension/substrate/git.ts +85 -2
  33. package/extension/substrate/paths.ts +2 -7
  34. package/extension/substrate/resolverLease.ts +363 -0
  35. package/extension/substrate/result.ts +3 -2
  36. package/extension/substrate/sessionData.ts +6 -4
  37. package/extension/substrate/sessionPointers.ts +3 -4
  38. package/extension/substrate/toolGating.ts +25 -0
  39. package/extension/substrate/workflowState.ts +57 -5
  40. package/extension/surfaces/report.ts +38 -12
  41. package/extension/surfaces/surfaces.ts +129 -7
  42. package/extension/vendor/btw/btw.ts +38 -6
  43. package/extension/waves/adversarialReviewWave.ts +34 -3
  44. package/extension/waves/draftReviewWave.ts +17 -1
  45. package/extension/waves/dreamReducerWave.ts +700 -0
  46. package/extension/waves/dreamReport.ts +1494 -0
  47. package/extension/waves/dreamWave.ts +927 -0
  48. package/extension/waves/harvestWave.ts +1 -1
  49. package/extension/waves/ponytail.ts +104 -0
  50. package/extension/waves/prReviewDynamicWave.ts +115 -34
  51. package/extension/waves/prReviewWave.ts +122 -17
  52. package/extension/waves/reportWave.ts +103 -7
  53. package/extension/worker/readOnlySession.ts +2 -3
  54. package/package.json +6 -3
  55. package/prompts/_fixtures/live.yaml +112 -0
  56. package/prompts/commit-and-compact-continuation.md +13 -0
  57. package/prompts/contexts/adapters/plannotator-objective.md +7 -1
  58. package/prompts/contexts/adapters/plannotator-plan.md +7 -1
  59. package/prompts/contexts/adapters/tombell-plan.md +4 -0
  60. package/prompts/contexts/plan-authoring.md +6 -5
  61. package/prompts/stages/conflict-resolution-continuation.md +6 -0
  62. package/prompts/stages/conflict-resolution.md +2 -2
  63. package/prompts/stages/learn-dream.md +10 -0
  64. package/prompts/stages/objective-author/adopt.md +1 -1
  65. package/prompts/stages/objective-author/file.md +1 -1
  66. package/prompts/stages/objective-author/seed.md +1 -1
  67. package/prompts/stages/objective-reconcile-ready.md +7 -0
  68. package/prompts/stages/objective-review-browser.md +1 -1
  69. package/prompts/stages/objective-sync.md +1 -1
  70. package/prompts/stages/plan-review-browser.md +1 -1
  71. package/prompts/stages/pr-review-browser/active.md +1 -1
  72. package/prompts/stages/pr-review-browser/foreign.md +1 -1
  73. package/prompts/stages/pr-review-dynamic.md +5 -5
  74. package/prompts/stages/pr-review-terminal/active.md +1 -1
  75. package/prompts/stages/pr-review-terminal/foreign.md +1 -1
  76. package/prompts/stages/pr-review-terminal/local.md +1 -1
  77. package/prompts/stages/pr-review.md +5 -5
  78. package/prompts/stages/stack-review/cold.md +1 -0
  79. package/prompts/stages/stack-review-browser/stack.md +23 -0
  80. package/shared/README.md +0 -3
  81. package/shared/bindings.yaml +6 -0
  82. package/shared/contracts.md +3784 -1851
  83. package/shared/registry.yaml +28 -13
  84. package/shared/schemas/inputs/review-post-batch.schema.json +14 -1
  85. package/shared/schemas/outputs/objective-doctor.schema.json +39 -1
  86. package/shared/schemas/outputs/objective-stack-status.schema.json +172 -1
  87. package/shared/schemas/outputs/pr-land.schema.json +3 -3
  88. package/shared/schemas/outputs/pr-ready.schema.json +110 -2
  89. package/shared/contracts-history.md +0 -605
@@ -78,7 +78,7 @@ stages:
78
78
  command: gist author # dedicated seeded cold door (perk gist author)
79
79
  requires: [] # nothing exists yet — this stage CREATES the gist
80
80
  reads: []
81
- writes: [session.workflow-state, cache.session-data] # the read-only `mode` append; gist_draft writes the gist-draft artifact + its session_artifacts pointer
81
+ writes: [session.workflow-state, cache.session-data, cache.scratch] # the read-only `mode` append; gist_draft writes the gist-draft artifact + its session_artifacts pointer; eligible turns may provision agent scratch
82
82
  predecessors: [] # an initial of the disconnected gist component
83
83
  successors: [gist-save]
84
84
 
@@ -91,7 +91,7 @@ stages:
91
91
  command: gist save # the gist_save terminating tool + /gist-save command
92
92
  requires: []
93
93
  reads: []
94
- writes: [github.gist, session.workflow-state] # create the gist issue/project
94
+ writes: [github.gist, session.workflow-state, cache.scratch] # create the gist issue/project; eligible turns may provision agent scratch
95
95
  predecessors: [gist-author]
96
96
  successors: [] # a terminal — consumption happens via the adoption doors, not edges
97
97
 
@@ -104,7 +104,7 @@ stages:
104
104
  command: objective author # P3.T2: dedicated seeded cold door (perk objective author)
105
105
  requires: [] # nothing exists yet — this stage CREATES the objective
106
106
  reads: []
107
- writes: [session.workflow-state, cache.session-data] # the read-only `mode` append (the gate toggle); #352 Node 2.1: objective_draft writes the objective-draft artifact + its session_artifacts pointer
107
+ writes: [session.workflow-state, cache.session-data, cache.scratch] # the read-only `mode` append (the gate toggle); #352 Node 2.1: objective_draft writes the objective-draft artifact + its session_artifacts pointer; eligible turns may provision agent scratch
108
108
  predecessors: [] # the new single initial (authoring precedes everything)
109
109
  successors: [objective-save]
110
110
 
@@ -117,20 +117,20 @@ stages:
117
117
  command: objective save # P3.T2: the objective_save terminating tool + /objective-save command
118
118
  requires: []
119
119
  reads: []
120
- writes: [github.objective, session.workflow-state] # create the objective issue; link active_objective
120
+ writes: [github.objective, session.workflow-state, cache.scratch] # create the objective issue; link active_objective; eligible turns may provision agent scratch
121
121
  predecessors: [objective-author]
122
122
  successors: [objective-plan]
123
123
 
124
124
  - id: objective-plan
125
125
  summary: Select the next objective node and author a bounded plan (read-only).
126
126
  mode: read-only
127
- worktree: none # interactive planning, like plan — no branch yet
127
+ worktree: none # interactive planning, like plan — no branch yet; the cold door overrides to a transient reuse stage for a stacked child layer with a live predecessor branch (§8.46)
128
128
  doors: { warm: true, cold_local: true, cold_remote: false } # interactive local exploration
129
129
  run_id: { warm: keep, cold_local: mint, cold_remote: mint }
130
130
  command: objective plan # P2.T10: dedicated cold door (perk objective plan) + /objective-plan
131
131
  requires: [github.objective] # an objective issue must exist
132
132
  reads: [github.objective] # roadmap nodes + next-node selection
133
- writes: [github.objective, session.workflow-state, cache.session-data] # mark node planning; set active_objective; #339 Node 2.1: plan_draft writes the working-plan artifact + its session_artifacts pointer
133
+ writes: [github.objective, session.workflow-state, cache.session-data, cache.scratch] # mark node planning; set active_objective; #339 Node 2.1: plan_draft writes the working-plan artifact + its session_artifacts pointer; eligible turns may provision agent scratch
134
134
  predecessors: [objective-save] # P3.T2: objective-save now precedes planning
135
135
  successors: [plan]
136
136
 
@@ -143,7 +143,7 @@ stages:
143
143
  command: plan # slash = /plan (perk-owned P2.T2a; toggles the read-only tool gate)
144
144
  requires: []
145
145
  reads: []
146
- writes: [session.workflow-state, cache.session-data] # P2.T2a: /plan enter/exit appends `mode`; #339 Node 2.1: plan_draft writes the working-plan artifact + its session_artifacts pointer
146
+ writes: [session.workflow-state, cache.session-data, cache.scratch] # P2.T2a: /plan enter/exit appends `mode`; #339 Node 2.1: plan_draft writes the working-plan artifact + its session_artifacts pointer; eligible turns may provision agent scratch
147
147
  predecessors: [objective-plan] # P2.T10: objective-plan is the new single initial
148
148
  successors: [save]
149
149
 
@@ -156,7 +156,7 @@ stages:
156
156
  command: plan save # cold: the merged `perk plan save` door (Node 3.2); warm twin: the plan_save tool + /plan-save command
157
157
  requires: []
158
158
  reads: []
159
- writes: [github.plan, cache.plan-ref, session.workflow-state] # T2a: plan issue; T2b: plan-ref pointer; T3: warm door appends active_plan_ref
159
+ writes: [github.plan, cache.plan-ref, session.workflow-state, cache.scratch] # T2a: plan issue; T2b: plan-ref pointer; T3: warm door appends active_plan_ref; eligible turns may provision agent scratch
160
160
  predecessors: [plan]
161
161
  successors: [implement]
162
162
 
@@ -169,7 +169,7 @@ stages:
169
169
  command: implement
170
170
  requires: [cache.plan-ref] # T4: cold door derives plan-<pr_id> from the active ref
171
171
  reads: [cache.plan-ref] # T4: positions the worktree from the ref (agent reads github.plan)
172
- writes: [session.workflow-state] # T4: the worktree session links active_plan_ref on session_start
172
+ writes: [session.workflow-state, cache.scratch] # T4: the worktree session links active_plan_ref on session_start; eligible turns may provision agent scratch
173
173
  predecessors: [save]
174
174
  successors: [submit]
175
175
 
@@ -185,7 +185,7 @@ stages:
185
185
  # journal fold) and the native stack, and writes the journal (objective comments), the
186
186
  # checkpoint pair (plan header), and the stack registration. Incremental touches neither.
187
187
  reads: [cache.plan-ref, github.plan, github.objective, github.stack]
188
- writes: [github.pr, github.plan, github.objective, github.stack]
188
+ writes: [github.pr, github.plan, github.objective, github.stack, cache.scratch]
189
189
  predecessors: [implement]
190
190
  successors: [address]
191
191
 
@@ -200,7 +200,7 @@ stages:
200
200
  # submit before resolving. The stacked route owns the objective journal + native stack.
201
201
  requires: [github.pr] # the PR whose feedback we address
202
202
  reads: [cache.plan-ref, github.plan, github.pr, github.review-threads, github.comments, github.objective, github.stack]
203
- writes: [github.review-threads, github.comments, github.pr, github.plan, github.objective, github.stack, session.workflow-state]
203
+ writes: [github.review-threads, github.comments, github.pr, github.plan, github.objective, github.stack, session.workflow-state, cache.scratch]
204
204
  predecessors: [submit]
205
205
  successors: [land]
206
206
 
@@ -213,7 +213,7 @@ stages:
213
213
  command: pr land
214
214
  requires: [github.pr] # T5b: the PR to merge must exist
215
215
  reads: [cache.plan-ref, github.pr, github.objective] # T5b ref->branch->PR; T11a node lookup
216
- writes: [github.pr, cache.markers, github.objective, github.plan] # T5b merge+marker; T11a mechanical node-done; §8.36 learn_state header stamp
216
+ writes: [github.pr, cache.markers, github.objective, github.plan, cache.scratch] # T5b merge+marker; T11a mechanical node-done; §8.36 learn_state header stamp; eligible turns may provision agent scratch
217
217
  predecessors: [address]
218
218
  successors: [learn]
219
219
 
@@ -234,7 +234,7 @@ stages:
234
234
  # keys (no new gateway op) — the existing learn tool / learn capture worker still persist.
235
235
  requires: [cache.markers] # pending-learn gates the worktree
236
236
  reads: [cache.markers, cache.plan-ref] # was it set? + the plan ref -> issue number/run_id
237
- writes: [cache.markers, github.learn, github.comments, github.plan] # clear marker; create learn issue + back-link; §8.36 learn_state header stamp
237
+ writes: [cache.markers, github.learn, github.comments, github.plan, cache.scratch] # clear marker; create learn issue + back-link; §8.36 learn_state header stamp; eligible turns may provision agent scratch
238
238
  predecessors: [land]
239
239
  successors: []
240
240
 
@@ -250,3 +250,18 @@ stages:
250
250
  writes: [session.workflow-state, cache.scratch] # the claim append; run_audit_wave writes <bundle>/verdicts.json under scratch
251
251
  predecessors: [] # a deliberately isolated node — the dev-only audit component
252
252
  successors: []
253
+
254
+ - id: stack-review
255
+ summary: Review a stacked PR train in the plannotator browser with judgment-routed per-PR posting.
256
+ mode: read-write # deliberate parity with the warm /stack-review-browser door — the
257
+ # human is present and nothing auto-posts (contracts.md §8.4)
258
+ worktree: none # runs in the invoking checkout; the review checkout is the
259
+ # detached review-<top> worktree the cold door materialized
260
+ doors: { warm: false, cold_local: true, cold_remote: false } # interactive browser flow — local-only by design
261
+ run_id: { warm: keep, cold_local: mint, cold_remote: mint }
262
+ command: objective stack review # label — the dedicated cold door under the objective stack group
263
+ requires: []
264
+ reads: []
265
+ writes: [github.pr, github.review-threads, session.workflow-state, cache.scratch] # per-PR review posting via submit_pr_review; the claim append; scratch
266
+ predecessors: [] # a deliberately isolated node — the stacked-review component
267
+ successors: []
@@ -29,7 +29,7 @@
29
29
  }
30
30
  },
31
31
  "additionalProperties": false,
32
- "description": "The strict `/pr-review` batch shape (`{verdict, summary, comments?, fyi?}`).\n\n`comments`/`fyi` stay nullable so an explicit `null` is tolerated (today's behavior),\nnormalized to `[]` in conversion. `line: int` under strict rejects `bool`/`float`/`str`\n(preserving the old `isinstance(line, bool)` guard).",
32
+ "description": "The strict `/pr-review` batch shape.\n\n`comments`/`fyi` stay nullable so an explicit `null` is tolerated (today's behavior),\nnormalized to `[]` in conversion. `line: int` and `expected_pr: int` reject\n`bool`/`float`/`str` under strict validation.",
33
33
  "properties": {
34
34
  "verdict": {
35
35
  "enum": [
@@ -73,6 +73,19 @@
73
73
  ],
74
74
  "default": null,
75
75
  "title": "Fyi"
76
+ },
77
+ "expected_pr": {
78
+ "anyOf": [
79
+ {
80
+ "exclusiveMinimum": 0,
81
+ "type": "integer"
82
+ },
83
+ {
84
+ "type": "null"
85
+ }
86
+ ],
87
+ "default": null,
88
+ "title": "Expected Pr"
76
89
  }
77
90
  },
78
91
  "required": [
@@ -1,5 +1,35 @@
1
1
  {
2
2
  "$defs": {
3
+ "_CorruptionFindingOut": {
4
+ "additionalProperties": false,
5
+ "description": "One kind-corruption finding over the objective's issue-tier carrier (report-only \u2014\n``--fix`` never touches it; no repair code path exists).",
6
+ "properties": {
7
+ "code": {
8
+ "title": "Code",
9
+ "type": "string"
10
+ },
11
+ "carrier": {
12
+ "title": "Carrier",
13
+ "type": "string"
14
+ },
15
+ "message": {
16
+ "title": "Message",
17
+ "type": "string"
18
+ },
19
+ "remediation": {
20
+ "title": "Remediation",
21
+ "type": "string"
22
+ }
23
+ },
24
+ "required": [
25
+ "code",
26
+ "carrier",
27
+ "message",
28
+ "remediation"
29
+ ],
30
+ "title": "_CorruptionFindingOut",
31
+ "type": "object"
32
+ },
3
33
  "_DriftConditionOut": {
4
34
  "additionalProperties": false,
5
35
  "properties": {
@@ -432,6 +462,13 @@
432
462
  "type": "null"
433
463
  }
434
464
  ]
465
+ },
466
+ "corruption": {
467
+ "items": {
468
+ "$ref": "#/$defs/_CorruptionFindingOut"
469
+ },
470
+ "title": "Corruption",
471
+ "type": "array"
435
472
  }
436
473
  },
437
474
  "required": [
@@ -442,7 +479,8 @@
442
479
  "fix",
443
480
  "redirected_from",
444
481
  "train",
445
- "train_fix"
482
+ "train_fix",
483
+ "corruption"
446
484
  ],
447
485
  "title": "ObjectiveDoctorOut",
448
486
  "type": "object"
@@ -123,6 +123,129 @@
123
123
  "title": "FindingOut",
124
124
  "type": "object"
125
125
  },
126
+ "GateBlockerOut": {
127
+ "additionalProperties": false,
128
+ "description": "One planning-gate blocker row (contracts.md \u00a78.46) \u2014 the shared machine\ndiscriminator every gate-carrying envelope serializes.\n\n``kind`` is ``\"technical\"`` (a train readiness veto \u2014 ``code``/``message`` verbatim, or\nthe gate-owned defensive ``dependency_not_ready``) or ``\"handoff\"`` (a handoff-blocked\ndirect dependency \u2014 fields-only, no prose: consumers read the pinned fields). Handoff\nrows derive from a verified-PUBLISHED layer, so ``plan``/``pr``/``remediation`` are\nalways populated there (the nullable wire types exist for the technical rows).",
129
+ "properties": {
130
+ "kind": {
131
+ "title": "Kind",
132
+ "type": "string"
133
+ },
134
+ "code": {
135
+ "anyOf": [
136
+ {
137
+ "type": "string"
138
+ },
139
+ {
140
+ "type": "null"
141
+ }
142
+ ],
143
+ "title": "Code"
144
+ },
145
+ "message": {
146
+ "anyOf": [
147
+ {
148
+ "type": "string"
149
+ },
150
+ {
151
+ "type": "null"
152
+ }
153
+ ],
154
+ "title": "Message"
155
+ },
156
+ "dependency_node_id": {
157
+ "anyOf": [
158
+ {
159
+ "type": "string"
160
+ },
161
+ {
162
+ "type": "null"
163
+ }
164
+ ],
165
+ "title": "Dependency Node Id"
166
+ },
167
+ "plan": {
168
+ "anyOf": [
169
+ {
170
+ "type": "string"
171
+ },
172
+ {
173
+ "type": "null"
174
+ }
175
+ ],
176
+ "title": "Plan"
177
+ },
178
+ "pr": {
179
+ "anyOf": [
180
+ {
181
+ "type": "integer"
182
+ },
183
+ {
184
+ "type": "null"
185
+ }
186
+ ],
187
+ "title": "Pr"
188
+ },
189
+ "handoff_state": {
190
+ "anyOf": [
191
+ {
192
+ "type": "string"
193
+ },
194
+ {
195
+ "type": "null"
196
+ }
197
+ ],
198
+ "title": "Handoff State"
199
+ },
200
+ "stamped_head": {
201
+ "anyOf": [
202
+ {
203
+ "type": "string"
204
+ },
205
+ {
206
+ "type": "null"
207
+ }
208
+ ],
209
+ "title": "Stamped Head"
210
+ },
211
+ "current_head": {
212
+ "anyOf": [
213
+ {
214
+ "type": "string"
215
+ },
216
+ {
217
+ "type": "null"
218
+ }
219
+ ],
220
+ "title": "Current Head"
221
+ },
222
+ "remediation": {
223
+ "anyOf": [
224
+ {
225
+ "type": "string"
226
+ },
227
+ {
228
+ "type": "null"
229
+ }
230
+ ],
231
+ "title": "Remediation"
232
+ }
233
+ },
234
+ "required": [
235
+ "kind",
236
+ "code",
237
+ "message",
238
+ "dependency_node_id",
239
+ "plan",
240
+ "pr",
241
+ "handoff_state",
242
+ "stamped_head",
243
+ "current_head",
244
+ "remediation"
245
+ ],
246
+ "title": "GateBlockerOut",
247
+ "type": "object"
248
+ },
126
249
  "LayerOut": {
127
250
  "additionalProperties": false,
128
251
  "properties": {
@@ -245,6 +368,10 @@
245
368
  }
246
369
  ],
247
370
  "title": "Expected Pr Base"
371
+ },
372
+ "handoff": {
373
+ "title": "Handoff",
374
+ "type": "string"
248
375
  }
249
376
  },
250
377
  "required": [
@@ -263,7 +390,8 @@
263
390
  "published_head_sha",
264
391
  "observed_remote_head_sha",
265
392
  "observed_pr_base",
266
- "expected_pr_base"
393
+ "expected_pr_base",
394
+ "handoff"
267
395
  ],
268
396
  "title": "LayerOut",
269
397
  "type": "object"
@@ -406,6 +534,41 @@
406
534
  "title": "OrphanedResidueOut",
407
535
  "type": "object"
408
536
  },
537
+ "PlanningGateOut": {
538
+ "additionalProperties": false,
539
+ "description": "The composed planning-gate block (contracts.md \u00a78.46): the evaluated candidate\n(``None`` when no candidate exists), the technical-AND-handoff verdict for\nplanning/fresh starts, and the blocker rows.",
540
+ "properties": {
541
+ "node_id": {
542
+ "anyOf": [
543
+ {
544
+ "type": "string"
545
+ },
546
+ {
547
+ "type": "null"
548
+ }
549
+ ],
550
+ "title": "Node Id"
551
+ },
552
+ "ready": {
553
+ "title": "Ready",
554
+ "type": "boolean"
555
+ },
556
+ "blockers": {
557
+ "items": {
558
+ "$ref": "#/$defs/GateBlockerOut"
559
+ },
560
+ "title": "Blockers",
561
+ "type": "array"
562
+ }
563
+ },
564
+ "required": [
565
+ "node_id",
566
+ "ready",
567
+ "blockers"
568
+ ],
569
+ "title": "PlanningGateOut",
570
+ "type": "object"
571
+ },
409
572
  "TrainOut": {
410
573
  "additionalProperties": false,
411
574
  "properties": {
@@ -477,6 +640,14 @@
477
640
  "default": 0,
478
641
  "title": "Landed Prefix Len",
479
642
  "type": "integer"
643
+ },
644
+ "planning_gate": {
645
+ "$ref": "#/$defs/PlanningGateOut",
646
+ "default": {
647
+ "node_id": null,
648
+ "ready": false,
649
+ "blockers": []
650
+ }
480
651
  }
481
652
  },
482
653
  "required": [
@@ -2,7 +2,7 @@
2
2
  "$defs": {
3
3
  "LandPrOut": {
4
4
  "additionalProperties": false,
5
- "description": "The serialization boundary of the picked :class:`github.PullRequest` subset\n(field order load-bearing).",
5
+ "description": "The serialization boundary of :class:`delivery.LandResult.PrSummary`\n(field order load-bearing).",
6
6
  "properties": {
7
7
  "number": {
8
8
  "title": "Number",
@@ -22,7 +22,7 @@
22
22
  },
23
23
  "LearnConsumeOut": {
24
24
  "additionalProperties": false,
25
- "description": "The serialization boundary of :class:`LearnConsumeUpdate` (field order load-bearing).",
25
+ "description": "The serialization boundary of :class:`delivery.LandResult.LearnUpdate`\n(field order load-bearing).",
26
26
  "properties": {
27
27
  "closed": {
28
28
  "items": {
@@ -52,7 +52,7 @@
52
52
  },
53
53
  "ObjectiveLandOut": {
54
54
  "additionalProperties": false,
55
- "description": "The serialization boundary of :class:`ObjectiveLandUpdate` (field order load-bearing).\n\n``id`` maps from the domain ``objective`` field (the linked objective id).",
55
+ "description": "The serialization boundary of :class:`delivery.LandResult.ObjectiveUpdate`\n(field order load-bearing).\n\n``id`` maps from the domain ``objective`` field (the linked objective id).",
56
56
  "properties": {
57
57
  "id": {
58
58
  "anyOf": [
@@ -22,7 +22,7 @@
22
22
  }
23
23
  },
24
24
  "additionalProperties": false,
25
- "description": "The ``--json`` serialization boundary of :class:`PrReadyResult` (order load-bearing).",
25
+ "description": "The ``--json`` serialization boundary of :class:`PrReadyResult` (order load-bearing \u2014\nthe nine continuation fields are tail-additive).\n\nNull semantics: dry-run \u2192 all nine continuation fields null; incremental \u2192\n``stacked=false``, rest null; stacked success \u2192 all populated (``reconcile_notice`` /\n``reconcile_retry`` are CLI-composed presentation: the ready-time reconcile pass was not\nlaunched \u2014 the worker never launches \u2014 plus the copyable re-run gesture; ``plan`` /\n``parent_checkpoint`` are the continuation evidence consumers compose the pinned diff\nrange from, contracts.md \u00a78.66).",
26
26
  "properties": {
27
27
  "success": {
28
28
  "title": "Success",
@@ -60,6 +60,105 @@
60
60
  "dry_run": {
61
61
  "title": "Dry Run",
62
62
  "type": "boolean"
63
+ },
64
+ "stacked": {
65
+ "anyOf": [
66
+ {
67
+ "type": "boolean"
68
+ },
69
+ {
70
+ "type": "null"
71
+ }
72
+ ],
73
+ "title": "Stacked"
74
+ },
75
+ "objective": {
76
+ "anyOf": [
77
+ {
78
+ "type": "string"
79
+ },
80
+ {
81
+ "type": "null"
82
+ }
83
+ ],
84
+ "title": "Objective"
85
+ },
86
+ "node": {
87
+ "anyOf": [
88
+ {
89
+ "type": "string"
90
+ },
91
+ {
92
+ "type": "null"
93
+ }
94
+ ],
95
+ "title": "Node"
96
+ },
97
+ "stamped_head": {
98
+ "anyOf": [
99
+ {
100
+ "type": "string"
101
+ },
102
+ {
103
+ "type": "null"
104
+ }
105
+ ],
106
+ "title": "Stamped Head"
107
+ },
108
+ "stamp_advanced": {
109
+ "anyOf": [
110
+ {
111
+ "type": "boolean"
112
+ },
113
+ {
114
+ "type": "null"
115
+ }
116
+ ],
117
+ "title": "Stamp Advanced"
118
+ },
119
+ "reconcile_notice": {
120
+ "anyOf": [
121
+ {
122
+ "type": "string"
123
+ },
124
+ {
125
+ "type": "null"
126
+ }
127
+ ],
128
+ "title": "Reconcile Notice"
129
+ },
130
+ "reconcile_retry": {
131
+ "anyOf": [
132
+ {
133
+ "type": "string"
134
+ },
135
+ {
136
+ "type": "null"
137
+ }
138
+ ],
139
+ "title": "Reconcile Retry"
140
+ },
141
+ "plan": {
142
+ "anyOf": [
143
+ {
144
+ "type": "string"
145
+ },
146
+ {
147
+ "type": "null"
148
+ }
149
+ ],
150
+ "title": "Plan"
151
+ },
152
+ "parent_checkpoint": {
153
+ "anyOf": [
154
+ {
155
+ "type": "string"
156
+ },
157
+ {
158
+ "type": "null"
159
+ }
160
+ ],
161
+ "title": "Parent Checkpoint"
63
162
  }
64
163
  },
65
164
  "required": [
@@ -68,7 +167,16 @@
68
167
  "message",
69
168
  "pr",
70
169
  "was_draft",
71
- "dry_run"
170
+ "dry_run",
171
+ "stacked",
172
+ "objective",
173
+ "node",
174
+ "stamped_head",
175
+ "stamp_advanced",
176
+ "reconcile_notice",
177
+ "reconcile_retry",
178
+ "plan",
179
+ "parent_checkpoint"
72
180
  ],
73
181
  "title": "PrReadyOut",
74
182
  "type": "object"