dorfl 0.0.0 → 0.1.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 (619) hide show
  1. package/dist/advance-ci-template.d.ts +73 -0
  2. package/dist/advance-ci-template.d.ts.map +1 -0
  3. package/dist/advance-ci-template.js +104 -0
  4. package/dist/advance-ci-template.js.map +1 -0
  5. package/dist/advance-classify.d.ts +132 -0
  6. package/dist/advance-classify.d.ts.map +1 -0
  7. package/dist/advance-classify.js +120 -0
  8. package/dist/advance-classify.js.map +1 -0
  9. package/dist/advance-drivers.d.ts +182 -0
  10. package/dist/advance-drivers.d.ts.map +1 -0
  11. package/dist/advance-drivers.js +231 -0
  12. package/dist/advance-drivers.js.map +1 -0
  13. package/dist/advance-isolated.d.ts +156 -0
  14. package/dist/advance-isolated.d.ts.map +1 -0
  15. package/dist/advance-isolated.js +256 -0
  16. package/dist/advance-isolated.js.map +1 -0
  17. package/dist/advance-lifecycle-template.d.ts +107 -0
  18. package/dist/advance-lifecycle-template.d.ts.map +1 -0
  19. package/dist/advance-lifecycle-template.js +668 -0
  20. package/dist/advance-lifecycle-template.js.map +1 -0
  21. package/dist/advance-loop-driver.d.ts +325 -0
  22. package/dist/advance-loop-driver.d.ts.map +1 -0
  23. package/dist/advance-loop-driver.js +437 -0
  24. package/dist/advance-loop-driver.js.map +1 -0
  25. package/dist/advance-treeless-publish.d.ts +108 -0
  26. package/dist/advance-treeless-publish.d.ts.map +1 -0
  27. package/dist/advance-treeless-publish.js +71 -0
  28. package/dist/advance-treeless-publish.js.map +1 -0
  29. package/dist/advance.d.ts +340 -0
  30. package/dist/advance.d.ts.map +1 -0
  31. package/dist/advance.js +1122 -0
  32. package/dist/advance.js.map +1 -0
  33. package/dist/advancing-lock.d.ts +294 -0
  34. package/dist/advancing-lock.d.ts.map +1 -0
  35. package/dist/advancing-lock.js +594 -0
  36. package/dist/advancing-lock.js.map +1 -0
  37. package/dist/agent-launch.d.ts +79 -0
  38. package/dist/agent-launch.d.ts.map +1 -0
  39. package/dist/agent-launch.js +61 -0
  40. package/dist/agent-launch.js.map +1 -0
  41. package/dist/agent-stop.d.ts +149 -0
  42. package/dist/agent-stop.d.ts.map +1 -0
  43. package/dist/agent-stop.js +307 -0
  44. package/dist/agent-stop.js.map +1 -0
  45. package/dist/apply-decide.d.ts +127 -0
  46. package/dist/apply-decide.d.ts.map +1 -0
  47. package/dist/apply-decide.js +176 -0
  48. package/dist/apply-decide.js.map +1 -0
  49. package/dist/apply-merge-action.d.ts +206 -0
  50. package/dist/apply-merge-action.d.ts.map +1 -0
  51. package/dist/apply-merge-action.js +307 -0
  52. package/dist/apply-merge-action.js.map +1 -0
  53. package/dist/apply-persist.d.ts +174 -0
  54. package/dist/apply-persist.d.ts.map +1 -0
  55. package/dist/apply-persist.js +359 -0
  56. package/dist/apply-persist.js.map +1 -0
  57. package/dist/arbiter.d.ts +120 -0
  58. package/dist/arbiter.d.ts.map +1 -0
  59. package/dist/arbiter.js +255 -0
  60. package/dist/arbiter.js.map +1 -0
  61. package/dist/brand.d.ts +70 -0
  62. package/dist/brand.d.ts.map +1 -0
  63. package/dist/brand.js +84 -0
  64. package/dist/brand.js.map +1 -0
  65. package/dist/buildable-body.d.ts +132 -0
  66. package/dist/buildable-body.d.ts.map +1 -0
  67. package/dist/buildable-body.js +131 -0
  68. package/dist/buildable-body.js.map +1 -0
  69. package/dist/categorise.d.ts +66 -0
  70. package/dist/categorise.d.ts.map +1 -0
  71. package/dist/categorise.js +106 -0
  72. package/dist/categorise.js.map +1 -0
  73. package/dist/claim-cas.d.ts +117 -0
  74. package/dist/claim-cas.d.ts.map +1 -0
  75. package/dist/claim-cas.js +312 -0
  76. package/dist/claim-cas.js.map +1 -0
  77. package/dist/cli-spinner.d.ts +112 -0
  78. package/dist/cli-spinner.d.ts.map +1 -0
  79. package/dist/cli-spinner.js +157 -0
  80. package/dist/cli-spinner.js.map +1 -0
  81. package/dist/cli.d.ts +11 -0
  82. package/dist/cli.d.ts.map +1 -0
  83. package/dist/cli.js +3094 -0
  84. package/dist/cli.js.map +1 -0
  85. package/dist/close-job-template.d.ts +70 -0
  86. package/dist/close-job-template.d.ts.map +1 -0
  87. package/dist/close-job-template.js +180 -0
  88. package/dist/close-job-template.js.map +1 -0
  89. package/dist/close-job.d.ts +95 -0
  90. package/dist/close-job.d.ts.map +1 -0
  91. package/dist/close-job.js +226 -0
  92. package/dist/close-job.js.map +1 -0
  93. package/dist/complete.d.ts +361 -0
  94. package/dist/complete.d.ts.map +1 -0
  95. package/dist/complete.js +885 -0
  96. package/dist/complete.js.map +1 -0
  97. package/dist/concurrency.d.ts +68 -0
  98. package/dist/concurrency.d.ts.map +1 -0
  99. package/dist/concurrency.js +112 -0
  100. package/dist/concurrency.js.map +1 -0
  101. package/dist/config-override.d.ts +76 -0
  102. package/dist/config-override.d.ts.map +1 -0
  103. package/dist/config-override.js +50 -0
  104. package/dist/config-override.js.map +1 -0
  105. package/dist/config.d.ts +668 -0
  106. package/dist/config.d.ts.map +1 -0
  107. package/dist/config.js +241 -0
  108. package/dist/config.js.map +1 -0
  109. package/dist/continue-branch.d.ts +249 -0
  110. package/dist/continue-branch.d.ts.map +1 -0
  111. package/dist/continue-branch.js +389 -0
  112. package/dist/continue-branch.js.map +1 -0
  113. package/dist/cwd-section.d.ts +186 -0
  114. package/dist/cwd-section.d.ts.map +1 -0
  115. package/dist/cwd-section.js +209 -0
  116. package/dist/cwd-section.js.map +1 -0
  117. package/dist/decision-engine.d.ts +170 -0
  118. package/dist/decision-engine.d.ts.map +1 -0
  119. package/dist/decision-engine.js +136 -0
  120. package/dist/decision-engine.js.map +1 -0
  121. package/dist/detect.d.ts +17 -0
  122. package/dist/detect.d.ts.map +1 -0
  123. package/dist/detect.js +118 -0
  124. package/dist/detect.js.map +1 -0
  125. package/dist/do-autopick.d.ts +85 -0
  126. package/dist/do-autopick.d.ts.map +1 -0
  127. package/dist/do-autopick.js +112 -0
  128. package/dist/do-autopick.js.map +1 -0
  129. package/dist/do-config.d.ts +312 -0
  130. package/dist/do-config.d.ts.map +1 -0
  131. package/dist/do-config.js +358 -0
  132. package/dist/do-config.js.map +1 -0
  133. package/dist/do-remote-auto.d.ts +75 -0
  134. package/dist/do-remote-auto.d.ts.map +1 -0
  135. package/dist/do-remote-auto.js +111 -0
  136. package/dist/do-remote-auto.js.map +1 -0
  137. package/dist/do.d.ts +621 -0
  138. package/dist/do.d.ts.map +1 -0
  139. package/dist/do.js +1882 -0
  140. package/dist/do.js.map +1 -0
  141. package/dist/drop-source.d.ts +96 -0
  142. package/dist/drop-source.d.ts.map +1 -0
  143. package/dist/drop-source.js +91 -0
  144. package/dist/drop-source.js.map +1 -0
  145. package/dist/eligibility.d.ts +46 -0
  146. package/dist/eligibility.d.ts.map +1 -0
  147. package/dist/eligibility.js +34 -0
  148. package/dist/eligibility.js.map +1 -0
  149. package/dist/env-config.d.ts +51 -0
  150. package/dist/env-config.d.ts.map +1 -0
  151. package/dist/env-config.js +272 -0
  152. package/dist/env-config.js.map +1 -0
  153. package/dist/failure-cause.d.ts +70 -0
  154. package/dist/failure-cause.d.ts.map +1 -0
  155. package/dist/failure-cause.js +126 -0
  156. package/dist/failure-cause.js.map +1 -0
  157. package/dist/format.d.ts +43 -0
  158. package/dist/format.d.ts.map +1 -0
  159. package/dist/format.js +256 -0
  160. package/dist/format.js.map +1 -0
  161. package/dist/frontmatter.d.ts +215 -0
  162. package/dist/frontmatter.d.ts.map +1 -0
  163. package/dist/frontmatter.js +345 -0
  164. package/dist/frontmatter.js.map +1 -0
  165. package/dist/gate-readiness.d.ts +84 -0
  166. package/dist/gate-readiness.d.ts.map +1 -0
  167. package/dist/gate-readiness.js +103 -0
  168. package/dist/gate-readiness.js.map +1 -0
  169. package/dist/gc.d.ts +165 -0
  170. package/dist/gc.d.ts.map +1 -0
  171. package/dist/gc.js +313 -0
  172. package/dist/gc.js.map +1 -0
  173. package/dist/gh-failure.d.ts +42 -0
  174. package/dist/gh-failure.d.ts.map +1 -0
  175. package/dist/gh-failure.js +49 -0
  176. package/dist/gh-failure.js.map +1 -0
  177. package/dist/git.d.ts +75 -0
  178. package/dist/git.d.ts.map +1 -0
  179. package/dist/git.js +130 -0
  180. package/dist/git.js.map +1 -0
  181. package/dist/github.d.ts +187 -0
  182. package/dist/github.d.ts.map +1 -0
  183. package/dist/github.js +343 -0
  184. package/dist/github.js.map +1 -0
  185. package/dist/harness.d.ts +242 -0
  186. package/dist/harness.d.ts.map +1 -0
  187. package/dist/harness.js +157 -0
  188. package/dist/harness.js.map +1 -0
  189. package/dist/identity.d.ts +167 -0
  190. package/dist/identity.d.ts.map +1 -0
  191. package/dist/identity.js +231 -0
  192. package/dist/identity.js.map +1 -0
  193. package/dist/index.d.ts +147 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +76 -0
  196. package/dist/index.js.map +1 -0
  197. package/dist/install-ci-branch-protection.d.ts +147 -0
  198. package/dist/install-ci-branch-protection.d.ts.map +1 -0
  199. package/dist/install-ci-branch-protection.js +166 -0
  200. package/dist/install-ci-branch-protection.js.map +1 -0
  201. package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
  202. package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
  203. package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
  204. package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
  205. package/dist/install-ci-capabilities/close-job.d.ts +13 -0
  206. package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
  207. package/dist/install-ci-capabilities/close-job.js +26 -0
  208. package/dist/install-ci-capabilities/close-job.js.map +1 -0
  209. package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
  210. package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
  211. package/dist/install-ci-capabilities/example-noop.js +23 -0
  212. package/dist/install-ci-capabilities/example-noop.js.map +1 -0
  213. package/dist/install-ci-capabilities/intake.d.ts +15 -0
  214. package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
  215. package/dist/install-ci-capabilities/intake.js +28 -0
  216. package/dist/install-ci-capabilities/intake.js.map +1 -0
  217. package/dist/install-ci-capabilities/verify.d.ts +14 -0
  218. package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
  219. package/dist/install-ci-capabilities/verify.js +27 -0
  220. package/dist/install-ci-capabilities/verify.js.map +1 -0
  221. package/dist/install-ci-core.d.ts +446 -0
  222. package/dist/install-ci-core.d.ts.map +1 -0
  223. package/dist/install-ci-core.js +760 -0
  224. package/dist/install-ci-core.js.map +1 -0
  225. package/dist/install-ci-github.d.ts +167 -0
  226. package/dist/install-ci-github.d.ts.map +1 -0
  227. package/dist/install-ci-github.js +315 -0
  228. package/dist/install-ci-github.js.map +1 -0
  229. package/dist/install-ci.d.ts +105 -0
  230. package/dist/install-ci.d.ts.map +1 -0
  231. package/dist/install-ci.js +363 -0
  232. package/dist/install-ci.js.map +1 -0
  233. package/dist/intake-event.d.ts +88 -0
  234. package/dist/intake-event.d.ts.map +1 -0
  235. package/dist/intake-event.js +66 -0
  236. package/dist/intake-event.js.map +1 -0
  237. package/dist/intake-marker.d.ts +95 -0
  238. package/dist/intake-marker.d.ts.map +1 -0
  239. package/dist/intake-marker.js +127 -0
  240. package/dist/intake-marker.js.map +1 -0
  241. package/dist/intake-triage.d.ts +48 -0
  242. package/dist/intake-triage.d.ts.map +1 -0
  243. package/dist/intake-triage.js +95 -0
  244. package/dist/intake-triage.js.map +1 -0
  245. package/dist/intake-trigger-template.d.ts +185 -0
  246. package/dist/intake-trigger-template.d.ts.map +1 -0
  247. package/dist/intake-trigger-template.js +449 -0
  248. package/dist/intake-trigger-template.js.map +1 -0
  249. package/dist/intake.d.ts +569 -0
  250. package/dist/intake.d.ts.map +1 -0
  251. package/dist/intake.js +1628 -0
  252. package/dist/intake.js.map +1 -0
  253. package/dist/integration-core.d.ts +539 -0
  254. package/dist/integration-core.d.ts.map +1 -0
  255. package/dist/integration-core.js +2195 -0
  256. package/dist/integration-core.js.map +1 -0
  257. package/dist/integrator.d.ts +343 -0
  258. package/dist/integrator.d.ts.map +1 -0
  259. package/dist/integrator.js +400 -0
  260. package/dist/integrator.js.map +1 -0
  261. package/dist/isolation.d.ts +219 -0
  262. package/dist/isolation.d.ts.map +1 -0
  263. package/dist/isolation.js +261 -0
  264. package/dist/isolation.js.map +1 -0
  265. package/dist/issue-provider.d.ts +349 -0
  266. package/dist/issue-provider.d.ts.map +1 -0
  267. package/dist/issue-provider.js +360 -0
  268. package/dist/issue-provider.js.map +1 -0
  269. package/dist/item-lock.d.ts +626 -0
  270. package/dist/item-lock.d.ts.map +1 -0
  271. package/dist/item-lock.js +1381 -0
  272. package/dist/item-lock.js.map +1 -0
  273. package/dist/item-path.d.ts +49 -0
  274. package/dist/item-path.d.ts.map +1 -0
  275. package/dist/item-path.js +66 -0
  276. package/dist/item-path.js.map +1 -0
  277. package/dist/ledger-lint.d.ts +129 -0
  278. package/dist/ledger-lint.d.ts.map +1 -0
  279. package/dist/ledger-lint.js +249 -0
  280. package/dist/ledger-lint.js.map +1 -0
  281. package/dist/ledger-read.d.ts +357 -0
  282. package/dist/ledger-read.d.ts.map +1 -0
  283. package/dist/ledger-read.js +442 -0
  284. package/dist/ledger-read.js.map +1 -0
  285. package/dist/ledger-write.d.ts +330 -0
  286. package/dist/ledger-write.d.ts.map +1 -0
  287. package/dist/ledger-write.js +411 -0
  288. package/dist/ledger-write.js.map +1 -0
  289. package/dist/lifecycle-gather.d.ts +30 -0
  290. package/dist/lifecycle-gather.d.ts.map +1 -0
  291. package/dist/lifecycle-gather.js +205 -0
  292. package/dist/lifecycle-gather.js.map +1 -0
  293. package/dist/lifecycle-pools.d.ts +180 -0
  294. package/dist/lifecycle-pools.d.ts.map +1 -0
  295. package/dist/lifecycle-pools.js +78 -0
  296. package/dist/lifecycle-pools.js.map +1 -0
  297. package/dist/merge-question-surfacer.d.ts +166 -0
  298. package/dist/merge-question-surfacer.d.ts.map +1 -0
  299. package/dist/merge-question-surfacer.js +297 -0
  300. package/dist/merge-question-surfacer.js.map +1 -0
  301. package/dist/mint-adr.d.ts +126 -0
  302. package/dist/mint-adr.d.ts.map +1 -0
  303. package/dist/mint-adr.js +257 -0
  304. package/dist/mint-adr.js.map +1 -0
  305. package/dist/mirror-pool-scan.d.ts +125 -0
  306. package/dist/mirror-pool-scan.d.ts.map +1 -0
  307. package/dist/mirror-pool-scan.js +104 -0
  308. package/dist/mirror-pool-scan.js.map +1 -0
  309. package/dist/needs-attention.d.ts +341 -0
  310. package/dist/needs-attention.d.ts.map +1 -0
  311. package/dist/needs-attention.js +900 -0
  312. package/dist/needs-attention.js.map +1 -0
  313. package/dist/orphan-sidecar.d.ts +79 -0
  314. package/dist/orphan-sidecar.d.ts.map +1 -0
  315. package/dist/orphan-sidecar.js +71 -0
  316. package/dist/orphan-sidecar.js.map +1 -0
  317. package/dist/output.d.ts +48 -0
  318. package/dist/output.d.ts.map +1 -0
  319. package/dist/output.js +66 -0
  320. package/dist/output.js.map +1 -0
  321. package/dist/pi-harness.d.ts +179 -0
  322. package/dist/pi-harness.d.ts.map +1 -0
  323. package/dist/pi-harness.js +342 -0
  324. package/dist/pi-harness.js.map +1 -0
  325. package/dist/placement.d.ts +99 -0
  326. package/dist/placement.d.ts.map +1 -0
  327. package/dist/placement.js +67 -0
  328. package/dist/placement.js.map +1 -0
  329. package/dist/prd-to-spec.d.ts +315 -0
  330. package/dist/prd-to-spec.d.ts.map +1 -0
  331. package/dist/prd-to-spec.js +684 -0
  332. package/dist/prd-to-spec.js.map +1 -0
  333. package/dist/prepare.d.ts +121 -0
  334. package/dist/prepare.d.ts.map +1 -0
  335. package/dist/prepare.js +140 -0
  336. package/dist/prepare.js.map +1 -0
  337. package/dist/prompt.d.ts +360 -0
  338. package/dist/prompt.d.ts.map +1 -0
  339. package/dist/prompt.js +499 -0
  340. package/dist/prompt.js.map +1 -0
  341. package/dist/protocol/ADR-FORMAT.md +47 -0
  342. package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
  343. package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
  344. package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
  345. package/dist/protocol/TASKING-PROTOCOL.md +122 -0
  346. package/dist/protocol/WORK-CONTRACT.md +276 -0
  347. package/dist/protocol/spec-template.md +71 -0
  348. package/dist/protocol/task-template.md +65 -0
  349. package/dist/readiness.d.ts +66 -0
  350. package/dist/readiness.d.ts.map +1 -0
  351. package/dist/readiness.js +36 -0
  352. package/dist/readiness.js.map +1 -0
  353. package/dist/reap-branches.d.ts +102 -0
  354. package/dist/reap-branches.d.ts.map +1 -0
  355. package/dist/reap-branches.js +149 -0
  356. package/dist/reap-branches.js.map +1 -0
  357. package/dist/recover-isolated.d.ts +72 -0
  358. package/dist/recover-isolated.d.ts.map +1 -0
  359. package/dist/recover-isolated.js +188 -0
  360. package/dist/recover-isolated.js.map +1 -0
  361. package/dist/registry.d.ts +172 -0
  362. package/dist/registry.d.ts.map +1 -0
  363. package/dist/registry.js +296 -0
  364. package/dist/registry.js.map +1 -0
  365. package/dist/repo-config.d.ts +201 -0
  366. package/dist/repo-config.d.ts.map +1 -0
  367. package/dist/repo-config.js +414 -0
  368. package/dist/repo-config.js.map +1 -0
  369. package/dist/repo-key.d.ts +20 -0
  370. package/dist/repo-key.d.ts.map +1 -0
  371. package/dist/repo-key.js +68 -0
  372. package/dist/repo-key.js.map +1 -0
  373. package/dist/repo-mirror.d.ts +177 -0
  374. package/dist/repo-mirror.d.ts.map +1 -0
  375. package/dist/repo-mirror.js +271 -0
  376. package/dist/repo-mirror.js.map +1 -0
  377. package/dist/retry-backoff.d.ts +90 -0
  378. package/dist/retry-backoff.d.ts.map +1 -0
  379. package/dist/retry-backoff.js +98 -0
  380. package/dist/retry-backoff.js.map +1 -0
  381. package/dist/review-gate.d.ts +173 -0
  382. package/dist/review-gate.d.ts.map +1 -0
  383. package/dist/review-gate.js +261 -0
  384. package/dist/review-gate.js.map +1 -0
  385. package/dist/review-verdict.d.ts +149 -0
  386. package/dist/review-verdict.d.ts.map +1 -0
  387. package/dist/review-verdict.js +332 -0
  388. package/dist/review-verdict.js.map +1 -0
  389. package/dist/run.d.ts +221 -0
  390. package/dist/run.d.ts.map +1 -0
  391. package/dist/run.js +963 -0
  392. package/dist/run.js.map +1 -0
  393. package/dist/scan.d.ts +308 -0
  394. package/dist/scan.d.ts.map +1 -0
  395. package/dist/scan.js +374 -0
  396. package/dist/scan.js.map +1 -0
  397. package/dist/select-order.d.ts +75 -0
  398. package/dist/select-order.d.ts.map +1 -0
  399. package/dist/select-order.js +108 -0
  400. package/dist/select-order.js.map +1 -0
  401. package/dist/select-priority.d.ts +188 -0
  402. package/dist/select-priority.d.ts.map +1 -0
  403. package/dist/select-priority.js +80 -0
  404. package/dist/select-priority.js.map +1 -0
  405. package/dist/select.d.ts +25 -0
  406. package/dist/select.d.ts.map +1 -0
  407. package/dist/select.js +43 -0
  408. package/dist/select.js.map +1 -0
  409. package/dist/session-path.d.ts +36 -0
  410. package/dist/session-path.d.ts.map +1 -0
  411. package/dist/session-path.js +129 -0
  412. package/dist/session-path.js.map +1 -0
  413. package/dist/sidecar-apply.d.ts +83 -0
  414. package/dist/sidecar-apply.d.ts.map +1 -0
  415. package/dist/sidecar-apply.js +111 -0
  416. package/dist/sidecar-apply.js.map +1 -0
  417. package/dist/sidecar.d.ts +245 -0
  418. package/dist/sidecar.d.ts.map +1 -0
  419. package/dist/sidecar.js +481 -0
  420. package/dist/sidecar.js.map +1 -0
  421. package/dist/slug-namespace.d.ts +204 -0
  422. package/dist/slug-namespace.d.ts.map +1 -0
  423. package/dist/slug-namespace.js +229 -0
  424. package/dist/slug-namespace.js.map +1 -0
  425. package/dist/spec-complete.d.ts +44 -0
  426. package/dist/spec-complete.d.ts.map +1 -0
  427. package/dist/spec-complete.js +69 -0
  428. package/dist/spec-complete.js.map +1 -0
  429. package/dist/start.d.ts +97 -0
  430. package/dist/start.d.ts.map +1 -0
  431. package/dist/start.js +633 -0
  432. package/dist/start.js.map +1 -0
  433. package/dist/status.d.ts +199 -0
  434. package/dist/status.d.ts.map +1 -0
  435. package/dist/status.js +228 -0
  436. package/dist/status.js.map +1 -0
  437. package/dist/surface-gate.d.ts +162 -0
  438. package/dist/surface-gate.d.ts.map +1 -0
  439. package/dist/surface-gate.js +206 -0
  440. package/dist/surface-gate.js.map +1 -0
  441. package/dist/surface-persist.d.ts +86 -0
  442. package/dist/surface-persist.d.ts.map +1 -0
  443. package/dist/surface-persist.js +129 -0
  444. package/dist/surface-persist.js.map +1 -0
  445. package/dist/tasker-review-loop.d.ts +249 -0
  446. package/dist/tasker-review-loop.d.ts.map +1 -0
  447. package/dist/tasker-review-loop.js +369 -0
  448. package/dist/tasker-review-loop.js.map +1 -0
  449. package/dist/tasking-eligibility.d.ts +74 -0
  450. package/dist/tasking-eligibility.d.ts.map +1 -0
  451. package/dist/tasking-eligibility.js +52 -0
  452. package/dist/tasking-eligibility.js.map +1 -0
  453. package/dist/tasking-lock.d.ts +111 -0
  454. package/dist/tasking-lock.d.ts.map +1 -0
  455. package/dist/tasking-lock.js +256 -0
  456. package/dist/tasking-lock.js.map +1 -0
  457. package/dist/tasking.d.ts +275 -0
  458. package/dist/tasking.d.ts.map +1 -0
  459. package/dist/tasking.js +952 -0
  460. package/dist/tasking.js.map +1 -0
  461. package/dist/triage-gate.d.ts +127 -0
  462. package/dist/triage-gate.d.ts.map +1 -0
  463. package/dist/triage-gate.js +139 -0
  464. package/dist/triage-gate.js.map +1 -0
  465. package/dist/triage-persist.d.ts +163 -0
  466. package/dist/triage-persist.d.ts.map +1 -0
  467. package/dist/triage-persist.js +387 -0
  468. package/dist/triage-persist.js.map +1 -0
  469. package/dist/verdict-json.d.ts +32 -0
  470. package/dist/verdict-json.d.ts.map +1 -0
  471. package/dist/verdict-json.js +74 -0
  472. package/dist/verdict-json.js.map +1 -0
  473. package/dist/verify-workflow-template.d.ts +60 -0
  474. package/dist/verify-workflow-template.d.ts.map +1 -0
  475. package/dist/verify-workflow-template.js +126 -0
  476. package/dist/verify-workflow-template.js.map +1 -0
  477. package/dist/verify.d.ts +60 -0
  478. package/dist/verify.d.ts.map +1 -0
  479. package/dist/verify.js +62 -0
  480. package/dist/verify.js.map +1 -0
  481. package/dist/watch-session.d.ts +112 -0
  482. package/dist/watch-session.d.ts.map +1 -0
  483. package/dist/watch-session.js +347 -0
  484. package/dist/watch-session.js.map +1 -0
  485. package/dist/work-layout.d.ts +198 -0
  486. package/dist/work-layout.d.ts.map +1 -0
  487. package/dist/work-layout.js +217 -0
  488. package/dist/work-layout.js.map +1 -0
  489. package/dist/work-on.d.ts +154 -0
  490. package/dist/work-on.d.ts.map +1 -0
  491. package/dist/work-on.js +387 -0
  492. package/dist/work-on.js.map +1 -0
  493. package/dist/workspace.d.ts +224 -0
  494. package/dist/workspace.d.ts.map +1 -0
  495. package/dist/workspace.js +325 -0
  496. package/dist/workspace.js.map +1 -0
  497. package/package.json +46 -2
  498. package/src/advance-ci-template.ts +203 -0
  499. package/src/advance-classify.ts +197 -0
  500. package/src/advance-drivers.ts +414 -0
  501. package/src/advance-isolated.ts +432 -0
  502. package/src/advance-lifecycle-template.ts +791 -0
  503. package/src/advance-loop-driver.ts +745 -0
  504. package/src/advance-treeless-publish.ts +177 -0
  505. package/src/advance.ts +1564 -0
  506. package/src/advancing-lock.ts +988 -0
  507. package/src/agent-launch.ts +137 -0
  508. package/src/agent-stop.ts +361 -0
  509. package/src/apply-decide.ts +242 -0
  510. package/src/apply-merge-action.ts +502 -0
  511. package/src/apply-persist.ts +518 -0
  512. package/src/arbiter.ts +372 -0
  513. package/src/brand.ts +111 -0
  514. package/src/buildable-body.ts +196 -0
  515. package/src/categorise.ts +158 -0
  516. package/src/claim-cas.ts +513 -0
  517. package/src/cli-spinner.ts +225 -0
  518. package/src/cli.ts +4369 -0
  519. package/src/close-job-template.ts +236 -0
  520. package/src/close-job.ts +319 -0
  521. package/src/complete.ts +1379 -0
  522. package/src/concurrency.ts +151 -0
  523. package/src/config-override.ts +116 -0
  524. package/src/config.ts +883 -0
  525. package/src/continue-branch.ts +542 -0
  526. package/src/cwd-section.ts +392 -0
  527. package/src/decision-engine.ts +272 -0
  528. package/src/detect.ts +124 -0
  529. package/src/do-autopick.ts +223 -0
  530. package/src/do-config.ts +589 -0
  531. package/src/do-remote-auto.ts +197 -0
  532. package/src/do.ts +2623 -0
  533. package/src/drop-source.ts +194 -0
  534. package/src/eligibility.ts +79 -0
  535. package/src/env-config.ts +305 -0
  536. package/src/failure-cause.ts +142 -0
  537. package/src/format.ts +313 -0
  538. package/src/frontmatter.ts +485 -0
  539. package/src/gate-readiness.ts +147 -0
  540. package/src/gc.ts +510 -0
  541. package/src/gh-failure.ts +53 -0
  542. package/src/git.ts +186 -0
  543. package/src/github.ts +468 -0
  544. package/src/harness.ts +355 -0
  545. package/src/identity.ts +322 -0
  546. package/src/index.ts +785 -0
  547. package/src/install-ci-branch-protection.ts +255 -0
  548. package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
  549. package/src/install-ci-capabilities/close-job.ts +32 -0
  550. package/src/install-ci-capabilities/example-noop.ts +24 -0
  551. package/src/install-ci-capabilities/intake.ts +34 -0
  552. package/src/install-ci-capabilities/verify.ts +33 -0
  553. package/src/install-ci-core.ts +1088 -0
  554. package/src/install-ci-github.ts +376 -0
  555. package/src/install-ci.ts +552 -0
  556. package/src/intake-event.ts +102 -0
  557. package/src/intake-marker.ts +195 -0
  558. package/src/intake-triage.ts +138 -0
  559. package/src/intake-trigger-template.ts +591 -0
  560. package/src/intake.ts +2445 -0
  561. package/src/integration-core.ts +3065 -0
  562. package/src/integrator.ts +771 -0
  563. package/src/isolation.ts +484 -0
  564. package/src/issue-provider.ts +733 -0
  565. package/src/item-lock.ts +1858 -0
  566. package/src/item-path.ts +75 -0
  567. package/src/ledger-lint.ts +332 -0
  568. package/src/ledger-read.ts +924 -0
  569. package/src/ledger-write.ts +865 -0
  570. package/src/lifecycle-gather.ts +298 -0
  571. package/src/lifecycle-pools.ts +250 -0
  572. package/src/merge-question-surfacer.ts +496 -0
  573. package/src/mint-adr.ts +362 -0
  574. package/src/mirror-pool-scan.ts +240 -0
  575. package/src/needs-attention.ts +1506 -0
  576. package/src/orphan-sidecar.ts +150 -0
  577. package/src/output.ts +89 -0
  578. package/src/pi-harness.ts +403 -0
  579. package/src/placement.ts +131 -0
  580. package/src/prd-to-spec.ts +1023 -0
  581. package/src/prepare.ts +230 -0
  582. package/src/prompt.ts +760 -0
  583. package/src/readiness.ts +98 -0
  584. package/src/reap-branches.ts +278 -0
  585. package/src/recover-isolated.ts +276 -0
  586. package/src/registry.ts +475 -0
  587. package/src/repo-config.ts +550 -0
  588. package/src/repo-key.ts +74 -0
  589. package/src/repo-mirror.ts +367 -0
  590. package/src/retry-backoff.ts +130 -0
  591. package/src/review-gate.ts +389 -0
  592. package/src/review-verdict.ts +422 -0
  593. package/src/run.ts +1430 -0
  594. package/src/scan.ts +611 -0
  595. package/src/select-order.ts +143 -0
  596. package/src/select-priority.ts +266 -0
  597. package/src/select.ts +62 -0
  598. package/src/session-path.ts +153 -0
  599. package/src/sidecar-apply.ts +216 -0
  600. package/src/sidecar.ts +700 -0
  601. package/src/slug-namespace.ts +367 -0
  602. package/src/spec-complete.ts +118 -0
  603. package/src/start.ts +974 -0
  604. package/src/status.ts +441 -0
  605. package/src/surface-gate.ts +337 -0
  606. package/src/surface-persist.ts +241 -0
  607. package/src/tasker-review-loop.ts +671 -0
  608. package/src/tasking-eligibility.ts +114 -0
  609. package/src/tasking-lock.ts +416 -0
  610. package/src/tasking.ts +1438 -0
  611. package/src/triage-gate.ts +248 -0
  612. package/src/triage-persist.ts +570 -0
  613. package/src/verdict-json.ts +73 -0
  614. package/src/verify-workflow-template.ts +159 -0
  615. package/src/verify.ts +123 -0
  616. package/src/watch-session.ts +397 -0
  617. package/src/work-layout.ts +262 -0
  618. package/src/work-on.ts +660 -0
  619. package/src/workspace.ts +502 -0
@@ -0,0 +1,422 @@
1
+ /**
2
+ * The UNIFIED review-verdict type + parser + the shared JSON-verdict-contract
3
+ * prompt helper for the runner-invoked **review discipline**
4
+ * (`work/protocol/REVIEW-PROTOCOL.md`, source-of-truth
5
+ * `skills/setup/protocol/REVIEW-PROTOCOL.md`).
6
+ *
7
+ * This is the keystone of the `runner-invoked-disciplines-into-protocol` prd
8
+ * (task 1, D4): every runner-invoked review prompt builder
9
+ * ({@link buildReviewPrompt}, {@link buildTaskAcceptancePrompt} in
10
+ * `review-gate.ts`; {@link buildLoneTaskReviewPrompt} in `intake.ts`;
11
+ * {@link buildTaskReviewPrompt} in `tasker-review-loop.ts`) POINTS at
12
+ * `REVIEW-PROTOCOL.md` for the discipline + calls {@link verdictContractPrompt}
13
+ * for the JSON-emitted-shape prose. None of them re-inlines the lenses or the
14
+ * verdict contract; this module is the single home.
15
+ *
16
+ * The PARSER is the source of truth for the EMITTED SHAPE (D2):
17
+ * `REVIEW-PROTOCOL.md` mirrors what `parseReviewVerdict` enforces (a
18
+ * fixture-matches-doc test pins the two together). Discipline content is owned
19
+ * by the doc; enforced shape is owned by the parser.
20
+ */
21
+
22
+ import {extractJsonObjectSpan} from './verdict-json.js';
23
+ import {resolveProtocolDoc} from './prompt.js';
24
+
25
+ /** A single review finding — the `severity`/`question`/`context` triple. */
26
+ export interface ReviewFinding {
27
+ /** Whether this finding blocks (keeps the work out of "ready") or is a nit. */
28
+ severity: 'blocking' | 'non-blocking';
29
+ /** The question / defect, with enough context to act. */
30
+ question: string;
31
+ /** The relevant excerpt, `file:line`, or reasoning. */
32
+ context?: string;
33
+ }
34
+
35
+ /**
36
+ * A full-content edit the review agent wants applied (the improver loop's
37
+ * between-passes step). `path` is repo-relative; `content` is the FULL
38
+ * replacement file body. The runner writes it; the agent does no disk/git.
39
+ */
40
+ export interface TaskEdit {
41
+ /** Repo-relative path of the candidate task file to write. */
42
+ path: string;
43
+ /** The full replacement content for that file. */
44
+ content: string;
45
+ }
46
+
47
+ /**
48
+ * A task the review judged UNCERTAIN — emit it `needsAnswers: true` with the
49
+ * questions in its body. Used by the tasker improver loop's non-converge sink.
50
+ */
51
+ export interface UncertainTask {
52
+ /** Repo-relative path of the uncertain candidate task. */
53
+ path: string;
54
+ /** The open questions to record in the task body. */
55
+ questions: string[];
56
+ }
57
+
58
+ /**
59
+ * The UNIFIED review verdict — one type across all four runner-invoked review
60
+ * call sites. The required fields (`verdict`, `findings`) are common; the
61
+ * optional channels are caller-specific (each builder's prompt names which
62
+ * channels to fill). The parser tolerates any subset; routing code reads only
63
+ * the channels its caller asked for.
64
+ */
65
+ export interface ReviewVerdict {
66
+ /** `approve` lets the artifact proceed; `block` routes to needs-attention. */
67
+ verdict: 'approve' | 'block';
68
+ /** The findings the agent surfaced (may be empty on an approve). */
69
+ findings: ReviewFinding[];
70
+ /**
71
+ * For the PR/code review gate: the deliberately-authored, human-readable
72
+ * REVIEW prose the in-core PR-comment poster posts. Advisory only — never
73
+ * gates the verdict (routing uses ONLY `verdict`/`findings`).
74
+ */
75
+ review?: string;
76
+ /** For the tasker improver loop: full-content edits to apply between passes. */
77
+ edits?: TaskEdit[];
78
+ /**
79
+ * For the lone-task review: a single in-memory full-replacement task BODY
80
+ * (the markdown AFTER the frontmatter), applied before the next round.
81
+ */
82
+ edit?: string;
83
+ /** For the lone-task review: open question(s) carried into the ASK comment. */
84
+ questions?: string[];
85
+ /** For the tasker improver loop: specific tasks to emit `needsAnswers: true`. */
86
+ uncertainTasks?: UncertainTask[];
87
+ /** For the tasker improver loop: route the WHOLE prd to needs-attention. */
88
+ decompositionUnclear?: {questions: string[]};
89
+ }
90
+
91
+ /** Raised when the review agent ran but produced no parseable verdict. */
92
+ export class ReviewParseError extends Error {}
93
+
94
+ /**
95
+ * Parse the unified review verdict out of the review agent's textual output.
96
+ * The agent may wrap the JSON object in prose / a fenced block, so the first
97
+ * JSON object carrying a `verdict` field is extracted via the shared
98
+ * {@link extractJsonObjectSpan}, JSON-parsed, and validated. The verdict shape
99
+ * is the source of truth for what `REVIEW-PROTOCOL.md` describes (D2).
100
+ *
101
+ * Throws {@link ReviewParseError} on: no JSON object, invalid JSON, or a
102
+ * `verdict` not in `{approve, block}`. The caller treats any throw as
103
+ * needs-attention — NEVER a silent approve.
104
+ */
105
+ export function parseReviewVerdict(output: string): ReviewVerdict {
106
+ const span = extractJsonObjectSpan(output);
107
+ if (span === undefined) {
108
+ throw new ReviewParseError(
109
+ 'review agent produced no parseable {verdict, findings} result',
110
+ );
111
+ }
112
+ const slice = output.slice(span.start, span.end);
113
+ let parsed: unknown;
114
+ try {
115
+ // STRICT FIRST: already-valid JSON parses here and is returned UNTOUCHED —
116
+ // the repair pass never runs for it (no chance to alter a correct payload).
117
+ parsed = JSON.parse(slice);
118
+ } catch (strictErr) {
119
+ // ONE lenient repair pass for the CONTROL-CHAR class (raw newline / tab / CR /
120
+ // other C0 char left unescaped inside a string field, common on large diffs +
121
+ // weaker models). The repair is NARROW: it only escapes control chars INSIDE
122
+ // strings; it NEVER touches JSON structure or token values (no trailing-comma
123
+ // stripping, no quoting bare tokens, no coercion), so it can never launder a
124
+ // genuinely-malformed or meaningfully-WRONG verdict into a false approve/block.
125
+ // A still-failing parse re-throws the ORIGINAL strict error (so direction-1's
126
+ // `runGate2Review` catch routes it to needs-attention, never a silent approve).
127
+ // NOTE the boundary: this does NOT fix an unescaped inner double-quote (which
128
+ // mis-bounds the extracted span before repair even runs); that class is handled
129
+ // by routing (direction 1) + the tightened contract (direction 3).
130
+ try {
131
+ parsed = JSON.parse(repairJsonControlChars(slice));
132
+ } catch {
133
+ throw new ReviewParseError(
134
+ `review verdict was not valid JSON: ${(strictErr as Error).message}`,
135
+ );
136
+ }
137
+ }
138
+ // A repaired parse STILL flows through validation, so a repaired
139
+ // `{"verdict":"maybe"}` (valid JSON, invalid VALUE) still throws here — the
140
+ // repair recovers SYNTAX, never bypasses the verdict-VALUE contract.
141
+ return validateVerdict(parsed);
142
+ }
143
+
144
+ /**
145
+ * The NARROW lenient repair (direction 2): walk the extracted JSON slice and
146
+ * escape any raw control char (a C0 char `< 0x20`, which JSON forbids inside a
147
+ * string literal) that appears INSIDE a string. OUTSIDE a string the structure
148
+ * is left byte-for-byte untouched. Escape-tracking is load-bearing: an escaped
149
+ * `\"` must NOT be read as the string's closing quote (or a following raw
150
+ * newline would be mis-handled). This recovers ONLY the control-char class; it
151
+ * performs NO structural change and NO token coercion, so it cannot turn a real
152
+ * reject into a false approve.
153
+ */
154
+ function repairJsonControlChars(text: string): string {
155
+ let out = '';
156
+ let inString = false;
157
+ let escaped = false;
158
+ for (let i = 0; i < text.length; i++) {
159
+ const ch = text[i];
160
+ const code = ch.charCodeAt(0);
161
+ if (inString) {
162
+ if (escaped) {
163
+ out += ch;
164
+ escaped = false;
165
+ continue;
166
+ }
167
+ if (ch === '\\') {
168
+ out += ch;
169
+ escaped = true;
170
+ continue;
171
+ }
172
+ if (ch === '"') {
173
+ out += ch;
174
+ inString = false;
175
+ continue;
176
+ }
177
+ if (code < 0x20) {
178
+ if (ch === '\n') out += '\\n';
179
+ else if (ch === '\t') out += '\\t';
180
+ else if (ch === '\r') out += '\\r';
181
+ else out += '\\u' + code.toString(16).padStart(4, '0');
182
+ continue;
183
+ }
184
+ out += ch;
185
+ continue;
186
+ }
187
+ if (ch === '"') {
188
+ inString = true;
189
+ }
190
+ out += ch;
191
+ }
192
+ return out;
193
+ }
194
+
195
+ function validateVerdict(parsed: unknown): ReviewVerdict {
196
+ if (typeof parsed !== 'object' || parsed === null) {
197
+ throw new ReviewParseError('review verdict was not an object');
198
+ }
199
+ const obj = parsed as Record<string, unknown>;
200
+ const verdict = obj.verdict;
201
+ if (verdict !== 'approve' && verdict !== 'block') {
202
+ throw new ReviewParseError(
203
+ `review verdict was not 'approve' or 'block' (got ${JSON.stringify(verdict)})`,
204
+ );
205
+ }
206
+ const rawFindings = Array.isArray(obj.findings) ? obj.findings : [];
207
+ const findings: ReviewFinding[] = rawFindings.map((f) => {
208
+ const item = (typeof f === 'object' && f !== null ? f : {}) as Record<
209
+ string,
210
+ unknown
211
+ >;
212
+ const severity = item.severity === 'blocking' ? 'blocking' : 'non-blocking';
213
+ return {
214
+ severity,
215
+ question: typeof item.question === 'string' ? item.question : '',
216
+ ...(typeof item.context === 'string' ? {context: item.context} : {}),
217
+ };
218
+ });
219
+ const edits = parseEdits(obj.edits);
220
+ const uncertainTasks = parseUncertainTasks(obj.uncertainTasks);
221
+ const decompositionUnclear = parseDecompositionUnclear(
222
+ obj.decompositionUnclear,
223
+ );
224
+ const questions = Array.isArray(obj.questions)
225
+ ? obj.questions.filter((q): q is string => typeof q === 'string')
226
+ : [];
227
+ return {
228
+ verdict,
229
+ findings,
230
+ ...(typeof obj.review === 'string' ? {review: obj.review} : {}),
231
+ ...(typeof obj.edit === 'string' ? {edit: obj.edit} : {}),
232
+ ...(edits.length > 0 ? {edits} : {}),
233
+ ...(questions.length > 0 ? {questions} : {}),
234
+ ...(uncertainTasks.length > 0 ? {uncertainTasks} : {}),
235
+ ...(decompositionUnclear ? {decompositionUnclear} : {}),
236
+ };
237
+ }
238
+
239
+ function parseEdits(raw: unknown): TaskEdit[] {
240
+ if (!Array.isArray(raw)) {
241
+ return [];
242
+ }
243
+ const out: TaskEdit[] = [];
244
+ for (const e of raw) {
245
+ if (typeof e !== 'object' || e === null) {
246
+ continue;
247
+ }
248
+ const item = e as Record<string, unknown>;
249
+ if (typeof item.path === 'string' && typeof item.content === 'string') {
250
+ out.push({path: item.path, content: item.content});
251
+ }
252
+ }
253
+ return out;
254
+ }
255
+
256
+ function parseUncertainTasks(raw: unknown): UncertainTask[] {
257
+ if (!Array.isArray(raw)) {
258
+ return [];
259
+ }
260
+ const out: UncertainTask[] = [];
261
+ for (const u of raw) {
262
+ if (typeof u !== 'object' || u === null) {
263
+ continue;
264
+ }
265
+ const item = u as Record<string, unknown>;
266
+ if (typeof item.path !== 'string') {
267
+ continue;
268
+ }
269
+ const questions = Array.isArray(item.questions)
270
+ ? item.questions.filter((q): q is string => typeof q === 'string')
271
+ : [];
272
+ out.push({path: item.path, questions});
273
+ }
274
+ return out;
275
+ }
276
+
277
+ function parseDecompositionUnclear(
278
+ raw: unknown,
279
+ ): {questions: string[]} | undefined {
280
+ if (typeof raw !== 'object' || raw === null) {
281
+ return undefined;
282
+ }
283
+ const item = raw as Record<string, unknown>;
284
+ const questions = Array.isArray(item.questions)
285
+ ? item.questions.filter((q): q is string => typeof q === 'string')
286
+ : [];
287
+ return {questions};
288
+ }
289
+
290
+ /**
291
+ * The shared JSON-verdict-contract prompt block — ONE function, called by all
292
+ * four review-prompt builders. Returns the prose describing the unified
293
+ * {@link ReviewVerdict} emitted shape (the prose mirrors what
294
+ * {@link parseReviewVerdict} enforces; D2). Per-builder framing (who you are,
295
+ * what you are reviewing, which optional channels to fill) stays in each
296
+ * builder; this block is the single source of truth for the shape.
297
+ *
298
+ * The block is intentionally generous about optional channels — each caller's
299
+ * prompt names which ones it wants. Unused channels are ignored by the parser.
300
+ */
301
+ export function verdictContractPrompt(): string {
302
+ return [
303
+ '## Your output \u2014 ONE single JSON object (no prose OUTSIDE it)',
304
+ '',
305
+ 'Emit a single JSON object of this exact shape (see',
306
+ '`work/protocol/REVIEW-PROTOCOL.md` \u2192 "Your output" for the prose-described',
307
+ 'contract this mirrors). The example below is EXPANDED over several lines for',
308
+ 'READABILITY, but you MUST emit it MINIFIED \u2014 ONE single line, no newlines',
309
+ 'between the keys:',
310
+ '',
311
+ '```json',
312
+ '{"verdict": "approve" | "block",',
313
+ ' "findings": [',
314
+ ' {"severity": "blocking" | "non-blocking", "question": "\u2026", "context": "\u2026"}',
315
+ ' ],',
316
+ ' "review": "<the human-readable PR-comment prose, when the caller asks for it>",',
317
+ ' "edits": [ {"path": "work/tasks/backlog/<slug>.md", "content": "<full replacement>"} ],',
318
+ ' "edit": "<single in-memory replacement body, for the lone-task review>",',
319
+ ' "questions": ["<open question for the human>"],',
320
+ ' "uncertainTasks": [ {"path": "work/tasks/backlog/<slug>.md", "questions": ["\u2026"]} ],',
321
+ ' "decompositionUnclear": {"questions": ["\u2026"]}}',
322
+ '```',
323
+ '',
324
+ '- `verdict` MUST be exactly `approve` or `block`. Use `block` with at least',
325
+ ' one blocking finding when the artifact does not deliver / drifts / hides',
326
+ ' a defect a human reviewer would flag; otherwise `approve`.',
327
+ "- `findings` is required (may be empty). Each finding's `severity` is",
328
+ ' `blocking` (keeps the item out of "ready") or `non-blocking` (a nit /',
329
+ ' future improvement). Give each `question` enough context to act WITHOUT',
330
+ ' re-deriving it. `context` is the relevant excerpt, `file:line`, or',
331
+ ' reasoning.',
332
+ '- The optional channels (`review`, `edits`, `edit`, `questions`,',
333
+ ' `uncertainTasks`, `decompositionUnclear`) are OPT-IN: only fill the ones',
334
+ " the caller's framing names. Unused channels are ignored.",
335
+ '',
336
+ parseableJsonContractPrompt('verdict', 'review'),
337
+ ].join('\n');
338
+ }
339
+
340
+ /**
341
+ * The shared "emit DEFENSIVE, parseable, minified JSON" contract block — the
342
+ * hard-won discipline that stops a weak model from stranding the run with an
343
+ * unparseable emit (a dropped escape on an inner `"`, a raw newline in a string,
344
+ * an over-long field). It was learned on the Gate-2 verdict seam
345
+ * (observation `gate2-review-verdict-json-parse-crash-on-large-diffs`) and is
346
+ * now SHARED so EVERY agent→JSON→dispatch seam carries it, not just the verdict
347
+ * gate: {@link verdictContractPrompt} appends it, and so does the SURFACE gate's
348
+ * `buildSurfacePrompt` (observation
349
+ * `surface-rung-agent-emits-no-parseable-questions` — the same class of failure
350
+ * on the surface rung, where the prompt previously lacked this hardening AND
351
+ * showed a multi-line example that invited pretty-printing).
352
+ *
353
+ * @param emitNoun what the emitted object is called in prose (`verdict` /
354
+ * `result`) — only the wording differs; the discipline is identical.
355
+ * @param longestField the name of the field most likely to be long (the one to
356
+ * length-cap), or undefined to omit the length-cap bullet.
357
+ */
358
+ export function parseableJsonContractPrompt(
359
+ emitNoun = 'verdict',
360
+ longestField?: string,
361
+ ): string {
362
+ const lengthCap =
363
+ longestField === undefined
364
+ ? []
365
+ : [
366
+ `- Keep the LONGEST field (\`${longestField}\`) under ~1500 characters; say`,
367
+ ' less, not more. A long, multi-paragraph field is exactly what corrupts',
368
+ ' the JSON.',
369
+ ];
370
+ return [
371
+ '### Keep the JSON PARSEABLE (this is where weak models fail)',
372
+ '',
373
+ `A malformed ${emitNoun} strands the work, so emit DEFENSIVELY:`,
374
+ '- Emit it MINIFIED: ONE single line, no pretty-printing, no blank lines.',
375
+ '- INSIDE every string value, do NOT use a literal double-quote `"`. If you',
376
+ ' must quote something in prose, PARAPHRASE it or use SINGLE quotes \u2014 a',
377
+ ` dropped escape on an inner \`"\` is the #1 cause of an unparseable ${emitNoun}.`,
378
+ '- Keep every string field SHORT and SINGLE-LINE. Do NOT embed a raw newline,',
379
+ ' tab, or other control char in a string; if you genuinely need a break, write',
380
+ ' the two characters `\\n` (a backslash then n), never a real newline.',
381
+ ...lengthCap,
382
+ ].join('\n');
383
+ }
384
+
385
+ /**
386
+ * The shared prompt block that POINTS the spawned agent at the in-band review
387
+ * discipline doc (`work/protocol/REVIEW-PROTOCOL.md` in the set-up target repo,
388
+ * or the vendored fallback) instead of re-inlining the lenses. The four review
389
+ * builders call this so the discipline content lives in ONE place
390
+ * (`REVIEW-PROTOCOL.md`), never duplicated in the prompt builders.
391
+ */
392
+ export function reviewDisciplinePrompt(): string {
393
+ return [
394
+ '## The review discipline',
395
+ '',
396
+ 'Run the review discipline defined in `work/protocol/REVIEW-PROTOCOL.md`',
397
+ '(the in-band, protocol-native review protocol every set-up repo carries;',
398
+ 'the human-facing pointer is `skills/review/SKILL.md`). Apply its lenses',
399
+ 'IN ORDER, ENDING in the destination check ("if this is built/merged',
400
+ 'exactly as written, do we end up with the system the prd/task',
401
+ 'goal describes?"). Be ADVERSARIAL; verify against what ACTUALLY LANDED',
402
+ '(the bytes on disk), not intent. Weight findings by REAL impact \u2014 the',
403
+ 'lenses find candidates, impact decides severity (a technically-true nit',
404
+ 'no one would hit is not a block). Flag, do not guess.',
405
+ ].join('\n');
406
+ }
407
+
408
+ /**
409
+ * Resolve `REVIEW-PROTOCOL.md` in the target repo / vendored fallback / dev
410
+ * walk \u2014 a thin alias around {@link resolveProtocolDoc} for callers (and
411
+ * tests) that want to assert the doc is reachable. The four builders themselves
412
+ * do NOT call this (they reference the path BY NAME in the prompt prose, so the
413
+ * spawned agent reads its repo's own `work/protocol/REVIEW-PROTOCOL.md`), but
414
+ * keeping the helper here lets the resolver test cover the protocol-doc set in
415
+ * one place.
416
+ */
417
+ export function resolveReviewProtocolPath(
418
+ cwd?: string,
419
+ override?: string,
420
+ ): string {
421
+ return resolveProtocolDoc('REVIEW-PROTOCOL.md', cwd, override);
422
+ }