@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 @@
1
+ {"version":3,"file":"round-stage-deadlines.d.ts","sourceRoot":"","sources":["../../src/round-stage-deadlines.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;IACN,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,EACD,SAAS,EAAE,OAAO,GACjB;IACD,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAOA"}
@@ -0,0 +1,10 @@
1
+ /** Start-derived round deadlines, shared by enforcement and status publication. */
2
+ export function roundStageDeadlines(started, bounds, sweepOwed) {
3
+ const extra = sweepOwed ? (bounds.follow_up_sweep_extra_min ?? 0) : 0;
4
+ return {
5
+ first_pass_start: started + bounds.first_pass_max_min * 60_000,
6
+ passes_complete: started + (bounds.passes_max_min + extra) * 60_000,
7
+ running_hard_bound: started + (bounds.running_max_min + extra) * 60_000,
8
+ };
9
+ }
10
+ //# sourceMappingURL=round-stage-deadlines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"round-stage-deadlines.js","sourceRoot":"","sources":["../../src/round-stage-deadlines.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,MAKC,EACD,SAAkB;IAMlB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,yBAAyB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO;QACL,gBAAgB,EAAE,OAAO,GAAG,MAAM,CAAC,kBAAkB,GAAG,MAAM;QAC9D,eAAe,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC,GAAG,MAAM;QACnE,kBAAkB,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC,GAAG,MAAM;KACxE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /** Stable receipt carried in the Pi user message for one durable command.
2
+ * It binds the database id to the immutable payload hash, so restart recovery
3
+ * can reconcile SQLite ownership against session JSONL without trusting a
4
+ * mutable inject filename. */
5
+ export declare function sessionCommandMarker(id: string, payloadSha256: string): string;
6
+ export declare function parseSessionCommandMarker(text: string): {
7
+ id: string;
8
+ payloadSha256: string;
9
+ } | undefined;
10
+ /** The exact reservation whose consumer recovery is allowed to fence. */
11
+ export interface SessionCommandOwnership {
12
+ id: string;
13
+ status: string;
14
+ owner_token: string | null;
15
+ attempt: number;
16
+ started_at: string | null;
17
+ }
18
+ export declare function sameSessionCommandOwner(current: SessionCommandOwnership | undefined, expected: SessionCommandOwnership): boolean;
19
+ //# sourceMappingURL=session-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-command.d.ts","sourceRoot":"","sources":["../../src/session-command.ts"],"names":[],"mappings":"AAAA;;;8BAG8B;AAC9B,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,GACX;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAGnD;AAED,yEAAyE;AACzE,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,uBAAuB,GAAG,SAAS,EAC5C,QAAQ,EAAE,uBAAuB,GAChC,OAAO,CAST"}
@@ -0,0 +1,20 @@
1
+ /** Stable receipt carried in the Pi user message for one durable command.
2
+ * It binds the database id to the immutable payload hash, so restart recovery
3
+ * can reconcile SQLite ownership against session JSONL without trusting a
4
+ * mutable inject filename. */
5
+ export function sessionCommandMarker(id, payloadSha256) {
6
+ return `<!-- qcr-command:${id}:${payloadSha256} -->`;
7
+ }
8
+ export function parseSessionCommandMarker(text) {
9
+ const match = [...text.matchAll(/<!-- qcr-command:([^:\s>]+):([a-f0-9]{64}) -->/g)].at(-1);
10
+ return match ? { id: match[1], payloadSha256: match[2] } : undefined;
11
+ }
12
+ export function sameSessionCommandOwner(current, expected) {
13
+ return (current !== undefined &&
14
+ current.id === expected.id &&
15
+ current.status === expected.status &&
16
+ current.owner_token === expected.owner_token &&
17
+ current.attempt === expected.attempt &&
18
+ current.started_at === expected.started_at);
19
+ }
20
+ //# sourceMappingURL=session-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-command.js","sourceRoot":"","sources":["../../src/session-command.ts"],"names":[],"mappings":"AAAA;;;8BAG8B;AAC9B,MAAM,UAAU,oBAAoB,CAAC,EAAU,EAAE,aAAqB;IACpE,OAAO,oBAAoB,EAAE,IAAI,aAAa,MAAM,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,IAAY;IAEZ,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,iDAAiD,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC;AAWD,MAAM,UAAU,uBAAuB,CACrC,OAA4C,EAC5C,QAAiC;IAEjC,OAAO,CACL,OAAO,KAAK,SAAS;QACrB,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE;QAC1B,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAClC,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,WAAW;QAC5C,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;QACpC,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,CAC3C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,61 @@
1
+ export interface PartialWritePolicy {
2
+ /** Bytes that moved this recently may still be mid-write. Also the time an
3
+ * unchanged unparseable file must sit, under our own observation, before it
4
+ * is called corrupt. */
5
+ settleMs: number;
6
+ /** Hard bound from the first look to "unparseable", however the file moves.
7
+ * 0 disables the tolerance: one read decides (tests). */
8
+ windowMs: number;
9
+ /** First re-read delay; doubles up to `maxDelayMs`. */
10
+ initialDelayMs: number;
11
+ maxDelayMs: number;
12
+ }
13
+ /** 3 s of stillness is two orders of magnitude above a healthy write and well
14
+ * above a CFS-throttled one; 30 s bounds the worst case. A truly corrupt file
15
+ * is declared after ~3–4 s instead of 120 ms, which costs nothing: the round
16
+ * is over either way and nothing else is waiting on the answer. */
17
+ export declare const DEFAULT_PARTIAL_WRITE_POLICY: PartialWritePolicy;
18
+ export type SettledRead = {
19
+ kind: "parsed";
20
+ value: unknown;
21
+ reads: number;
22
+ waited_ms: number;
23
+ }
24
+ /** The file is not there (ENOENT) — never there, or gone mid-wait. Only
25
+ * ENOENT: any other stat or read failure is evidence about a file that is
26
+ * there, and is reported as `unparseable` below. */
27
+ | {
28
+ kind: "missing";
29
+ reads: number;
30
+ } | {
31
+ /** The bytes never parsed as JSON — or could not be read at all (EISDIR,
32
+ * EACCES, EIO, …; `error` then says "could not be read"): either way
33
+ * nothing usable is there, and the caller's malformed path decides. */
34
+ kind: "unparseable";
35
+ error: string;
36
+ reads: number;
37
+ waited_ms: number;
38
+ /** `settled`: it sat still and stayed broken. `window`: the hard bound.
39
+ * `no_tolerance`: the policy's window is 0. */
40
+ why: "settled" | "window" | "no_tolerance";
41
+ };
42
+ export interface SettledReadIo {
43
+ /** Monotonic ms — the wait's own clock. Default `performance.now()`. */
44
+ monotonicMs?: () => number;
45
+ /** Wall ms, compared with the file's mtime. Default `Date.now()`. */
46
+ wallMs?: () => number;
47
+ sleep?: (ms: number) => Promise<void>;
48
+ stat?: (path: string) => {
49
+ size: number;
50
+ mtimeMs: number;
51
+ ino: number;
52
+ };
53
+ read?: (path: string) => string;
54
+ }
55
+ export declare function resolvePartialWritePolicy(over: Partial<PartialWritePolicy> | undefined): PartialWritePolicy;
56
+ /**
57
+ * Read `path` as JSON, tolerating a writer that has not finished. Total: never
58
+ * throws. The caller still owns shape validation of `value`.
59
+ */
60
+ export declare function readSettledJson(path: string, policy: PartialWritePolicy, io?: SettledReadIo): Promise<SettledRead>;
61
+ //# sourceMappingURL=settledread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settledread.d.ts","sourceRoot":"","sources":["../../src/settledread.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,kBAAkB;IACjC;;4BAEwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB;6DACyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;mEAGmE;AACnE,eAAO,MAAM,4BAA4B,EAAE,kBAK1C,CAAC;AAQF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AACtE;;oDAEoD;GAClD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClC;IACE;;2EAEuE;IACvE,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB;mDAC+C;IAC/C,GAAG,EAAE,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;CAC5C,CAAC;AAEN,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;IAC3B,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACjC;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,SAAS,GAC5C,kBAAkB,CAEpB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,kBAAkB,EAC1B,EAAE,GAAE,aAAkB,GACrB,OAAO,CAAC,WAAW,CAAC,CAmDtB"}
@@ -0,0 +1,135 @@
1
+ // Reading a JSON file another process may still be writing.
2
+ //
3
+ // A session writes its verdict (and its recheck outcome) with pi's `write`
4
+ // tool, which is Node's `fs.promises.writeFile`: open with O_TRUNC, then the
5
+ // bytes, then close, each step a separate turn of pi's event loop. `fs.watch`
6
+ // fires on the open. Between the two steps the file is empty or short, and on
7
+ // a CPU-starved container that gap can outlast a short burst of re-reads.
8
+ //
9
+ // So an unparseable read is not evidence of a malformed file while the file
10
+ // is still plausibly being written: while its bytes moved within the last
11
+ // `settleMs` — by its own mtime, or between two of our own looks. The reader
12
+ // re-reads with backoff until the JSON parses, or until the file has sat
13
+ // unchanged for `settleMs` across several looks (it really is corrupt), or
14
+ // until `windowMs` has passed since the first look (a hard bound, so a file
15
+ // rewritten forever is still declared). Only unparseable bytes wait: a file
16
+ // that parses is complete, whatever its shape, and shape checking is the
17
+ // caller's. A file that is there but cannot be read (EISDIR, EACCES, EIO, …)
18
+ // waits the same way and is then reported as unparseable — never as missing,
19
+ // which would leave it in place, unconsumed and unannounced. Only ENOENT is
20
+ // "missing".
21
+ //
22
+ // The wait is an ordinary async sleep, never a busy loop: nothing here holds
23
+ // the event loop.
24
+ import { readFileSync, statSync } from "node:fs";
25
+ /** 3 s of stillness is two orders of magnitude above a healthy write and well
26
+ * above a CFS-throttled one; 30 s bounds the worst case. A truly corrupt file
27
+ * is declared after ~3–4 s instead of 120 ms, which costs nothing: the round
28
+ * is over either way and nothing else is waiting on the answer. */
29
+ export const DEFAULT_PARTIAL_WRITE_POLICY = {
30
+ settleMs: 3_000,
31
+ windowMs: 30_000,
32
+ initialDelayMs: 50,
33
+ maxDelayMs: 1_000,
34
+ };
35
+ /** Unchanged looks required before stillness counts — at least two re-reads
36
+ * after the signature was first seen, so a look that lands right after a
37
+ * daemon stall (when the writer, in the same throttled cgroup, has not run
38
+ * yet either) can never decide alone. */
39
+ const MIN_STABLE_LOOKS = 3;
40
+ export function resolvePartialWritePolicy(over) {
41
+ return { ...DEFAULT_PARTIAL_WRITE_POLICY, ...(over ?? {}) };
42
+ }
43
+ /**
44
+ * Read `path` as JSON, tolerating a writer that has not finished. Total: never
45
+ * throws. The caller still owns shape validation of `value`.
46
+ */
47
+ export async function readSettledJson(path, policy, io = {}) {
48
+ const mono = io.monotonicMs ?? (() => performance.now());
49
+ const wall = io.wallMs ?? (() => Date.now());
50
+ const sleep = io.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
51
+ const stat = io.stat ?? ((p) => statSync(p));
52
+ const read = io.read ?? ((p) => readFileSync(p, "utf8"));
53
+ const start = mono();
54
+ let delay = Math.max(1, policy.initialDelayMs);
55
+ let reads = 0;
56
+ let lastSig = null;
57
+ let stableSince = start;
58
+ let stableLooks = 0;
59
+ for (;;) {
60
+ const look = lookAt(path, stat, read, wall);
61
+ if (look.kind === "missing")
62
+ return { kind: "missing", reads };
63
+ reads++;
64
+ let error;
65
+ if (look.kind === "bytes") {
66
+ try {
67
+ return { kind: "parsed", value: JSON.parse(look.raw), reads, waited_ms: mono() - start };
68
+ }
69
+ catch (err) {
70
+ error = String(err);
71
+ }
72
+ }
73
+ else {
74
+ error = `the file could not be read: ${look.error}`;
75
+ }
76
+ const now = mono();
77
+ const waited = now - start;
78
+ if (policy.windowMs <= 0)
79
+ return { kind: "unparseable", error, reads, waited_ms: waited, why: "no_tolerance" };
80
+ const { sig, mtimeAge } = look;
81
+ if (sig !== lastSig) {
82
+ lastSig = sig;
83
+ stableSince = now;
84
+ stableLooks = 1;
85
+ }
86
+ else {
87
+ stableLooks++;
88
+ }
89
+ const stillFor = now - stableSince;
90
+ if (stableLooks >= MIN_STABLE_LOOKS &&
91
+ stillFor >= policy.settleMs &&
92
+ mtimeAge >= policy.settleMs)
93
+ return { kind: "unparseable", error, reads, waited_ms: waited, why: "settled" };
94
+ if (waited >= policy.windowMs)
95
+ return { kind: "unparseable", error, reads, waited_ms: waited, why: "window" };
96
+ await sleep(Math.min(delay, Math.max(1, policy.windowMs - waited)));
97
+ delay = Math.min(delay * 2, Math.max(1, policy.maxDelayMs));
98
+ }
99
+ }
100
+ /** ENOENT is the one failure that means "no file here". */
101
+ function isMissing(err) {
102
+ return err?.code === "ENOENT";
103
+ }
104
+ /** One look: the file's signature and its bytes, or why they could not be had.
105
+ * A read that fails on a file that is there (EISDIR, EACCES, EIO, …) is not
106
+ * "missing" — a verdict path the watcher silently never consumes would wedge
107
+ * its round with nothing ever said — so it is reported as an error and waited
108
+ * out like unparseable bytes: transient ones clear, persistent ones are
109
+ * declared at the same bounds. */
110
+ function lookAt(path, stat, read, wall) {
111
+ let st;
112
+ try {
113
+ st = stat(path);
114
+ }
115
+ catch (err) {
116
+ if (isMissing(err))
117
+ return { kind: "missing" };
118
+ // No mtime to age: stillness under our own looks decides alone.
119
+ const code = err?.code ?? "unknown";
120
+ return { kind: "error", error: String(err), sig: `stat-error:${code}`, mtimeAge: Infinity };
121
+ }
122
+ // Size alone misses a same-length rewrite; mtime alone misses a coarse
123
+ // clock; the inode catches a rename onto the name.
124
+ const sig = `${st.size}:${st.mtimeMs}:${st.ino}`;
125
+ const mtimeAge = wall() - st.mtimeMs;
126
+ try {
127
+ return { kind: "bytes", raw: read(path), sig, mtimeAge };
128
+ }
129
+ catch (err) {
130
+ if (isMissing(err))
131
+ return { kind: "missing" };
132
+ return { kind: "error", error: String(err), sig, mtimeAge };
133
+ }
134
+ }
135
+ //# sourceMappingURL=settledread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settledread.js","sourceRoot":"","sources":["../../src/settledread.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ import type { Verdict as VerdictType } from "./types.js";
2
+ import { SEVERITIES } from "./severityrank.js";
3
+ export { SEVERITIES };
4
+ export type Severity = (typeof SEVERITIES)[number];
5
+ /** How often the state a finding depends on actually arises. */
6
+ export type Reachability = "routine" | "plausible" | "contrived";
7
+ export declare const REACHABILITY_VALUES: readonly Reachability[];
8
+ /** Findings that omit the axis are read as `routine`, so a pass that does not
9
+ * emit it can never accidentally soften a blocker. */
10
+ export declare function normalizeReachability(value: string | undefined | null): Reachability;
11
+ /** The directive-path vocabulary the predicate below walks. Config can only
12
+ * EXTEND it: `[review.directives]` `extra_*` keys add entries and nothing can
13
+ * remove the built-ins. Replacement is deliberately not offered — dropping,
14
+ * say, `CLAUDE.md` from the vocabulary would let a config typo silently
15
+ * change how first-party directive edits are treated. A repo whose tree
16
+ * genuinely uses one of these names for something else loses at most an
17
+ * escalation comment; the reverse mistake loses a guarantee. */
18
+ export interface DirectiveVocabulary {
19
+ /** Path segments that mark VENDORED/third-party content: a directive file
20
+ * under one of these keeps the injection bright line — it was not authored
21
+ * in-repo through the PR flow. Matched lowercased. */
22
+ vendoredSegments: Set<string>;
23
+ /** Basenames that are agent-directive files wherever they sit in the tree. */
24
+ basenames: Set<string>;
25
+ /** Directory segments whose whole subtree is agent-directive content. */
26
+ dirSegments: Set<string>;
27
+ /** Root-level directory names whose subtree is directive content AT THE
28
+ * REPO ROOT ONLY — a nested `foo/prompts/` is an ordinary source dir. */
29
+ rootDirs: Set<string>;
30
+ /** Exact repo-relative file paths that are directive files. */
31
+ files: Set<string>;
32
+ }
33
+ /** Config-shaped EXTENSIONS to the built-in vocabulary (all optional; the
34
+ * shape [review.directives] parses into — see src/config.ts). */
35
+ export interface DirectiveVocabularyExtras {
36
+ extra_vendored_segments?: string[];
37
+ extra_basenames?: string[];
38
+ extra_dir_segments?: string[];
39
+ extra_root_dirs?: string[];
40
+ extra_files?: string[];
41
+ }
42
+ /** The compiled-in vocabulary; the shipped default. */
43
+ export declare const DEFAULT_DIRECTIVE_VOCABULARY: DirectiveVocabulary;
44
+ /** The filenames among `files` that are first-party agent-directive paths
45
+ * under `extras` (the configured extension of the built-in vocabulary). */
46
+ export declare function firstPartyDirectiveFiles(files: readonly {
47
+ filename: string;
48
+ }[], extras?: DirectiveVocabularyExtras): string[];
49
+ /** Built-ins ∪ the configured extras — EXTEND-only by construction. */
50
+ export declare function directiveVocabulary(extras?: DirectiveVocabularyExtras): DirectiveVocabulary;
51
+ /**
52
+ * Is `path` a FIRST-PARTY agent-directive file of the reviewed repo —
53
+ * `.claude/**`, top-level `prompts/**`, an `AGENTS.md`/`CLAUDE.md` (and kin)
54
+ * at any depth — and NOT under a vendored tree? The predicate is deliberately
55
+ * path-shaped and shared: dispatch uses it to pick the escalation mention,
56
+ * and posting.ts (through `isFirstPartyDirectiveInjection`) to name the files
57
+ * the escalation comment cites. `vocab` defaults to the compiled-in
58
+ * vocabulary for callers without config in reach.
59
+ */
60
+ export declare function isFirstPartyDirectivePath(path: string | undefined | null, vocab?: DirectiveVocabulary): boolean;
61
+ /** An injection-kind finding anchored on a first-party directive path.
62
+ * Findings without a `kind` never match. */
63
+ export declare function isFirstPartyDirectiveInjection(kind: string | undefined | null, path: string | undefined | null, vocab?: DirectiveVocabulary): boolean;
64
+ export interface PostTagContext {
65
+ /** The finding's `kind` field, when the pass emitted one. */
66
+ kind?: string | null;
67
+ /** The finding's anchored path. */
68
+ path?: string | null;
69
+ }
70
+ export declare function postTag(severity: Severity, confidence: number, reachability?: Reachability | null, ctx?: PostTagContext): PostTag;
71
+ /**
72
+ * `postTag`'s reachability gate expressed as a SEVERITY, for a surface with
73
+ * no posting map (the whole-repo scan): the severity whose ROUTINE tag equals
74
+ * the original's reachability-gated tag. `contrived` P0–P2 → `P3` (a
75
+ * question, never a blocker), `plausible` P2 → `P3`; everything else — and an
76
+ * absent axis, read as `routine` — is unchanged. Pinned against `postTag` at
77
+ * every severity × reachability × confidence by tests/severity.test.ts.
78
+ */
79
+ export declare function reachabilityCappedSeverity(severity: Severity, reachability?: Reachability | null): Severity;
80
+ export type { Verdict } from "./types.js";
81
+ export interface VerdictInput {
82
+ hasBlockers: boolean;
83
+ /** Legacy input: the session's own "I cannot decide this" call. A
84
+ * NEEDS_HUMAN verdict is still accepted (older prompts and containers emit
85
+ * it; `normalizeVerdict` folds ESCALATE into it) and the daemon lands it as
86
+ * `tracked`: review posted, no approval, the AI keeps driving. There is no
87
+ * park. No daemon-side criteria feed it. */
88
+ needsHuman: boolean;
89
+ /** Legacy input retained for older callers/containers; it has no verdict
90
+ * effect: routine first-party instructions produce no finding, while a
91
+ * surviving malicious/path-proven injection follows the ordinary blocker
92
+ * map. */
93
+ firstPartyDirectiveInjection?: boolean;
94
+ }
95
+ /** Verdict logic: any [blocker] ⇒ REQUEST_CHANGES; an explicit legacy
96
+ * cannot-decide call ⇒ NEEDS_HUMAN; else APPROVE. Directive location alone
97
+ * never changes the merits verdict. */
98
+ export declare function deriveVerdict(v: VerdictInput): VerdictType;
99
+ /**
100
+ * The "[check this]" inline-comment grammar: every "For a human to
101
+ * double-check" item is ALSO posted as an inline review comment whose first
102
+ * line starts with this tag. The repo's
103
+ * merge rule requires every conversation resolved, so each item opens a
104
+ * thread a person must touch — and the reviewer never resolves one:
105
+ * github.ts resolveOwnReviewThread refuses on this marker, so only the author
106
+ * or another human can clear it.
107
+ */
108
+ export declare const CHECK_THIS_TAG = "[check this]";
109
+ export declare const CHECK_THIS_RE: RegExp;
110
+ export declare const ASK_HUMAN_TAG = "[ask your human]";
111
+ export declare const ASK_HUMAN_RE: RegExp;
112
+ /** The lens that mints the tag (dispatch.ts ALL_PASSES; agents/pass-ask-human.md). */
113
+ export declare const ASK_HUMAN_LENS = "pass-ask-human";
114
+ /**
115
+ * Is this finding an ask-your-human question? Keyed on the lens tag (the
116
+ * merge step concatenates lens tags, so a substring test is the honest one)
117
+ * or on an explicit `kind: ask-human`.
118
+ */
119
+ export declare function isAskHumanFinding(kind?: string | null, lens?: string | null): boolean;
120
+ export declare const DEFERRED_TAG = "[deferred]";
121
+ export declare const DEFERRED_RE: RegExp;
122
+ /** Is this finding a conscious deferral? Keyed on an explicit `kind`, the one
123
+ * signal a session sets deliberately — there is no lens that mints deferrals
124
+ * (the DECISION to defer belongs to the PR's session, after validation). */
125
+ export declare function isDeferredFinding(kind?: string | null): boolean;
126
+ /** The three posting tags, bare (no brackets) — `postTag`'s whole range. */
127
+ export declare const POSTING_TAG_WORDS: readonly ["blocker", "question", "nit"];
128
+ export type PostTag = (typeof POSTING_TAG_WORDS)[number];
129
+ /** Every sanctioned tag, bracketed, in one list: the three posting tags plus
130
+ * the marker prefixes. This is THE grammar — a tag not on it is not one. */
131
+ declare const MARKER_TAGS: readonly ["[check this]", "[ask your human]", "[deferred]"];
132
+ type BareMarker<T> = T extends `[${infer Word}]` ? Word : never;
133
+ export type SanctionedTagWord = PostTag | BareMarker<(typeof MARKER_TAGS)[number]>;
134
+ export declare const SANCTIONED_TAGS: readonly string[];
135
+ /** Remove only sanctioned posting and marker tags from a title. */
136
+ export declare function stripSanctionedTags(title: string): string;
137
+ /** The ordinary posting tag a findings-record tag word (bare, lower case) is
138
+ * counted, posted and ranked under: a posting tag is itself; `check this` is a
139
+ * question; `ask your human` and `deferred` take the tag their severity maps
140
+ * to (a question without one). Null for a word outside the grammar. */
141
+ export declare function ordinaryPostTag(tag: string, severity: string | null, confidence: number | null, reachability: string | null): PostTag | null;
142
+ /** A tag's bare word as every reader compares it: no brackets, lowercase,
143
+ * internal whitespace collapsed (`"[Ask your human]"` → `"ask your human"`).
144
+ * "" for null or empty. */
145
+ export declare function bareTag(raw: string | null | undefined): string;
146
+ /** Is `raw` — with or without brackets, in any case, with internal whitespace
147
+ * collapsed — one of the sanctioned tags? */
148
+ export declare function isSanctionedTag(raw: string | null | undefined): boolean;
149
+ /**
150
+ * Strip a leading tag from a finding TITLE when that tag is outside the
151
+ * grammar.
152
+ *
153
+ * A title is not where a tag belongs — `inlineBody` mints the real one — so a
154
+ * bracketed prefix on a title is either a duplicate of the sanctioned tag or an
155
+ * invented one. Both are removed; the invented one is REPORTED, so the escape
156
+ * shows up in telemetry instead of going out on the PR. A sanctioned marker
157
+ * (`[check this]`, `[ask your human]`) is left alone: those are minted from the
158
+ * finding's own fields and carry meaning.
159
+ *
160
+ * Only the tag is stripped. Not one word of the finding's reasoning is touched
161
+ * — this cuts a wrong label, never a justification.
162
+ */
163
+ export declare function stripUngrammaticalTag(title: string): {
164
+ title: string;
165
+ stripped: string | null;
166
+ };
167
+ //# sourceMappingURL=severity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"severity.d.ts","sourceRoot":"","sources":["../../src/severity.ts"],"names":[],"mappings":"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"}