@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
@@ -0,0 +1,160 @@
1
+ // The production `DreamGateRecovery` capability for the §8.63 `dream_report` gate — the
2
+ // Pi/session edge that mints the resolver's trusted-context recovery per operation. The
3
+ // mechanics live HERE (workflow-state snapshot, run-scratch reads, the decode/digest ladder,
4
+ // the §8.65 bracket) so `authoring/objective/dreamReportGate.ts` stays storage-free; the gate
5
+ // matrix, outcome union, and every rendered byte stay with the resolver.
6
+ //
7
+ // Fail-closed hardenings at this edge (both classify as `unreadable` → the resolver's
8
+ // `bad_state`, never a silent "non-dream"): the claimed run_id is narrowed through
9
+ // `isSafeRunId` BEFORE any path derivation (the canonical read-path trust boundary — the
10
+ // `activeSessionRunId` degrade-to-null posture is for the identity-optional data seam; the
11
+ // gate refuses loudly on a pathological id), and the `dream_bundle_digest` marker is
12
+ // runtime-narrowed to string-or-absent (the rebuilt state is a cast — a mistyped marker is
13
+ // corrupted state, not "no finalized wave").
14
+
15
+ import { existsSync, readFileSync } from "node:fs";
16
+ import { dirname, join } from "node:path";
17
+ import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
18
+ import type { DreamGateRecovery } from "../../authoring/objective/dreamReportGate.ts";
19
+ import { DREAM_MANIFEST_FILENAME, decodeDreamManifest } from "../../learning/dream.ts";
20
+ import {
21
+ DREAM_ANALYSES_FILENAME,
22
+ decodeFinalizedDreamBundle,
23
+ } from "../../learning/dreamReducer.ts";
24
+ import { isSafeRunId, runScratchDir } from "../../substrate/cache.ts";
25
+ import { revalidationBracket } from "../../substrate/git.ts";
26
+ import { digestSessionData } from "../../substrate/sessionData.ts";
27
+ import {
28
+ branchOf,
29
+ rebuildWorkflowState,
30
+ type WorkflowState,
31
+ } from "../../substrate/workflowState.ts";
32
+
33
+ /**
34
+ * Mint the production recovery capability over the live session context. Every `detail` on the
35
+ * `unreadable` arm is the RAW CAUSE (the resolver owns the rendering prefix); `recoverContext`
36
+ * details are the final text, byte-preserved from the recovery ladder this capability carries.
37
+ * `recoverContext` re-executes the full read+decode+digest ladder on EVERY call (the
38
+ * anti-proof-object contract — nothing is cached across calls); `runId` only ever arrives from
39
+ * `readSession()`'s narrowing (the one mint point).
40
+ */
41
+ export function productionDreamGateRecovery(ctx: ExtensionContext): DreamGateRecovery {
42
+ return {
43
+ readSession() {
44
+ let state: WorkflowState;
45
+ try {
46
+ state = rebuildWorkflowState(branchOf(ctx));
47
+ } catch (error) {
48
+ const detail = error instanceof Error ? error.message : String(error);
49
+ return { kind: "unreadable", detail };
50
+ }
51
+ // The rebuilt state is a CAST, not runtime-validated — narrow both fields here.
52
+ const rawRunId: unknown = state.run_id;
53
+ const claimed = typeof rawRunId === "string" && rawRunId.length > 0 ? rawRunId : null;
54
+ if (claimed !== null && !isSafeRunId(claimed)) {
55
+ // Fail-closed BEFORE any path derivation: a pathological claimed id refuses loudly
56
+ // rather than degrading to "non-dream".
57
+ return { kind: "unreadable", detail: "claimed run_id is not a safe path component" };
58
+ }
59
+ const rawMarker: unknown = state.dream_bundle_digest;
60
+ if (rawMarker !== undefined && typeof rawMarker !== "string") {
61
+ // Corrupted state is bad_state, not "no finalized wave" — mapping a mistyped marker
62
+ // to absent would misreport corruption.
63
+ return { kind: "unreadable", detail: "workflow-state dream_bundle_digest is not a string" };
64
+ }
65
+ // The empty string is kept as-is — it is the invalidation residue the recovery ladder
66
+ // already refuses.
67
+ const marker = rawMarker;
68
+ const dream =
69
+ claimed !== null &&
70
+ existsSync(join(runScratchDir(ctx.cwd, claimed), DREAM_MANIFEST_FILENAME));
71
+ return { kind: "read", runId: claimed, dream, marker };
72
+ },
73
+
74
+ /**
75
+ * The trusted-context recovery ladder — every arm fail-closed with a named detail (the
76
+ * resolver maps them to `bad_state`):
77
+ *
78
+ * 1. the run-scoped manifest: read + parse + `decodeDreamManifest` (the strict §8.60
79
+ * decoder, path bound at decode time). No `verifyDocContainment` — this path reads no
80
+ * doc files; the lexical decode suffices (resolved containment is the wave tool's
81
+ * pre-spawn concern);
82
+ * 2. the freshness check: the `dream_bundle_digest` marker (from the resolver's ONE
83
+ * workflow-state snapshot) must be present, non-empty, and equal the digest of the
84
+ * bundle bytes just read — a bare file is never trusted (missing marker = no finalized
85
+ * wave; empty = invalidated by a newer attempt, including a cleanup-failure residue;
86
+ * mismatch = stale/tampered bytes);
87
+ * 3. the strict finalized decode (`decodeFinalizedDreamBundle` over the digest of the
88
+ * manifest bytes just read — the marker authenticates the bundle bytes and the
89
+ * bundle's `manifest_digest` extends that authority to the manifest, so an at-rest
90
+ * manifest edit refuses; the analyses-only mid-wave shape refuses here too).
91
+ */
92
+ recoverContext(runId, marker) {
93
+ const manifestPath = join(runScratchDir(ctx.cwd, runId), DREAM_MANIFEST_FILENAME);
94
+ let manifestBytes: string;
95
+ let rawManifest: unknown;
96
+ try {
97
+ manifestBytes = readFileSync(manifestPath, "utf8");
98
+ rawManifest = JSON.parse(manifestBytes);
99
+ } catch (error) {
100
+ const detail = error instanceof Error ? error.message : String(error);
101
+ return { ok: false, detail: `dream manifest unreadable at '${manifestPath}': ${detail}` };
102
+ }
103
+ const manifest = decodeDreamManifest(rawManifest, manifestPath);
104
+ if (!manifest.ok) {
105
+ return { ok: false, detail: `dream manifest invalid: ${manifest.detail}` };
106
+ }
107
+
108
+ const bundlePath = join(dirname(manifestPath), DREAM_ANALYSES_FILENAME);
109
+ let bundleBytes: string;
110
+ try {
111
+ bundleBytes = readFileSync(bundlePath, "utf8");
112
+ } catch {
113
+ return {
114
+ ok: false,
115
+ detail: `no dream bundle at '${bundlePath}' — re-run the dream wave`,
116
+ };
117
+ }
118
+ if (marker === undefined || marker === "") {
119
+ return {
120
+ ok: false,
121
+ detail: "no finalized dream wave for this session — re-run the dream wave",
122
+ };
123
+ }
124
+ if (digestSessionData(bundleBytes) !== marker) {
125
+ return {
126
+ ok: false,
127
+ detail:
128
+ "the dream bundle does not match the session's finalized digest — re-run the dream wave",
129
+ };
130
+ }
131
+ let rawBundle: unknown;
132
+ try {
133
+ rawBundle = JSON.parse(bundleBytes);
134
+ } catch (error) {
135
+ const detail = error instanceof Error ? error.message : String(error);
136
+ return { ok: false, detail: `dream bundle is not valid JSON: ${detail}` };
137
+ }
138
+ const decoded = decodeFinalizedDreamBundle(
139
+ rawBundle,
140
+ manifest.manifest,
141
+ digestSessionData(manifestBytes),
142
+ );
143
+ if (!decoded.ok) {
144
+ return { ok: false, detail: `${decoded.detail} — re-run the dream wave` };
145
+ }
146
+ return {
147
+ ok: true,
148
+ manifest: manifest.manifest,
149
+ analyses: decoded.analyses,
150
+ reducers: decoded.reducers,
151
+ };
152
+ },
153
+
154
+ bracket(expectedSha) {
155
+ // The production §8.65 bracket: END-STATE HEAD + tree-clean against the manifest's
156
+ // stamped commit — fail-closed (an unprovable probe reads as drift).
157
+ return revalidationBracket(ctx.cwd, expectedSha);
158
+ },
159
+ };
160
+ }