@mgiles/perk 3.2.0 → 3.3.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 (202) hide show
  1. package/README.md +5 -0
  2. package/extension/authoring/gist/draft.ts +198 -0
  3. package/extension/authoring/gist/prose.ts +46 -0
  4. package/extension/authoring/gist/review.ts +133 -0
  5. package/extension/authoring/gist/save.ts +118 -0
  6. package/extension/authoring/objective/draft.ts +345 -0
  7. package/extension/{factories/objectiveDreamReport.ts → authoring/objective/dreamReportGate.ts} +74 -131
  8. package/extension/authoring/objective/planning.ts +124 -0
  9. package/extension/authoring/objective/prose.ts +103 -0
  10. package/extension/authoring/objective/review.ts +128 -0
  11. package/extension/authoring/objective/save.ts +224 -0
  12. package/extension/authoring/plan/draft.ts +84 -0
  13. package/extension/authoring/plan/prose.ts +41 -0
  14. package/extension/authoring/plan/review.ts +269 -0
  15. package/extension/authoring/plan/save.ts +256 -0
  16. package/extension/authoring/plan/source.ts +82 -0
  17. package/extension/authoring/refinement/context.ts +468 -0
  18. package/extension/authoring/refinement/draft.ts +261 -0
  19. package/extension/authoring/refinement/prose.ts +79 -0
  20. package/extension/authoring/refinement/review.ts +111 -0
  21. package/extension/authoring/refinement/save.ts +119 -0
  22. package/extension/authoring/review/approvalGate.ts +34 -0
  23. package/extension/authoring/review/draftContext.ts +68 -0
  24. package/extension/codeReview/automated.ts +352 -0
  25. package/extension/codeReview/submission.ts +229 -0
  26. package/extension/delivery/address.ts +295 -0
  27. package/extension/delivery/ci.ts +355 -0
  28. package/extension/delivery/commitCompact.ts +93 -0
  29. package/extension/delivery/conflictResolution.ts +247 -0
  30. package/extension/delivery/ready.ts +193 -0
  31. package/extension/delivery/stackConflict.ts +361 -0
  32. package/extension/delivery/stackObjective.ts +16 -0
  33. package/extension/delivery/stackReconcile.ts +165 -0
  34. package/extension/delivery/submit.ts +171 -0
  35. package/extension/index.ts +365 -380
  36. package/extension/learning/analystWave.ts +324 -0
  37. package/extension/learning/audit.ts +667 -0
  38. package/extension/learning/capture.ts +92 -0
  39. package/extension/learning/containment.ts +104 -0
  40. package/extension/{waves/dreamWave.ts → learning/dream.ts} +112 -94
  41. package/extension/learning/dreamAnalysis.ts +435 -0
  42. package/extension/{waves/dreamReducerWave.ts → learning/dreamReducer.ts} +46 -41
  43. package/extension/{waves → learning}/dreamReport.ts +35 -31
  44. package/extension/learning/harvest.ts +491 -0
  45. package/extension/learning/prose.ts +66 -0
  46. package/extension/learning/routing.ts +79 -0
  47. package/extension/pi/v1/bashScanTimeout.ts +64 -0
  48. package/extension/{doors/prReview.ts → pi/v1/codeReview/automated.ts} +215 -311
  49. package/extension/{doors/prReviewBrowser.ts → pi/v1/codeReview/browser.ts} +53 -33
  50. package/extension/{doors/hunkHandoff.ts → pi/v1/codeReview/checkout.ts} +12 -8
  51. package/extension/{doors/reviewWaveTools.ts → pi/v1/codeReview/reviewWave.ts} +146 -114
  52. package/extension/{doors/stackReviewBrowser.ts → pi/v1/codeReview/stack.ts} +62 -29
  53. package/extension/pi/v1/codeReview/submit.ts +354 -0
  54. package/extension/{doors/prReviewTerminal.ts → pi/v1/codeReview/terminal.ts} +32 -27
  55. package/extension/pi/v1/contextEvidence.ts +80 -0
  56. package/extension/pi/v1/contextInjection.ts +207 -0
  57. package/extension/{doors → pi/v1/delivery}/address.ts +154 -267
  58. package/extension/pi/v1/delivery/ci.ts +570 -0
  59. package/extension/pi/v1/delivery/commitCompact.ts +201 -0
  60. package/extension/pi/v1/delivery/conflictResolverEngine.ts +425 -0
  61. package/extension/{doors → pi/v1/delivery}/land.ts +123 -61
  62. package/extension/pi/v1/delivery/ready.ts +322 -0
  63. package/extension/pi/v1/delivery/stackConflictResolver.ts +172 -0
  64. package/extension/pi/v1/delivery/stackDrive.ts +120 -0
  65. package/extension/pi/v1/delivery/stackLand.ts +223 -0
  66. package/extension/pi/v1/delivery/stackRecover.ts +265 -0
  67. package/extension/pi/v1/delivery/stackStatus.ts +237 -0
  68. package/extension/pi/v1/delivery/stackSync.ts +658 -0
  69. package/extension/pi/v1/delivery/submit.ts +389 -0
  70. package/extension/pi/v1/delivery/submitConflict.ts +186 -0
  71. package/extension/pi/v1/draftReview.ts +431 -0
  72. package/extension/{doors → pi/v1}/draftReviewWaveTools.ts +141 -151
  73. package/extension/pi/v1/gist.ts +794 -0
  74. package/extension/pi/v1/learning/audit.ts +186 -0
  75. package/extension/pi/v1/learning/dream.ts +207 -0
  76. package/extension/{doors/learnFactory.ts → pi/v1/learning/factory.ts} +18 -65
  77. package/extension/{doors/harvestWaveTools.ts → pi/v1/learning/harvest.ts} +46 -100
  78. package/extension/pi/v1/learning/learn.ts +585 -0
  79. package/extension/pi/v1/lifecycleGates.ts +127 -0
  80. package/extension/{factories → pi/v1}/objective.ts +53 -33
  81. package/extension/pi/v1/objectiveAuthoring.ts +672 -0
  82. package/extension/pi/v1/objectiveDreamGate.ts +160 -0
  83. package/extension/{factories/objectivePlan.ts → pi/v1/objectivePlanning.ts} +328 -533
  84. package/extension/pi/v1/objectiveRefinement.ts +1320 -0
  85. package/extension/pi/v1/objectiveReview.ts +451 -0
  86. package/extension/{doors → pi/v1}/objectiveReviewBrowser.ts +259 -172
  87. package/extension/pi/v1/plan.ts +812 -0
  88. package/extension/pi/v1/planReview.ts +820 -0
  89. package/extension/{doors → pi/v1}/planReviewBrowser.ts +228 -152
  90. package/extension/{doors/annotationPush.ts → pi/v1/providers/annotations.ts} +158 -89
  91. package/extension/pi/v1/providers/plannotator.ts +487 -0
  92. package/extension/{doors → pi/v1/providers}/plannotatorHandoff.ts +73 -27
  93. package/extension/pi/v1/providers/selection.ts +43 -0
  94. package/extension/{adapters/planAdapterTombell.ts → pi/v1/providers/tombell.ts} +43 -72
  95. package/extension/pi/v1/review.ts +538 -0
  96. package/extension/pi/v1/reviewOutcome.ts +9 -0
  97. package/extension/pi/v1/scoutWave.ts +318 -0
  98. package/extension/{doors → pi/v1}/selfcheck.ts +4 -4
  99. package/extension/session/branchWorkflowSession.ts +60 -0
  100. package/extension/session/lifecycle.ts +644 -0
  101. package/extension/session/lifecycleGates.ts +64 -0
  102. package/extension/session/saveDestination.ts +87 -0
  103. package/extension/session/workflowSession.ts +971 -0
  104. package/extension/substrate/agentScratch.ts +27 -54
  105. package/extension/substrate/bashScanTimeout.ts +181 -0
  106. package/extension/substrate/bindingDelivery.ts +38 -30
  107. package/extension/substrate/bindings.ts +4 -5
  108. package/extension/substrate/cache.ts +64 -12
  109. package/extension/substrate/childRestrictions.ts +39 -0
  110. package/extension/substrate/coldDoor.ts +17 -1
  111. package/extension/substrate/config.ts +157 -21
  112. package/extension/substrate/git.ts +88 -6
  113. package/extension/substrate/modelVisible.ts +53 -0
  114. package/extension/substrate/prompts.ts +22 -0
  115. package/extension/substrate/registry.ts +2 -0
  116. package/extension/substrate/resolverLease.ts +5 -4
  117. package/extension/substrate/sessionData.ts +85 -152
  118. package/extension/substrate/toolGating.ts +263 -84
  119. package/extension/substrate/unifiedDiff.ts +1 -1
  120. package/extension/substrate/workflowState.ts +178 -163
  121. package/extension/substrate/worktreeResolverLock.ts +261 -0
  122. package/extension/surfaces/surfaces.ts +79 -27
  123. package/extension/waves/adversarialReviewWave.ts +87 -46
  124. package/extension/waves/blockedReports.ts +59 -0
  125. package/extension/waves/draftReviewWave.ts +42 -42
  126. package/extension/waves/laneIdentity.ts +77 -0
  127. package/extension/waves/objectiveExplorerWave.ts +24 -24
  128. package/extension/waves/prReviewWave.ts +89 -77
  129. package/extension/waves/reportWave.ts +438 -578
  130. package/extension/waves/reviewClassifierWave.ts +22 -22
  131. package/extension/waves/rpcAdapter.ts +100 -15
  132. package/extension/waves/scoutWave.ts +192 -0
  133. package/extension/waves/transport.ts +480 -0
  134. package/extension/worker/sdkAdapter.ts +494 -0
  135. package/extension/worker/stageExecution.ts +679 -0
  136. package/extension/workerMain.ts +18 -19
  137. package/package.json +6 -4
  138. package/prompts/_fixtures/live.yaml +43 -18
  139. package/prompts/contexts/adapters/plannotator-gist.md +6 -0
  140. package/prompts/contexts/adapters/plannotator-objective.md +6 -0
  141. package/prompts/contexts/adapters/plannotator-plan.md +8 -1
  142. package/prompts/contexts/adapters/plannotator-refinement.md +22 -0
  143. package/prompts/contexts/objective-refinement.md +17 -0
  144. package/prompts/contexts/read-only.md +1 -1
  145. package/prompts/stages/conflict-resolution-continuation.md +9 -6
  146. package/prompts/stages/conflict-resolution.md +4 -4
  147. package/prompts/stages/objective-plan/guidance.md +2 -2
  148. package/prompts/stages/objective-plan/seed.md +9 -1
  149. package/prompts/stages/objective-reconcile-ready.md +1 -1
  150. package/prompts/stages/objective-reconcile.md +1 -1
  151. package/prompts/stages/objective-refine/seed.md +18 -0
  152. package/prompts/stages/objective-review-browser.md +4 -4
  153. package/prompts/stages/objective-sync.md +1 -1
  154. package/prompts/stages/plan-review-browser.md +4 -4
  155. package/prompts/stages/pr-review-browser/active.md +3 -4
  156. package/prompts/stages/pr-review-browser/foreign.md +3 -4
  157. package/prompts/stages/pr-review-terminal/active.md +3 -3
  158. package/prompts/stages/pr-review-terminal/foreign.md +3 -3
  159. package/prompts/stages/pr-review.md +3 -3
  160. package/prompts/stages/stack-review-browser/stack.md +5 -6
  161. package/shared/README.md +8 -0
  162. package/shared/bindings.yaml +3 -3
  163. package/shared/contracts.md +2601 -506
  164. package/shared/fixtures/issues-table.json +130 -0
  165. package/shared/registry.yaml +13 -0
  166. package/shared/schemas/outputs/objective-node-engagement.schema.json +318 -0
  167. package/shared/schemas/outputs/objective-stack-status.schema.json +6 -1
  168. package/shared/schemas/outputs/pr-review-context.schema.json +54 -9
  169. package/shared/schemas/outputs/pr-review-stack-context.schema.json +196 -0
  170. package/extension/adapters/planAdapterPlannotator.ts +0 -362
  171. package/extension/doors/auditWaveTools.ts +0 -352
  172. package/extension/doors/ciExecutor.ts +0 -756
  173. package/extension/doors/commitCompact.ts +0 -251
  174. package/extension/doors/dreamWaveTools.ts +0 -489
  175. package/extension/doors/learn.ts +0 -668
  176. package/extension/doors/lifecycleGates.ts +0 -207
  177. package/extension/doors/objectiveStack.ts +0 -1543
  178. package/extension/doors/prReviewDynamic.ts +0 -276
  179. package/extension/doors/ready.ts +0 -279
  180. package/extension/doors/submit.ts +0 -373
  181. package/extension/doors/submitPrReview.ts +0 -505
  182. package/extension/factories/gistAuthor.ts +0 -94
  183. package/extension/factories/gistDraft.ts +0 -265
  184. package/extension/factories/gistSave.ts +0 -251
  185. package/extension/factories/implementHere.ts +0 -116
  186. package/extension/factories/objectiveAuthor.ts +0 -98
  187. package/extension/factories/objectiveDraft.ts +0 -466
  188. package/extension/factories/objectiveSave.ts +0 -366
  189. package/extension/factories/planDraft.ts +0 -140
  190. package/extension/factories/planMode.ts +0 -205
  191. package/extension/factories/planReview.ts +0 -1237
  192. package/extension/factories/planSave.ts +0 -604
  193. package/extension/factories/planTitle.ts +0 -141
  194. package/extension/substrate/structuredOutput.ts +0 -202
  195. package/extension/waves/auditWave.ts +0 -312
  196. package/extension/waves/harvestWave.ts +0 -399
  197. package/extension/waves/learnWave.ts +0 -155
  198. package/extension/waves/memoryAdapter.ts +0 -139
  199. package/extension/waves/prReviewDynamicWave.ts +0 -777
  200. package/extension/worker/readOnlySession.ts +0 -294
  201. package/extension/worker/worker.ts +0 -899
  202. package/prompts/stages/pr-review-dynamic.md +0 -7
@@ -9,11 +9,6 @@
9
9
  // no tool registration, no `ExtensionAPI` — imports only the two dream siblings plus nothing
10
10
  // else. The input is untrusted DATA, never instructions.
11
11
 
12
- import {
13
- DREAM_REDUCER_ANGLES,
14
- type DreamReducerAnalysis,
15
- type DreamReducerAngle,
16
- } from "./dreamReducerWave.ts";
17
12
  import {
18
13
  codePointLength,
19
14
  DREAM_DISPOSITIONS,
@@ -21,14 +16,19 @@ import {
21
16
  type DreamDocAssessment,
22
17
  type DreamLaneAnalysis,
23
18
  type DreamManifest,
24
- } from "./dreamWave.ts";
19
+ } from "./dream.ts";
20
+ import {
21
+ DREAM_REDUCER_ANGLES,
22
+ type DreamReducerAnalysis,
23
+ type DreamReducerAngle,
24
+ } from "./dreamReducer.ts";
25
25
 
26
26
  /** The dream report's own schema version line (independent of the manifest's). */
27
- export const DREAM_REPORT_SCHEMA_VERSION = "1";
27
+ const DREAM_REPORT_SCHEMA_VERSION = "1";
28
28
 
29
29
  /** The cap on DISTINCT `roadmap_node` values across the selected units — the ≤12-node
30
30
  * selection cap checked at review time (many-to-one unit→node mapping is allowed). */
31
- export const DREAM_REPORT_MAX_ROADMAP_NODES = 12;
31
+ const DREAM_REPORT_MAX_ROADMAP_NODES = 12;
32
32
 
33
33
  /**
34
34
  * The per-part cap on the rendered report, measured in Unicode CODE POINTS (matching Python's
@@ -36,13 +36,13 @@ export const DREAM_REPORT_MAX_ROADMAP_NODES = 12;
36
36
  * comment limit with margin for the persistence-side storage markers (the renderer never emits
37
37
  * marker HTML).
38
38
  */
39
- export const DREAM_REPORT_PART_MAX_CHARS = 60_000;
39
+ const DREAM_REPORT_PART_MAX_CHARS = 60_000;
40
40
 
41
41
  /** The fixed per-part packing allowance for the part header line. */
42
- export const DREAM_REPORT_PART_HEADER_RESERVE = 200;
42
+ const DREAM_REPORT_PART_HEADER_RESERVE = 200;
43
43
 
44
44
  /** The bounded semantic-detail collection cap: overflow appends ONE synthetic count detail. */
45
- export const DREAM_REPORT_MAX_VALIDATION_DETAILS = 25;
45
+ const DREAM_REPORT_MAX_VALIDATION_DETAILS = 25;
46
46
 
47
47
  /**
48
48
  * The SSOT for EVERY capped model-supplied field: the input schema's `maxItems`/`maxLength`
@@ -52,7 +52,7 @@ export const DREAM_REPORT_MAX_VALIDATION_DETAILS = 25;
52
52
  * the real gates are the validator's exact path-set equality, the ≤12-distinct-node cap, and
53
53
  * the exact unit partition.
54
54
  */
55
- export const DREAM_REPORT_CAPS = {
55
+ const DREAM_REPORT_CAPS = {
56
56
  rows: 512,
57
57
  rowRationaleChars: 300,
58
58
  fallbackReasonChars: 300,
@@ -75,7 +75,7 @@ export const DREAM_REPORT_CAPS = {
75
75
  // ------------------------------------------------------------------ the model-facing input
76
76
 
77
77
  /** One final per-doc disposition row (model-supplied). */
78
- export interface DreamReportInputRow {
78
+ interface DreamReportInputRow {
79
79
  path: string;
80
80
  disposition: DreamDisposition;
81
81
  merge_target: string | null;
@@ -85,7 +85,7 @@ export interface DreamReportInputRow {
85
85
  }
86
86
 
87
87
  /** One selected curation unit (rank = input position; several units MAY share a node). */
88
- export interface DreamReportSelectedUnit {
88
+ interface DreamReportSelectedUnit {
89
89
  title: string;
90
90
  roadmap_node: string;
91
91
  docs: string[];
@@ -93,14 +93,14 @@ export interface DreamReportSelectedUnit {
93
93
  }
94
94
 
95
95
  /** One overflow curation unit (rank = input position; carries no roadmap node). */
96
- export interface DreamReportOverflowUnit {
96
+ interface DreamReportOverflowUnit {
97
97
  title: string;
98
98
  docs: string[];
99
99
  rationale: string;
100
100
  }
101
101
 
102
102
  /** One harvest follow-up citing a SURVIVING destination (a keep/revise doc or its cluster). */
103
- export interface DreamReportFollowup {
103
+ interface DreamReportFollowup {
104
104
  title: string;
105
105
  destination: string;
106
106
  pointer: string;
@@ -108,14 +108,14 @@ export interface DreamReportFollowup {
108
108
  }
109
109
 
110
110
  /** The model-supplied prediction — TYPE sanity only, deliberately no directional/quota rule. */
111
- export interface DreamReportPredictedEffectsInput {
111
+ interface DreamReportPredictedEffectsInput {
112
112
  docs_after: number;
113
113
  bytes_after: number;
114
114
  note: string | null;
115
115
  }
116
116
 
117
117
  /** The untrusted, model-supplied input: ONLY the decisions the design assigns to the parent. */
118
- export interface DreamReportInput {
118
+ interface DreamReportInput {
119
119
  rows: DreamReportInputRow[];
120
120
  uncertainties: string[];
121
121
  selected_units: DreamReportSelectedUnit[];
@@ -249,7 +249,7 @@ export const DREAM_REPORT_INPUT_SCHEMA = {
249
249
  // ------------------------------------------------------------------- the composed report
250
250
 
251
251
  /** One injected reducer stance record, joined onto its doc's row (angle order). */
252
- export interface DreamReportStanceRecord {
252
+ interface DreamReportStanceRecord {
253
253
  angle: DreamReducerAngle;
254
254
  stance: "endorse" | "challenge";
255
255
  reason: string;
@@ -258,7 +258,7 @@ export interface DreamReportStanceRecord {
258
258
 
259
259
  /** One composed per-doc row: the model's final decision joined with the injected analyst
260
260
  * evidence and reducer stances (manifest lane/doc order). */
261
- export interface DreamReportRow {
261
+ interface DreamReportRow {
262
262
  path: string;
263
263
  lane: string;
264
264
  cluster: string | null;
@@ -276,7 +276,7 @@ export interface DreamReportRow {
276
276
  }
277
277
 
278
278
  /** One analyst lane's coverage line (complete by construction — rendered for verification). */
279
- export interface DreamReportAnalystCoverage {
279
+ interface DreamReportAnalystCoverage {
280
280
  lane: string;
281
281
  docs: number;
282
282
  overlap_signals_omitted: number;
@@ -285,7 +285,7 @@ export interface DreamReportAnalystCoverage {
285
285
  }
286
286
 
287
287
  /** One reducer angle's coverage line. */
288
- export interface DreamReportReducerCoverage {
288
+ interface DreamReportReducerCoverage {
289
289
  angle: DreamReducerAngle;
290
290
  stances: number;
291
291
  stances_omitted: number;
@@ -736,8 +736,10 @@ interface JoinedRow {
736
736
  * the semantic rules collect up to `DREAM_REPORT_MAX_VALIDATION_DETAILS` named details in
737
737
  * deterministic order (validation phase order, then manifest doc order within a phase),
738
738
  * overflow appending one final synthetic detail counting the omitted violations.
739
+ * Module-private: `buildDreamReport` is the one entry — the whole matrix is exercised
740
+ * through it.
739
741
  */
740
- export function validateDreamReport(
742
+ function validateDreamReport(
741
743
  input: unknown,
742
744
  context: DreamReportContext,
743
745
  ): { ok: true; report: DreamReport } | Refusal {
@@ -759,7 +761,7 @@ export function validateDreamReport(
759
761
 
760
762
  const details: string[] = [];
761
763
 
762
- // Phase 1 (D4) — exact path-set equality: no duplicate, no extra, no missing rows.
764
+ // Phase 1 — exact path-set equality: no duplicate, no extra, no missing rows.
763
765
  const rowByPath = new Map<string, DreamReportInputRow>();
764
766
  for (const row of typed.rows) {
765
767
  if (rowByPath.has(row.path)) {
@@ -778,7 +780,7 @@ export function validateDreamReport(
778
780
  }
779
781
  }
780
782
 
781
- // Phase 2 (D4) — per-row rules in manifest doc order: rationale non-empty, the
783
+ // Phase 2 — per-row rules in manifest doc order: rationale non-empty, the
782
784
  // merge-target shape, downgrade-only against the analyst proposal, the fallback rule.
783
785
  const joined = new Map<string, JoinedRow>();
784
786
  for (const path of manifestPaths) {
@@ -847,7 +849,7 @@ export function validateDreamReport(
847
849
  }
848
850
  }
849
851
 
850
- // Phase 3 (D5) — the destructive evidence bar, computed ONLY from context stances: an
852
+ // Phase 3 — the destructive evidence bar, computed ONLY from context stances: an
851
853
  // explicit endorse from BOTH gate angles and no challenge from ANY angle; silence counts as
852
854
  // non-endorsement. The bar is necessary, not sufficient — an eligible proposal MAY still be
853
855
  // downgraded by parent judgment.
@@ -886,7 +888,7 @@ export function validateDreamReport(
886
888
  }
887
889
  }
888
890
 
889
- // Phase 4 (D6) — merge-target existence + survival over FINAL dispositions. Survival
891
+ // Phase 4 — merge-target existence + survival over FINAL dispositions. Survival
890
892
  // structurally forbids merge chains and cycles (a merge-into doc can never be a target).
891
893
  for (const path of manifestPaths) {
892
894
  const state = joined.get(path);
@@ -907,7 +909,7 @@ export function validateDreamReport(
907
909
  }
908
910
  }
909
911
 
910
- // Phase 5 (D7) — curation units: corpus membership, no doc in two units, no empty unit, no
912
+ // Phase 5 — curation units: corpus membership, no doc in two units, no empty unit, no
911
913
  // final-keep doc in a unit, the exact partition over the final non-keep set, non-empty
912
914
  // roadmap nodes, and the ≤12-distinct-node cap (many-to-one node mapping is allowed).
913
915
  const claimedBy = new Set<string>();
@@ -969,7 +971,7 @@ export function validateDreamReport(
969
971
  );
970
972
  }
971
973
 
972
- // Phase 6 (D8) — harvest follow-ups cite SURVIVING destinations: a keep/revise corpus doc,
974
+ // Phase 6 — harvest follow-ups cite SURVIVING destinations: a keep/revise corpus doc,
973
975
  // or a cluster named by at least one keep/revise doc.
974
976
  const survivingDocs = new Set<string>();
975
977
  for (const path of manifestPaths) {
@@ -1016,7 +1018,7 @@ export function validateDreamReport(
1016
1018
  }
1017
1019
  }
1018
1020
 
1019
- // Phase 7 (D9) — predicted effects carry deliberately NO directional/quota rule: a growth
1021
+ // Phase 7 — predicted effects carry deliberately NO directional/quota rule: a growth
1020
1022
  // prediction is valid (type sanity was structural).
1021
1023
 
1022
1024
  if (details.length > 0) {
@@ -1176,8 +1178,10 @@ function joinOrDash(items: string[]): string {
1176
1178
  * every part prefixed with its header after packing. A single block exceeding the budget is a
1177
1179
  * defensive refusal (structurally unreachable under the caps arithmetic — named, never
1178
1180
  * truncated).
1181
+ * Module-private: `buildDreamReport` is the one entry (it returns both the typed report and
1182
+ * the rendered parts).
1179
1183
  */
1180
- export function renderDreamReport(
1184
+ function renderDreamReport(
1181
1185
  report: DreamReport,
1182
1186
  ): { ok: true; parts: string[] } | { ok: false; detail: string } {
1183
1187
  const blocks: RenderBlock[] = [];