@quickchatai/pi-quickreview 0.0.0-stage → 1.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 (689) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +75 -2
  3. package/assets/agents/pass-abstraction.md +64 -0
  4. package/assets/agents/pass-ask-human.md +134 -0
  5. package/assets/agents/pass-backcompat.md +67 -0
  6. package/assets/agents/pass-baseline.md +61 -0
  7. package/assets/agents/pass-behaviour-delta.md +64 -0
  8. package/assets/agents/pass-bounds.md +36 -0
  9. package/assets/agents/pass-claims.md +31 -0
  10. package/assets/agents/pass-concurrency.md +168 -0
  11. package/assets/agents/pass-consistency.md +57 -0
  12. package/assets/agents/pass-contracts.md +30 -0
  13. package/assets/agents/pass-data-safety.md +54 -0
  14. package/assets/agents/pass-deferred.md +35 -0
  15. package/assets/agents/pass-delivery.md +37 -0
  16. package/assets/agents/pass-duplication.md +60 -0
  17. package/assets/agents/pass-intent.md +63 -0
  18. package/assets/agents/pass-lint-conformance.md +46 -0
  19. package/assets/agents/pass-maintainability.md +67 -0
  20. package/assets/agents/pass-placement.md +68 -0
  21. package/assets/agents/pass-prod-risk.md +24 -0
  22. package/assets/agents/pass-rollout.md +32 -0
  23. package/assets/agents/pass-roundtrip.md +46 -0
  24. package/assets/agents/pass-security.md +31 -0
  25. package/assets/agents/pass-simplicity.md +68 -0
  26. package/assets/agents/pass-statelessness.md +27 -0
  27. package/assets/agents/pass-style.md +37 -0
  28. package/assets/agents/pass-sweep.md +57 -0
  29. package/assets/agents/pass-tests.md +58 -0
  30. package/assets/agents/pass-ui.md +23 -0
  31. package/assets/agents/pass-validate.md +50 -0
  32. package/assets/agents/pass-widened.md +46 -0
  33. package/assets/agents/scan/pass-scan.md +86 -0
  34. package/assets/config.example.toml +1067 -0
  35. package/assets/deploy/reviewer/AGENTS.override.md +12 -0
  36. package/assets/profiles/default/README.md +21 -0
  37. package/assets/profiles/default/addenda/.gitkeep +0 -0
  38. package/assets/profiles/default/profile.toml +17 -0
  39. package/assets/profiles/example-django/README.md +21 -0
  40. package/assets/profiles/example-django/addenda/10-migration-discipline.md +13 -0
  41. package/assets/profiles/example-django/addenda/20-new-column-nullability.md +12 -0
  42. package/assets/profiles/example-django/addenda/30-test-doctrine.md +12 -0
  43. package/assets/profiles/example-django/addenda/40-orm-usage.md +19 -0
  44. package/assets/profiles/example-django/addenda/50-declared-shape.md +10 -0
  45. package/assets/profiles/example-django/addenda/60-config-placement.md +14 -0
  46. package/assets/profiles/example-django/heuristics.toml +24 -0
  47. package/assets/profiles/example-django/profile.toml +9 -0
  48. package/assets/profiles/fast/README.md +24 -0
  49. package/assets/profiles/fast/profile.toml +59 -0
  50. package/assets/profiles/minimal/README.md +17 -0
  51. package/assets/profiles/minimal/addenda/.gitkeep +0 -0
  52. package/assets/profiles/minimal/profile.toml +8 -0
  53. package/assets/profiles/snappy/README.md +24 -0
  54. package/assets/profiles/snappy/addenda/10-race-as-question.md +6 -0
  55. package/assets/profiles/snappy/profile.toml +46 -0
  56. package/assets/prompts/companion-day-open.md +46 -0
  57. package/assets/prompts/companion-first-run.md +104 -0
  58. package/assets/prompts/companion.md +821 -0
  59. package/assets/prompts/conversation-system.md +117 -0
  60. package/assets/prompts/eod-sweep.md +120 -0
  61. package/assets/prompts/onboarding.md +74 -0
  62. package/assets/prompts/pass-common.md +52 -0
  63. package/assets/prompts/pass-quality-common.md +22 -0
  64. package/assets/prompts/round-first.md +874 -0
  65. package/assets/prompts/round-follow-up.md +991 -0
  66. package/assets/prompts/round-re-review.md +889 -0
  67. package/assets/prompts/round-recheck.md +196 -0
  68. package/assets/prompts/round-staleness.md +856 -0
  69. package/assets/schemas/review-result.v1.json +391 -0
  70. package/assets/schemas/scan-result.v1.json +421 -0
  71. package/assets/schemas/version.v1.json +57 -0
  72. package/assets/seed-manifest.json +19 -0
  73. package/assets/seeds/agents/pass-baseline.md +61 -0
  74. package/assets/seeds/agents/pass-contracts.md +30 -0
  75. package/assets/seeds/agents/pass-data-safety.md +54 -0
  76. package/assets/seeds/agents/pass-delivery.md +37 -0
  77. package/assets/seeds/agents/pass-prod-risk.md +24 -0
  78. package/assets/seeds/agents/pass-security.md +31 -0
  79. package/assets/seeds/agents/pass-statelessness.md +27 -0
  80. package/assets/seeds/agents/pass-ui.md +23 -0
  81. package/assets/seeds/agents/pass-validate.md +50 -0
  82. package/assets/seeds/prompts/conversation-system.md +117 -0
  83. package/assets/seeds/prompts/eod-sweep.md +120 -0
  84. package/assets/seeds/prompts/pass-common.md +52 -0
  85. package/dist/extensions/bash-guard.d.ts +467 -0
  86. package/dist/extensions/bash-guard.d.ts.map +1 -0
  87. package/dist/extensions/bash-guard.js +3058 -0
  88. package/dist/extensions/bash-guard.js.map +1 -0
  89. package/dist/extensions/finding-clusters.d.ts +33 -0
  90. package/dist/extensions/finding-clusters.d.ts.map +1 -0
  91. package/dist/extensions/finding-clusters.js +218 -0
  92. package/dist/extensions/finding-clusters.js.map +1 -0
  93. package/dist/extensions/ledger-pin.d.ts +76 -0
  94. package/dist/extensions/ledger-pin.d.ts.map +1 -0
  95. package/dist/extensions/ledger-pin.js +331 -0
  96. package/dist/extensions/ledger-pin.js.map +1 -0
  97. package/dist/extensions/lens.d.ts +43 -0
  98. package/dist/extensions/lens.d.ts.map +1 -0
  99. package/dist/extensions/lens.js +150 -0
  100. package/dist/extensions/lens.js.map +1 -0
  101. package/dist/extensions/pi-tool.d.ts +22 -0
  102. package/dist/extensions/pi-tool.d.ts.map +1 -0
  103. package/dist/extensions/pi-tool.js +20 -0
  104. package/dist/extensions/pi-tool.js.map +1 -0
  105. package/dist/extensions/quickreview.d.ts +21 -0
  106. package/dist/extensions/quickreview.d.ts.map +1 -0
  107. package/dist/extensions/quickreview.js +132 -0
  108. package/dist/extensions/quickreview.js.map +1 -0
  109. package/dist/src/anchors.d.ts +54 -0
  110. package/dist/src/anchors.d.ts.map +1 -0
  111. package/dist/src/anchors.js +127 -0
  112. package/dist/src/anchors.js.map +1 -0
  113. package/dist/src/assetroot.d.ts +16 -0
  114. package/dist/src/assetroot.d.ts.map +1 -0
  115. package/dist/src/assetroot.js +77 -0
  116. package/dist/src/assetroot.js.map +1 -0
  117. package/dist/src/authwatch.d.ts +61 -0
  118. package/dist/src/authwatch.d.ts.map +1 -0
  119. package/dist/src/authwatch.js +210 -0
  120. package/dist/src/authwatch.js.map +1 -0
  121. package/dist/src/budget.d.ts +15 -0
  122. package/dist/src/budget.d.ts.map +1 -0
  123. package/dist/src/budget.js +32 -0
  124. package/dist/src/budget.js.map +1 -0
  125. package/dist/src/casebudget.d.ts +3 -0
  126. package/dist/src/casebudget.d.ts.map +1 -0
  127. package/dist/src/casebudget.js +3 -0
  128. package/dist/src/casebudget.js.map +1 -0
  129. package/dist/src/cigate.d.ts +116 -0
  130. package/dist/src/cigate.d.ts.map +1 -0
  131. package/dist/src/cigate.js +176 -0
  132. package/dist/src/cigate.js.map +1 -0
  133. package/dist/src/codespan.d.ts +46 -0
  134. package/dist/src/codespan.d.ts.map +1 -0
  135. package/dist/src/codespan.js +75 -0
  136. package/dist/src/codespan.js.map +1 -0
  137. package/dist/src/contextpack.d.ts +56 -0
  138. package/dist/src/contextpack.d.ts.map +1 -0
  139. package/dist/src/contextpack.js +195 -0
  140. package/dist/src/contextpack.js.map +1 -0
  141. package/dist/src/contract.d.ts +8 -0
  142. package/dist/src/contract.d.ts.map +1 -0
  143. package/dist/src/contract.js +21 -0
  144. package/dist/src/contract.js.map +1 -0
  145. package/dist/src/coverage.d.ts +32 -0
  146. package/dist/src/coverage.d.ts.map +1 -0
  147. package/dist/src/coverage.js +85 -0
  148. package/dist/src/coverage.js.map +1 -0
  149. package/dist/src/datafence.d.ts +19 -0
  150. package/dist/src/datafence.d.ts.map +1 -0
  151. package/dist/src/datafence.js +60 -0
  152. package/dist/src/datafence.js.map +1 -0
  153. package/dist/src/dedup.d.ts +65 -0
  154. package/dist/src/dedup.d.ts.map +1 -0
  155. package/dist/src/dedup.js +459 -0
  156. package/dist/src/dedup.js.map +1 -0
  157. package/dist/src/depsources.d.ts +304 -0
  158. package/dist/src/depsources.d.ts.map +1 -0
  159. package/dist/src/depsources.js +3367 -0
  160. package/dist/src/depsources.js.map +1 -0
  161. package/dist/src/diffinput.d.ts +10 -0
  162. package/dist/src/diffinput.d.ts.map +1 -0
  163. package/dist/src/diffinput.js +172 -0
  164. package/dist/src/diffinput.js.map +1 -0
  165. package/dist/src/doubtwords.d.ts +10 -0
  166. package/dist/src/doubtwords.d.ts.map +1 -0
  167. package/dist/src/doubtwords.js +13 -0
  168. package/dist/src/doubtwords.js.map +1 -0
  169. package/dist/src/ecosystem.d.ts +148 -0
  170. package/dist/src/ecosystem.d.ts.map +1 -0
  171. package/dist/src/ecosystem.js +338 -0
  172. package/dist/src/ecosystem.js.map +1 -0
  173. package/dist/src/engine/agentdir.d.ts +5 -0
  174. package/dist/src/engine/agentdir.d.ts.map +1 -0
  175. package/dist/src/engine/agentdir.js +21 -0
  176. package/dist/src/engine/agentdir.js.map +1 -0
  177. package/dist/src/engine/auth.d.ts +214 -0
  178. package/dist/src/engine/auth.d.ts.map +1 -0
  179. package/dist/src/engine/auth.js +374 -0
  180. package/dist/src/engine/auth.js.map +1 -0
  181. package/dist/src/engine/budget.d.ts +60 -0
  182. package/dist/src/engine/budget.d.ts.map +1 -0
  183. package/dist/src/engine/budget.js +113 -0
  184. package/dist/src/engine/budget.js.map +1 -0
  185. package/dist/src/engine/capfd.d.ts +6 -0
  186. package/dist/src/engine/capfd.d.ts.map +1 -0
  187. package/dist/src/engine/capfd.js +21 -0
  188. package/dist/src/engine/capfd.js.map +1 -0
  189. package/dist/src/engine/caseout.d.ts +66 -0
  190. package/dist/src/engine/caseout.d.ts.map +1 -0
  191. package/dist/src/engine/caseout.js +107 -0
  192. package/dist/src/engine/caseout.js.map +1 -0
  193. package/dist/src/engine/context.d.ts +57 -0
  194. package/dist/src/engine/context.d.ts.map +1 -0
  195. package/dist/src/engine/context.js +212 -0
  196. package/dist/src/engine/context.js.map +1 -0
  197. package/dist/src/engine/envmap.d.ts +13 -0
  198. package/dist/src/engine/envmap.d.ts.map +1 -0
  199. package/dist/src/engine/envmap.js +372 -0
  200. package/dist/src/engine/envmap.js.map +1 -0
  201. package/dist/src/engine/extfiles.d.ts +7 -0
  202. package/dist/src/engine/extfiles.d.ts.map +1 -0
  203. package/dist/src/engine/extfiles.js +23 -0
  204. package/dist/src/engine/extfiles.js.map +1 -0
  205. package/dist/src/engine/keyroute.d.ts +21 -0
  206. package/dist/src/engine/keyroute.d.ts.map +1 -0
  207. package/dist/src/engine/keyroute.js +58 -0
  208. package/dist/src/engine/keyroute.js.map +1 -0
  209. package/dist/src/engine/lens/cache-group.d.ts +20 -0
  210. package/dist/src/engine/lens/cache-group.d.ts.map +1 -0
  211. package/dist/src/engine/lens/cache-group.js +31 -0
  212. package/dist/src/engine/lens/cache-group.js.map +1 -0
  213. package/dist/src/engine/lens/cache-run.d.ts +65 -0
  214. package/dist/src/engine/lens/cache-run.d.ts.map +1 -0
  215. package/dist/src/engine/lens/cache-run.js +159 -0
  216. package/dist/src/engine/lens/cache-run.js.map +1 -0
  217. package/dist/src/engine/lens/deadline.d.ts +54 -0
  218. package/dist/src/engine/lens/deadline.d.ts.map +1 -0
  219. package/dist/src/engine/lens/deadline.js +111 -0
  220. package/dist/src/engine/lens/deadline.js.map +1 -0
  221. package/dist/src/engine/lens/engine-tools.d.ts +13 -0
  222. package/dist/src/engine/lens/engine-tools.d.ts.map +1 -0
  223. package/dist/src/engine/lens/engine-tools.js +37 -0
  224. package/dist/src/engine/lens/engine-tools.js.map +1 -0
  225. package/dist/src/engine/lens/env.d.ts +23 -0
  226. package/dist/src/engine/lens/env.d.ts.map +1 -0
  227. package/dist/src/engine/lens/env.js +42 -0
  228. package/dist/src/engine/lens/env.js.map +1 -0
  229. package/dist/src/engine/lens/launch-plan.d.ts +63 -0
  230. package/dist/src/engine/lens/launch-plan.d.ts.map +1 -0
  231. package/dist/src/engine/lens/launch-plan.js +203 -0
  232. package/dist/src/engine/lens/launch-plan.js.map +1 -0
  233. package/dist/src/engine/lens/leaf-cache.d.ts +22 -0
  234. package/dist/src/engine/lens/leaf-cache.d.ts.map +1 -0
  235. package/dist/src/engine/lens/leaf-cache.js +115 -0
  236. package/dist/src/engine/lens/leaf-cache.js.map +1 -0
  237. package/dist/src/engine/lens/permits.d.ts +14 -0
  238. package/dist/src/engine/lens/permits.d.ts.map +1 -0
  239. package/dist/src/engine/lens/permits.js +18 -0
  240. package/dist/src/engine/lens/permits.js.map +1 -0
  241. package/dist/src/engine/lens/registry.d.ts +55 -0
  242. package/dist/src/engine/lens/registry.d.ts.map +1 -0
  243. package/dist/src/engine/lens/registry.js +140 -0
  244. package/dist/src/engine/lens/registry.js.map +1 -0
  245. package/dist/src/engine/lens/round-lens.d.ts +16 -0
  246. package/dist/src/engine/lens/round-lens.d.ts.map +1 -0
  247. package/dist/src/engine/lens/round-lens.js +46 -0
  248. package/dist/src/engine/lens/round-lens.js.map +1 -0
  249. package/dist/src/engine/lens/runlens.d.ts +103 -0
  250. package/dist/src/engine/lens/runlens.d.ts.map +1 -0
  251. package/dist/src/engine/lens/runlens.js +538 -0
  252. package/dist/src/engine/lens/runlens.js.map +1 -0
  253. package/dist/src/engine/lens/section.d.ts +19 -0
  254. package/dist/src/engine/lens/section.d.ts.map +1 -0
  255. package/dist/src/engine/lens/section.js +40 -0
  256. package/dist/src/engine/lens/section.js.map +1 -0
  257. package/dist/src/engine/lens/semaphore.d.ts +13 -0
  258. package/dist/src/engine/lens/semaphore.d.ts.map +1 -0
  259. package/dist/src/engine/lens/semaphore.js +44 -0
  260. package/dist/src/engine/lens/semaphore.js.map +1 -0
  261. package/dist/src/engine/lens/tool.d.ts +34 -0
  262. package/dist/src/engine/lens/tool.d.ts.map +1 -0
  263. package/dist/src/engine/lens/tool.js +345 -0
  264. package/dist/src/engine/lens/tool.js.map +1 -0
  265. package/dist/src/engine/lens/wave.d.ts +63 -0
  266. package/dist/src/engine/lens/wave.d.ts.map +1 -0
  267. package/dist/src/engine/lens/wave.js +95 -0
  268. package/dist/src/engine/lens/wave.js.map +1 -0
  269. package/dist/src/engine/livesessions.d.ts +21 -0
  270. package/dist/src/engine/livesessions.d.ts.map +1 -0
  271. package/dist/src/engine/livesessions.js +57 -0
  272. package/dist/src/engine/livesessions.js.map +1 -0
  273. package/dist/src/engine/livewire.d.ts +18 -0
  274. package/dist/src/engine/livewire.d.ts.map +1 -0
  275. package/dist/src/engine/livewire.js +31 -0
  276. package/dist/src/engine/livewire.js.map +1 -0
  277. package/dist/src/engine/openable.d.ts +37 -0
  278. package/dist/src/engine/openable.d.ts.map +1 -0
  279. package/dist/src/engine/openable.js +120 -0
  280. package/dist/src/engine/openable.js.map +1 -0
  281. package/dist/src/engine/pisdk.d.ts +226 -0
  282. package/dist/src/engine/pisdk.d.ts.map +1 -0
  283. package/dist/src/engine/pisdk.js +552 -0
  284. package/dist/src/engine/pisdk.js.map +1 -0
  285. package/dist/src/engine/port.d.ts +144 -0
  286. package/dist/src/engine/port.d.ts.map +1 -0
  287. package/dist/src/engine/port.js +16 -0
  288. package/dist/src/engine/port.js.map +1 -0
  289. package/dist/src/engine/prompts.d.ts +159 -0
  290. package/dist/src/engine/prompts.d.ts.map +1 -0
  291. package/dist/src/engine/prompts.js +339 -0
  292. package/dist/src/engine/prompts.js.map +1 -0
  293. package/dist/src/engine/render.d.ts +10 -0
  294. package/dist/src/engine/render.d.ts.map +1 -0
  295. package/dist/src/engine/render.js +23 -0
  296. package/dist/src/engine/render.js.map +1 -0
  297. package/dist/src/engine/reviewruntime.d.ts +13 -0
  298. package/dist/src/engine/reviewruntime.d.ts.map +1 -0
  299. package/dist/src/engine/reviewruntime.js +35 -0
  300. package/dist/src/engine/reviewruntime.js.map +1 -0
  301. package/dist/src/engine/reviewsdk.d.ts +75 -0
  302. package/dist/src/engine/reviewsdk.d.ts.map +1 -0
  303. package/dist/src/engine/reviewsdk.js +180 -0
  304. package/dist/src/engine/reviewsdk.js.map +1 -0
  305. package/dist/src/engine/round.d.ts +166 -0
  306. package/dist/src/engine/round.d.ts.map +1 -0
  307. package/dist/src/engine/round.js +543 -0
  308. package/dist/src/engine/round.js.map +1 -0
  309. package/dist/src/engine/roundagents.d.ts +17 -0
  310. package/dist/src/engine/roundagents.d.ts.map +1 -0
  311. package/dist/src/engine/roundagents.js +49 -0
  312. package/dist/src/engine/roundagents.js.map +1 -0
  313. package/dist/src/engine/roundevents.d.ts +110 -0
  314. package/dist/src/engine/roundevents.d.ts.map +1 -0
  315. package/dist/src/engine/roundevents.js +276 -0
  316. package/dist/src/engine/roundevents.js.map +1 -0
  317. package/dist/src/engine/roundsdk.d.ts +33 -0
  318. package/dist/src/engine/roundsdk.d.ts.map +1 -0
  319. package/dist/src/engine/roundsdk.js +76 -0
  320. package/dist/src/engine/roundsdk.js.map +1 -0
  321. package/dist/src/engine/sdkruntime.d.ts +23 -0
  322. package/dist/src/engine/sdkruntime.d.ts.map +1 -0
  323. package/dist/src/engine/sdkruntime.js +340 -0
  324. package/dist/src/engine/sdkruntime.js.map +1 -0
  325. package/dist/src/engine/select.d.ts +16 -0
  326. package/dist/src/engine/select.d.ts.map +1 -0
  327. package/dist/src/engine/select.js +32 -0
  328. package/dist/src/engine/select.js.map +1 -0
  329. package/dist/src/engine/sessionwrap.d.ts +4 -0
  330. package/dist/src/engine/sessionwrap.d.ts.map +1 -0
  331. package/dist/src/engine/sessionwrap.js +31 -0
  332. package/dist/src/engine/sessionwrap.js.map +1 -0
  333. package/dist/src/engine/toolfence.d.ts +90 -0
  334. package/dist/src/engine/toolfence.d.ts.map +1 -0
  335. package/dist/src/engine/toolfence.js +378 -0
  336. package/dist/src/engine/toolfence.js.map +1 -0
  337. package/dist/src/engine/tooluid.d.ts +128 -0
  338. package/dist/src/engine/tooluid.d.ts.map +1 -0
  339. package/dist/src/engine/tooluid.js +401 -0
  340. package/dist/src/engine/tooluid.js.map +1 -0
  341. package/dist/src/envstrip.d.ts +10 -0
  342. package/dist/src/envstrip.d.ts.map +1 -0
  343. package/dist/src/envstrip.js +15 -0
  344. package/dist/src/envstrip.js.map +1 -0
  345. package/dist/src/escalationprompt.d.ts +22 -0
  346. package/dist/src/escalationprompt.d.ts.map +1 -0
  347. package/dist/src/escalationprompt.js +54 -0
  348. package/dist/src/escalationprompt.js.map +1 -0
  349. package/dist/src/execfn.d.ts +29 -0
  350. package/dist/src/execfn.d.ts.map +1 -0
  351. package/dist/src/execfn.js +55 -0
  352. package/dist/src/execfn.js.map +1 -0
  353. package/dist/src/finding-chain.d.ts +40 -0
  354. package/dist/src/finding-chain.d.ts.map +1 -0
  355. package/dist/src/finding-chain.js +76 -0
  356. package/dist/src/finding-chain.js.map +1 -0
  357. package/dist/src/finding-row.d.ts +24 -0
  358. package/dist/src/finding-row.d.ts.map +1 -0
  359. package/dist/src/finding-row.js +26 -0
  360. package/dist/src/finding-row.js.map +1 -0
  361. package/dist/src/findingkey.d.ts +99 -0
  362. package/dist/src/findingkey.d.ts.map +1 -0
  363. package/dist/src/findingkey.js +210 -0
  364. package/dist/src/findingkey.js.map +1 -0
  365. package/dist/src/findingsrecord.d.ts +175 -0
  366. package/dist/src/findingsrecord.d.ts.map +1 -0
  367. package/dist/src/findingsrecord.js +410 -0
  368. package/dist/src/findingsrecord.js.map +1 -0
  369. package/dist/src/followup-mode.d.ts +4 -0
  370. package/dist/src/followup-mode.d.ts.map +1 -0
  371. package/dist/src/followup-mode.js +6 -0
  372. package/dist/src/followup-mode.js.map +1 -0
  373. package/dist/src/gate.d.ts +199 -0
  374. package/dist/src/gate.d.ts.map +1 -0
  375. package/dist/src/gate.js +315 -0
  376. package/dist/src/gate.js.map +1 -0
  377. package/dist/src/ghcred.d.ts +58 -0
  378. package/dist/src/ghcred.d.ts.map +1 -0
  379. package/dist/src/ghcred.js +139 -0
  380. package/dist/src/ghcred.js.map +1 -0
  381. package/dist/src/githubAuth.d.ts +32 -0
  382. package/dist/src/githubAuth.d.ts.map +1 -0
  383. package/dist/src/githubAuth.js +116 -0
  384. package/dist/src/githubAuth.js.map +1 -0
  385. package/dist/src/githubcore.d.ts +20 -0
  386. package/dist/src/githubcore.d.ts.map +1 -0
  387. package/dist/src/githubcore.js +20 -0
  388. package/dist/src/githubcore.js.map +1 -0
  389. package/dist/src/glob.d.ts +11 -0
  390. package/dist/src/glob.d.ts.map +1 -0
  391. package/dist/src/glob.js +69 -0
  392. package/dist/src/glob.js.map +1 -0
  393. package/dist/src/guards.d.ts +93 -0
  394. package/dist/src/guards.d.ts.map +1 -0
  395. package/dist/src/guards.js +306 -0
  396. package/dist/src/guards.js.map +1 -0
  397. package/dist/src/heartbeat.d.ts +29 -0
  398. package/dist/src/heartbeat.d.ts.map +1 -0
  399. package/dist/src/heartbeat.js +87 -0
  400. package/dist/src/heartbeat.js.map +1 -0
  401. package/dist/src/heuristics.d.ts +247 -0
  402. package/dist/src/heuristics.d.ts.map +1 -0
  403. package/dist/src/heuristics.js +927 -0
  404. package/dist/src/heuristics.js.map +1 -0
  405. package/dist/src/homes.d.ts +181 -0
  406. package/dist/src/homes.d.ts.map +1 -0
  407. package/dist/src/homes.js +242 -0
  408. package/dist/src/homes.js.map +1 -0
  409. package/dist/src/hunkheader.d.ts +11 -0
  410. package/dist/src/hunkheader.d.ts.map +1 -0
  411. package/dist/src/hunkheader.js +18 -0
  412. package/dist/src/hunkheader.js.map +1 -0
  413. package/dist/src/include.d.ts +435 -0
  414. package/dist/src/include.d.ts.map +1 -0
  415. package/dist/src/include.js +1692 -0
  416. package/dist/src/include.js.map +1 -0
  417. package/dist/src/launchvocab.d.ts +36 -0
  418. package/dist/src/launchvocab.d.ts.map +1 -0
  419. package/dist/src/launchvocab.js +59 -0
  420. package/dist/src/launchvocab.js.map +1 -0
  421. package/dist/src/ledgercarry.d.ts +24 -0
  422. package/dist/src/ledgercarry.d.ts.map +1 -0
  423. package/dist/src/ledgercarry.js +109 -0
  424. package/dist/src/ledgercarry.js.map +1 -0
  425. package/dist/src/lensids.d.ts +7 -0
  426. package/dist/src/lensids.d.ts.map +1 -0
  427. package/dist/src/lensids.js +53 -0
  428. package/dist/src/lensids.js.map +1 -0
  429. package/dist/src/lensplanning.d.ts +8 -0
  430. package/dist/src/lensplanning.d.ts.map +1 -0
  431. package/dist/src/lensplanning.js +126 -0
  432. package/dist/src/lensplanning.js.map +1 -0
  433. package/dist/src/lensresult.d.ts +94 -0
  434. package/dist/src/lensresult.d.ts.map +1 -0
  435. package/dist/src/lensresult.js +162 -0
  436. package/dist/src/lensresult.js.map +1 -0
  437. package/dist/src/lenstuning.d.ts +97 -0
  438. package/dist/src/lenstuning.d.ts.map +1 -0
  439. package/dist/src/lenstuning.js +326 -0
  440. package/dist/src/lenstuning.js.map +1 -0
  441. package/dist/src/lintconfig.d.ts +31 -0
  442. package/dist/src/lintconfig.d.ts.map +1 -0
  443. package/dist/src/lintconfig.js +543 -0
  444. package/dist/src/lintconfig.js.map +1 -0
  445. package/dist/src/live/events.d.ts +188 -0
  446. package/dist/src/live/events.d.ts.map +1 -0
  447. package/dist/src/live/events.js +136 -0
  448. package/dist/src/live/events.js.map +1 -0
  449. package/dist/src/live/writer.d.ts +54 -0
  450. package/dist/src/live/writer.d.ts.map +1 -0
  451. package/dist/src/live/writer.js +516 -0
  452. package/dist/src/live/writer.js.map +1 -0
  453. package/dist/src/localreview.d.ts +128 -0
  454. package/dist/src/localreview.d.ts.map +1 -0
  455. package/dist/src/localreview.js +426 -0
  456. package/dist/src/localreview.js.map +1 -0
  457. package/dist/src/loosenedtests.d.ts +13 -0
  458. package/dist/src/loosenedtests.d.ts.map +1 -0
  459. package/dist/src/loosenedtests.js +188 -0
  460. package/dist/src/loosenedtests.js.map +1 -0
  461. package/dist/src/memoryport.d.ts +264 -0
  462. package/dist/src/memoryport.d.ts.map +1 -0
  463. package/dist/src/memoryport.js +445 -0
  464. package/dist/src/memoryport.js.map +1 -0
  465. package/dist/src/migrations.d.ts +106 -0
  466. package/dist/src/migrations.d.ts.map +1 -0
  467. package/dist/src/migrations.js +373 -0
  468. package/dist/src/migrations.js.map +1 -0
  469. package/dist/src/oneshot.d.ts +12 -0
  470. package/dist/src/oneshot.d.ts.map +1 -0
  471. package/dist/src/oneshot.js +8 -0
  472. package/dist/src/oneshot.js.map +1 -0
  473. package/dist/src/packing.d.ts +11 -0
  474. package/dist/src/packing.d.ts.map +1 -0
  475. package/dist/src/packing.js +31 -0
  476. package/dist/src/packing.js.map +1 -0
  477. package/dist/src/passes.d.ts +16 -0
  478. package/dist/src/passes.d.ts.map +1 -0
  479. package/dist/src/passes.js +104 -0
  480. package/dist/src/passes.js.map +1 -0
  481. package/dist/src/passtasks.d.ts +68 -0
  482. package/dist/src/passtasks.d.ts.map +1 -0
  483. package/dist/src/passtasks.js +360 -0
  484. package/dist/src/passtasks.js.map +1 -0
  485. package/dist/src/pathinside.d.ts +5 -0
  486. package/dist/src/pathinside.d.ts.map +1 -0
  487. package/dist/src/pathinside.js +9 -0
  488. package/dist/src/pathinside.js.map +1 -0
  489. package/dist/src/pibuiltins.d.ts +36 -0
  490. package/dist/src/pibuiltins.d.ts.map +1 -0
  491. package/dist/src/pibuiltins.js +83 -0
  492. package/dist/src/pibuiltins.js.map +1 -0
  493. package/dist/src/plankey.d.ts +4 -0
  494. package/dist/src/plankey.d.ts.map +1 -0
  495. package/dist/src/plankey.js +10 -0
  496. package/dist/src/plankey.js.map +1 -0
  497. package/dist/src/planner.d.ts +375 -0
  498. package/dist/src/planner.d.ts.map +1 -0
  499. package/dist/src/planner.js +722 -0
  500. package/dist/src/planner.js.map +1 -0
  501. package/dist/src/plugin/args.d.ts +19 -0
  502. package/dist/src/plugin/args.d.ts.map +1 -0
  503. package/dist/src/plugin/args.js +107 -0
  504. package/dist/src/plugin/args.js.map +1 -0
  505. package/dist/src/plugin/index.d.ts +3 -0
  506. package/dist/src/plugin/index.d.ts.map +1 -0
  507. package/dist/src/plugin/index.js +14 -0
  508. package/dist/src/plugin/index.js.map +1 -0
  509. package/dist/src/plugin/login.d.ts +39 -0
  510. package/dist/src/plugin/login.d.ts.map +1 -0
  511. package/dist/src/plugin/login.js +73 -0
  512. package/dist/src/plugin/login.js.map +1 -0
  513. package/dist/src/plugin/review.d.ts +27 -0
  514. package/dist/src/plugin/review.d.ts.map +1 -0
  515. package/dist/src/plugin/review.js +298 -0
  516. package/dist/src/plugin/review.js.map +1 -0
  517. package/dist/src/plugin/runner.d.ts +6 -0
  518. package/dist/src/plugin/runner.d.ts.map +1 -0
  519. package/dist/src/plugin/runner.js +65 -0
  520. package/dist/src/plugin/runner.js.map +1 -0
  521. package/dist/src/plugin/scan.d.ts +79 -0
  522. package/dist/src/plugin/scan.d.ts.map +1 -0
  523. package/dist/src/plugin/scan.js +348 -0
  524. package/dist/src/plugin/scan.js.map +1 -0
  525. package/dist/src/plugin/session.d.ts +56 -0
  526. package/dist/src/plugin/session.d.ts.map +1 -0
  527. package/dist/src/plugin/session.js +2 -0
  528. package/dist/src/plugin/session.js.map +1 -0
  529. package/dist/src/plugin/setup.d.ts +19 -0
  530. package/dist/src/plugin/setup.d.ts.map +1 -0
  531. package/dist/src/plugin/setup.js +142 -0
  532. package/dist/src/plugin/setup.js.map +1 -0
  533. package/dist/src/plugin/versiongate.d.ts +26 -0
  534. package/dist/src/plugin/versiongate.d.ts.map +1 -0
  535. package/dist/src/plugin/versiongate.js +83 -0
  536. package/dist/src/plugin/versiongate.js.map +1 -0
  537. package/dist/src/postingkey.d.ts +8 -0
  538. package/dist/src/postingkey.d.ts.map +1 -0
  539. package/dist/src/postingkey.js +25 -0
  540. package/dist/src/postingkey.js.map +1 -0
  541. package/dist/src/postingpolicy.d.ts +108 -0
  542. package/dist/src/postingpolicy.d.ts.map +1 -0
  543. package/dist/src/postingpolicy.js +341 -0
  544. package/dist/src/postingpolicy.js.map +1 -0
  545. package/dist/src/pr-identity.d.ts +3 -0
  546. package/dist/src/pr-identity.d.ts.map +1 -0
  547. package/dist/src/pr-identity.js +9 -0
  548. package/dist/src/pr-identity.js.map +1 -0
  549. package/dist/src/prdelta.d.ts +181 -0
  550. package/dist/src/prdelta.d.ts.map +1 -0
  551. package/dist/src/prdelta.js +501 -0
  552. package/dist/src/prdelta.js.map +1 -0
  553. package/dist/src/pricing.d.ts +94 -0
  554. package/dist/src/pricing.d.ts.map +1 -0
  555. package/dist/src/pricing.js +209 -0
  556. package/dist/src/pricing.js.map +1 -0
  557. package/dist/src/priorfindings.d.ts +167 -0
  558. package/dist/src/priorfindings.d.ts.map +1 -0
  559. package/dist/src/priorfindings.js +445 -0
  560. package/dist/src/priorfindings.js.map +1 -0
  561. package/dist/src/priortasks.d.ts +31 -0
  562. package/dist/src/priortasks.d.ts.map +1 -0
  563. package/dist/src/priortasks.js +119 -0
  564. package/dist/src/priortasks.js.map +1 -0
  565. package/dist/src/profilelookup.d.ts +59 -0
  566. package/dist/src/profilelookup.d.ts.map +1 -0
  567. package/dist/src/profilelookup.js +98 -0
  568. package/dist/src/profilelookup.js.map +1 -0
  569. package/dist/src/profileoverrides.d.ts +91 -0
  570. package/dist/src/profileoverrides.d.ts.map +1 -0
  571. package/dist/src/profileoverrides.js +313 -0
  572. package/dist/src/profileoverrides.js.map +1 -0
  573. package/dist/src/profiles.d.ts +144 -0
  574. package/dist/src/profiles.d.ts.map +1 -0
  575. package/dist/src/profiles.js +604 -0
  576. package/dist/src/profiles.js.map +1 -0
  577. package/dist/src/promptdoc.d.ts +3 -0
  578. package/dist/src/promptdoc.d.ts.map +1 -0
  579. package/dist/src/promptdoc.js +18 -0
  580. package/dist/src/promptdoc.js.map +1 -0
  581. package/dist/src/prtarget.d.ts +70 -0
  582. package/dist/src/prtarget.d.ts.map +1 -0
  583. package/dist/src/prtarget.js +181 -0
  584. package/dist/src/prtarget.js.map +1 -0
  585. package/dist/src/recheckorder.d.ts +32 -0
  586. package/dist/src/recheckorder.d.ts.map +1 -0
  587. package/dist/src/recheckorder.js +5 -0
  588. package/dist/src/recheckorder.js.map +1 -0
  589. package/dist/src/reviewapi.d.ts +207 -0
  590. package/dist/src/reviewapi.d.ts.map +1 -0
  591. package/dist/src/reviewapi.js +939 -0
  592. package/dist/src/reviewapi.js.map +1 -0
  593. package/dist/src/reviewbotfindings.d.ts +33 -0
  594. package/dist/src/reviewbotfindings.d.ts.map +1 -0
  595. package/dist/src/reviewbotfindings.js +80 -0
  596. package/dist/src/reviewbotfindings.js.map +1 -0
  597. package/dist/src/reviewconfig.d.ts +741 -0
  598. package/dist/src/reviewconfig.d.ts.map +1 -0
  599. package/dist/src/reviewconfig.js +797 -0
  600. package/dist/src/reviewconfig.js.map +1 -0
  601. package/dist/src/reviewdelta.d.ts +51 -0
  602. package/dist/src/reviewdelta.d.ts.map +1 -0
  603. package/dist/src/reviewdelta.js +119 -0
  604. package/dist/src/reviewdelta.js.map +1 -0
  605. package/dist/src/reviewdest.d.ts +86 -0
  606. package/dist/src/reviewdest.d.ts.map +1 -0
  607. package/dist/src/reviewdest.js +142 -0
  608. package/dist/src/reviewdest.js.map +1 -0
  609. package/dist/src/reviewerstub.d.ts +12 -0
  610. package/dist/src/reviewerstub.d.ts.map +1 -0
  611. package/dist/src/reviewerstub.js +28 -0
  612. package/dist/src/reviewerstub.js.map +1 -0
  613. package/dist/src/reviewhost.d.ts +58 -0
  614. package/dist/src/reviewhost.d.ts.map +1 -0
  615. package/dist/src/reviewhost.js +135 -0
  616. package/dist/src/reviewhost.js.map +1 -0
  617. package/dist/src/reviewpost.d.ts +79 -0
  618. package/dist/src/reviewpost.d.ts.map +1 -0
  619. package/dist/src/reviewpost.js +233 -0
  620. package/dist/src/reviewpost.js.map +1 -0
  621. package/dist/src/reviewrender.d.ts +154 -0
  622. package/dist/src/reviewrender.d.ts.map +1 -0
  623. package/dist/src/reviewrender.js +480 -0
  624. package/dist/src/reviewrender.js.map +1 -0
  625. package/dist/src/reviewstate.d.ts +62 -0
  626. package/dist/src/reviewstate.d.ts.map +1 -0
  627. package/dist/src/reviewstate.js +167 -0
  628. package/dist/src/reviewstate.js.map +1 -0
  629. package/dist/src/reviewstore.d.ts +17 -0
  630. package/dist/src/reviewstore.d.ts.map +1 -0
  631. package/dist/src/reviewstore.js +105 -0
  632. package/dist/src/reviewstore.js.map +1 -0
  633. package/dist/src/round-progress.d.ts +120 -0
  634. package/dist/src/round-progress.d.ts.map +1 -0
  635. package/dist/src/round-progress.js +172 -0
  636. package/dist/src/round-progress.js.map +1 -0
  637. package/dist/src/round-stage-deadlines.d.ts +12 -0
  638. package/dist/src/round-stage-deadlines.d.ts.map +1 -0
  639. package/dist/src/round-stage-deadlines.js +10 -0
  640. package/dist/src/round-stage-deadlines.js.map +1 -0
  641. package/dist/src/session-command.d.ts +19 -0
  642. package/dist/src/session-command.d.ts.map +1 -0
  643. package/dist/src/session-command.js +20 -0
  644. package/dist/src/session-command.js.map +1 -0
  645. package/dist/src/settledread.d.ts +61 -0
  646. package/dist/src/settledread.d.ts.map +1 -0
  647. package/dist/src/settledread.js +135 -0
  648. package/dist/src/settledread.js.map +1 -0
  649. package/dist/src/severity.d.ts +167 -0
  650. package/dist/src/severity.d.ts.map +1 -0
  651. package/dist/src/severity.js +364 -0
  652. package/dist/src/severity.js.map +1 -0
  653. package/dist/src/severityrank.d.ts +8 -0
  654. package/dist/src/severityrank.d.ts.map +1 -0
  655. package/dist/src/severityrank.js +16 -0
  656. package/dist/src/severityrank.js.map +1 -0
  657. package/dist/src/standing-review.d.ts +45 -0
  658. package/dist/src/standing-review.d.ts.map +1 -0
  659. package/dist/src/standing-review.js +43 -0
  660. package/dist/src/standing-review.js.map +1 -0
  661. package/dist/src/storerows.d.ts +225 -0
  662. package/dist/src/storerows.d.ts.map +1 -0
  663. package/dist/src/storerows.js +7 -0
  664. package/dist/src/storerows.js.map +1 -0
  665. package/dist/src/styleguide.d.ts +25 -0
  666. package/dist/src/styleguide.d.ts.map +1 -0
  667. package/dist/src/styleguide.js +272 -0
  668. package/dist/src/styleguide.js.map +1 -0
  669. package/dist/src/sweepstatus.d.ts +42 -0
  670. package/dist/src/sweepstatus.d.ts.map +1 -0
  671. package/dist/src/sweepstatus.js +97 -0
  672. package/dist/src/sweepstatus.js.map +1 -0
  673. package/dist/src/templates.d.ts +243 -0
  674. package/dist/src/templates.d.ts.map +1 -0
  675. package/dist/src/templates.js +847 -0
  676. package/dist/src/templates.js.map +1 -0
  677. package/dist/src/types.d.ts +639 -0
  678. package/dist/src/types.d.ts.map +1 -0
  679. package/dist/src/types.js +90 -0
  680. package/dist/src/types.js.map +1 -0
  681. package/dist/src/unifieddiff.d.ts +22 -0
  682. package/dist/src/unifieddiff.d.ts.map +1 -0
  683. package/dist/src/unifieddiff.js +176 -0
  684. package/dist/src/unifieddiff.js.map +1 -0
  685. package/dist/src/yieldloop.d.ts +2 -0
  686. package/dist/src/yieldloop.d.ts.map +1 -0
  687. package/dist/src/yieldloop.js +14 -0
  688. package/dist/src/yieldloop.js.map +1 -0
  689. package/package.json +60 -4
@@ -0,0 +1,364 @@
1
+ // Severity → posting-tag mapping (spec §5): P0/P1 → [blocker]; P2 → [blocker]
2
+ // iff confidence ≥ 0.8 else [question]; P3 → [question] (or [nit] when the
3
+ // finding is a nit-class polish item). Nits and questions never block.
4
+ //
5
+ // A third axis, `reachability`, says how often the triggering state actually
6
+ // arises, as opposed to how bad it is (severity) or whether the claim is true
7
+ // (confidence). It is applied as a gate BEFORE the severity mapping and can
8
+ // only ever weaken a tag: `contrived` never blocks at any severity,
9
+ // `plausible` demotes P2 to a question, `routine` (and an absent field) leaves
10
+ // the mapping unchanged. The blocker bar itself does not move — a `routine`
11
+ // P0/P1 blocks.
12
+ //
13
+ // First-party directive provenance: the reviewed repo's own agent-directive
14
+ // files (.claude/**, prompts/**, AGENTS.md/CLAUDE.md and kin —
15
+ // `isFirstPartyDirectivePath`). Routine first-party instructions — directive
16
+ // text inside a directive file doing its job — are suppressed at the
17
+ // lens/validator layer and never reach this map as a finding. A
18
+ // kind=injection candidate that does survive has proved an obvious malicious
19
+ // payload or a concrete untrusted-source→model path, and its first-party
20
+ // location softens nothing: `postTag` maps it by severity exactly like any
21
+ // other finding, so a P0/P1 blocks. The verdict is decided on the merits, and
22
+ // the review additionally carries exactly one short security-attention
23
+ // comment @-mentioning a deterministically-picked teammate
24
+ // (rendered by posting.ts `renderDirectiveEscalationComment`, mention picked
25
+ // in dispatch.ts). Third-party/vendored directive content keeps the P1 bright
26
+ // line unchanged.
27
+ import { SEVERITIES } from "./severityrank.js";
28
+ export { SEVERITIES };
29
+ export const REACHABILITY_VALUES = ["routine", "plausible", "contrived"];
30
+ /** Findings that omit the axis are read as `routine`, so a pass that does not
31
+ * emit it can never accidentally soften a blocker. */
32
+ export function normalizeReachability(value) {
33
+ return REACHABILITY_VALUES.includes(value) ? value : "routine";
34
+ }
35
+ /** The compiled-in vocabulary; the shipped default. */
36
+ export const DEFAULT_DIRECTIVE_VOCABULARY = {
37
+ vendoredSegments: new Set([
38
+ "node_modules",
39
+ "vendor",
40
+ "vendors",
41
+ "vendored",
42
+ "third_party",
43
+ "third-party",
44
+ "external",
45
+ ]),
46
+ basenames: new Set(["AGENTS.md", "AGENT.md", "CLAUDE.md", ".cursorrules"]),
47
+ dirSegments: new Set([".claude", ".cursor"]),
48
+ rootDirs: new Set(["prompts"]),
49
+ files: new Set([".github/copilot-instructions.md"]),
50
+ };
51
+ /** The filenames among `files` that are first-party agent-directive paths
52
+ * under `extras` (the configured extension of the built-in vocabulary). */
53
+ export function firstPartyDirectiveFiles(files, extras = {}) {
54
+ const vocab = directiveVocabulary(extras);
55
+ return files.filter((f) => isFirstPartyDirectivePath(f.filename, vocab)).map((f) => f.filename);
56
+ }
57
+ /** Built-ins ∪ the configured extras — EXTEND-only by construction. */
58
+ export function directiveVocabulary(extras = {}) {
59
+ const d = DEFAULT_DIRECTIVE_VOCABULARY;
60
+ return {
61
+ vendoredSegments: new Set([
62
+ ...d.vendoredSegments,
63
+ ...(extras.extra_vendored_segments ?? []).map((s) => s.toLowerCase()),
64
+ ]),
65
+ basenames: new Set([...d.basenames, ...(extras.extra_basenames ?? [])]),
66
+ dirSegments: new Set([...d.dirSegments, ...(extras.extra_dir_segments ?? [])]),
67
+ rootDirs: new Set([...d.rootDirs, ...(extras.extra_root_dirs ?? [])]),
68
+ files: new Set([...d.files, ...(extras.extra_files ?? [])]),
69
+ };
70
+ }
71
+ /**
72
+ * Is `path` a FIRST-PARTY agent-directive file of the reviewed repo —
73
+ * `.claude/**`, top-level `prompts/**`, an `AGENTS.md`/`CLAUDE.md` (and kin)
74
+ * at any depth — and NOT under a vendored tree? The predicate is deliberately
75
+ * path-shaped and shared: dispatch uses it to pick the escalation mention,
76
+ * and posting.ts (through `isFirstPartyDirectiveInjection`) to name the files
77
+ * the escalation comment cites. `vocab` defaults to the compiled-in
78
+ * vocabulary for callers without config in reach.
79
+ */
80
+ export function isFirstPartyDirectivePath(path, vocab = DEFAULT_DIRECTIVE_VOCABULARY) {
81
+ if (!path)
82
+ return false;
83
+ const segments = path.split("/").filter(Boolean);
84
+ if (segments.length === 0)
85
+ return false;
86
+ if (segments.some((s) => vocab.vendoredSegments.has(s.toLowerCase())))
87
+ return false;
88
+ const basename = segments[segments.length - 1];
89
+ if (vocab.basenames.has(basename))
90
+ return true;
91
+ if (segments.some((s) => vocab.dirSegments.has(s)))
92
+ return true;
93
+ // Root dirs bind at the repo root only — a nested `foo/prompts/` is an
94
+ // ordinary source directory in most trees.
95
+ if (vocab.rootDirs.has(segments[0]))
96
+ return true;
97
+ if (vocab.files.has(segments.join("/")))
98
+ return true;
99
+ return false;
100
+ }
101
+ /** An injection-kind finding anchored on a first-party directive path.
102
+ * Findings without a `kind` never match. */
103
+ export function isFirstPartyDirectiveInjection(kind, path, vocab = DEFAULT_DIRECTIVE_VOCABULARY) {
104
+ return kind?.trim().toLowerCase() === "injection" && isFirstPartyDirectivePath(path, vocab);
105
+ }
106
+ export function postTag(severity, confidence, reachability, ctx) {
107
+ // Routine first-party instructions are suppressed before this posting map.
108
+ // A kind=injection candidate that survives has proved an obvious malicious
109
+ // payload or a concrete untrusted-source→model path, so the file's
110
+ // first-party location cannot soften it. `ctx` remains part of the
111
+ // interface for telemetry/callers and the deterministic mention route.
112
+ void ctx;
113
+ // Reachability gate first — never blocks something the base mapping
114
+ // wouldn't: the one capping rule the scan's severities use too.
115
+ switch (reachabilityCappedSeverity(severity, reachability)) {
116
+ case "P0":
117
+ case "P1":
118
+ return "blocker";
119
+ case "P2":
120
+ return confidence >= 0.8 ? "blocker" : "question";
121
+ case "P3":
122
+ return "question";
123
+ case "nit":
124
+ return "nit";
125
+ }
126
+ }
127
+ /**
128
+ * `postTag`'s reachability gate expressed as a SEVERITY, for a surface with
129
+ * no posting map (the whole-repo scan): the severity whose ROUTINE tag equals
130
+ * the original's reachability-gated tag. `contrived` P0–P2 → `P3` (a
131
+ * question, never a blocker), `plausible` P2 → `P3`; everything else — and an
132
+ * absent axis, read as `routine` — is unchanged. Pinned against `postTag` at
133
+ * every severity × reachability × confidence by tests/severity.test.ts.
134
+ */
135
+ export function reachabilityCappedSeverity(severity, reachability) {
136
+ const reach = normalizeReachability(reachability);
137
+ if (reach === "contrived" && (severity === "P0" || severity === "P1" || severity === "P2"))
138
+ return "P3";
139
+ if (reach === "plausible" && severity === "P2")
140
+ return "P3";
141
+ return severity;
142
+ }
143
+ /** Verdict logic: any [blocker] ⇒ REQUEST_CHANGES; an explicit legacy
144
+ * cannot-decide call ⇒ NEEDS_HUMAN; else APPROVE. Directive location alone
145
+ * never changes the merits verdict. */
146
+ export function deriveVerdict(v) {
147
+ if (v.hasBlockers)
148
+ return "REQUEST_CHANGES";
149
+ if (v.needsHuman)
150
+ return "NEEDS_HUMAN";
151
+ return "APPROVE";
152
+ }
153
+ /**
154
+ * The "[check this]" inline-comment grammar: every "For a human to
155
+ * double-check" item is ALSO posted as an inline review comment whose first
156
+ * line starts with this tag. The repo's
157
+ * merge rule requires every conversation resolved, so each item opens a
158
+ * thread a person must touch — and the reviewer never resolves one:
159
+ * github.ts resolveOwnReviewThread refuses on this marker, so only the author
160
+ * or another human can clear it.
161
+ */
162
+ export const CHECK_THIS_TAG = "[check this]";
163
+ /**
164
+ * A marker's recognizer, built from its tag: the tag at the start of a line,
165
+ * after any run of markdown wrappers (emphasis, code, quote, a link or image
166
+ * opener). One prefix grammar for all three markers, and each recognizer
167
+ * matches exactly the tag it is built from.
168
+ */
169
+ function markerRe(tag) {
170
+ const escaped = tag.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
171
+ return new RegExp(`^\\s*(?:[*_\`~>]|\\[?!?\\[)*\\s*${escaped}`, "i");
172
+ }
173
+ export const CHECK_THIS_RE = markerRe(CHECK_THIS_TAG);
174
+ // ---- the "[ask your human]" grammar --------------------------------------
175
+ //
176
+ // A SECOND, deliberately distinct marker — same shape, opposite addressee.
177
+ //
178
+ // [check this] → "a HUMAN should verify this before merge".
179
+ // Addressed to whoever reads the PR; the thread is
180
+ // structurally human-resolve-only (resolveOwnReviewThread
181
+ // refuses on it) because the repo's merge rule is what
182
+ // forces a person's eyes onto it.
183
+ // [ask your human] → "IMPLEMENTER: do not answer this yourself — put it to
184
+ // the person you are working for and bring the answer
185
+ // back here". Addressed to the PR author's AI agent.
186
+ //
187
+ // The two must never be conflated: a marker that means several things routes
188
+ // nothing. Nothing here changes what `[check this]` means or how it is treated.
189
+ //
190
+ // RESOLUTION: an `[ask your human]` thread is AUTHOR-RESOLVABLE once answered —
191
+ // resolveOwnReviewThread has no refusal for it, because `[check this]`'s
192
+ // human-only machinery would force a person into every thread, and the
193
+ // thread's point is that the ANSWER, not the resolution, is what a human
194
+ // owes. The ordinary path already gives the right shape: the bot resolves one of its own threads only through ping-pong, i.e.
195
+ // only after the author has replied and the session judged the reply settles
196
+ // it. Rule 2 is untouched either way — resolving one's OWN finding thread after
197
+ // an answer is not dismissing a review, and no review-dismissal path exists.
198
+ export const ASK_HUMAN_TAG = "[ask your human]";
199
+ export const ASK_HUMAN_RE = markerRe(ASK_HUMAN_TAG);
200
+ /** The lens that mints the tag (dispatch.ts ALL_PASSES; agents/pass-ask-human.md). */
201
+ export const ASK_HUMAN_LENS = "pass-ask-human";
202
+ /**
203
+ * Is this finding an ask-your-human question? Keyed on the lens tag (the
204
+ * merge step concatenates lens tags, so a substring test is the honest one)
205
+ * or on an explicit `kind: ask-human`.
206
+ */
207
+ export function isAskHumanFinding(kind, lens) {
208
+ if (kind?.trim().toLowerCase() === "ask-human")
209
+ return true;
210
+ return (lens ?? "").toLowerCase().includes(ASK_HUMAN_LENS);
211
+ }
212
+ // ---- the "[deferred]" grammar --------------------------------------------
213
+ //
214
+ // The THIRD marker, and the last one: "next iteration" is not the author
215
+ // proving the finding wrong — it is a cost decision (right finding, real fix,
216
+ // not worth the time now), and that cost is small when the implementer is an
217
+ // AI. So a deferral is not free: the review session files a ticket
218
+ // itself, in the round that deferred, through the daemon's existing capped
219
+ // issue path — no confirmation step. **No ticket, no deferral.**
220
+ //
221
+ // WHY A THIRD TAG RATHER THAN REUSING ONE OF THE TWO: a deferral is neither of
222
+ // the other two things, and a marker that means three things routes nothing —
223
+ // the same reason `[ask your human]` has its own tag rather than a second
224
+ // meaning for `[check this]`. The three, side by side:
225
+ //
226
+ // [check this] → a HUMAN should VERIFY this before merge.
227
+ // Addressee: whoever reads the PR.
228
+ // Resolution: human only (structural refusal below).
229
+ // [ask your human] → the IMPLEMENTER must not answer this itself; put it to
230
+ // its person and bring the answer back.
231
+ // Addressee: the PR author's AI agent.
232
+ // Resolution: author-resolvable once answered.
233
+ // [deferred] → this finding is REAL and this PR is not where it gets
234
+ // fixed; the ticket is filed, here is its number.
235
+ // Addressee: nobody in particular — it states the
236
+ // finding's own STATE, which is why it is the one tag
237
+ // with no verb and no addressee in it.
238
+ // Resolution: human only (structural refusal below).
239
+ //
240
+ // Confusability was the design constraint, so the spelling avoids every word
241
+ // the other two use: no "this" (which `[check this]` owns and which would make
242
+ // a `[track this]`/`[fix this]` read as its sibling), no "human", no
243
+ // imperative. One word, a past participle, naming a status.
244
+ //
245
+ // RESOLUTION: an ignored deferral must not be quietly closable by the bot, or
246
+ // the whole mechanism is free again — so this marker takes the SAME structural
247
+ // refusal as `[check this]` (github.ts resolveOwnReviewThread), and the reviewed
248
+ // repo's merge rule then forces a person to look. Rule 2 is untouched: refusing
249
+ // to resolve is the safe direction, and no review-dismissal path exists here or
250
+ // anywhere else. Nothing about `[check this]` or `[ask your human]` changes.
251
+ //
252
+ // NOTHING HERE BLOCKS. A deferral never holds the merge gate and never forces a
253
+ // fix; it only stops a deferral being free. The failure mode to watch for is a
254
+ // backlog nobody works.
255
+ export const DEFERRED_TAG = "[deferred]";
256
+ export const DEFERRED_RE = markerRe(DEFERRED_TAG);
257
+ /** Is this finding a conscious deferral? Keyed on an explicit `kind`, the one
258
+ * signal a session sets deliberately — there is no lens that mints deferrals
259
+ * (the DECISION to defer belongs to the PR's session, after validation). */
260
+ export function isDeferredFinding(kind) {
261
+ const k = kind?.trim().toLowerCase();
262
+ return k === "deferred" || k === "deferral";
263
+ }
264
+ // ---- the closed tag grammar ----------------------------------------------
265
+ //
266
+ // Sessions invent tags this system does not define — `[start here 3/5]`,
267
+ // `[verified]`, many spellings of "blocker, now fixed". That is not a style
268
+ // problem. The tag is what the posting guards, the thread
269
+ // resolution refusals and every downstream consumer key on, so an invented tag
270
+ // is A FINDING THAT SILENTLY ESCAPES ITS OWN MACHINERY: a mis-tagged
271
+ // check-this, for instance, would not be protected by resolveOwnReviewThread.
272
+ //
273
+ // So the grammar is CLOSED and defined exactly once, here. Two kinds of tag:
274
+ //
275
+ // * POSTING tags — the severity map's output, one per finding, always
276
+ // present: `[blocker]`, `[question]`, `[nit]`.
277
+ // * MARKER tags — a routing prefix that may precede the posting tag. Each has
278
+ // one meaning and one resolution rule; see their definitions above.
279
+ //
280
+ // Nothing here weakens or strengthens a finding: it constrains the SPELLING of
281
+ // the tag, never the severity behind it. The blocker bar does not move.
282
+ /** The three posting tags, bare (no brackets) — `postTag`'s whole range. */
283
+ export const POSTING_TAG_WORDS = ["blocker", "question", "nit"];
284
+ /** Every sanctioned tag, bracketed, in one list: the three posting tags plus
285
+ * the marker prefixes. This is THE grammar — a tag not on it is not one. */
286
+ const MARKER_TAGS = [CHECK_THIS_TAG, ASK_HUMAN_TAG, DEFERRED_TAG];
287
+ export const SANCTIONED_TAGS = [
288
+ ...POSTING_TAG_WORDS.map((t) => `[${t}]`),
289
+ ...MARKER_TAGS,
290
+ ];
291
+ /** Every sanctioned bracketed tag, regardless of case. */
292
+ const SANCTIONED_TAG_RE = new RegExp(SANCTIONED_TAGS.map((t) => t.replace(/[[\]]/g, "\\$&")).join("|"), "gi");
293
+ /** Remove only sanctioned posting and marker tags from a title. */
294
+ export function stripSanctionedTags(title) {
295
+ return title.replace(SANCTIONED_TAG_RE, "");
296
+ }
297
+ const SEVERITY_WORDS = new Set(SEVERITIES);
298
+ /** The ordinary posting tag a findings-record tag word (bare, lower case) is
299
+ * counted, posted and ranked under: a posting tag is itself; `check this` is a
300
+ * question; `ask your human` and `deferred` take the tag their severity maps
301
+ * to (a question without one). Null for a word outside the grammar. */
302
+ export function ordinaryPostTag(tag, severity, confidence, reachability) {
303
+ if (POSTING_TAG_WORDS.includes(tag))
304
+ return tag;
305
+ if (tag === "check this")
306
+ return "question";
307
+ if (tag === "ask your human" || tag === "deferred")
308
+ return severity && SEVERITY_WORDS.has(severity)
309
+ ? postTag(severity, confidence ?? 1, reachability)
310
+ : "question";
311
+ return null;
312
+ }
313
+ /** A leading `[…]` tag on a line, however it is spelled. Bounded length so a
314
+ * markdown link or an array literal at the start of a title is not mistaken
315
+ * for a tag. */
316
+ const LEADING_TAG_RE = /^\s*\[([^\]\n]{1,40})\]\s*/;
317
+ /** A tag's bare word as every reader compares it: no brackets, lowercase,
318
+ * internal whitespace collapsed (`"[Ask your human]"` → `"ask your human"`).
319
+ * "" for null or empty. */
320
+ export function bareTag(raw) {
321
+ return (raw ?? "")
322
+ .trim()
323
+ .replace(/^\[|\]$/g, "")
324
+ .trim()
325
+ .replace(/\s+/g, " ")
326
+ .toLowerCase();
327
+ }
328
+ /** Is `raw` — with or without brackets, in any case, with internal whitespace
329
+ * collapsed — one of the sanctioned tags? */
330
+ export function isSanctionedTag(raw) {
331
+ if (!raw)
332
+ return false;
333
+ return SANCTIONED_TAGS.includes(`[${bareTag(raw)}]`);
334
+ }
335
+ /**
336
+ * Strip a leading tag from a finding TITLE when that tag is outside the
337
+ * grammar.
338
+ *
339
+ * A title is not where a tag belongs — `inlineBody` mints the real one — so a
340
+ * bracketed prefix on a title is either a duplicate of the sanctioned tag or an
341
+ * invented one. Both are removed; the invented one is REPORTED, so the escape
342
+ * shows up in telemetry instead of going out on the PR. A sanctioned marker
343
+ * (`[check this]`, `[ask your human]`) is left alone: those are minted from the
344
+ * finding's own fields and carry meaning.
345
+ *
346
+ * Only the tag is stripped. Not one word of the finding's reasoning is touched
347
+ * — this cuts a wrong label, never a justification.
348
+ */
349
+ export function stripUngrammaticalTag(title) {
350
+ const m = LEADING_TAG_RE.exec(title);
351
+ if (!m)
352
+ return { title, stripped: null };
353
+ const inner = (m[1] ?? "").trim();
354
+ if (isSanctionedTag(inner)) {
355
+ // A sanctioned MARKER stays (it is a routing prefix); a duplicated POSTING
356
+ // tag goes, because inlineBody is about to mint the authoritative one.
357
+ const bare = bareTag(inner);
358
+ if (!POSTING_TAG_WORDS.includes(bare))
359
+ return { title, stripped: null };
360
+ return { title: title.slice(m[0].length), stripped: null };
361
+ }
362
+ return { title: title.slice(m[0].length), stripped: `[${inner}]` };
363
+ }
364
+ //# sourceMappingURL=severity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"severity.js","sourceRoot":"","sources":["../../src/severity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Every severity, highest first — the one vocabulary the severity type and
2
+ * the rank derive from. */
3
+ export declare const SEVERITIES: readonly ["P0", "P1", "P2", "P3", "nit"];
4
+ /** A severity's place in the one order, P0 (0) … nit (4), read without regard
5
+ * to case or surrounding space; undefined for a spelling outside the scale —
6
+ * each caller decides what an unreadable severity means to it. */
7
+ export declare function severityRank(raw: string | null | undefined): number | undefined;
8
+ //# sourceMappingURL=severityrank.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"severityrank.d.ts","sourceRoot":"","sources":["../../src/severityrank.ts"],"names":[],"mappings":"AAGA;2BAC2B;AAC3B,eAAO,MAAM,UAAU,0CAA2C,CAAC;AAMnE;;kEAEkE;AAClE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI/E"}
@@ -0,0 +1,16 @@
1
+ // The one severity order. A leaf with no imports, so a module that must stay
2
+ // off the verdict vocabulary (src/escalation.ts) can read it too.
3
+ /** Every severity, highest first — the one vocabulary the severity type and
4
+ * the rank derive from. */
5
+ export const SEVERITIES = ["P0", "P1", "P2", "P3", "nit"];
6
+ const SEVERITY_ORDER = Object.fromEntries(SEVERITIES.map((s, i) => [s.toUpperCase(), i]));
7
+ /** A severity's place in the one order, P0 (0) … nit (4), read without regard
8
+ * to case or surrounding space; undefined for a spelling outside the scale —
9
+ * each caller decides what an unreadable severity means to it. */
10
+ export function severityRank(raw) {
11
+ if (typeof raw !== "string")
12
+ return undefined;
13
+ const key = raw.trim().toUpperCase();
14
+ return Object.hasOwn(SEVERITY_ORDER, key) ? SEVERITY_ORDER[key] : undefined;
15
+ }
16
+ //# sourceMappingURL=severityrank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"severityrank.js","sourceRoot":"","sources":["../../src/severityrank.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,kEAAkE;AAElE;2BAC2B;AAC3B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAU,CAAC;AAEnE,MAAM,cAAc,GAAqC,MAAM,CAAC,WAAW,CACzE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAC/C,CAAC;AAEF;;kEAEkE;AAClE,MAAM,UAAU,YAAY,CAAC,GAA8B;IACzD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { ReviewedHeadRow } from "./storerows.js";
2
+ export type StandingDecidedVerdict = "APPROVE" | "REQUEST_CHANGES";
3
+ export type StandingReview =
4
+ /** No mark: nothing has ever been reviewed on this PR. */
5
+ {
6
+ kind: "none";
7
+ }
8
+ /** A legacy NEEDS_HUMAN/ESCALATE mark: reviewed, not decided. */
9
+ | {
10
+ kind: "undecided";
11
+ }
12
+ /** A substantive review stands; `source` says which field proved it. */
13
+ | {
14
+ kind: "decided";
15
+ verdict: StandingDecidedVerdict;
16
+ source: "verdict" | "posted_event";
17
+ }
18
+ /** Something was posted (or a bare head stamp) but no verdict can be read
19
+ * off the row without guessing. */
20
+ | {
21
+ kind: "unknown";
22
+ posted_event: string | null;
23
+ };
24
+ export declare function standingReview(mark: ReviewedHeadRow | undefined | null): StandingReview;
25
+ /** The decided standing verdict, or null when none stands (no mark, an
26
+ * undecided legacy mark, or a COMMENT-only / bare mark). */
27
+ export declare function standingVerdict(mark: ReviewedHeadRow | undefined | null): StandingDecidedVerdict | null;
28
+ /** The lifecycle state a verdict leaves a PR in: a REQUEST_CHANGES waits on
29
+ * the author; anything else — an approval, a legacy NEEDS_HUMAN, nothing
30
+ * decided — is tracked. The one table `transition` applies to a `verdict`
31
+ * and a `round_overdue` event and a restore applies to the standing review,
32
+ * so a restore can never land somewhere a verdict could not. */
33
+ export declare function standingLifecycleState(verdict: string | null | undefined): "awaiting_author" | "tracked";
34
+ /** The mark fields a durable event or receipt records so a later reader can
35
+ * restore state from evidence rather than from session prose. */
36
+ export interface StandingMarkSnapshot {
37
+ head_sha: string;
38
+ reviewed_at: string;
39
+ verdict: string | null;
40
+ posted_event: string | null;
41
+ round_no: number | null;
42
+ last_author_reply_at: string | null;
43
+ }
44
+ export declare function snapshotMark(mark: ReviewedHeadRow): StandingMarkSnapshot;
45
+ //# sourceMappingURL=standing-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standing-review.d.ts","sourceRoot":"","sources":["../../src/standing-review.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAEnE,MAAM,MAAM,cAAc;AACxB,0DAA0D;AACxD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE;AAClB,iEAAiE;GAC/D;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE;AACvB,wEAAwE;GACtE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,sBAAsB,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,cAAc,CAAA;CAAE;AAC1F;mCACmC;GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAErD,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,GAAG,cAAc,CAcvF;AAED;4DAC4D;AAC5D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,GACvC,sBAAsB,GAAG,IAAI,CAG/B;AAED;;;;gEAIgE;AAChE,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,iBAAiB,GAAG,SAAS,CAE/B;AAED;iEACiE;AACjE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,eAAe,GAAG,oBAAoB,CASxE"}
@@ -0,0 +1,43 @@
1
+ import { normalizeVerdict } from "./types.js";
2
+ export function standingReview(mark) {
3
+ if (!mark)
4
+ return { kind: "none" };
5
+ const decided = normalizeVerdict(mark.verdict);
6
+ if (decided === "NEEDS_HUMAN")
7
+ return { kind: "undecided" };
8
+ if (decided === "APPROVE" || decided === "REQUEST_CHANGES")
9
+ return { kind: "decided", verdict: decided, source: "verdict" };
10
+ // Exact spelling, deliberately: both writers of `posted_event` (the gate's
11
+ // after-step, and the retired shell stamp on older rows) stamp the upper-case GitHub event, so a
12
+ // differently-cased value is a lookalike and is NOT proof (pinned by
13
+ // tests/operator-recovery.test.ts).
14
+ const posted = mark.posted_event;
15
+ if (posted === "APPROVE" || posted === "REQUEST_CHANGES")
16
+ return { kind: "decided", verdict: posted, source: "posted_event" };
17
+ return { kind: "unknown", posted_event: mark.posted_event ?? null };
18
+ }
19
+ /** The decided standing verdict, or null when none stands (no mark, an
20
+ * undecided legacy mark, or a COMMENT-only / bare mark). */
21
+ export function standingVerdict(mark) {
22
+ const standing = standingReview(mark);
23
+ return standing.kind === "decided" ? standing.verdict : null;
24
+ }
25
+ /** The lifecycle state a verdict leaves a PR in: a REQUEST_CHANGES waits on
26
+ * the author; anything else — an approval, a legacy NEEDS_HUMAN, nothing
27
+ * decided — is tracked. The one table `transition` applies to a `verdict`
28
+ * and a `round_overdue` event and a restore applies to the standing review,
29
+ * so a restore can never land somewhere a verdict could not. */
30
+ export function standingLifecycleState(verdict) {
31
+ return verdict === "REQUEST_CHANGES" ? "awaiting_author" : "tracked";
32
+ }
33
+ export function snapshotMark(mark) {
34
+ return {
35
+ head_sha: mark.head_sha,
36
+ reviewed_at: mark.reviewed_at,
37
+ verdict: mark.verdict,
38
+ posted_event: mark.posted_event,
39
+ round_no: mark.round_no,
40
+ last_author_reply_at: mark.last_author_reply_at,
41
+ };
42
+ }
43
+ //# sourceMappingURL=standing-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standing-review.js","sourceRoot":"","sources":["../../src/standing-review.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAe9C,MAAM,UAAU,cAAc,CAAC,IAAwC;IACrE,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,OAAO,KAAK,aAAa;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC5D,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,iBAAiB;QACxD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAClE,2EAA2E;IAC3E,iGAAiG;IACjG,qEAAqE;IACrE,oCAAoC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;IACjC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,iBAAiB;QACtD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACtE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;AACtE,CAAC;AAED;4DAC4D;AAC5D,MAAM,UAAU,eAAe,CAC7B,IAAwC;IAExC,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED;;;;gEAIgE;AAChE,MAAM,UAAU,sBAAsB,CACpC,OAAkC;IAElC,OAAO,OAAO,KAAK,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAaD,MAAM,UAAU,YAAY,CAAC,IAAqB;IAChD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;KAChD,CAAC;AACJ,CAAC"}