@blxzer/pactile 0.6.0-beta.2 → 0.6.0-beta.5

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 (704) hide show
  1. package/README.md +93 -84
  2. package/README.zh-CN.md +90 -81
  3. package/dist/bin/compat-warning.d.ts +2 -0
  4. package/dist/bin/compat-warning.d.ts.map +1 -0
  5. package/dist/bin/compat-warning.js +8 -0
  6. package/dist/bin/compat-warning.js.map +1 -0
  7. package/dist/bin/cstl.d.ts +3 -0
  8. package/dist/bin/cstl.d.ts.map +1 -0
  9. package/{bin → dist/bin}/cstl.js +2 -3
  10. package/dist/bin/cstl.js.map +1 -0
  11. package/dist/bin/pactile.d.ts +3 -0
  12. package/dist/bin/pactile.d.ts.map +1 -0
  13. package/dist/bin/pactile.js +4 -0
  14. package/dist/bin/pactile.js.map +1 -0
  15. package/dist/cli/index.d.ts.map +1 -1
  16. package/dist/cli/index.js +77 -17
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/commands/capability.d.ts +3 -0
  19. package/dist/commands/capability.d.ts.map +1 -0
  20. package/dist/commands/capability.js +129 -0
  21. package/dist/commands/capability.js.map +1 -0
  22. package/dist/commands/codex.d.ts.map +1 -1
  23. package/dist/commands/codex.js +54 -6
  24. package/dist/commands/codex.js.map +1 -1
  25. package/dist/commands/context.d.ts +2 -0
  26. package/dist/commands/context.d.ts.map +1 -1
  27. package/dist/commands/context.js +367 -41
  28. package/dist/commands/context.js.map +1 -1
  29. package/dist/commands/detach.d.ts.map +1 -1
  30. package/dist/commands/detach.js +5 -4
  31. package/dist/commands/detach.js.map +1 -1
  32. package/dist/commands/init.d.ts.map +1 -1
  33. package/dist/commands/init.js +615 -259
  34. package/dist/commands/init.js.map +1 -1
  35. package/dist/commands/legacy-task.d.ts +3 -0
  36. package/dist/commands/legacy-task.d.ts.map +1 -0
  37. package/dist/commands/legacy-task.js +295 -0
  38. package/dist/commands/legacy-task.js.map +1 -0
  39. package/dist/commands/pi.d.ts +3 -2
  40. package/dist/commands/pi.d.ts.map +1 -1
  41. package/dist/commands/pi.js +333 -10
  42. package/dist/commands/pi.js.map +1 -1
  43. package/dist/commands/session.d.ts.map +1 -1
  44. package/dist/commands/session.js +148 -24
  45. package/dist/commands/session.js.map +1 -1
  46. package/dist/commands/task-schedule.d.ts +17 -0
  47. package/dist/commands/task-schedule.d.ts.map +1 -0
  48. package/dist/commands/task-schedule.js +395 -0
  49. package/dist/commands/task-schedule.js.map +1 -0
  50. package/dist/commands/task-verify-plan.d.ts +3 -0
  51. package/dist/commands/task-verify-plan.d.ts.map +1 -0
  52. package/dist/commands/task-verify-plan.js +503 -0
  53. package/dist/commands/task-verify-plan.js.map +1 -0
  54. package/dist/commands/task-worktree-close.d.ts +4 -0
  55. package/dist/commands/task-worktree-close.d.ts.map +1 -0
  56. package/dist/commands/task-worktree-close.js +81 -0
  57. package/dist/commands/task-worktree-close.js.map +1 -0
  58. package/dist/commands/task.d.ts +3 -0
  59. package/dist/commands/task.d.ts.map +1 -1
  60. package/dist/commands/task.js +1373 -184
  61. package/dist/commands/task.js.map +1 -1
  62. package/dist/commands/tile-selection.d.ts +3 -0
  63. package/dist/commands/tile-selection.d.ts.map +1 -0
  64. package/dist/commands/tile-selection.js +174 -0
  65. package/dist/commands/tile-selection.js.map +1 -0
  66. package/dist/commands/update.d.ts +1 -1
  67. package/dist/commands/update.d.ts.map +1 -1
  68. package/dist/commands/update.js +80 -55
  69. package/dist/commands/update.js.map +1 -1
  70. package/dist/commands/worktree.d.ts +4 -0
  71. package/dist/commands/worktree.d.ts.map +1 -0
  72. package/dist/commands/worktree.js +198 -0
  73. package/dist/commands/worktree.js.map +1 -0
  74. package/dist/configurators/shared.js +1 -1
  75. package/dist/configurators/shared.js.map +1 -1
  76. package/dist/core/compat/environment.d.ts +0 -1
  77. package/dist/core/compat/environment.d.ts.map +1 -1
  78. package/dist/core/compat/environment.js +1 -9
  79. package/dist/core/compat/environment.js.map +1 -1
  80. package/dist/core/pactile/bounded-capabilities.d.ts +127 -0
  81. package/dist/core/pactile/bounded-capabilities.d.ts.map +1 -0
  82. package/dist/core/pactile/bounded-capabilities.js +188 -0
  83. package/dist/core/pactile/bounded-capabilities.js.map +1 -0
  84. package/dist/core/pactile/index.d.ts +1 -0
  85. package/dist/core/pactile/index.d.ts.map +1 -1
  86. package/dist/core/pactile/index.js +1 -0
  87. package/dist/core/pactile/index.js.map +1 -1
  88. package/dist/core/task/index.d.ts +4 -2
  89. package/dist/core/task/index.d.ts.map +1 -1
  90. package/dist/core/task/index.js +2 -1
  91. package/dist/core/task/index.js.map +1 -1
  92. package/dist/core/task/kernel-cli.d.ts +14 -1
  93. package/dist/core/task/kernel-cli.d.ts.map +1 -1
  94. package/dist/core/task/kernel-cli.js +128 -0
  95. package/dist/core/task/kernel-cli.js.map +1 -1
  96. package/dist/core/task/kernel-contract.d.ts +6 -3
  97. package/dist/core/task/kernel-contract.d.ts.map +1 -1
  98. package/dist/core/task/kernel-contract.js +71 -23
  99. package/dist/core/task/kernel-contract.js.map +1 -1
  100. package/dist/core/task/kernel-store.d.ts +6 -0
  101. package/dist/core/task/kernel-store.d.ts.map +1 -1
  102. package/dist/core/task/kernel-store.js +54 -2
  103. package/dist/core/task/kernel-store.js.map +1 -1
  104. package/dist/core/task/legacy-task-migration-reader.d.ts +137 -0
  105. package/dist/core/task/legacy-task-migration-reader.d.ts.map +1 -0
  106. package/dist/core/task/legacy-task-migration-reader.js +512 -0
  107. package/dist/core/task/legacy-task-migration-reader.js.map +1 -0
  108. package/dist/core/task/legacy-task-migration.d.ts +105 -0
  109. package/dist/core/task/legacy-task-migration.d.ts.map +1 -0
  110. package/dist/core/task/legacy-task-migration.js +562 -0
  111. package/dist/core/task/legacy-task-migration.js.map +1 -0
  112. package/dist/core/task/legacy-task-overlay-durable-io.d.ts +18 -0
  113. package/dist/core/task/legacy-task-overlay-durable-io.d.ts.map +1 -0
  114. package/dist/core/task/legacy-task-overlay-durable-io.js +66 -0
  115. package/dist/core/task/legacy-task-overlay-durable-io.js.map +1 -0
  116. package/dist/core/task/legacy-task-reconciliation-reader.d.ts +26 -0
  117. package/dist/core/task/legacy-task-reconciliation-reader.d.ts.map +1 -0
  118. package/dist/core/task/legacy-task-reconciliation-reader.js +324 -0
  119. package/dist/core/task/legacy-task-reconciliation-reader.js.map +1 -0
  120. package/dist/core/task/legacy-task-v2-import.d.ts +67 -0
  121. package/dist/core/task/legacy-task-v2-import.d.ts.map +1 -0
  122. package/dist/core/task/legacy-task-v2-import.js +1046 -0
  123. package/dist/core/task/legacy-task-v2-import.js.map +1 -0
  124. package/dist/core/task/project-file-observer.d.ts +46 -0
  125. package/dist/core/task/project-file-observer.d.ts.map +1 -0
  126. package/dist/core/task/project-file-observer.js +618 -0
  127. package/dist/core/task/project-file-observer.js.map +1 -0
  128. package/dist/core/task/start-authority.d.ts +14 -0
  129. package/dist/core/task/start-authority.d.ts.map +1 -0
  130. package/dist/core/task/start-authority.js +146 -0
  131. package/dist/core/task/start-authority.js.map +1 -0
  132. package/dist/core/task/strategy.d.ts +24 -0
  133. package/dist/core/task/strategy.d.ts.map +1 -0
  134. package/dist/core/task/strategy.js +136 -0
  135. package/dist/core/task/strategy.js.map +1 -0
  136. package/dist/core/task/task-candidate-observer.d.ts +111 -0
  137. package/dist/core/task/task-candidate-observer.d.ts.map +1 -0
  138. package/dist/core/task/task-candidate-observer.js +762 -0
  139. package/dist/core/task/task-candidate-observer.js.map +1 -0
  140. package/dist/core/task/task-kernel-close.d.ts +5 -0
  141. package/dist/core/task/task-kernel-close.d.ts.map +1 -0
  142. package/dist/core/task/task-kernel-close.js +367 -0
  143. package/dist/core/task/task-kernel-close.js.map +1 -0
  144. package/dist/core/task/task-kernel-dependencies.d.ts +3 -0
  145. package/dist/core/task/task-kernel-dependencies.d.ts.map +1 -0
  146. package/dist/core/task/task-kernel-dependencies.js +24 -0
  147. package/dist/core/task/task-kernel-dependencies.js.map +1 -0
  148. package/dist/core/task/task-kernel-host.d.ts +5 -0
  149. package/dist/core/task/task-kernel-host.d.ts.map +1 -0
  150. package/dist/core/task/task-kernel-host.js +136 -0
  151. package/dist/core/task/task-kernel-host.js.map +1 -0
  152. package/dist/core/task/task-kernel-paths.d.ts +19 -0
  153. package/dist/core/task/task-kernel-paths.d.ts.map +1 -0
  154. package/dist/core/task/task-kernel-paths.js +237 -0
  155. package/dist/core/task/task-kernel-paths.js.map +1 -0
  156. package/dist/core/task/task-kernel-reviews.d.ts +3 -0
  157. package/dist/core/task/task-kernel-reviews.d.ts.map +1 -0
  158. package/dist/core/task/task-kernel-reviews.js +100 -0
  159. package/dist/core/task/task-kernel-reviews.js.map +1 -0
  160. package/dist/core/task/task-kernel-runs.d.ts +5 -0
  161. package/dist/core/task/task-kernel-runs.d.ts.map +1 -0
  162. package/dist/core/task/task-kernel-runs.js +196 -0
  163. package/dist/core/task/task-kernel-runs.js.map +1 -0
  164. package/dist/core/task/task-kernel-schema.d.ts +29 -0
  165. package/dist/core/task/task-kernel-schema.d.ts.map +1 -0
  166. package/dist/core/task/task-kernel-schema.js +1169 -0
  167. package/dist/core/task/task-kernel-schema.js.map +1 -0
  168. package/dist/core/task/task-kernel-store-v2.d.ts +33 -0
  169. package/dist/core/task/task-kernel-store-v2.d.ts.map +1 -0
  170. package/dist/core/task/task-kernel-store-v2.js +574 -0
  171. package/dist/core/task/task-kernel-store-v2.js.map +1 -0
  172. package/dist/core/task/task-kernel-types.d.ts +585 -0
  173. package/dist/core/task/task-kernel-types.d.ts.map +1 -0
  174. package/dist/core/task/task-kernel-types.js +31 -0
  175. package/dist/core/task/task-kernel-types.js.map +1 -0
  176. package/dist/core/task/task-kernel-workspaces.d.ts +10 -0
  177. package/dist/core/task/task-kernel-workspaces.d.ts.map +1 -0
  178. package/dist/core/task/task-kernel-workspaces.js +250 -0
  179. package/dist/core/task/task-kernel-workspaces.js.map +1 -0
  180. package/dist/core/task/task-kernel-write-set.d.ts +3 -0
  181. package/dist/core/task/task-kernel-write-set.d.ts.map +1 -0
  182. package/dist/core/task/task-kernel-write-set.js +12 -0
  183. package/dist/core/task/task-kernel-write-set.js.map +1 -0
  184. package/dist/core/task/task-kernel.d.ts +19 -0
  185. package/dist/core/task/task-kernel.d.ts.map +1 -0
  186. package/dist/core/task/task-kernel.js +17 -0
  187. package/dist/core/task/task-kernel.js.map +1 -0
  188. package/dist/core/task/task-pull-request-observer.d.ts +25 -0
  189. package/dist/core/task/task-pull-request-observer.d.ts.map +1 -0
  190. package/dist/core/task/task-pull-request-observer.js +187 -0
  191. package/dist/core/task/task-pull-request-observer.js.map +1 -0
  192. package/dist/core/task/task-review-evidence.d.ts +27 -0
  193. package/dist/core/task/task-review-evidence.d.ts.map +1 -0
  194. package/dist/core/task/task-review-evidence.js +383 -0
  195. package/dist/core/task/task-review-evidence.js.map +1 -0
  196. package/dist/migrations/index.d.ts +1 -1
  197. package/dist/migrations/index.d.ts.map +1 -1
  198. package/dist/migrations/index.js +5 -3
  199. package/dist/migrations/index.js.map +1 -1
  200. package/dist/migrations/manifests/0.6.0-beta.3.json +9 -0
  201. package/dist/migrations/manifests/0.6.0-beta.4.json +9 -0
  202. package/dist/migrations/manifests/0.6.0-beta.5.json +9 -0
  203. package/dist/pactile/artifacts/documents.d.ts +72 -0
  204. package/dist/pactile/artifacts/documents.d.ts.map +1 -0
  205. package/dist/pactile/artifacts/documents.js +406 -0
  206. package/dist/pactile/artifacts/documents.js.map +1 -0
  207. package/dist/pactile/artifacts/index.d.ts +6 -0
  208. package/dist/pactile/artifacts/index.d.ts.map +1 -0
  209. package/dist/pactile/artifacts/index.js +6 -0
  210. package/dist/pactile/artifacts/index.js.map +1 -0
  211. package/dist/pactile/artifacts/projection.d.ts +50 -0
  212. package/dist/pactile/artifacts/projection.d.ts.map +1 -0
  213. package/dist/pactile/artifacts/projection.js +139 -0
  214. package/dist/pactile/artifacts/projection.js.map +1 -0
  215. package/dist/pactile/artifacts/reader.d.ts +20 -0
  216. package/dist/pactile/artifacts/reader.d.ts.map +1 -0
  217. package/dist/pactile/artifacts/reader.js +559 -0
  218. package/dist/pactile/artifacts/reader.js.map +1 -0
  219. package/dist/pactile/artifacts/schema.d.ts +4 -0
  220. package/dist/pactile/artifacts/schema.d.ts.map +1 -0
  221. package/dist/pactile/artifacts/schema.js +217 -0
  222. package/dist/pactile/artifacts/schema.js.map +1 -0
  223. package/dist/pactile/artifacts/types.d.ts +66 -0
  224. package/dist/pactile/artifacts/types.d.ts.map +1 -0
  225. package/dist/pactile/artifacts/types.js +45 -0
  226. package/dist/pactile/artifacts/types.js.map +1 -0
  227. package/dist/pactile/capabilities/claim.d.ts +3 -0
  228. package/dist/pactile/capabilities/claim.d.ts.map +1 -0
  229. package/dist/pactile/capabilities/claim.js +97 -0
  230. package/dist/pactile/capabilities/claim.js.map +1 -0
  231. package/dist/pactile/capabilities/command.d.ts +6 -0
  232. package/dist/pactile/capabilities/command.d.ts.map +1 -0
  233. package/dist/pactile/capabilities/command.js +253 -0
  234. package/dist/pactile/capabilities/command.js.map +1 -0
  235. package/dist/pactile/capabilities/discover.d.ts +6 -0
  236. package/dist/pactile/capabilities/discover.d.ts.map +1 -0
  237. package/dist/pactile/capabilities/discover.js +48 -0
  238. package/dist/pactile/capabilities/discover.js.map +1 -0
  239. package/dist/pactile/capabilities/node.d.ts +15 -0
  240. package/dist/pactile/capabilities/node.d.ts.map +1 -0
  241. package/dist/pactile/capabilities/node.js +292 -0
  242. package/dist/pactile/capabilities/node.js.map +1 -0
  243. package/dist/pactile/capabilities/read.d.ts +6 -0
  244. package/dist/pactile/capabilities/read.d.ts.map +1 -0
  245. package/dist/pactile/capabilities/read.js +100 -0
  246. package/dist/pactile/capabilities/read.js.map +1 -0
  247. package/dist/pactile/capabilities/receipts.d.ts +17 -0
  248. package/dist/pactile/capabilities/receipts.d.ts.map +1 -0
  249. package/dist/pactile/capabilities/receipts.js +90 -0
  250. package/dist/pactile/capabilities/receipts.js.map +1 -0
  251. package/dist/pactile/capabilities/search.d.ts +6 -0
  252. package/dist/pactile/capabilities/search.d.ts.map +1 -0
  253. package/dist/pactile/capabilities/search.js +181 -0
  254. package/dist/pactile/capabilities/search.js.map +1 -0
  255. package/dist/pactile/capabilities/shared.d.ts +29 -0
  256. package/dist/pactile/capabilities/shared.d.ts.map +1 -0
  257. package/dist/pactile/capabilities/shared.js +134 -0
  258. package/dist/pactile/capabilities/shared.js.map +1 -0
  259. package/dist/pactile/capabilities/workspace.d.ts +19 -0
  260. package/dist/pactile/capabilities/workspace.d.ts.map +1 -0
  261. package/dist/pactile/capabilities/workspace.js +273 -0
  262. package/dist/pactile/capabilities/workspace.js.map +1 -0
  263. package/dist/pactile/codex/bridge.d.ts +105 -2
  264. package/dist/pactile/codex/bridge.d.ts.map +1 -1
  265. package/dist/pactile/codex/bridge.js +1266 -92
  266. package/dist/pactile/codex/bridge.js.map +1 -1
  267. package/dist/pactile/codex/dispatch-stop-proof.d.ts +43 -0
  268. package/dist/pactile/codex/dispatch-stop-proof.d.ts.map +1 -0
  269. package/dist/pactile/codex/dispatch-stop-proof.js +177 -0
  270. package/dist/pactile/codex/dispatch-stop-proof.js.map +1 -0
  271. package/dist/pactile/codex/host-stop.d.ts +47 -0
  272. package/dist/pactile/codex/host-stop.d.ts.map +1 -0
  273. package/dist/pactile/codex/host-stop.js +344 -0
  274. package/dist/pactile/codex/host-stop.js.map +1 -0
  275. package/dist/pactile/coordination/index.d.ts +4 -0
  276. package/dist/pactile/coordination/index.d.ts.map +1 -0
  277. package/dist/pactile/coordination/index.js +4 -0
  278. package/dist/pactile/coordination/index.js.map +1 -0
  279. package/dist/pactile/coordination/journal.d.ts +10 -0
  280. package/dist/pactile/coordination/journal.d.ts.map +1 -0
  281. package/dist/pactile/coordination/journal.js +255 -0
  282. package/dist/pactile/coordination/journal.js.map +1 -0
  283. package/dist/pactile/coordination/kernel-resume.d.ts +8 -0
  284. package/dist/pactile/coordination/kernel-resume.d.ts.map +1 -0
  285. package/dist/pactile/coordination/kernel-resume.js +87 -0
  286. package/dist/pactile/coordination/kernel-resume.js.map +1 -0
  287. package/dist/pactile/coordination/model.d.ts +553 -0
  288. package/dist/pactile/coordination/model.d.ts.map +1 -0
  289. package/dist/pactile/coordination/model.js +239 -0
  290. package/dist/pactile/coordination/model.js.map +1 -0
  291. package/dist/pactile/coordination/state.d.ts +46 -0
  292. package/dist/pactile/coordination/state.d.ts.map +1 -0
  293. package/dist/pactile/coordination/state.js +301 -0
  294. package/dist/pactile/coordination/state.js.map +1 -0
  295. package/dist/pactile/coordination/store.d.ts +94 -0
  296. package/dist/pactile/coordination/store.d.ts.map +1 -0
  297. package/dist/pactile/coordination/store.js +396 -0
  298. package/dist/pactile/coordination/store.js.map +1 -0
  299. package/dist/pactile/index.d.ts +7 -1
  300. package/dist/pactile/index.d.ts.map +1 -1
  301. package/dist/pactile/index.js +7 -1
  302. package/dist/pactile/index.js.map +1 -1
  303. package/dist/pactile/jev/contracts.d.ts +104 -0
  304. package/dist/pactile/jev/contracts.d.ts.map +1 -0
  305. package/dist/pactile/jev/contracts.js +53 -0
  306. package/dist/pactile/jev/contracts.js.map +1 -0
  307. package/dist/pactile/jev/decision.d.ts +58 -0
  308. package/dist/pactile/jev/decision.d.ts.map +1 -0
  309. package/dist/pactile/jev/decision.js +149 -0
  310. package/dist/pactile/jev/decision.js.map +1 -0
  311. package/dist/pactile/jev/http.d.ts +25 -0
  312. package/dist/pactile/jev/http.d.ts.map +1 -0
  313. package/dist/pactile/jev/http.js +234 -0
  314. package/dist/pactile/jev/http.js.map +1 -0
  315. package/dist/pactile/jev/index.d.ts +8 -0
  316. package/dist/pactile/jev/index.d.ts.map +1 -0
  317. package/dist/pactile/jev/index.js +4 -0
  318. package/dist/pactile/jev/index.js.map +1 -0
  319. package/dist/pactile/jev/outbound.d.ts +15 -0
  320. package/dist/pactile/jev/outbound.d.ts.map +1 -0
  321. package/dist/pactile/jev/outbound.js +264 -0
  322. package/dist/pactile/jev/outbound.js.map +1 -0
  323. package/dist/pactile/jev/project-policy.d.ts +10 -0
  324. package/dist/pactile/jev/project-policy.d.ts.map +1 -0
  325. package/dist/pactile/jev/project-policy.js +53 -0
  326. package/dist/pactile/jev/project-policy.js.map +1 -0
  327. package/dist/pactile/jev/response.d.ts +17 -0
  328. package/dist/pactile/jev/response.d.ts.map +1 -0
  329. package/dist/pactile/jev/response.js +280 -0
  330. package/dist/pactile/jev/response.js.map +1 -0
  331. package/dist/pactile/jev/scheduler-advice.d.ts +92 -0
  332. package/dist/pactile/jev/scheduler-advice.d.ts.map +1 -0
  333. package/dist/pactile/jev/scheduler-advice.js +323 -0
  334. package/dist/pactile/jev/scheduler-advice.js.map +1 -0
  335. package/dist/pactile/jev/transport.d.ts +6 -0
  336. package/dist/pactile/jev/transport.d.ts.map +1 -0
  337. package/dist/pactile/jev/transport.js +87 -0
  338. package/dist/pactile/jev/transport.js.map +1 -0
  339. package/dist/pactile/lifecycle/deferred-live.d.ts +17 -0
  340. package/dist/pactile/lifecycle/deferred-live.d.ts.map +1 -0
  341. package/dist/pactile/lifecycle/deferred-live.js +173 -0
  342. package/dist/pactile/lifecycle/deferred-live.js.map +1 -0
  343. package/dist/pactile/lifecycle/legacy-import.d.ts +1 -1
  344. package/dist/pactile/lifecycle/legacy-import.js +3 -3
  345. package/dist/pactile/lifecycle/legacy-import.js.map +1 -1
  346. package/dist/pactile/lifecycle/project-files.d.ts.map +1 -1
  347. package/dist/pactile/lifecycle/project-files.js +1 -0
  348. package/dist/pactile/lifecycle/project-files.js.map +1 -1
  349. package/dist/pactile/migration/legacy-task-batch-generation.d.ts +23 -0
  350. package/dist/pactile/migration/legacy-task-batch-generation.d.ts.map +1 -0
  351. package/dist/pactile/migration/legacy-task-batch-generation.js +102 -0
  352. package/dist/pactile/migration/legacy-task-batch-generation.js.map +1 -0
  353. package/dist/pactile/migration/legacy-task-batch-io.d.ts +9 -0
  354. package/dist/pactile/migration/legacy-task-batch-io.d.ts.map +1 -0
  355. package/dist/pactile/migration/legacy-task-batch-io.js +208 -0
  356. package/dist/pactile/migration/legacy-task-batch-io.js.map +1 -0
  357. package/dist/pactile/migration/legacy-task-batch-journal.d.ts +6 -0
  358. package/dist/pactile/migration/legacy-task-batch-journal.d.ts.map +1 -0
  359. package/dist/pactile/migration/legacy-task-batch-journal.js +121 -0
  360. package/dist/pactile/migration/legacy-task-batch-journal.js.map +1 -0
  361. package/dist/pactile/migration/legacy-task-batch-orchestrator.d.ts +18 -0
  362. package/dist/pactile/migration/legacy-task-batch-orchestrator.d.ts.map +1 -0
  363. package/dist/pactile/migration/legacy-task-batch-orchestrator.js +634 -0
  364. package/dist/pactile/migration/legacy-task-batch-orchestrator.js.map +1 -0
  365. package/dist/pactile/migration/legacy-task-batch-source.d.ts +8 -0
  366. package/dist/pactile/migration/legacy-task-batch-source.d.ts.map +1 -0
  367. package/dist/pactile/migration/legacy-task-batch-source.js +158 -0
  368. package/dist/pactile/migration/legacy-task-batch-source.js.map +1 -0
  369. package/dist/pactile/migration/legacy-task-batch-types.d.ts +127 -0
  370. package/dist/pactile/migration/legacy-task-batch-types.d.ts.map +1 -0
  371. package/dist/pactile/migration/legacy-task-batch-types.js +127 -0
  372. package/dist/pactile/migration/legacy-task-batch-types.js.map +1 -0
  373. package/dist/pactile/migration/legacy-task-batch.d.ts +3 -0
  374. package/dist/pactile/migration/legacy-task-batch.d.ts.map +1 -0
  375. package/dist/pactile/migration/legacy-task-batch.js +2 -0
  376. package/dist/pactile/migration/legacy-task-batch.js.map +1 -0
  377. package/dist/pactile/migration/legacy-task-held-source-reader.d.ts +27 -0
  378. package/dist/pactile/migration/legacy-task-held-source-reader.d.ts.map +1 -0
  379. package/dist/pactile/migration/legacy-task-held-source-reader.js +261 -0
  380. package/dist/pactile/migration/legacy-task-held-source-reader.js.map +1 -0
  381. package/dist/pactile/migration/legacy-task-reconciliation.d.ts +46 -0
  382. package/dist/pactile/migration/legacy-task-reconciliation.d.ts.map +1 -0
  383. package/dist/pactile/migration/legacy-task-reconciliation.js +589 -0
  384. package/dist/pactile/migration/legacy-task-reconciliation.js.map +1 -0
  385. package/dist/pactile/migration/legacy-task-update.d.ts +19 -0
  386. package/dist/pactile/migration/legacy-task-update.d.ts.map +1 -0
  387. package/dist/pactile/migration/legacy-task-update.js +164 -0
  388. package/dist/pactile/migration/legacy-task-update.js.map +1 -0
  389. package/dist/pactile/parallel/batch.d.ts +21 -2
  390. package/dist/pactile/parallel/batch.d.ts.map +1 -1
  391. package/dist/pactile/parallel/batch.js +271 -50
  392. package/dist/pactile/parallel/batch.js.map +1 -1
  393. package/dist/pactile/parallel/policy.d.ts +1 -1
  394. package/dist/pactile/parallel/policy.d.ts.map +1 -1
  395. package/dist/pactile/parallel/policy.js +130 -102
  396. package/dist/pactile/parallel/policy.js.map +1 -1
  397. package/dist/pactile/pi/bridge.d.ts +139 -2
  398. package/dist/pactile/pi/bridge.d.ts.map +1 -1
  399. package/dist/pactile/pi/bridge.js +1317 -106
  400. package/dist/pactile/pi/bridge.js.map +1 -1
  401. package/dist/pactile/pi/rpc.d.ts +23 -4
  402. package/dist/pactile/pi/rpc.d.ts.map +1 -1
  403. package/dist/pactile/pi/rpc.js +243 -42
  404. package/dist/pactile/pi/rpc.js.map +1 -1
  405. package/dist/pactile/pi/v2-dispatch.d.ts +113 -0
  406. package/dist/pactile/pi/v2-dispatch.d.ts.map +1 -0
  407. package/dist/pactile/pi/v2-dispatch.js +919 -0
  408. package/dist/pactile/pi/v2-dispatch.js.map +1 -0
  409. package/dist/pactile/projection/planner.js +1 -1
  410. package/dist/pactile/projection/planner.js.map +1 -1
  411. package/dist/pactile/registry.d.ts +63 -1
  412. package/dist/pactile/registry.d.ts.map +1 -1
  413. package/dist/pactile/registry.js +633 -4
  414. package/dist/pactile/registry.js.map +1 -1
  415. package/dist/pactile/retrieval/index.d.ts +1 -0
  416. package/dist/pactile/retrieval/index.d.ts.map +1 -1
  417. package/dist/pactile/retrieval/index.js +1 -0
  418. package/dist/pactile/retrieval/index.js.map +1 -1
  419. package/dist/pactile/retrieval/jev-planning.d.ts +28 -0
  420. package/dist/pactile/retrieval/jev-planning.d.ts.map +1 -0
  421. package/dist/pactile/retrieval/jev-planning.js +96 -0
  422. package/dist/pactile/retrieval/jev-planning.js.map +1 -0
  423. package/dist/pactile/review/contract.d.ts +232 -0
  424. package/dist/pactile/review/contract.d.ts.map +1 -0
  425. package/dist/pactile/review/contract.js +695 -0
  426. package/dist/pactile/review/contract.js.map +1 -0
  427. package/dist/pactile/review/escalation-artifacts.d.ts +41 -0
  428. package/dist/pactile/review/escalation-artifacts.d.ts.map +1 -0
  429. package/dist/pactile/review/escalation-artifacts.js +415 -0
  430. package/dist/pactile/review/escalation-artifacts.js.map +1 -0
  431. package/dist/pactile/review/escalation-contract.d.ts +115 -0
  432. package/dist/pactile/review/escalation-contract.d.ts.map +1 -0
  433. package/dist/pactile/review/escalation-contract.js +151 -0
  434. package/dist/pactile/review/escalation-contract.js.map +1 -0
  435. package/dist/pactile/review/escalation-finalize.d.ts +14 -0
  436. package/dist/pactile/review/escalation-finalize.d.ts.map +1 -0
  437. package/dist/pactile/review/escalation-finalize.js +319 -0
  438. package/dist/pactile/review/escalation-finalize.js.map +1 -0
  439. package/dist/pactile/review/escalation-reply.d.ts +10 -0
  440. package/dist/pactile/review/escalation-reply.d.ts.map +1 -0
  441. package/dist/pactile/review/escalation-reply.js +61 -0
  442. package/dist/pactile/review/escalation-reply.js.map +1 -0
  443. package/dist/pactile/review/escalation-transport.d.ts +32 -0
  444. package/dist/pactile/review/escalation-transport.d.ts.map +1 -0
  445. package/dist/pactile/review/escalation-transport.js +216 -0
  446. package/dist/pactile/review/escalation-transport.js.map +1 -0
  447. package/dist/pactile/review/escalation.d.ts +7 -0
  448. package/dist/pactile/review/escalation.d.ts.map +1 -0
  449. package/dist/pactile/review/escalation.js +6 -0
  450. package/dist/pactile/review/escalation.js.map +1 -0
  451. package/dist/pactile/review/evidence.d.ts +25 -0
  452. package/dist/pactile/review/evidence.d.ts.map +1 -0
  453. package/dist/pactile/review/evidence.js +58 -0
  454. package/dist/pactile/review/evidence.js.map +1 -0
  455. package/dist/pactile/review/jev-escalation-advice.d.ts +77 -0
  456. package/dist/pactile/review/jev-escalation-advice.d.ts.map +1 -0
  457. package/dist/pactile/review/jev-escalation-advice.js +358 -0
  458. package/dist/pactile/review/jev-escalation-advice.js.map +1 -0
  459. package/dist/pactile/scheduler/index.d.ts +6 -0
  460. package/dist/pactile/scheduler/index.d.ts.map +1 -0
  461. package/dist/pactile/scheduler/index.js +5 -0
  462. package/dist/pactile/scheduler/index.js.map +1 -0
  463. package/dist/pactile/scheduler/project-lease-store.d.ts +35 -0
  464. package/dist/pactile/scheduler/project-lease-store.d.ts.map +1 -0
  465. package/dist/pactile/scheduler/project-lease-store.js +189 -0
  466. package/dist/pactile/scheduler/project-lease-store.js.map +1 -0
  467. package/dist/pactile/scheduler/scheduler.d.ts +91 -0
  468. package/dist/pactile/scheduler/scheduler.d.ts.map +1 -0
  469. package/dist/pactile/scheduler/scheduler.js +589 -0
  470. package/dist/pactile/scheduler/scheduler.js.map +1 -0
  471. package/dist/pactile/scheduler/task-kernel-admission.d.ts +173 -0
  472. package/dist/pactile/scheduler/task-kernel-admission.d.ts.map +1 -0
  473. package/dist/pactile/scheduler/task-kernel-admission.js +1560 -0
  474. package/dist/pactile/scheduler/task-kernel-admission.js.map +1 -0
  475. package/dist/pactile/scheduler/task-kernel-wave-dispatch.d.ts +184 -0
  476. package/dist/pactile/scheduler/task-kernel-wave-dispatch.d.ts.map +1 -0
  477. package/dist/pactile/scheduler/task-kernel-wave-dispatch.js +952 -0
  478. package/dist/pactile/scheduler/task-kernel-wave-dispatch.js.map +1 -0
  479. package/dist/pactile/scheduler/task-map-scheduler.d.ts +116 -0
  480. package/dist/pactile/scheduler/task-map-scheduler.d.ts.map +1 -0
  481. package/dist/pactile/scheduler/task-map-scheduler.js +1448 -0
  482. package/dist/pactile/scheduler/task-map-scheduler.js.map +1 -0
  483. package/dist/pactile/scheduler/task-run-dispatch-state.d.ts +7 -0
  484. package/dist/pactile/scheduler/task-run-dispatch-state.d.ts.map +1 -0
  485. package/dist/pactile/scheduler/task-run-dispatch-state.js +69 -0
  486. package/dist/pactile/scheduler/task-run-dispatch-state.js.map +1 -0
  487. package/dist/pactile/task/authorization.d.ts +3 -0
  488. package/dist/pactile/task/authorization.d.ts.map +1 -0
  489. package/dist/pactile/task/authorization.js +43 -0
  490. package/dist/pactile/task/authorization.js.map +1 -0
  491. package/dist/pactile/task/creation.d.ts +22 -0
  492. package/dist/pactile/task/creation.d.ts.map +1 -0
  493. package/dist/pactile/task/creation.js +95 -0
  494. package/dist/pactile/task/creation.js.map +1 -0
  495. package/dist/pactile/task/guards.d.ts +1 -4
  496. package/dist/pactile/task/guards.d.ts.map +1 -1
  497. package/dist/pactile/task/guards.js +5 -57
  498. package/dist/pactile/task/guards.js.map +1 -1
  499. package/dist/pactile/task/session-jev-receipt.d.ts +58 -0
  500. package/dist/pactile/task/session-jev-receipt.d.ts.map +1 -0
  501. package/dist/pactile/task/session-jev-receipt.js +375 -0
  502. package/dist/pactile/task/session-jev-receipt.js.map +1 -0
  503. package/dist/pactile/task/session-jev.d.ts +7 -0
  504. package/dist/pactile/task/session-jev.d.ts.map +1 -0
  505. package/dist/pactile/task/session-jev.js +217 -0
  506. package/dist/pactile/task/session-jev.js.map +1 -0
  507. package/dist/pactile/task/session-pack.d.ts.map +1 -1
  508. package/dist/pactile/task/session-pack.js +155 -16
  509. package/dist/pactile/task/session-pack.js.map +1 -1
  510. package/dist/pactile/task/session-retrieval-jev-receipt.d.ts +49 -0
  511. package/dist/pactile/task/session-retrieval-jev-receipt.d.ts.map +1 -0
  512. package/dist/pactile/task/session-retrieval-jev-receipt.js +97 -0
  513. package/dist/pactile/task/session-retrieval-jev-receipt.js.map +1 -0
  514. package/dist/pactile/task/session-retrieval-jev.d.ts +8 -0
  515. package/dist/pactile/task/session-retrieval-jev.d.ts.map +1 -0
  516. package/dist/pactile/task/session-retrieval-jev.js +352 -0
  517. package/dist/pactile/task/session-retrieval-jev.js.map +1 -0
  518. package/dist/pactile/task/strategy.d.ts +1 -23
  519. package/dist/pactile/task/strategy.d.ts.map +1 -1
  520. package/dist/pactile/task/strategy.js +2 -135
  521. package/dist/pactile/task/strategy.js.map +1 -1
  522. package/dist/pactile/tiles/jev-selection.d.ts +44 -0
  523. package/dist/pactile/tiles/jev-selection.d.ts.map +1 -0
  524. package/dist/pactile/tiles/jev-selection.js +210 -0
  525. package/dist/pactile/tiles/jev-selection.js.map +1 -0
  526. package/dist/pactile/tiles/safe-yaml.d.ts +5 -1
  527. package/dist/pactile/tiles/safe-yaml.d.ts.map +1 -1
  528. package/dist/pactile/tiles/safe-yaml.js +8 -8
  529. package/dist/pactile/tiles/safe-yaml.js.map +1 -1
  530. package/dist/pactile/tiles/selection-receipts.d.ts +71 -0
  531. package/dist/pactile/tiles/selection-receipts.d.ts.map +1 -0
  532. package/dist/pactile/tiles/selection-receipts.js +319 -0
  533. package/dist/pactile/tiles/selection-receipts.js.map +1 -0
  534. package/dist/pactile/tiles/selection.d.ts +185 -0
  535. package/dist/pactile/tiles/selection.d.ts.map +1 -0
  536. package/dist/pactile/tiles/selection.js +985 -0
  537. package/dist/pactile/tiles/selection.js.map +1 -0
  538. package/dist/pactile/verification/git-observer.d.ts +3 -0
  539. package/dist/pactile/verification/git-observer.d.ts.map +1 -0
  540. package/dist/pactile/verification/git-observer.js +3 -0
  541. package/dist/pactile/verification/git-observer.js.map +1 -0
  542. package/dist/pactile/verification/index.d.ts +11 -0
  543. package/dist/pactile/verification/index.d.ts.map +1 -0
  544. package/dist/pactile/verification/index.js +6 -0
  545. package/dist/pactile/verification/index.js.map +1 -0
  546. package/dist/pactile/verification/jev-advice.d.ts +78 -0
  547. package/dist/pactile/verification/jev-advice.d.ts.map +1 -0
  548. package/dist/pactile/verification/jev-advice.js +397 -0
  549. package/dist/pactile/verification/jev-advice.js.map +1 -0
  550. package/dist/pactile/verification/planner.d.ts +15 -0
  551. package/dist/pactile/verification/planner.d.ts.map +1 -0
  552. package/dist/pactile/verification/planner.js +412 -0
  553. package/dist/pactile/verification/planner.js.map +1 -0
  554. package/dist/pactile/verification/receipt.d.ts +101 -0
  555. package/dist/pactile/verification/receipt.d.ts.map +1 -0
  556. package/dist/pactile/verification/receipt.js +400 -0
  557. package/dist/pactile/verification/receipt.js.map +1 -0
  558. package/dist/pactile/verification/types.d.ts +72 -0
  559. package/dist/pactile/verification/types.d.ts.map +1 -0
  560. package/dist/pactile/verification/types.js +21 -0
  561. package/dist/pactile/verification/types.js.map +1 -0
  562. package/dist/pactile/worktree/git-probe.d.ts +32 -0
  563. package/dist/pactile/worktree/git-probe.d.ts.map +1 -0
  564. package/dist/pactile/worktree/git-probe.js +336 -0
  565. package/dist/pactile/worktree/git-probe.js.map +1 -0
  566. package/dist/pactile/worktree/git-removal.d.ts +3 -0
  567. package/dist/pactile/worktree/git-removal.d.ts.map +1 -0
  568. package/dist/pactile/worktree/git-removal.js +11 -0
  569. package/dist/pactile/worktree/git-removal.js.map +1 -0
  570. package/dist/pactile/worktree/index.d.ts +2 -0
  571. package/dist/pactile/worktree/index.d.ts.map +1 -0
  572. package/dist/pactile/worktree/index.js +2 -0
  573. package/dist/pactile/worktree/index.js.map +1 -0
  574. package/dist/pactile/worktree/integration-evidence.d.ts +80 -0
  575. package/dist/pactile/worktree/integration-evidence.d.ts.map +1 -0
  576. package/dist/pactile/worktree/integration-evidence.js +166 -0
  577. package/dist/pactile/worktree/integration-evidence.js.map +1 -0
  578. package/dist/pactile/worktree/manager-core.d.ts +50 -0
  579. package/dist/pactile/worktree/manager-core.d.ts.map +1 -0
  580. package/dist/pactile/worktree/manager-core.js +359 -0
  581. package/dist/pactile/worktree/manager-core.js.map +1 -0
  582. package/dist/pactile/worktree/manager-provenance.d.ts +32 -0
  583. package/dist/pactile/worktree/manager-provenance.d.ts.map +1 -0
  584. package/dist/pactile/worktree/manager-provenance.js +409 -0
  585. package/dist/pactile/worktree/manager-provenance.js.map +1 -0
  586. package/dist/pactile/worktree/manager-types.d.ts +84 -0
  587. package/dist/pactile/worktree/manager-types.d.ts.map +1 -0
  588. package/dist/pactile/worktree/manager-types.js +11 -0
  589. package/dist/pactile/worktree/manager-types.js.map +1 -0
  590. package/dist/pactile/worktree/manager.d.ts +10 -0
  591. package/dist/pactile/worktree/manager.d.ts.map +1 -0
  592. package/dist/pactile/worktree/manager.js +6 -0
  593. package/dist/pactile/worktree/manager.js.map +1 -0
  594. package/dist/pactile/worktree/run-workspace-cleanup.d.ts +10 -0
  595. package/dist/pactile/worktree/run-workspace-cleanup.d.ts.map +1 -0
  596. package/dist/pactile/worktree/run-workspace-cleanup.js +695 -0
  597. package/dist/pactile/worktree/run-workspace-cleanup.js.map +1 -0
  598. package/dist/pactile/worktree/run-workspace-lifecycle.d.ts +65 -0
  599. package/dist/pactile/worktree/run-workspace-lifecycle.d.ts.map +1 -0
  600. package/dist/pactile/worktree/run-workspace-lifecycle.js +276 -0
  601. package/dist/pactile/worktree/run-workspace-lifecycle.js.map +1 -0
  602. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/change-hooks.md +1 -1
  603. package/dist/templates/common/bundled-skills/pactile-meta/references/local-architecture/generated-files.md +1 -1
  604. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/hooks-and-settings.md +1 -1
  605. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/overview.md +1 -1
  606. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/platform-map.md +1 -1
  607. package/dist/templates/common/bundled-skills/smart-search-cli/SKILL.md +2 -0
  608. package/dist/templates/common/skills/brainstorm.md +19 -13
  609. package/dist/templates/markdown/agents.md +2 -2
  610. package/dist/templates/markdown/framework/execution-strategy.md.txt +1 -1
  611. package/dist/templates/markdown/framework/index.md.txt +1 -1
  612. package/dist/templates/markdown/framework/parallel-first-execution.md.txt +17 -105
  613. package/dist/templates/markdown/framework/prd-grill-frontier.md.txt +3 -3
  614. package/dist/templates/markdown/framework/release-boundary.md.txt +9 -10
  615. package/dist/templates/markdown/framework/retrieval-daily-guide.md.txt +1 -1
  616. package/dist/templates/pactile/CONTEXT.md +48 -36
  617. package/dist/templates/pactile/modules/approval-personal/contract.md +12 -24
  618. package/dist/templates/pactile/modules/close-basic/contract.md +15 -18
  619. package/dist/templates/pactile/modules/debug-recovery/contract.md +4 -4
  620. package/dist/templates/pactile/modules/define-basic/contract.md +15 -19
  621. package/dist/templates/pactile/modules/define-extended/contract.md +3 -3
  622. package/dist/templates/pactile/modules/execute-agent/contract.md +11 -19
  623. package/dist/templates/pactile/modules/intake-basic/contract.md +16 -13
  624. package/dist/templates/pactile/modules/verify-basic/contract.md +11 -20
  625. package/dist/templates/pactile/tasks/templates/release-execution/design.md +5 -5
  626. package/dist/templates/pactile/tasks/templates/release-readiness/design.md +6 -6
  627. package/dist/templates/pactile/tasks/templates/release-readiness/handoff-template.md +8 -2
  628. package/dist/templates/pactile/workflow.md +37 -41
  629. package/dist/templates/template-utils.d.ts +1 -2
  630. package/dist/templates/template-utils.d.ts.map +1 -1
  631. package/dist/templates/template-utils.js +2 -13
  632. package/dist/templates/template-utils.js.map +1 -1
  633. package/dist/types/ai-tools.d.ts +1 -1
  634. package/dist/types/ai-tools.js +1 -1
  635. package/dist/utils/manifest-prune.js +1 -1
  636. package/dist/utils/manifest-prune.js.map +1 -1
  637. package/dist/utils/p36-upgrade.d.ts +2 -2
  638. package/dist/utils/p36-upgrade.d.ts.map +1 -1
  639. package/dist/utils/p36-upgrade.js +2 -10
  640. package/dist/utils/p36-upgrade.js.map +1 -1
  641. package/dist/utils/post-update-smoke.js +1 -1
  642. package/dist/utils/post-update-smoke.js.map +1 -1
  643. package/dist/utils/readiness.d.ts +2 -2
  644. package/dist/utils/readiness.js +2 -2
  645. package/dist/utils/uninstall-scrubbers.js +1 -1
  646. package/dist/utils/workflow-dir.d.ts +1 -1
  647. package/dist/utils/workflow-dir.d.ts.map +1 -1
  648. package/dist/utils/workflow-dir.js +1 -1
  649. package/dist/utils/workflow-dir.js.map +1 -1
  650. package/package.json +42 -37
  651. package/CHANGELOG.md +0 -651
  652. package/bin/compat-warning.js +0 -11
  653. package/bin/pactile.js +0 -3
  654. package/bin/smart-search.js +0 -38
  655. package/dist/migrations/manifests/0.1.0.json +0 -9
  656. package/dist/migrations/manifests/0.1.1.json +0 -9
  657. package/dist/migrations/manifests/0.1.2.json +0 -9
  658. package/dist/migrations/manifests/0.1.3.json +0 -9
  659. package/dist/migrations/manifests/0.1.4.json +0 -9
  660. package/dist/migrations/manifests/0.2.1.json +0 -9
  661. package/dist/migrations/manifests/0.2.10.json +0 -374
  662. package/dist/migrations/manifests/0.2.2.json +0 -9
  663. package/dist/migrations/manifests/0.2.3.json +0 -9
  664. package/dist/migrations/manifests/0.2.4.json +0 -9
  665. package/dist/migrations/manifests/0.2.5.json +0 -9
  666. package/dist/migrations/manifests/0.2.6.json +0 -9
  667. package/dist/migrations/manifests/0.2.7.json +0 -9
  668. package/dist/migrations/manifests/0.2.8.json +0 -9
  669. package/dist/migrations/manifests/0.2.9.json +0 -9
  670. package/dist/migrations/manifests/0.3.0.json +0 -89
  671. package/dist/migrations/manifests/0.3.1.json +0 -32
  672. package/dist/migrations/manifests/0.3.2.json +0 -16
  673. package/dist/migrations/manifests/0.3.3.json +0 -9
  674. package/dist/migrations/manifests/0.3.4.json +0 -9
  675. package/dist/migrations/manifests/0.3.5.json +0 -9
  676. package/dist/migrations/manifests/0.3.6.json +0 -9
  677. package/dist/migrations/manifests/0.4.0.json +0 -9
  678. package/dist/migrations/manifests/0.4.1.json +0 -9
  679. package/dist/migrations/manifests/0.4.2.json +0 -9
  680. package/dist/migrations/manifests/0.4.3.json +0 -9
  681. package/dist/migrations/manifests/0.5.0-beta.0.json +0 -9
  682. package/dist/migrations/manifests/0.5.0-beta.1.json +0 -9
  683. package/dist/migrations/manifests/0.5.0-beta.2.json +0 -9
  684. package/dist/migrations/manifests/0.5.0-beta.3.json +0 -9
  685. package/dist/migrations/manifests/0.5.0-beta.4.json +0 -9
  686. package/dist/migrations/manifests/0.5.0-beta.5.json +0 -9
  687. package/dist/migrations/manifests/0.5.0.json +0 -9
  688. package/dist/pactile/compat/retired-alternate-client.d.ts +0 -42
  689. package/dist/pactile/compat/retired-alternate-client.d.ts.map +0 -1
  690. package/dist/pactile/compat/retired-alternate-client.js +0 -153
  691. package/dist/pactile/compat/retired-alternate-client.js.map +0 -1
  692. package/dist/pactile/compat/update-residue.d.ts +0 -4
  693. package/dist/pactile/compat/update-residue.d.ts.map +0 -1
  694. package/dist/pactile/compat/update-residue.js +0 -55
  695. package/dist/pactile/compat/update-residue.js.map +0 -1
  696. package/dist/utils/cursor-retrieval-env.d.ts +0 -17
  697. package/dist/utils/cursor-retrieval-env.d.ts.map +0 -1
  698. package/dist/utils/cursor-retrieval-env.js +0 -19
  699. package/dist/utils/cursor-retrieval-env.js.map +0 -1
  700. package/dist/utils/proxy.d.ts +0 -25
  701. package/dist/utils/proxy.d.ts.map +0 -1
  702. package/dist/utils/proxy.js +0 -60
  703. package/dist/utils/proxy.js.map +0 -1
  704. package/scripts/postinstall.js +0 -6
@@ -0,0 +1,695 @@
1
+ /**
2
+ * Structured Pi Check Review contract.
3
+ *
4
+ * This module is deliberately adapter-independent: callers must supply trusted
5
+ * Run/reviewer facts from the current Task Kernel/host receipt. A Pi transport
6
+ * outcome is never treated as a Review verdict.
7
+ */
8
+ export const INDEPENDENT_REVIEW_AREAS = [
9
+ "task-drift",
10
+ "write-set",
11
+ "standards-maintainability",
12
+ "security",
13
+ "required-validation",
14
+ "open-questions",
15
+ ];
16
+ const MAX_TEXT_LENGTH = 1_000;
17
+ const MAX_EVIDENCE_REF_LENGTH = 512;
18
+ const MAX_ITEMS = 128;
19
+ const FINGERPRINT_PATTERN = /^[a-f0-9]{64}$/;
20
+ const IDENTIFIER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/;
21
+ const SECRET_PATTERN = /\b(?:bearer\s+[a-z0-9._~+/-]{12,}|(?:sk[-_]|gh[pousr]_|glpat-|plane_api_)[a-z0-9_-]{12,}|(?:api[_-]?key|token|password|secret)\s*[:=]\s*\S+)/iu;
22
+ const PI_CHECK_RECEIPT_KEYS = [
23
+ "piRunId", "role", "outcome", "taskRunId", "candidateSnapshotId", "candidateFingerprint",
24
+ "sessionId", "reviewerId", "reviewerIdentityAssurance", "kernelRevisionAtDispatch",
25
+ "startupMs", "firstEventMs", "elapsedMs", "eventCount", "toolErrors",
26
+ ];
27
+ class ReviewValidationError extends Error {
28
+ constructor(message) {
29
+ super(message);
30
+ this.name = "ReviewValidationError";
31
+ }
32
+ }
33
+ function invalid(message) {
34
+ throw new ReviewValidationError(message);
35
+ }
36
+ export function buildIndependentPiReviewPrompt(binding) {
37
+ const coverage = Object.fromEntries(INDEPENDENT_REVIEW_AREAS.map((area) => [
38
+ area,
39
+ { status: "clear", confidence: "high", evidenceRefs: ["replace-with-evidence-reference"], note: null },
40
+ ]));
41
+ const acceptanceEvidence = Object.fromEntries(binding.acceptanceCriteria.map((criterion) => [criterion.id, ["replace-with-criterion-evidence"]]));
42
+ const template = {
43
+ contractVersion: 1,
44
+ runId: binding.runId,
45
+ candidateSnapshotId: binding.candidateSnapshotId,
46
+ candidateFingerprint: binding.candidateFingerprint,
47
+ verdict: "pass",
48
+ coverage,
49
+ findings: [],
50
+ blockers: [],
51
+ unresolvedQuestions: [],
52
+ evidenceRefs: ["replace-with-review-evidence"],
53
+ acceptanceEvidence,
54
+ escalation: { required: false, target: "none", reasons: [] },
55
+ usage: { inputTokens: null, outputTokens: null, estimatedCostMicros: null },
56
+ };
57
+ const context = {
58
+ kernelRevision: binding.kernelRevision,
59
+ taskId: binding.taskId,
60
+ runId: binding.runId,
61
+ candidateSnapshotId: binding.candidateSnapshotId,
62
+ candidateFingerprint: binding.candidateFingerprint,
63
+ task: {
64
+ title: binding.taskTitle,
65
+ description: binding.taskDescription,
66
+ deliverable: binding.deliverable,
67
+ acceptanceCriteria: binding.acceptanceCriteria,
68
+ },
69
+ Run: {
70
+ summary: binding.runSummary,
71
+ references: binding.runReferences,
72
+ authorizedScope: binding.authorizationScope,
73
+ writeSetSnapshot: binding.writeSetSnapshot,
74
+ candidateEntries: binding.candidateEntries,
75
+ allowedEvidenceRefs: binding.allowedEvidenceRefs,
76
+ },
77
+ };
78
+ return [
79
+ "Perform a read-only independent Pi Check of the fixed candidate shown below. Compare task scope, write-set boundaries, standards and maintainability, obvious security risks, required validation, and unresolved questions. Inspect the cited candidate and verification evidence; do not modify files.",
80
+ "The Run, candidate snapshot ID, fingerprint, and acceptance-criterion IDs are fixed. Do not review a different candidate or infer PASS from this process having settled.",
81
+ "Return exactly one JSON object matching the following shape, without Markdown fences or additional keys. The Run context contains the exact allowedEvidenceRefs path strings, derived only from recorded candidate files and completed Run evidence. Replace every example evidence reference in the template with one of those path strings. Every reference value in coverage[*].evidenceRefs, findings[*].evidenceRefs, blockers[*].evidenceRefs, unresolvedQuestions[*].evidenceRefs, top-level evidenceRefs, and acceptanceEvidence[*] must be copied exactly from that list. Put only those path strings in reference arrays; do not use explanations, summaries, or sentence fragments as evidence references. Do not add any path that is not listed. Every coverage area needs evidence. PASS requires evidence for every acceptance criterion, no blockers or unresolved questions, and no Codex escalation. If the listed files do not substantiate a claim, use needs-changes and explain the issue in the appropriate prose field.",
82
+ "For each coverage area, status is clear, finding, or not-applicable; use a non-empty note only for not-applicable. Findings must cite evidence. Every blocker must reference a finding. Escalate to Codex when confidence is not high, impact is high, or a finding is disputed. Jev/advisor suggestions are not an independent Review.",
83
+ "Provider token and cost values are unverified caller declarations. Use null when unavailable. The bridge will attach locally measured timing from its Pi run receipt.",
84
+ "Fixed review context:",
85
+ JSON.stringify(context, null, 2),
86
+ "Required JSON shape:",
87
+ JSON.stringify(template, null, 2),
88
+ ].join("\n\n");
89
+ }
90
+ function record(value, field) {
91
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
92
+ invalid(field + " must be an object");
93
+ }
94
+ const prototype = Object.getPrototypeOf(value);
95
+ if (prototype !== Object.prototype && prototype !== null)
96
+ invalid(field + " must be a plain object");
97
+ return value;
98
+ }
99
+ function exactKeys(value, keys, field) {
100
+ const allowed = new Set(keys);
101
+ if (Object.keys(value).some((key) => !allowed.has(key)) || keys.some((key) => !Object.hasOwn(value, key))) {
102
+ invalid(field + " has missing or unsupported fields");
103
+ }
104
+ }
105
+ function hasControlCharacters(value) {
106
+ return Array.from(value).some((character) => {
107
+ const code = character.charCodeAt(0);
108
+ return code <= 0x1f || code === 0x7f;
109
+ });
110
+ }
111
+ function boundedText(value, field, maxLength = MAX_TEXT_LENGTH) {
112
+ if (typeof value !== "string" ||
113
+ value.trim().length === 0 ||
114
+ value.length > maxLength ||
115
+ hasControlCharacters(value) ||
116
+ SECRET_PATTERN.test(value)) {
117
+ invalid(field + " must be bounded safe text");
118
+ }
119
+ return value;
120
+ }
121
+ function identifier(value, field) {
122
+ const parsed = boundedText(value, field, 128);
123
+ if (!IDENTIFIER_PATTERN.test(parsed))
124
+ invalid(field + " is invalid");
125
+ return parsed;
126
+ }
127
+ function fingerprint(value, field) {
128
+ if (typeof value !== "string" || !FINGERPRINT_PATTERN.test(value)) {
129
+ invalid(field + " must be a lowercase SHA-256 fingerprint");
130
+ }
131
+ return value;
132
+ }
133
+ function enumValue(value, values, field) {
134
+ if (typeof value !== "string" || !values.includes(value))
135
+ invalid(field + " is invalid");
136
+ return value;
137
+ }
138
+ function booleanValue(value, field) {
139
+ if (typeof value !== "boolean")
140
+ invalid(field + " must be a boolean");
141
+ return value;
142
+ }
143
+ function integer(value, field, maximum, nullable = false) {
144
+ if (nullable && value === null)
145
+ return null;
146
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0 || value > maximum) {
147
+ invalid(field + " must be a bounded non-negative integer" + (nullable ? " or null" : ""));
148
+ }
149
+ return value;
150
+ }
151
+ function textArray(value, field, options = {}) {
152
+ if (!Array.isArray(value) || value.length > (options.max ?? MAX_ITEMS) || value.length < (options.min ?? 0)) {
153
+ invalid(field + " must be a bounded array");
154
+ }
155
+ const parsed = value.map((item, index) => boundedText(item, field + "[" + index + "]", options.evidence ? MAX_EVIDENCE_REF_LENGTH : MAX_TEXT_LENGTH));
156
+ if (new Set(parsed).size !== parsed.length)
157
+ invalid(field + " cannot contain duplicates");
158
+ return parsed;
159
+ }
160
+ function uniqueIdentifiers(value, field) {
161
+ if (!Array.isArray(value) || value.length > MAX_ITEMS)
162
+ invalid(field + " must be a bounded array");
163
+ const parsed = value.map((item, index) => identifier(item, field + "[" + index + "]"));
164
+ if (new Set(parsed).size !== parsed.length)
165
+ invalid(field + " cannot contain duplicates");
166
+ return parsed;
167
+ }
168
+ function evidenceRefs(value, field) {
169
+ return textArray(value, field, { min: 1, max: MAX_ITEMS, evidence: true });
170
+ }
171
+ function parseCoverage(value) {
172
+ const input = record(value, "coverage");
173
+ exactKeys(input, INDEPENDENT_REVIEW_AREAS, "coverage");
174
+ const parsed = {};
175
+ for (const area of INDEPENDENT_REVIEW_AREAS) {
176
+ const cell = record(input[area], "coverage." + area);
177
+ exactKeys(cell, ["status", "confidence", "evidenceRefs", "note"], "coverage." + area);
178
+ const status = enumValue(cell["status"], ["clear", "finding", "not-applicable"], "coverage." + area + ".status");
179
+ const confidence = enumValue(cell["confidence"], ["high", "medium", "low"], "coverage." + area + ".confidence");
180
+ const refs = evidenceRefs(cell["evidenceRefs"], "coverage." + area + ".evidenceRefs");
181
+ const note = cell["note"] === null ? null : boundedText(cell["note"], "coverage." + area + ".note");
182
+ if (status === "not-applicable" && note === null)
183
+ invalid("coverage." + area + ".note is required when not applicable");
184
+ if (status !== "not-applicable" && note !== null)
185
+ invalid("coverage." + area + ".note must be null unless not applicable");
186
+ parsed[area] = { status, confidence, evidenceRefs: refs, note };
187
+ }
188
+ return parsed;
189
+ }
190
+ function parseFindings(value) {
191
+ if (!Array.isArray(value) || value.length > MAX_ITEMS)
192
+ invalid("findings must be a bounded array");
193
+ const parsed = value.map((item, index) => {
194
+ const field = "findings[" + index + "]";
195
+ const input = record(item, field);
196
+ exactKeys(input, ["id", "area", "severity", "confidence", "impact", "disputed", "summary", "evidenceRefs"], field);
197
+ const area = enumValue(input["area"], ["task-drift", "write-set", "standards-maintainability", "security", "required-validation"], field + ".area");
198
+ return {
199
+ id: identifier(input["id"], field + ".id"),
200
+ area,
201
+ severity: enumValue(input["severity"], ["warning", "blocker"], field + ".severity"),
202
+ confidence: enumValue(input["confidence"], ["high", "medium", "low"], field + ".confidence"),
203
+ impact: enumValue(input["impact"], ["low", "high"], field + ".impact"),
204
+ disputed: booleanValue(input["disputed"], field + ".disputed"),
205
+ summary: boundedText(input["summary"], field + ".summary"),
206
+ evidenceRefs: evidenceRefs(input["evidenceRefs"], field + ".evidenceRefs"),
207
+ };
208
+ });
209
+ if (new Set(parsed.map((finding) => finding.id)).size !== parsed.length)
210
+ invalid("finding IDs must be unique");
211
+ return parsed;
212
+ }
213
+ function parseBlockers(value) {
214
+ if (!Array.isArray(value) || value.length > MAX_ITEMS)
215
+ invalid("blockers must be a bounded array");
216
+ const parsed = value.map((item, index) => {
217
+ const field = "blockers[" + index + "]";
218
+ const input = record(item, field);
219
+ exactKeys(input, ["id", "findingId", "summary", "evidenceRefs"], field);
220
+ return {
221
+ id: identifier(input["id"], field + ".id"),
222
+ findingId: identifier(input["findingId"], field + ".findingId"),
223
+ summary: boundedText(input["summary"], field + ".summary"),
224
+ evidenceRefs: evidenceRefs(input["evidenceRefs"], field + ".evidenceRefs"),
225
+ };
226
+ });
227
+ if (new Set(parsed.map((blocker) => blocker.id)).size !== parsed.length)
228
+ invalid("blocker IDs must be unique");
229
+ if (new Set(parsed.map((blocker) => blocker.findingId)).size !== parsed.length)
230
+ invalid("a finding cannot be listed as multiple blockers");
231
+ return parsed;
232
+ }
233
+ function parseQuestions(value) {
234
+ if (!Array.isArray(value) || value.length > MAX_ITEMS)
235
+ invalid("unresolvedQuestions must be a bounded array");
236
+ const parsed = value.map((item, index) => {
237
+ const field = "unresolvedQuestions[" + index + "]";
238
+ const input = record(item, field);
239
+ exactKeys(input, ["id", "question", "evidenceRefs"], field);
240
+ return {
241
+ id: identifier(input["id"], field + ".id"),
242
+ question: boundedText(input["question"], field + ".question"),
243
+ evidenceRefs: evidenceRefs(input["evidenceRefs"], field + ".evidenceRefs"),
244
+ };
245
+ });
246
+ if (new Set(parsed.map((question) => question.id)).size !== parsed.length)
247
+ invalid("question IDs must be unique");
248
+ return parsed;
249
+ }
250
+ function parseCodexConcernResolutions(value) {
251
+ if (!Array.isArray(value) || value.length > MAX_ITEMS) {
252
+ invalid("concernResolutions must be a bounded array");
253
+ }
254
+ const parsed = value.map((item, index) => {
255
+ const field = `concernResolutions[${index}]`;
256
+ const input = record(item, field);
257
+ exactKeys(input, ["concernId", "disposition", "rationale", "evidenceRefs"], field);
258
+ const rationale = boundedText(input["rationale"], `${field}.rationale`);
259
+ if (/\b(?:placeholder|replace with|insert rationale|todo|tbd)\b/iu.test(rationale)) {
260
+ invalid(`${field}.rationale cannot be a placeholder`);
261
+ }
262
+ return {
263
+ concernId: identifier(input["concernId"], `${field}.concernId`),
264
+ disposition: enumValue(input["disposition"], ["resolved", "still-blocking"], `${field}.disposition`),
265
+ rationale,
266
+ evidenceRefs: evidenceRefs(input["evidenceRefs"], `${field}.evidenceRefs`),
267
+ };
268
+ });
269
+ if (new Set(parsed.map((item) => item.concernId)).size !== parsed.length) {
270
+ invalid("concernResolutions cannot contain duplicate concern IDs");
271
+ }
272
+ return parsed;
273
+ }
274
+ function parseAcceptanceEvidence(value, criteria, decision) {
275
+ const input = record(value, "acceptanceEvidence");
276
+ exactKeys(input, criteria, "acceptanceEvidence");
277
+ const result = {};
278
+ for (const criterion of criteria) {
279
+ const refs = textArray(input[criterion], "acceptanceEvidence." + criterion, {
280
+ min: decision === "pass" ? 1 : 0,
281
+ max: MAX_ITEMS,
282
+ evidence: true,
283
+ });
284
+ Object.defineProperty(result, criterion, { value: refs, enumerable: true, writable: true, configurable: true });
285
+ }
286
+ return result;
287
+ }
288
+ function parseUsage(value) {
289
+ const input = record(value, "usage");
290
+ exactKeys(input, ["inputTokens", "outputTokens", "estimatedCostMicros"], "usage");
291
+ return {
292
+ inputTokens: integer(input["inputTokens"], "usage.inputTokens", Number.MAX_SAFE_INTEGER, true),
293
+ outputTokens: integer(input["outputTokens"], "usage.outputTokens", Number.MAX_SAFE_INTEGER, true),
294
+ estimatedCostMicros: integer(input["estimatedCostMicros"], "usage.estimatedCostMicros", Number.MAX_SAFE_INTEGER, true),
295
+ };
296
+ }
297
+ function parseEscalation(value, expectedReasons, verdict) {
298
+ const input = record(value, "escalation");
299
+ exactKeys(input, ["required", "target", "reasons"], "escalation");
300
+ const required = booleanValue(input["required"], "escalation.required");
301
+ const target = enumValue(input["target"], ["none", "codex"], "escalation.target");
302
+ const reasons = textArray(input["reasons"], "escalation.reasons", { max: 3 });
303
+ if (reasons.some((reason) => !["uncertainty", "high-impact", "dispute"].includes(reason))) {
304
+ invalid("escalation.reasons contains an unsupported value");
305
+ }
306
+ if (new Set(reasons).size !== reasons.length)
307
+ invalid("escalation.reasons cannot contain duplicates");
308
+ if (required !== (expectedReasons.length > 0) || target !== (required ? "codex" : "none")) {
309
+ invalid("escalation marker does not match the review risk signals");
310
+ }
311
+ if (reasons.length !== expectedReasons.length || reasons.some((reason, index) => reason !== expectedReasons[index])) {
312
+ invalid("escalation reasons do not match the review risk signals");
313
+ }
314
+ if (required && verdict === "pass")
315
+ invalid("a Review requiring Codex escalation cannot pass");
316
+ return { required, target, reasons: expectedReasons };
317
+ }
318
+ function deriveEscalationReasons(coverage, findings, questions) {
319
+ const reasons = [];
320
+ if (questions.length > 0 ||
321
+ INDEPENDENT_REVIEW_AREAS.some((area) => coverage[area].confidence !== "high") ||
322
+ findings.some((finding) => finding.confidence !== "high"))
323
+ reasons.push("uncertainty");
324
+ if (findings.some((finding) => finding.impact === "high"))
325
+ reasons.push("high-impact");
326
+ if (findings.some((finding) => finding.disputed))
327
+ reasons.push("dispute");
328
+ return reasons;
329
+ }
330
+ function parsePayload(value, acceptanceCriteria) {
331
+ const input = record(value, "review");
332
+ exactKeys(input, [
333
+ "contractVersion", "runId", "candidateSnapshotId", "candidateFingerprint", "verdict",
334
+ "coverage", "findings", "blockers", "unresolvedQuestions", "evidenceRefs",
335
+ "acceptanceEvidence", "escalation", "usage",
336
+ ], "review");
337
+ if (input["contractVersion"] !== 1)
338
+ invalid("review.contractVersion must be 1");
339
+ const verdict = enumValue(input["verdict"], ["pass", "fail", "needs-changes"], "review.verdict");
340
+ return {
341
+ runId: identifier(input["runId"], "review.runId"),
342
+ candidateSnapshotId: identifier(input["candidateSnapshotId"], "review.candidateSnapshotId"),
343
+ candidateFingerprint: fingerprint(input["candidateFingerprint"], "review.candidateFingerprint"),
344
+ verdict,
345
+ coverage: parseCoverage(input["coverage"]),
346
+ findings: parseFindings(input["findings"]),
347
+ blockers: parseBlockers(input["blockers"]),
348
+ unresolvedQuestions: parseQuestions(input["unresolvedQuestions"]),
349
+ evidenceRefs: evidenceRefs(input["evidenceRefs"], "review.evidenceRefs"),
350
+ acceptanceEvidence: parseAcceptanceEvidence(input["acceptanceEvidence"], acceptanceCriteria, verdict),
351
+ escalation: input["escalation"],
352
+ usage: parseUsage(input["usage"]),
353
+ };
354
+ }
355
+ function allReportedEvidenceRefs(parsed) {
356
+ const references = [
357
+ ...parsed.evidenceRefs,
358
+ ...Object.values(parsed.coverage).flatMap((coverage) => coverage.evidenceRefs),
359
+ ...parsed.findings.flatMap((finding) => finding.evidenceRefs),
360
+ ...parsed.blockers.flatMap((blocker) => blocker.evidenceRefs),
361
+ ...parsed.unresolvedQuestions.flatMap((question) => question.evidenceRefs),
362
+ ...(parsed.concernResolutions ?? []).flatMap((resolution) => resolution.evidenceRefs),
363
+ ...Object.values(parsed.acceptanceEvidence).flat(),
364
+ ];
365
+ return [...new Set(references)].sort();
366
+ }
367
+ /** Validate the shared structured Review body without asserting a host identity. */
368
+ export function safeParseIndependentReviewPayload(input, acceptanceCriterionIds) {
369
+ try {
370
+ const criteria = uniqueIdentifiers(acceptanceCriterionIds, "acceptanceCriterionIds");
371
+ const parsed = parsePayload(input, criteria);
372
+ validateCoverageConsistency(parsed.coverage, parsed.findings, parsed.unresolvedQuestions);
373
+ validateBlockers(parsed.findings, parsed.blockers);
374
+ if (parsed.verdict === "pass" &&
375
+ (parsed.blockers.length > 0 || parsed.unresolvedQuestions.length > 0)) {
376
+ invalid("a passing Review cannot contain unresolved blockers or questions");
377
+ }
378
+ const escalationReasons = deriveEscalationReasons(parsed.coverage, parsed.findings, parsed.unresolvedQuestions);
379
+ const escalation = parseEscalation(parsed.escalation, escalationReasons, parsed.verdict);
380
+ return {
381
+ ok: true,
382
+ value: {
383
+ contractVersion: 1,
384
+ ...parsed,
385
+ escalation,
386
+ allEvidenceRefs: allReportedEvidenceRefs(parsed),
387
+ },
388
+ };
389
+ }
390
+ catch (error) {
391
+ const message = error instanceof ReviewValidationError
392
+ ? error.message
393
+ : "review input could not be safely parsed";
394
+ return { ok: false, errors: [message] };
395
+ }
396
+ }
397
+ /** Strict P40 reply body; escalation is not recursively delegated to Codex. */
398
+ export function safeParseCodexEscalationReviewContentV1(value, acceptanceCriterionIds) {
399
+ try {
400
+ const criteria = uniqueIdentifiers(acceptanceCriterionIds, "acceptanceCriterionIds");
401
+ const input = record(value, "review");
402
+ exactKeys(input, [
403
+ "contractVersion",
404
+ "runId",
405
+ "candidateSnapshotId",
406
+ "candidateFingerprint",
407
+ "verdict",
408
+ "coverage",
409
+ "findings",
410
+ "blockers",
411
+ "unresolvedQuestions",
412
+ "concernResolutions",
413
+ "evidenceRefs",
414
+ "acceptanceEvidence",
415
+ ], "review");
416
+ if (input["contractVersion"] !== 1)
417
+ invalid("review.contractVersion must be 1");
418
+ const verdict = enumValue(input["verdict"], ["pass", "fail", "needs-changes"], "review.verdict");
419
+ const parsed = {
420
+ contractVersion: 1,
421
+ runId: identifier(input["runId"], "review.runId"),
422
+ candidateSnapshotId: identifier(input["candidateSnapshotId"], "review.candidateSnapshotId"),
423
+ candidateFingerprint: fingerprint(input["candidateFingerprint"], "review.candidateFingerprint"),
424
+ verdict,
425
+ coverage: parseCoverage(input["coverage"]),
426
+ findings: parseFindings(input["findings"]),
427
+ blockers: parseBlockers(input["blockers"]),
428
+ unresolvedQuestions: parseQuestions(input["unresolvedQuestions"]),
429
+ concernResolutions: parseCodexConcernResolutions(input["concernResolutions"]),
430
+ evidenceRefs: evidenceRefs(input["evidenceRefs"], "review.evidenceRefs"),
431
+ acceptanceEvidence: parseAcceptanceEvidence(input["acceptanceEvidence"], criteria, verdict),
432
+ };
433
+ validateCoverageConsistency(parsed.coverage, parsed.findings, parsed.unresolvedQuestions);
434
+ validateBlockers(parsed.findings, parsed.blockers);
435
+ if (parsed.verdict === "pass" &&
436
+ (parsed.blockers.length > 0 ||
437
+ parsed.unresolvedQuestions.length > 0 ||
438
+ parsed.concernResolutions.some((resolution) => resolution.disposition !== "resolved" ||
439
+ resolution.evidenceRefs.length === 0))) {
440
+ invalid("a passing Review cannot contain unresolved blockers, questions, or Pi concerns");
441
+ }
442
+ return {
443
+ ok: true,
444
+ value: {
445
+ ...parsed,
446
+ allEvidenceRefs: allReportedEvidenceRefs(parsed),
447
+ },
448
+ };
449
+ }
450
+ catch (error) {
451
+ const message = error instanceof ReviewValidationError
452
+ ? error.message
453
+ : "Codex Review reply could not be safely parsed";
454
+ return { ok: false, errors: [message] };
455
+ }
456
+ }
457
+ export function collectIndependentPiReviewEvidenceRefs(input, acceptanceCriterionIds) {
458
+ try {
459
+ const criteria = uniqueIdentifiers(acceptanceCriterionIds, "acceptanceCriterionIds");
460
+ const parsed = parsePayload(input, criteria);
461
+ return { ok: true, references: allReportedEvidenceRefs(parsed) };
462
+ }
463
+ catch (error) {
464
+ const message = error instanceof ReviewValidationError ? error.message : "review evidence references could not be safely collected";
465
+ return { ok: false, errors: [message] };
466
+ }
467
+ }
468
+ function validateCoverageConsistency(coverage, findings, questions) {
469
+ for (const area of INDEPENDENT_REVIEW_AREAS) {
470
+ const count = area === "open-questions"
471
+ ? questions.length
472
+ : findings.filter((finding) => finding.area === area).length;
473
+ if ((coverage[area].status === "finding") !== (count > 0)) {
474
+ invalid("coverage." + area + ".status does not match reported findings");
475
+ }
476
+ }
477
+ }
478
+ function validateBlockers(findings, blockers) {
479
+ const blockerFindingIds = new Set(findings.filter((finding) => finding.severity === "blocker").map((finding) => finding.id));
480
+ const listedFindingIds = new Set(blockers.map((blocker) => blocker.findingId));
481
+ if (blockerFindingIds.size !== listedFindingIds.size || [...blockerFindingIds].some((id) => !listedFindingIds.has(id))) {
482
+ invalid("every blocking finding must have exactly one unresolved blocker record");
483
+ }
484
+ }
485
+ function parsePiCheckReceipt(value) {
486
+ const input = record(value, "context.piReceipt");
487
+ exactKeys(input, PI_CHECK_RECEIPT_KEYS, "context.piReceipt");
488
+ const sessionId = input["sessionId"] === null ? null : identifier(input["sessionId"], "context.piReceipt.sessionId");
489
+ const reviewerId = input["reviewerId"] === null ? null : identifier(input["reviewerId"], "context.piReceipt.reviewerId");
490
+ const assurance = input["reviewerIdentityAssurance"];
491
+ if (assurance !== "caller-declared" && assurance !== null)
492
+ invalid("context.piReceipt.reviewerIdentityAssurance is invalid");
493
+ return {
494
+ piRunId: identifier(input["piRunId"], "context.piReceipt.piRunId"),
495
+ role: enumValue(input["role"], ["check"], "context.piReceipt.role"),
496
+ outcome: enumValue(input["outcome"], ["settled", "needs_review", "failed", "cancelled", "timed_out", "interrupted", "running"], "context.piReceipt.outcome"),
497
+ taskRunId: identifier(input["taskRunId"], "context.piReceipt.taskRunId"),
498
+ candidateSnapshotId: identifier(input["candidateSnapshotId"], "context.piReceipt.candidateSnapshotId"),
499
+ candidateFingerprint: fingerprint(input["candidateFingerprint"], "context.piReceipt.candidateFingerprint"),
500
+ sessionId,
501
+ reviewerId,
502
+ reviewerIdentityAssurance: assurance,
503
+ kernelRevisionAtDispatch: integer(input["kernelRevisionAtDispatch"], "context.piReceipt.kernelRevisionAtDispatch", Number.MAX_SAFE_INTEGER),
504
+ startupMs: integer(input["startupMs"], "context.piReceipt.startupMs", Number.MAX_SAFE_INTEGER, true),
505
+ firstEventMs: integer(input["firstEventMs"], "context.piReceipt.firstEventMs", Number.MAX_SAFE_INTEGER, true),
506
+ elapsedMs: integer(input["elapsedMs"], "context.piReceipt.elapsedMs", Number.MAX_SAFE_INTEGER, true),
507
+ eventCount: integer(input["eventCount"], "context.piReceipt.eventCount", Number.MAX_SAFE_INTEGER),
508
+ toolErrors: integer(input["toolErrors"], "context.piReceipt.toolErrors", Number.MAX_SAFE_INTEGER),
509
+ };
510
+ }
511
+ function parseEvidenceVerification(value, expected) {
512
+ const input = record(value, "context.evidenceVerification");
513
+ exactKeys(input, ["schemaVersion", "source", "observedAt", "runId", "candidateSnapshotId", "candidateFingerprint", "items"], "context.evidenceVerification");
514
+ if (input["schemaVersion"] !== 1 || input["source"] !== "pactile-task-review-evidence-v1") {
515
+ invalid("context.evidenceVerification schema is unsupported");
516
+ }
517
+ const observedAt = boundedText(input["observedAt"], "context.evidenceVerification.observedAt", 64);
518
+ if (!Number.isFinite(Date.parse(observedAt)))
519
+ invalid("context.evidenceVerification.observedAt is invalid");
520
+ const runId = identifier(input["runId"], "context.evidenceVerification.runId");
521
+ const candidateSnapshotId = identifier(input["candidateSnapshotId"], "context.evidenceVerification.candidateSnapshotId");
522
+ const candidateFingerprint = fingerprint(input["candidateFingerprint"], "context.evidenceVerification.candidateFingerprint");
523
+ if (runId !== expected.runId || candidateSnapshotId !== expected.candidateSnapshotId || candidateFingerprint !== expected.candidateFingerprint) {
524
+ invalid("Review evidence verification is stale or bound to another candidate");
525
+ }
526
+ if (!Array.isArray(input["items"]) || input["items"].length === 0 || input["items"].length > MAX_ITEMS) {
527
+ invalid("context.evidenceVerification.items must be a bounded non-empty array");
528
+ }
529
+ const items = input["items"].map((item, index) => {
530
+ const field = `context.evidenceVerification.items[${index}]`;
531
+ const fact = record(item, field);
532
+ exactKeys(fact, ["ref", "sha256", "sizeBytes", "source"], field);
533
+ const ref = boundedText(fact["ref"], field + ".ref", MAX_EVIDENCE_REF_LENGTH);
534
+ const sha256 = fingerprint(fact["sha256"], field + ".sha256");
535
+ const sizeBytes = integer(fact["sizeBytes"], field + ".sizeBytes", Number.MAX_SAFE_INTEGER);
536
+ const source = enumValue(fact["source"], ["candidate-snapshot", "run-evidence"], field + ".source");
537
+ return { ref, sha256, sizeBytes, source };
538
+ });
539
+ if (new Set(items.map((item) => item.ref)).size !== items.length)
540
+ invalid("context.evidenceVerification contains duplicate references");
541
+ return { schemaVersion: 1, source: "pactile-task-review-evidence-v1", observedAt, runId, candidateSnapshotId, candidateFingerprint, items };
542
+ }
543
+ function parseContext(context) {
544
+ const kernelRevision = integer(context.kernelRevision, "context.kernelRevision", Number.MAX_SAFE_INTEGER);
545
+ if (context.transportOutcome !== "settled")
546
+ invalid("Pi transport did not settle; no Review may be recorded");
547
+ if (context.reviewerAuthority !== "pi-check")
548
+ invalid("Jev/advisor output cannot be recorded as an independent Review");
549
+ const reviewerId = identifier(context.reviewerId, "context.reviewerId");
550
+ const runId = identifier(context.run.id, "context.run.id");
551
+ if (context.run.state !== "completed")
552
+ invalid("Review requires a completed Run");
553
+ if (identifier(context.latestCompletedRunId, "context.latestCompletedRunId") !== runId)
554
+ invalid("Review does not target the latest completed Run");
555
+ const executorId = identifier(context.run.startedBy, "context.run.startedBy");
556
+ const approverId = identifier(context.run.authorization.approvedBy, "context.run.authorization.approvedBy");
557
+ if (reviewerId === executorId || reviewerId === approverId) {
558
+ invalid("Review must be performed by someone other than the Run executor and approver");
559
+ }
560
+ if (context.run.candidateSnapshot === null)
561
+ invalid("completed Run has no candidate snapshot");
562
+ const runCandidateId = identifier(context.run.candidateSnapshot.id, "context.run.candidateSnapshot.id");
563
+ const runCandidateFingerprint = fingerprint(context.run.candidateSnapshot.fingerprint, "context.run.candidateSnapshot.fingerprint");
564
+ const boundCandidateId = identifier(context.boundCandidate.snapshotId, "context.boundCandidate.snapshotId");
565
+ const boundCandidateFingerprint = fingerprint(context.boundCandidate.fingerprint, "context.boundCandidate.fingerprint");
566
+ if (runCandidateId !== boundCandidateId || runCandidateFingerprint !== boundCandidateFingerprint) {
567
+ invalid("bound candidate does not match the latest completed Run snapshot");
568
+ }
569
+ const piReceipt = parsePiCheckReceipt(context.piReceipt);
570
+ if (piReceipt.role !== "check" || piReceipt.outcome !== "settled" || piReceipt.outcome !== context.transportOutcome) {
571
+ invalid("Pi Check receipt is not a settled check run");
572
+ }
573
+ if (identifier(piReceipt.taskRunId, "context.piReceipt.taskRunId") !== runId) {
574
+ invalid("Pi Check receipt targets another Task Run");
575
+ }
576
+ if (identifier(piReceipt.candidateSnapshotId, "context.piReceipt.candidateSnapshotId") !== runCandidateId ||
577
+ fingerprint(piReceipt.candidateFingerprint, "context.piReceipt.candidateFingerprint") !== runCandidateFingerprint)
578
+ invalid("Pi Check receipt candidate is stale or mismatched");
579
+ if (piReceipt.kernelRevisionAtDispatch !== kernelRevision) {
580
+ invalid("Task Kernel revision changed during Pi Check");
581
+ }
582
+ if (piReceipt.sessionId === null)
583
+ invalid("Pi Check receipt has no session identity");
584
+ const sessionId = identifier(piReceipt.sessionId, "context.piReceipt.sessionId");
585
+ if (context.run.host?.sessionId === sessionId) {
586
+ invalid("Pi Check session matches the implementation Run host session");
587
+ }
588
+ const receiptReviewerId = identifier(piReceipt.reviewerId, "context.piReceipt.reviewerId");
589
+ if (piReceipt.reviewerIdentityAssurance !== "caller-declared" || receiptReviewerId !== `pi-session:${sessionId}` || reviewerId !== receiptReviewerId) {
590
+ invalid("Pi reviewer identity is not bound to its declared session receipt");
591
+ }
592
+ const startupMs = integer(piReceipt.startupMs, "context.piReceipt.startupMs", Number.MAX_SAFE_INTEGER, true);
593
+ const firstEventMs = integer(piReceipt.firstEventMs, "context.piReceipt.firstEventMs", Number.MAX_SAFE_INTEGER, true);
594
+ const elapsedMs = integer(piReceipt.elapsedMs, "context.piReceipt.elapsedMs", Number.MAX_SAFE_INTEGER, true);
595
+ if ((startupMs !== null && elapsedMs !== null && startupMs > elapsedMs) || (firstEventMs !== null && elapsedMs !== null && firstEventMs > elapsedMs)) {
596
+ invalid("Pi Check receipt latency values are inconsistent");
597
+ }
598
+ if (integer(piReceipt.eventCount, "context.piReceipt.eventCount", Number.MAX_SAFE_INTEGER) === 0) {
599
+ invalid("Pi Check receipt contains no RPC events");
600
+ }
601
+ if (integer(piReceipt.toolErrors, "context.piReceipt.toolErrors", Number.MAX_SAFE_INTEGER) !== 0) {
602
+ invalid("Pi Check receipt contains tool errors");
603
+ }
604
+ const acceptanceCriterionIds = uniqueIdentifiers(context.acceptanceCriterionIds, "context.acceptanceCriterionIds");
605
+ const evidenceVerification = parseEvidenceVerification(context.evidenceVerification, {
606
+ runId,
607
+ candidateSnapshotId: runCandidateId,
608
+ candidateFingerprint: runCandidateFingerprint,
609
+ });
610
+ return {
611
+ reviewerId,
612
+ runId,
613
+ candidateSnapshotId: runCandidateId,
614
+ candidateFingerprint: runCandidateFingerprint,
615
+ acceptanceCriterionIds,
616
+ piReceipt,
617
+ evidenceVerification,
618
+ };
619
+ }
620
+ /**
621
+ * Parse an untrusted structured Pi response and bind it to trusted current Run,
622
+ * candidate, and reviewer facts. Returns safe field-level errors without
623
+ * returning or echoing untrusted input values.
624
+ */
625
+ export function safeParseIndependentPiReview(input, context) {
626
+ try {
627
+ const trusted = parseContext(context);
628
+ const payload = safeParseIndependentReviewPayload(input, trusted.acceptanceCriterionIds);
629
+ if (!payload.ok)
630
+ invalid(payload.errors[0] ?? "Review payload is invalid");
631
+ const parsed = payload.value;
632
+ if (parsed.runId !== trusted.runId)
633
+ invalid("review.runId does not match the latest completed Run");
634
+ if (parsed.candidateSnapshotId !== trusted.candidateSnapshotId ||
635
+ parsed.candidateFingerprint !== trusted.candidateFingerprint)
636
+ invalid("Review candidate snapshot is stale or mismatched");
637
+ const reportedEvidenceRefs = parsed.allEvidenceRefs;
638
+ const verifiedEvidenceRefs = trusted.evidenceVerification.items.map((item) => item.ref).sort();
639
+ if (JSON.stringify(reportedEvidenceRefs) !== JSON.stringify(verifiedEvidenceRefs)) {
640
+ invalid("Review evidence references do not match the byte-verified evidence receipt");
641
+ }
642
+ const escalation = parsed.escalation;
643
+ const unresolvedBlockers = [
644
+ ...parsed.blockers.map((blocker) => blocker.id + ": " + blocker.summary),
645
+ ...parsed.unresolvedQuestions.map((question) => question.id + ": " + question.question),
646
+ ];
647
+ const kernelReview = {
648
+ actor: trusted.reviewerId,
649
+ runId: trusted.runId,
650
+ candidateSnapshotId: trusted.candidateSnapshotId,
651
+ candidateFingerprint: trusted.candidateFingerprint,
652
+ reviewer: trusted.reviewerId,
653
+ decision: parsed.verdict,
654
+ evidenceRefs: trusted.evidenceVerification.items.map((item) => item.ref),
655
+ acceptanceEvidence: parsed.acceptanceEvidence,
656
+ unresolvedBlockers,
657
+ };
658
+ return {
659
+ ok: true,
660
+ value: {
661
+ contractVersion: 1,
662
+ runId: trusted.runId,
663
+ candidateSnapshotId: trusted.candidateSnapshotId,
664
+ candidateFingerprint: trusted.candidateFingerprint,
665
+ reviewer: trusted.reviewerId,
666
+ reviewerIdentityAssurance: "caller-declared",
667
+ piReceipt: trusted.piReceipt,
668
+ independent: true,
669
+ verdict: parsed.verdict,
670
+ coverage: parsed.coverage,
671
+ findings: parsed.findings,
672
+ blockers: parsed.blockers,
673
+ unresolvedQuestions: parsed.unresolvedQuestions,
674
+ evidenceRefs: parsed.evidenceRefs,
675
+ evidenceVerification: trusted.evidenceVerification,
676
+ acceptanceEvidence: parsed.acceptanceEvidence,
677
+ escalation,
678
+ telemetry: {
679
+ startupMs: trusted.piReceipt.startupMs,
680
+ firstEventMs: trusted.piReceipt.firstEventMs,
681
+ elapsedMs: trusted.piReceipt.elapsedMs,
682
+ ...parsed.usage,
683
+ timingAssurance: "pi-bridge-local",
684
+ usageAssurance: "caller-declared",
685
+ },
686
+ kernelReview,
687
+ },
688
+ };
689
+ }
690
+ catch (error) {
691
+ const message = error instanceof ReviewValidationError ? error.message : "review input could not be safely parsed";
692
+ return { ok: false, errors: [message] };
693
+ }
694
+ }
695
+ //# sourceMappingURL=contract.js.map