@mgiles/perk 3.1.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 (211) 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 +369 -359
  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 -310
  49. package/extension/{doors/prReviewBrowser.ts → pi/v1/codeReview/browser.ts} +125 -57
  50. package/extension/{doors/hunkHandoff.ts → pi/v1/codeReview/checkout.ts} +12 -8
  51. package/extension/{doors/reviewWaveTools.ts → pi/v1/codeReview/reviewWave.ts} +169 -116
  52. package/extension/pi/v1/codeReview/stack.ts +606 -0
  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 +163 -265
  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 +128 -60
  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/{doors → pi/v1}/lifecycleGates.ts +14 -59
  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/pi/v1/objectivePlanning.ts +776 -0
  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 +152 -34
  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 -19
  112. package/extension/substrate/git.ts +88 -6
  113. package/extension/substrate/modelVisible.ts +53 -0
  114. package/extension/substrate/paths.ts +2 -7
  115. package/extension/substrate/prompts.ts +22 -0
  116. package/extension/substrate/registry.ts +2 -0
  117. package/extension/substrate/resolverLease.ts +364 -0
  118. package/extension/substrate/sessionData.ts +85 -152
  119. package/extension/substrate/toolGating.ts +279 -84
  120. package/extension/substrate/unifiedDiff.ts +1 -1
  121. package/extension/substrate/workflowState.ts +191 -166
  122. package/extension/substrate/worktreeResolverLock.ts +261 -0
  123. package/extension/surfaces/surfaces.ts +79 -27
  124. package/extension/waves/adversarialReviewWave.ts +103 -48
  125. package/extension/waves/blockedReports.ts +59 -0
  126. package/extension/waves/draftReviewWave.ts +42 -42
  127. package/extension/waves/laneIdentity.ts +77 -0
  128. package/extension/waves/objectiveExplorerWave.ts +24 -24
  129. package/extension/waves/prReviewWave.ts +89 -77
  130. package/extension/waves/reportWave.ts +438 -578
  131. package/extension/waves/reviewClassifierWave.ts +22 -22
  132. package/extension/waves/rpcAdapter.ts +100 -15
  133. package/extension/waves/scoutWave.ts +192 -0
  134. package/extension/waves/transport.ts +480 -0
  135. package/extension/worker/sdkAdapter.ts +494 -0
  136. package/extension/worker/stageExecution.ts +679 -0
  137. package/extension/workerMain.ts +18 -19
  138. package/package.json +6 -4
  139. package/prompts/_fixtures/live.yaml +98 -10
  140. package/prompts/contexts/adapters/plannotator-gist.md +6 -0
  141. package/prompts/contexts/adapters/plannotator-objective.md +6 -0
  142. package/prompts/contexts/adapters/plannotator-plan.md +8 -1
  143. package/prompts/contexts/adapters/plannotator-refinement.md +22 -0
  144. package/prompts/contexts/adapters/tombell-plan.md +4 -0
  145. package/prompts/contexts/objective-refinement.md +17 -0
  146. package/prompts/contexts/plan-authoring.md +6 -5
  147. package/prompts/contexts/read-only.md +1 -1
  148. package/prompts/stages/conflict-resolution-continuation.md +9 -0
  149. package/prompts/stages/conflict-resolution.md +4 -4
  150. package/prompts/stages/objective-author/adopt.md +1 -1
  151. package/prompts/stages/objective-author/file.md +1 -1
  152. package/prompts/stages/objective-author/seed.md +1 -1
  153. package/prompts/stages/objective-plan/guidance.md +2 -2
  154. package/prompts/stages/objective-plan/seed.md +9 -1
  155. package/prompts/stages/objective-reconcile-ready.md +7 -0
  156. package/prompts/stages/objective-reconcile.md +1 -1
  157. package/prompts/stages/objective-refine/seed.md +18 -0
  158. package/prompts/stages/objective-review-browser.md +4 -4
  159. package/prompts/stages/objective-sync.md +1 -1
  160. package/prompts/stages/plan-review-browser.md +4 -4
  161. package/prompts/stages/pr-review-browser/active.md +3 -4
  162. package/prompts/stages/pr-review-browser/foreign.md +3 -4
  163. package/prompts/stages/pr-review-terminal/active.md +3 -3
  164. package/prompts/stages/pr-review-terminal/foreign.md +3 -3
  165. package/prompts/stages/pr-review.md +3 -3
  166. package/prompts/stages/stack-review/cold.md +1 -0
  167. package/prompts/stages/stack-review-browser/stack.md +22 -0
  168. package/shared/README.md +8 -3
  169. package/shared/bindings.yaml +6 -3
  170. package/shared/contracts.md +4499 -2147
  171. package/shared/fixtures/issues-table.json +130 -0
  172. package/shared/registry.yaml +29 -1
  173. package/shared/schemas/outputs/objective-node-engagement.schema.json +318 -0
  174. package/shared/schemas/outputs/objective-stack-status.schema.json +178 -2
  175. package/shared/schemas/outputs/pr-ready.schema.json +110 -2
  176. package/shared/schemas/outputs/pr-review-context.schema.json +54 -9
  177. package/shared/schemas/outputs/pr-review-stack-context.schema.json +196 -0
  178. package/extension/adapters/planAdapterPlannotator.ts +0 -362
  179. package/extension/doors/auditWaveTools.ts +0 -352
  180. package/extension/doors/ciExecutor.ts +0 -756
  181. package/extension/doors/commitCompact.ts +0 -251
  182. package/extension/doors/dreamWaveTools.ts +0 -475
  183. package/extension/doors/learn.ts +0 -655
  184. package/extension/doors/objectiveStack.ts +0 -1143
  185. package/extension/doors/prReviewDynamic.ts +0 -276
  186. package/extension/doors/ready.ts +0 -87
  187. package/extension/doors/submit.ts +0 -347
  188. package/extension/doors/submitPrReview.ts +0 -408
  189. package/extension/factories/gistAuthor.ts +0 -94
  190. package/extension/factories/gistDraft.ts +0 -265
  191. package/extension/factories/gistSave.ts +0 -251
  192. package/extension/factories/implementHere.ts +0 -116
  193. package/extension/factories/objectiveAuthor.ts +0 -98
  194. package/extension/factories/objectiveDraft.ts +0 -466
  195. package/extension/factories/objectivePlan.ts +0 -975
  196. package/extension/factories/objectiveSave.ts +0 -363
  197. package/extension/factories/planDraft.ts +0 -140
  198. package/extension/factories/planMode.ts +0 -205
  199. package/extension/factories/planReview.ts +0 -1237
  200. package/extension/factories/planSave.ts +0 -604
  201. package/extension/factories/planTitle.ts +0 -141
  202. package/extension/substrate/structuredOutput.ts +0 -202
  203. package/extension/waves/auditWave.ts +0 -312
  204. package/extension/waves/harvestWave.ts +0 -399
  205. package/extension/waves/learnWave.ts +0 -155
  206. package/extension/waves/memoryAdapter.ts +0 -139
  207. package/extension/waves/prReviewDynamicWave.ts +0 -777
  208. package/extension/worker/readOnlySession.ts +0 -294
  209. package/extension/worker/worker.ts +0 -899
  210. package/prompts/stages/pr-review-dynamic.md +0 -7
  211. package/shared/contracts-history.md +0 -605
@@ -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
+ }