@quickchatai/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 (1443) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +385 -2
  3. package/THIRD-PARTY-NOTICES.md +134 -0
  4. package/agents/pass-abstraction.md +64 -0
  5. package/agents/pass-ask-human.md +134 -0
  6. package/agents/pass-backcompat.md +67 -0
  7. package/agents/pass-baseline.md +61 -0
  8. package/agents/pass-behaviour-delta.md +64 -0
  9. package/agents/pass-bounds.md +36 -0
  10. package/agents/pass-claims.md +31 -0
  11. package/agents/pass-concurrency.md +168 -0
  12. package/agents/pass-consistency.md +57 -0
  13. package/agents/pass-contracts.md +30 -0
  14. package/agents/pass-data-safety.md +54 -0
  15. package/agents/pass-deferred.md +35 -0
  16. package/agents/pass-delivery.md +37 -0
  17. package/agents/pass-duplication.md +60 -0
  18. package/agents/pass-intent.md +63 -0
  19. package/agents/pass-lint-conformance.md +46 -0
  20. package/agents/pass-maintainability.md +67 -0
  21. package/agents/pass-placement.md +68 -0
  22. package/agents/pass-prod-risk.md +24 -0
  23. package/agents/pass-rollout.md +32 -0
  24. package/agents/pass-roundtrip.md +46 -0
  25. package/agents/pass-security.md +31 -0
  26. package/agents/pass-simplicity.md +68 -0
  27. package/agents/pass-statelessness.md +27 -0
  28. package/agents/pass-style.md +37 -0
  29. package/agents/pass-sweep.md +57 -0
  30. package/agents/pass-tests.md +58 -0
  31. package/agents/pass-ui.md +23 -0
  32. package/agents/pass-validate.md +50 -0
  33. package/agents/pass-widened.md +46 -0
  34. package/agents/scan/pass-scan.md +86 -0
  35. package/bin/qcr.js +11 -0
  36. package/config.example.toml +1067 -0
  37. package/deploy/ansible/README.md +356 -0
  38. package/deploy/ansible/group_vars/all.yml +212 -0
  39. package/deploy/ansible/inventory.example.ini +25 -0
  40. package/deploy/ansible/playbook.yml +360 -0
  41. package/deploy/collect-secrets.sh +289 -0
  42. package/deploy/collect-slack-secrets.mjs +1190 -0
  43. package/deploy/github-app-manifest.json +31 -0
  44. package/deploy/manifest.schema.json +75 -0
  45. package/deploy/qcr-update.sh +803 -0
  46. package/deploy/reviewer/AGENTS.override.md +12 -0
  47. package/dist/extensions/cli/bash-guard-ambient.js +42 -0
  48. package/dist/extensions/cli/bash-guard-ambient.js.map +1 -0
  49. package/dist/extensions/cli/bash-guard.js +5 -0
  50. package/dist/extensions/cli/bash-guard.js.map +1 -0
  51. package/dist/extensions/cli/companion-guard.js +5 -0
  52. package/dist/extensions/cli/companion-guard.js.map +1 -0
  53. package/dist/extensions/cli/debug-round.js +8 -0
  54. package/dist/extensions/cli/debug-round.js.map +1 -0
  55. package/dist/extensions/cli/inject-bridge.js +5 -0
  56. package/dist/extensions/cli/inject-bridge.js.map +1 -0
  57. package/dist/extensions/cli/ledger-pin.js +5 -0
  58. package/dist/extensions/cli/ledger-pin.js.map +1 -0
  59. package/dist/extensions/cli/lens.js +13 -0
  60. package/dist/extensions/cli/lens.js.map +1 -0
  61. package/dist/extensions/cli/muted-theme.js +5 -0
  62. package/dist/extensions/cli/muted-theme.js.map +1 -0
  63. package/dist/extensions/cli/onboarding.js +5 -0
  64. package/dist/extensions/cli/onboarding.js.map +1 -0
  65. package/dist/extensions/cli/setup.js +5 -0
  66. package/dist/extensions/cli/setup.js.map +1 -0
  67. package/dist/extensions/cli/tui-view.js +5 -0
  68. package/dist/extensions/cli/tui-view.js.map +1 -0
  69. package/dist/extensions/companion-guard.js +361 -0
  70. package/dist/extensions/companion-guard.js.map +1 -0
  71. package/dist/extensions/debug-round.js +204 -0
  72. package/dist/extensions/debug-round.js.map +1 -0
  73. package/dist/extensions/inject-bridge.js +603 -0
  74. package/dist/extensions/inject-bridge.js.map +1 -0
  75. package/dist/extensions/muted-theme.js +12 -0
  76. package/dist/extensions/muted-theme.js.map +1 -0
  77. package/dist/extensions/onboarding.js +175 -0
  78. package/dist/extensions/onboarding.js.map +1 -0
  79. package/dist/extensions/setup-replay.js +269 -0
  80. package/dist/extensions/setup-replay.js.map +1 -0
  81. package/dist/extensions/setup-scan.js +998 -0
  82. package/dist/extensions/setup-scan.js.map +1 -0
  83. package/dist/extensions/setup-triage.js +175 -0
  84. package/dist/extensions/setup-triage.js.map +1 -0
  85. package/dist/extensions/setup.js +1160 -0
  86. package/dist/extensions/setup.js.map +1 -0
  87. package/dist/extensions/tui-view.js +389 -0
  88. package/dist/extensions/tui-view.js.map +1 -0
  89. package/dist/extensions/vendor/openviking-pi/client.js +376 -0
  90. package/dist/extensions/vendor/openviking-pi/client.js.map +1 -0
  91. package/dist/extensions/vendor/openviking-pi/config.js +189 -0
  92. package/dist/extensions/vendor/openviking-pi/config.js.map +1 -0
  93. package/dist/extensions/vendor/openviking-pi/index.js +421 -0
  94. package/dist/extensions/vendor/openviking-pi/index.js.map +1 -0
  95. package/dist/extensions/vendor/openviking-pi/lib/capture-adapter.mjs +86 -0
  96. package/dist/extensions/vendor/openviking-pi/lib/capture-adapter.mjs.map +1 -0
  97. package/dist/extensions/vendor/openviking-pi/lib/takeover-core.mjs +408 -0
  98. package/dist/extensions/vendor/openviking-pi/lib/takeover-core.mjs.map +1 -0
  99. package/dist/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs +41 -0
  100. package/dist/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs.map +1 -0
  101. package/dist/extensions/vendor/openviking-pi/qcr-hint.js +290 -0
  102. package/dist/extensions/vendor/openviking-pi/qcr-hint.js.map +1 -0
  103. package/dist/extensions/vendor/openviking-pi/qcr-honest.js +148 -0
  104. package/dist/extensions/vendor/openviking-pi/qcr-honest.js.map +1 -0
  105. package/dist/extensions/vendor/openviking-pi/qcr-hooks.js +68 -0
  106. package/dist/extensions/vendor/openviking-pi/qcr-hooks.js.map +1 -0
  107. package/dist/extensions/vendor/openviking-pi/qcr-leaf.js +77 -0
  108. package/dist/extensions/vendor/openviking-pi/qcr-leaf.js.map +1 -0
  109. package/dist/extensions/vendor/openviking-pi/qcr-lesson.js +216 -0
  110. package/dist/extensions/vendor/openviking-pi/qcr-lesson.js.map +1 -0
  111. package/dist/extensions/vendor/openviking-pi/qcr-namespaces.js +154 -0
  112. package/dist/extensions/vendor/openviking-pi/qcr-namespaces.js.map +1 -0
  113. package/dist/extensions/vendor/openviking-pi/qcr-recall.js +254 -0
  114. package/dist/extensions/vendor/openviking-pi/qcr-recall.js.map +1 -0
  115. package/dist/extensions/vendor/openviking-pi/qcr-shim.js +94 -0
  116. package/dist/extensions/vendor/openviking-pi/qcr-shim.js.map +1 -0
  117. package/dist/extensions/vendor/openviking-pi/qcr-write.js +333 -0
  118. package/dist/extensions/vendor/openviking-pi/qcr-write.js.map +1 -0
  119. package/dist/extensions/vendor/openviking-pi/recall.js +108 -0
  120. package/dist/extensions/vendor/openviking-pi/recall.js.map +1 -0
  121. package/dist/extensions/vendor/openviking-pi/shared/capture-utils.mjs +529 -0
  122. package/dist/extensions/vendor/openviking-pi/shared/capture-utils.mjs.map +1 -0
  123. package/dist/extensions/vendor/openviking-pi/shared/credentials.mjs +205 -0
  124. package/dist/extensions/vendor/openviking-pi/shared/credentials.mjs.map +1 -0
  125. package/dist/extensions/vendor/openviking-pi/shared/pending-queue.mjs +442 -0
  126. package/dist/extensions/vendor/openviking-pi/shared/pending-queue.mjs.map +1 -0
  127. package/dist/extensions/vendor/openviking-pi/shared/profile-inject.mjs +286 -0
  128. package/dist/extensions/vendor/openviking-pi/shared/profile-inject.mjs.map +1 -0
  129. package/dist/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs +189 -0
  130. package/dist/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs.map +1 -0
  131. package/dist/extensions/vendor/openviking-pi/shared/recall-core.mjs +580 -0
  132. package/dist/extensions/vendor/openviking-pi/shared/recall-core.mjs.map +1 -0
  133. package/dist/extensions/vendor/openviking-pi/shared/retryable.mjs +11 -0
  134. package/dist/extensions/vendor/openviking-pi/shared/retryable.mjs.map +1 -0
  135. package/dist/extensions/vendor/openviking-pi/shared/session-model.mjs +63 -0
  136. package/dist/extensions/vendor/openviking-pi/shared/session-model.mjs.map +1 -0
  137. package/dist/extensions/vendor/openviking-pi/shared/uri-guard.mjs +58 -0
  138. package/dist/extensions/vendor/openviking-pi/shared/uri-guard.mjs.map +1 -0
  139. package/dist/extensions/vendor/openviking-pi/shared/workspace-peer.mjs +16 -0
  140. package/dist/extensions/vendor/openviking-pi/shared/workspace-peer.mjs.map +1 -0
  141. package/dist/extensions/vendor/openviking-pi/sync.js +127 -0
  142. package/dist/extensions/vendor/openviking-pi/sync.js.map +1 -0
  143. package/dist/extensions/vendor/openviking-pi/takeover.js +25 -0
  144. package/dist/extensions/vendor/openviking-pi/takeover.js.map +1 -0
  145. package/dist/extensions/vendor/openviking-pi/tools.js +417 -0
  146. package/dist/extensions/vendor/openviking-pi/tools.js.map +1 -0
  147. package/dist/src/anomalies.js +483 -0
  148. package/dist/src/anomalies.js.map +1 -0
  149. package/dist/src/answerworker.js +180 -0
  150. package/dist/src/answerworker.js.map +1 -0
  151. package/dist/src/appstamp.js +68 -0
  152. package/dist/src/appstamp.js.map +1 -0
  153. package/dist/src/archive/admission.js +3 -0
  154. package/dist/src/archive/admission.js.map +1 -0
  155. package/dist/src/archive/archivedb.js +474 -0
  156. package/dist/src/archive/archivedb.js.map +1 -0
  157. package/dist/src/archive/archiver.js +1770 -0
  158. package/dist/src/archive/archiver.js.map +1 -0
  159. package/dist/src/archive/archivewrite.js +198 -0
  160. package/dist/src/archive/archivewrite.js.map +1 -0
  161. package/dist/src/archive/bundle.js +266 -0
  162. package/dist/src/archive/bundle.js.map +1 -0
  163. package/dist/src/archive/dbmove.js +638 -0
  164. package/dist/src/archive/dbmove.js.map +1 -0
  165. package/dist/src/archive/duplicatecounts.js +80 -0
  166. package/dist/src/archive/duplicatecounts.js.map +1 -0
  167. package/dist/src/archive/eligibility.js +113 -0
  168. package/dist/src/archive/eligibility.js.map +1 -0
  169. package/dist/src/archive/extract.js +288 -0
  170. package/dist/src/archive/extract.js.map +1 -0
  171. package/dist/src/archive/fsutil.js +330 -0
  172. package/dist/src/archive/fsutil.js.map +1 -0
  173. package/dist/src/archive/gzfile.js +277 -0
  174. package/dist/src/archive/gzfile.js.map +1 -0
  175. package/dist/src/archive/kinds.js +22 -0
  176. package/dist/src/archive/kinds.js.map +1 -0
  177. package/dist/src/archive/livecheckpoint.js +178 -0
  178. package/dist/src/archive/livecheckpoint.js.map +1 -0
  179. package/dist/src/archive/liveretention.js +145 -0
  180. package/dist/src/archive/liveretention.js.map +1 -0
  181. package/dist/src/archive/manifest.js +284 -0
  182. package/dist/src/archive/manifest.js.map +1 -0
  183. package/dist/src/archive/overseer.js +283 -0
  184. package/dist/src/archive/overseer.js.map +1 -0
  185. package/dist/src/archive/piglobal.js +129 -0
  186. package/dist/src/archive/piglobal.js.map +1 -0
  187. package/dist/src/archive/plan.js +398 -0
  188. package/dist/src/archive/plan.js.map +1 -0
  189. package/dist/src/archive/prarchive.js +831 -0
  190. package/dist/src/archive/prarchive.js.map +1 -0
  191. package/dist/src/archive/prfiles.js +303 -0
  192. package/dist/src/archive/prfiles.js.map +1 -0
  193. package/dist/src/archive/report.js +169 -0
  194. package/dist/src/archive/report.js.map +1 -0
  195. package/dist/src/archive/restore.js +276 -0
  196. package/dist/src/archive/restore.js.map +1 -0
  197. package/dist/src/archive/rows.js +106 -0
  198. package/dist/src/archive/rows.js.map +1 -0
  199. package/dist/src/archive/seal.js +480 -0
  200. package/dist/src/archive/seal.js.map +1 -0
  201. package/dist/src/archive/status.js +528 -0
  202. package/dist/src/archive/status.js.map +1 -0
  203. package/dist/src/archive/storepass.js +409 -0
  204. package/dist/src/archive/storepass.js.map +1 -0
  205. package/dist/src/backfill.js +217 -0
  206. package/dist/src/backfill.js.map +1 -0
  207. package/dist/src/bench/cost.js +87 -0
  208. package/dist/src/bench/exec.js +76 -0
  209. package/dist/src/bench/values.js +14 -0
  210. package/dist/src/botcontrol.js +127 -0
  211. package/dist/src/botcontrol.js.map +1 -0
  212. package/dist/src/botworker.js +805 -0
  213. package/dist/src/botworker.js.map +1 -0
  214. package/dist/src/capture.js +234 -0
  215. package/dist/src/capture.js.map +1 -0
  216. package/dist/src/cases.js +1491 -0
  217. package/dist/src/cases.js.map +1 -0
  218. package/dist/src/channelfs.js +27 -0
  219. package/dist/src/channelfs.js.map +1 -0
  220. package/dist/src/checklist.js +312 -0
  221. package/dist/src/checklist.js.map +1 -0
  222. package/dist/src/ciretry.js +91 -0
  223. package/dist/src/ciretry.js.map +1 -0
  224. package/dist/src/cli.js +1916 -0
  225. package/dist/src/cli.js.map +1 -0
  226. package/dist/src/cliops.js +333 -0
  227. package/dist/src/cliops.js.map +1 -0
  228. package/dist/src/clonedir.js +15 -0
  229. package/dist/src/clonedir.js.map +1 -0
  230. package/dist/src/commandeffects.js +43 -0
  231. package/dist/src/commandeffects.js.map +1 -0
  232. package/dist/src/commands.js +1312 -0
  233. package/dist/src/commands.js.map +1 -0
  234. package/dist/src/companioninbox.js +203 -0
  235. package/dist/src/companioninbox.js.map +1 -0
  236. package/dist/src/compare.js +673 -0
  237. package/dist/src/compare.js.map +1 -0
  238. package/dist/src/config.js +1027 -0
  239. package/dist/src/config.js.map +1 -0
  240. package/dist/src/configcheck.js +111 -0
  241. package/dist/src/configcheck.js.map +1 -0
  242. package/dist/src/coreext.js +43 -0
  243. package/dist/src/coreext.js.map +1 -0
  244. package/dist/src/daemon.js +929 -0
  245. package/dist/src/daemon.js.map +1 -0
  246. package/dist/src/debuground.js +731 -0
  247. package/dist/src/debuground.js.map +1 -0
  248. package/dist/src/debugroundpi.js +219 -0
  249. package/dist/src/debugroundpi.js.map +1 -0
  250. package/dist/src/diagnostics.js +14 -0
  251. package/dist/src/diagnostics.js.map +1 -0
  252. package/dist/src/digest.js +139 -0
  253. package/dist/src/digest.js.map +1 -0
  254. package/dist/src/dispatch.js +1726 -0
  255. package/dist/src/dispatch.js.map +1 -0
  256. package/dist/src/engine/answerguard.js +18 -0
  257. package/dist/src/engine/answerguard.js.map +1 -0
  258. package/dist/src/engine/botsdk.js +262 -0
  259. package/dist/src/engine/botsdk.js.map +1 -0
  260. package/dist/src/engine/caserunner-sdk.js +332 -0
  261. package/dist/src/engine/caserunner-sdk.js.map +1 -0
  262. package/dist/src/engine/debugpi.js +194 -0
  263. package/dist/src/engine/debugpi.js.map +1 -0
  264. package/dist/src/eod.js +473 -0
  265. package/dist/src/eod.js.map +1 -0
  266. package/dist/src/eodpinwatch.js +391 -0
  267. package/dist/src/eodpinwatch.js.map +1 -0
  268. package/dist/src/escalation.js +1009 -0
  269. package/dist/src/escalation.js.map +1 -0
  270. package/dist/src/eventloop.js +779 -0
  271. package/dist/src/eventloop.js.map +1 -0
  272. package/dist/src/execboundary.js +430 -0
  273. package/dist/src/execboundary.js.map +1 -0
  274. package/dist/src/feedback.js +915 -0
  275. package/dist/src/feedback.js.map +1 -0
  276. package/dist/src/findingscheck.js +200 -0
  277. package/dist/src/findingscheck.js.map +1 -0
  278. package/dist/src/fsdenied.js +26 -0
  279. package/dist/src/fsdenied.js.map +1 -0
  280. package/dist/src/ghread.js +181 -0
  281. package/dist/src/ghread.js.map +1 -0
  282. package/dist/src/github.js +1063 -0
  283. package/dist/src/github.js.map +1 -0
  284. package/dist/src/homes.js +103 -0
  285. package/dist/src/homes.js.map +1 -0
  286. package/dist/src/hostroute.js +24 -0
  287. package/dist/src/hostroute.js.map +1 -0
  288. package/dist/src/improvements.js +625 -0
  289. package/dist/src/improvements.js.map +1 -0
  290. package/dist/src/install.js +946 -0
  291. package/dist/src/install.js.map +1 -0
  292. package/dist/src/installkind.js +40 -0
  293. package/dist/src/installkind.js.map +1 -0
  294. package/dist/src/ipc/capability.js +286 -0
  295. package/dist/src/ipc/capability.js.map +1 -0
  296. package/dist/src/ipc/client.js +226 -0
  297. package/dist/src/ipc/client.js.map +1 -0
  298. package/dist/src/ipc/control.js +70 -0
  299. package/dist/src/ipc/control.js.map +1 -0
  300. package/dist/src/ipc/ghreadshim.js +77 -0
  301. package/dist/src/ipc/ghreadshim.js.map +1 -0
  302. package/dist/src/ipc/launcher.js +65 -0
  303. package/dist/src/ipc/launcher.js.map +1 -0
  304. package/dist/src/ipc/permits.js +293 -0
  305. package/dist/src/ipc/permits.js.map +1 -0
  306. package/dist/src/ipc/postshim.js +137 -0
  307. package/dist/src/ipc/postshim.js.map +1 -0
  308. package/dist/src/ipc/protocol.js +239 -0
  309. package/dist/src/ipc/protocol.js.map +1 -0
  310. package/dist/src/ipc/server.js +312 -0
  311. package/dist/src/ipc/server.js.map +1 -0
  312. package/dist/src/ipc/workerspec.js +148 -0
  313. package/dist/src/ipc/workerspec.js.map +1 -0
  314. package/dist/src/learner/learner.js +1272 -0
  315. package/dist/src/learner/learner.js.map +1 -0
  316. package/dist/src/learner/miner.js +948 -0
  317. package/dist/src/learner/miner.js.map +1 -0
  318. package/dist/src/learner/packet.js +216 -0
  319. package/dist/src/learner/packet.js.map +1 -0
  320. package/dist/src/learner/receipt.js +135 -0
  321. package/dist/src/learner/receipt.js.map +1 -0
  322. package/dist/src/learner/status.js +38 -0
  323. package/dist/src/learner/status.js.map +1 -0
  324. package/dist/src/ledgercheck.js +120 -0
  325. package/dist/src/ledgercheck.js.map +1 -0
  326. package/dist/src/lessonledger.js +451 -0
  327. package/dist/src/lessonledger.js.map +1 -0
  328. package/dist/src/lessonselect.js +639 -0
  329. package/dist/src/lessonselect.js.map +1 -0
  330. package/dist/src/lessonshadow.js +540 -0
  331. package/dist/src/lessonshadow.js.map +1 -0
  332. package/dist/src/levers.js +302 -0
  333. package/dist/src/levers.js.map +1 -0
  334. package/dist/src/live/projection.js +450 -0
  335. package/dist/src/live/projection.js.map +1 -0
  336. package/dist/src/live/publish.js +83 -0
  337. package/dist/src/live/publish.js.map +1 -0
  338. package/dist/src/live/read.js +60 -0
  339. package/dist/src/live/read.js.map +1 -0
  340. package/dist/src/livecli.js +288 -0
  341. package/dist/src/livecli.js.map +1 -0
  342. package/dist/src/loginhint.js +42 -0
  343. package/dist/src/loginhint.js.map +1 -0
  344. package/dist/src/loginrefresh/atomic.js +66 -0
  345. package/dist/src/loginrefresh/atomic.js.map +1 -0
  346. package/dist/src/loginrefresh/lock.js +93 -0
  347. package/dist/src/loginrefresh/lock.js.map +1 -0
  348. package/dist/src/loginrefresh/main.js +58 -0
  349. package/dist/src/loginrefresh/main.js.map +1 -0
  350. package/dist/src/loginrefresh/pirefresh.js +49 -0
  351. package/dist/src/loginrefresh/pirefresh.js.map +1 -0
  352. package/dist/src/loginrefresh/refresher.js +286 -0
  353. package/dist/src/loginrefresh/refresher.js.map +1 -0
  354. package/dist/src/loginrefresh/supervisor.js +253 -0
  355. package/dist/src/loginrefresh/supervisor.js.map +1 -0
  356. package/dist/src/loginrefresh/types.js +4 -0
  357. package/dist/src/loginrefresh/types.js.map +1 -0
  358. package/dist/src/memory/context.js +251 -0
  359. package/dist/src/memory/context.js.map +1 -0
  360. package/dist/src/memory/datafence.js +5 -0
  361. package/dist/src/memory/datafence.js.map +1 -0
  362. package/dist/src/memory/delivery.js +131 -0
  363. package/dist/src/memory/delivery.js.map +1 -0
  364. package/dist/src/memory/eventtags.js +81 -0
  365. package/dist/src/memory/eventtags.js.map +1 -0
  366. package/dist/src/memory/health.js +713 -0
  367. package/dist/src/memory/health.js.map +1 -0
  368. package/dist/src/memory/import.js +504 -0
  369. package/dist/src/memory/import.js.map +1 -0
  370. package/dist/src/memory/layout.js +252 -0
  371. package/dist/src/memory/layout.js.map +1 -0
  372. package/dist/src/memory/legacy-file.js +100 -0
  373. package/dist/src/memory/legacy-file.js.map +1 -0
  374. package/dist/src/memory/lessons.js +370 -0
  375. package/dist/src/memory/lessons.js.map +1 -0
  376. package/dist/src/memory/ovsession.js +449 -0
  377. package/dist/src/memory/ovsession.js.map +1 -0
  378. package/dist/src/memory/relayout.js +259 -0
  379. package/dist/src/memory/relayout.js.map +1 -0
  380. package/dist/src/memory/roundactivity.js +180 -0
  381. package/dist/src/memory/roundactivity.js.map +1 -0
  382. package/dist/src/memory/selection.js +690 -0
  383. package/dist/src/memory/selection.js.map +1 -0
  384. package/dist/src/memory/shadowstatus.js +69 -0
  385. package/dist/src/memory/shadowstatus.js.map +1 -0
  386. package/dist/src/memory/store.js +83 -0
  387. package/dist/src/memory/store.js.map +1 -0
  388. package/dist/src/memory/textidentity.js +8 -0
  389. package/dist/src/memory/textidentity.js.map +1 -0
  390. package/dist/src/metrics.js +773 -0
  391. package/dist/src/metrics.js.map +1 -0
  392. package/dist/src/missingconfig.js +8 -0
  393. package/dist/src/missingconfig.js.map +1 -0
  394. package/dist/src/npmverbs.js +226 -0
  395. package/dist/src/npmverbs.js.map +1 -0
  396. package/dist/src/onboard/choices.js +191 -0
  397. package/dist/src/onboard/choices.js.map +1 -0
  398. package/dist/src/onboard/engine.js +344 -0
  399. package/dist/src/onboard/engine.js.map +1 -0
  400. package/dist/src/onboard/launch.js +83 -0
  401. package/dist/src/onboard/launch.js.map +1 -0
  402. package/dist/src/onboard/steps/appslug.js +211 -0
  403. package/dist/src/onboard/steps/appslug.js.map +1 -0
  404. package/dist/src/onboard/steps/bringup.js +408 -0
  405. package/dist/src/onboard/steps/bringup.js.map +1 -0
  406. package/dist/src/onboard/steps/compose.js +343 -0
  407. package/dist/src/onboard/steps/compose.js.map +1 -0
  408. package/dist/src/onboard/steps/configdelivery.js +50 -0
  409. package/dist/src/onboard/steps/configdelivery.js.map +1 -0
  410. package/dist/src/onboard/steps/configfill.js +1148 -0
  411. package/dist/src/onboard/steps/configfill.js.map +1 -0
  412. package/dist/src/onboard/steps/deploysh.js +80 -0
  413. package/dist/src/onboard/steps/deploysh.js.map +1 -0
  414. package/dist/src/onboard/steps/embeddings.js +472 -0
  415. package/dist/src/onboard/steps/embeddings.js.map +1 -0
  416. package/dist/src/onboard/steps/escalation.js +571 -0
  417. package/dist/src/onboard/steps/escalation.js.map +1 -0
  418. package/dist/src/onboard/steps/githubapp.js +1092 -0
  419. package/dist/src/onboard/steps/githubapp.js.map +1 -0
  420. package/dist/src/onboard/steps/golive.js +506 -0
  421. package/dist/src/onboard/steps/golive.js.map +1 -0
  422. package/dist/src/onboard/steps/index.js +67 -0
  423. package/dist/src/onboard/steps/index.js.map +1 -0
  424. package/dist/src/onboard/steps/ingress.js +762 -0
  425. package/dist/src/onboard/steps/ingress.js.map +1 -0
  426. package/dist/src/onboard/steps/inventory.js +420 -0
  427. package/dist/src/onboard/steps/inventory.js.map +1 -0
  428. package/dist/src/onboard/steps/llmauth.js +893 -0
  429. package/dist/src/onboard/steps/llmauth.js.map +1 -0
  430. package/dist/src/onboard/steps/memory.js +1060 -0
  431. package/dist/src/onboard/steps/memory.js.map +1 -0
  432. package/dist/src/onboard/steps/memorykeys.js +43 -0
  433. package/dist/src/onboard/steps/memorykeys.js.map +1 -0
  434. package/dist/src/onboard/steps/preflight.js +172 -0
  435. package/dist/src/onboard/steps/preflight.js.map +1 -0
  436. package/dist/src/onboard/steps/proof.js +502 -0
  437. package/dist/src/onboard/steps/proof.js.map +1 -0
  438. package/dist/src/onboard/steps/ssh.js +300 -0
  439. package/dist/src/onboard/steps/ssh.js.map +1 -0
  440. package/dist/src/onboard/steps/topology.js +291 -0
  441. package/dist/src/onboard/steps/topology.js.map +1 -0
  442. package/dist/src/onboard/steps/transport.js +511 -0
  443. package/dist/src/onboard/steps/transport.js.map +1 -0
  444. package/dist/src/onboard/steps/verifyup.js +362 -0
  445. package/dist/src/onboard/steps/verifyup.js.map +1 -0
  446. package/dist/src/onboard/steps/vmdeploy.js +368 -0
  447. package/dist/src/onboard/steps/vmdeploy.js.map +1 -0
  448. package/dist/src/onboard/toml.js +53 -0
  449. package/dist/src/onboard/toml.js.map +1 -0
  450. package/dist/src/opencli.js +508 -0
  451. package/dist/src/opencli.js.map +1 -0
  452. package/dist/src/openpr.js +457 -0
  453. package/dist/src/openpr.js.map +1 -0
  454. package/dist/src/openviking/client.js +821 -0
  455. package/dist/src/openviking/client.js.map +1 -0
  456. package/dist/src/openviking/context.js +218 -0
  457. package/dist/src/openviking/context.js.map +1 -0
  458. package/dist/src/openviking/embedder.js +457 -0
  459. package/dist/src/openviking/embedder.js.map +1 -0
  460. package/dist/src/openviking/gapsink.js +38 -0
  461. package/dist/src/openviking/gapsink.js.map +1 -0
  462. package/dist/src/openviking/health.js +69 -0
  463. package/dist/src/openviking/health.js.map +1 -0
  464. package/dist/src/openviking/index.js +24 -0
  465. package/dist/src/openviking/index.js.map +1 -0
  466. package/dist/src/openviking/lessonfind.js +54 -0
  467. package/dist/src/openviking/lessonfind.js.map +1 -0
  468. package/dist/src/openviking/probe.js +89 -0
  469. package/dist/src/openviking/probe.js.map +1 -0
  470. package/dist/src/openviking/proc.js +95 -0
  471. package/dist/src/openviking/proc.js.map +1 -0
  472. package/dist/src/openviking/provisionreport.js +144 -0
  473. package/dist/src/openviking/provisionreport.js.map +1 -0
  474. package/dist/src/openviking/reembed.js +317 -0
  475. package/dist/src/openviking/reembed.js.map +1 -0
  476. package/dist/src/openviking/relayout.js +153 -0
  477. package/dist/src/openviking/relayout.js.map +1 -0
  478. package/dist/src/openviking/sidecar-main.js +39 -0
  479. package/dist/src/openviking/sidecar-main.js.map +1 -0
  480. package/dist/src/openviking/sidecar.js +79 -0
  481. package/dist/src/openviking/sidecar.js.map +1 -0
  482. package/dist/src/openviking/store.js +1758 -0
  483. package/dist/src/openviking/store.js.map +1 -0
  484. package/dist/src/openviking/supervisor.js +422 -0
  485. package/dist/src/openviking/supervisor.js.map +1 -0
  486. package/dist/src/openviking/types.js +5 -0
  487. package/dist/src/openviking/types.js.map +1 -0
  488. package/dist/src/operator-recovery.js +172 -0
  489. package/dist/src/operator-recovery.js.map +1 -0
  490. package/dist/src/operatormessage.js +44 -0
  491. package/dist/src/operatormessage.js.map +1 -0
  492. package/dist/src/outcomes.js +1361 -0
  493. package/dist/src/outcomes.js.map +1 -0
  494. package/dist/src/piauthcopy.js +5 -0
  495. package/dist/src/piauthcopy.js.map +1 -0
  496. package/dist/src/picli.js +45 -0
  497. package/dist/src/picli.js.map +1 -0
  498. package/dist/src/picwd.js +25 -0
  499. package/dist/src/picwd.js.map +1 -0
  500. package/dist/src/pilogin.js +35 -0
  501. package/dist/src/pilogin.js.map +1 -0
  502. package/dist/src/pingpong.js +1028 -0
  503. package/dist/src/pingpong.js.map +1 -0
  504. package/dist/src/posting-journal.js +441 -0
  505. package/dist/src/posting-journal.js.map +1 -0
  506. package/dist/src/posting-outbox.js +662 -0
  507. package/dist/src/posting-outbox.js.map +1 -0
  508. package/dist/src/posting-receipt.js +203 -0
  509. package/dist/src/posting-receipt.js.map +1 -0
  510. package/dist/src/posting.js +348 -0
  511. package/dist/src/posting.js.map +1 -0
  512. package/dist/src/postops.js +637 -0
  513. package/dist/src/postops.js.map +1 -0
  514. package/dist/src/pr-activity.js +11 -0
  515. package/dist/src/pr-activity.js.map +1 -0
  516. package/dist/src/pr-author.js +5 -0
  517. package/dist/src/pr-author.js.map +1 -0
  518. package/dist/src/pr-conversation.js +355 -0
  519. package/dist/src/pr-conversation.js.map +1 -0
  520. package/dist/src/pr-session-lifecycle.js +542 -0
  521. package/dist/src/pr-session-lifecycle.js.map +1 -0
  522. package/dist/src/preflight.js +341 -0
  523. package/dist/src/preflight.js.map +1 -0
  524. package/dist/src/priorresolve.js +275 -0
  525. package/dist/src/priorresolve.js.map +1 -0
  526. package/dist/src/qcrbin.js +180 -0
  527. package/dist/src/qcrbin.js.map +1 -0
  528. package/dist/src/recheck.js +1398 -0
  529. package/dist/src/recheck.js.map +1 -0
  530. package/dist/src/reconcile.js +820 -0
  531. package/dist/src/reconcile.js.map +1 -0
  532. package/dist/src/recordedfindings.js +15 -0
  533. package/dist/src/recordedfindings.js.map +1 -0
  534. package/dist/src/regression.js +546 -0
  535. package/dist/src/regression.js.map +1 -0
  536. package/dist/src/replay.js +598 -0
  537. package/dist/src/replay.js.map +1 -0
  538. package/dist/src/requiredpasses.js +113 -0
  539. package/dist/src/requiredpasses.js.map +1 -0
  540. package/dist/src/resumecheck.js +168 -0
  541. package/dist/src/resumecheck.js.map +1 -0
  542. package/dist/src/reviewcli.js +671 -0
  543. package/dist/src/reviewcli.js.map +1 -0
  544. package/dist/src/reviewcontext.js +22 -0
  545. package/dist/src/reviewcontext.js.map +1 -0
  546. package/dist/src/reviewdetach.js +574 -0
  547. package/dist/src/reviewdetach.js.map +1 -0
  548. package/dist/src/reviewhistory.js +284 -0
  549. package/dist/src/reviewhistory.js.map +1 -0
  550. package/dist/src/reviewhome.js +26 -0
  551. package/dist/src/reviewhome.js.map +1 -0
  552. package/dist/src/reviewmemory.js +110 -0
  553. package/dist/src/reviewmemory.js.map +1 -0
  554. package/dist/src/reviewrendercli.js +104 -0
  555. package/dist/src/reviewrendercli.js.map +1 -0
  556. package/dist/src/round-work.js +20 -0
  557. package/dist/src/round-work.js.map +1 -0
  558. package/dist/src/runhost.js +72 -0
  559. package/dist/src/runhost.js.map +1 -0
  560. package/dist/src/scanauth.js +25 -0
  561. package/dist/src/scanauth.js.map +1 -0
  562. package/dist/src/scanbox.js +846 -0
  563. package/dist/src/scanbox.js.map +1 -0
  564. package/dist/src/scancli.js +1074 -0
  565. package/dist/src/scancli.js.map +1 -0
  566. package/dist/src/scandriverlog.js +30 -0
  567. package/dist/src/scandriverlog.js.map +1 -0
  568. package/dist/src/session-bridge.js +75 -0
  569. package/dist/src/session-bridge.js.map +1 -0
  570. package/dist/src/session-command-payload.js +29 -0
  571. package/dist/src/session-command-payload.js.map +1 -0
  572. package/dist/src/session-command-supervisor.js +939 -0
  573. package/dist/src/session-command-supervisor.js.map +1 -0
  574. package/dist/src/sessionjsonl.js +85 -0
  575. package/dist/src/sessionjsonl.js.map +1 -0
  576. package/dist/src/sessions.js +541 -0
  577. package/dist/src/sessions.js.map +1 -0
  578. package/dist/src/setup/adapters.js +330 -0
  579. package/dist/src/setup/adapters.js.map +1 -0
  580. package/dist/src/setup/baselines.js +64 -0
  581. package/dist/src/setup/baselines.js.map +1 -0
  582. package/dist/src/setup/caserunner.js +554 -0
  583. package/dist/src/setup/caserunner.js.map +1 -0
  584. package/dist/src/setup/configcommit.js +358 -0
  585. package/dist/src/setup/configcommit.js.map +1 -0
  586. package/dist/src/setup/engine.js +672 -0
  587. package/dist/src/setup/engine.js.map +1 -0
  588. package/dist/src/setup/facts.js +593 -0
  589. package/dist/src/setup/facts.js.map +1 -0
  590. package/dist/src/setup/findings.js +948 -0
  591. package/dist/src/setup/findings.js.map +1 -0
  592. package/dist/src/setup/history.js +338 -0
  593. package/dist/src/setup/history.js.map +1 -0
  594. package/dist/src/setup/interview.js +185 -0
  595. package/dist/src/setup/interview.js.map +1 -0
  596. package/dist/src/setup/ledger.js +207 -0
  597. package/dist/src/setup/ledger.js.map +1 -0
  598. package/dist/src/setup/pins.js +43 -0
  599. package/dist/src/setup/pins.js.map +1 -0
  600. package/dist/src/setup/portrait.js +432 -0
  601. package/dist/src/setup/portrait.js.map +1 -0
  602. package/dist/src/setup/presentation.js +9 -0
  603. package/dist/src/setup/presentation.js.map +1 -0
  604. package/dist/src/setup/profile.js +417 -0
  605. package/dist/src/setup/profile.js.map +1 -0
  606. package/dist/src/setup/replay.js +240 -0
  607. package/dist/src/setup/replay.js.map +1 -0
  608. package/dist/src/setup/replaybuild.js +311 -0
  609. package/dist/src/setup/replaybuild.js.map +1 -0
  610. package/dist/src/setup/replayrun.js +806 -0
  611. package/dist/src/setup/replayrun.js.map +1 -0
  612. package/dist/src/setup/replaysource.js +169 -0
  613. package/dist/src/setup/replaysource.js.map +1 -0
  614. package/dist/src/setup/retune.js +333 -0
  615. package/dist/src/setup/retune.js.map +1 -0
  616. package/dist/src/setup/retunelog.js +51 -0
  617. package/dist/src/setup/retunelog.js.map +1 -0
  618. package/dist/src/setup/scan.js +725 -0
  619. package/dist/src/setup/scan.js.map +1 -0
  620. package/dist/src/setup/scanbuild.js +133 -0
  621. package/dist/src/setup/scanbuild.js.map +1 -0
  622. package/dist/src/setup/scanfacts.js +96 -0
  623. package/dist/src/setup/scanfacts.js.map +1 -0
  624. package/dist/src/setup/scanlease.js +251 -0
  625. package/dist/src/setup/scanlease.js.map +1 -0
  626. package/dist/src/setup/scanreport.js +289 -0
  627. package/dist/src/setup/scanreport.js.map +1 -0
  628. package/dist/src/setup/scanrun.js +1733 -0
  629. package/dist/src/setup/scanrun.js.map +1 -0
  630. package/dist/src/setup/scantree.js +257 -0
  631. package/dist/src/setup/scantree.js.map +1 -0
  632. package/dist/src/setup/stage2.js +617 -0
  633. package/dist/src/setup/stage2.js.map +1 -0
  634. package/dist/src/setup/stage2request.js +259 -0
  635. package/dist/src/setup/stage2request.js.map +1 -0
  636. package/dist/src/setup/survey.js +307 -0
  637. package/dist/src/setup/survey.js.map +1 -0
  638. package/dist/src/setup/surveyrun.js +549 -0
  639. package/dist/src/setup/surveyrun.js.map +1 -0
  640. package/dist/src/setup/textsniff.js +89 -0
  641. package/dist/src/setup/textsniff.js.map +1 -0
  642. package/dist/src/setup/trackersink.js +395 -0
  643. package/dist/src/setup/trackersink.js.map +1 -0
  644. package/dist/src/setup/triage.js +636 -0
  645. package/dist/src/setup/triage.js.map +1 -0
  646. package/dist/src/setup/tuning.js +585 -0
  647. package/dist/src/setup/tuning.js.map +1 -0
  648. package/dist/src/setup/unitcut.js +437 -0
  649. package/dist/src/setup/unitcut.js.map +1 -0
  650. package/dist/src/singleflight.js +72 -0
  651. package/dist/src/singleflight.js.map +1 -0
  652. package/dist/src/slack/announce.js +725 -0
  653. package/dist/src/slack/announce.js.map +1 -0
  654. package/dist/src/slack/api.js +227 -0
  655. package/dist/src/slack/api.js.map +1 -0
  656. package/dist/src/slack/messages.js +158 -0
  657. package/dist/src/slack/messages.js.map +1 -0
  658. package/dist/src/slack/origin.js +550 -0
  659. package/dist/src/slack/origin.js.map +1 -0
  660. package/dist/src/slack/policy.js +225 -0
  661. package/dist/src/slack/policy.js.map +1 -0
  662. package/dist/src/slack/reply.js +153 -0
  663. package/dist/src/slack/reply.js.map +1 -0
  664. package/dist/src/slack/router.js +189 -0
  665. package/dist/src/slack/router.js.map +1 -0
  666. package/dist/src/slack/socket.js +323 -0
  667. package/dist/src/slack/socket.js.map +1 -0
  668. package/dist/src/slack/types.js +11 -0
  669. package/dist/src/slack/types.js.map +1 -0
  670. package/dist/src/sqlitehint.js +30 -0
  671. package/dist/src/sqlitehint.js.map +1 -0
  672. package/dist/src/ssh-observation.js +25 -0
  673. package/dist/src/ssh-observation.js.map +1 -0
  674. package/dist/src/state.js +5869 -0
  675. package/dist/src/state.js.map +1 -0
  676. package/dist/src/statemachine.js +220 -0
  677. package/dist/src/statemachine.js.map +1 -0
  678. package/dist/src/stubs.js +52 -0
  679. package/dist/src/stubs.js.map +1 -0
  680. package/dist/src/takeover.js +506 -0
  681. package/dist/src/takeover.js.map +1 -0
  682. package/dist/src/takeoverpi.js +249 -0
  683. package/dist/src/takeoverpi.js.map +1 -0
  684. package/dist/src/terminal-failure.js +26 -0
  685. package/dist/src/terminal-failure.js.map +1 -0
  686. package/dist/src/thread-resolution-refusal.js +4 -0
  687. package/dist/src/thread-resolution-refusal.js.map +1 -0
  688. package/dist/src/tmux.js +126 -0
  689. package/dist/src/tmux.js.map +1 -0
  690. package/dist/src/trackerid.js +43 -0
  691. package/dist/src/trackerid.js.map +1 -0
  692. package/dist/src/transcriptindex.js +512 -0
  693. package/dist/src/transcriptindex.js.map +1 -0
  694. package/dist/src/tui/actions.js +404 -0
  695. package/dist/src/tui/actions.js.map +1 -0
  696. package/dist/src/tui/alerts.js +523 -0
  697. package/dist/src/tui/alerts.js.map +1 -0
  698. package/dist/src/tui/app.js +1835 -0
  699. package/dist/src/tui/app.js.map +1 -0
  700. package/dist/src/tui/archiveops.js +164 -0
  701. package/dist/src/tui/archiveops.js.map +1 -0
  702. package/dist/src/tui/autofile.js +191 -0
  703. package/dist/src/tui/autofile.js.map +1 -0
  704. package/dist/src/tui/board.js +1143 -0
  705. package/dist/src/tui/board.js.map +1 -0
  706. package/dist/src/tui/candidates.js +699 -0
  707. package/dist/src/tui/candidates.js.map +1 -0
  708. package/dist/src/tui/cellwidth.js +151 -0
  709. package/dist/src/tui/cellwidth.js.map +1 -0
  710. package/dist/src/tui/changelog-store.js +404 -0
  711. package/dist/src/tui/changelog-store.js.map +1 -0
  712. package/dist/src/tui/chord.js +26 -0
  713. package/dist/src/tui/chord.js.map +1 -0
  714. package/dist/src/tui/clipboard.js +81 -0
  715. package/dist/src/tui/clipboard.js.map +1 -0
  716. package/dist/src/tui/cmdbar.js +253 -0
  717. package/dist/src/tui/cmdbar.js.map +1 -0
  718. package/dist/src/tui/companion.js +1275 -0
  719. package/dist/src/tui/companion.js.map +1 -0
  720. package/dist/src/tui/companionplan.js +200 -0
  721. package/dist/src/tui/companionplan.js.map +1 -0
  722. package/dist/src/tui/companiontab.js +61 -0
  723. package/dist/src/tui/companiontab.js.map +1 -0
  724. package/dist/src/tui/confighome.js +105 -0
  725. package/dist/src/tui/confighome.js.map +1 -0
  726. package/dist/src/tui/connect.js +44 -0
  727. package/dist/src/tui/connect.js.map +1 -0
  728. package/dist/src/tui/deploy-ceremony.js +75 -0
  729. package/dist/src/tui/deploy-ceremony.js.map +1 -0
  730. package/dist/src/tui/deploy-drain.js +93 -0
  731. package/dist/src/tui/deploy-drain.js.map +1 -0
  732. package/dist/src/tui/deploy-process.js +234 -0
  733. package/dist/src/tui/deploy-process.js.map +1 -0
  734. package/dist/src/tui/deploytab.js +1263 -0
  735. package/dist/src/tui/deploytab.js.map +1 -0
  736. package/dist/src/tui/design.js +111 -0
  737. package/dist/src/tui/design.js.map +1 -0
  738. package/dist/src/tui/digesttab.js +148 -0
  739. package/dist/src/tui/digesttab.js.map +1 -0
  740. package/dist/src/tui/emptystate.js +32 -0
  741. package/dist/src/tui/emptystate.js.map +1 -0
  742. package/dist/src/tui/evidence.js +790 -0
  743. package/dist/src/tui/evidence.js.map +1 -0
  744. package/dist/src/tui/feed.js +415 -0
  745. package/dist/src/tui/feed.js.map +1 -0
  746. package/dist/src/tui/feedbacktab.js +907 -0
  747. package/dist/src/tui/feedbacktab.js.map +1 -0
  748. package/dist/src/tui/filters.js +72 -0
  749. package/dist/src/tui/filters.js.map +1 -0
  750. package/dist/src/tui/ghread.js +272 -0
  751. package/dist/src/tui/ghread.js.map +1 -0
  752. package/dist/src/tui/historypull.js +61 -0
  753. package/dist/src/tui/historypull.js.map +1 -0
  754. package/dist/src/tui/inboxpull.js +197 -0
  755. package/dist/src/tui/inboxpull.js.map +1 -0
  756. package/dist/src/tui/index.js +1425 -0
  757. package/dist/src/tui/index.js.map +1 -0
  758. package/dist/src/tui/issuesink.js +206 -0
  759. package/dist/src/tui/issuesink.js.map +1 -0
  760. package/dist/src/tui/jsonfile.js +32 -0
  761. package/dist/src/tui/jsonfile.js.map +1 -0
  762. package/dist/src/tui/keys.js +97 -0
  763. package/dist/src/tui/keys.js.map +1 -0
  764. package/dist/src/tui/layout.js +70 -0
  765. package/dist/src/tui/layout.js.map +1 -0
  766. package/dist/src/tui/learning.js +469 -0
  767. package/dist/src/tui/learning.js.map +1 -0
  768. package/dist/src/tui/lessonswitch.js +103 -0
  769. package/dist/src/tui/lessonswitch.js.map +1 -0
  770. package/dist/src/tui/livecontrol.js +167 -0
  771. package/dist/src/tui/livecontrol.js.map +1 -0
  772. package/dist/src/tui/memforward.js +310 -0
  773. package/dist/src/tui/memforward.js.map +1 -0
  774. package/dist/src/tui/memincident.js +287 -0
  775. package/dist/src/tui/memincident.js.map +1 -0
  776. package/dist/src/tui/memory.js +485 -0
  777. package/dist/src/tui/memory.js.map +1 -0
  778. package/dist/src/tui/memtab.js +513 -0
  779. package/dist/src/tui/memtab.js.map +1 -0
  780. package/dist/src/tui/metricstab.js +979 -0
  781. package/dist/src/tui/metricstab.js.map +1 -0
  782. package/dist/src/tui/model.js +104 -0
  783. package/dist/src/tui/model.js.map +1 -0
  784. package/dist/src/tui/mouse.js +83 -0
  785. package/dist/src/tui/mouse.js.map +1 -0
  786. package/dist/src/tui/msg.js +196 -0
  787. package/dist/src/tui/msg.js.map +1 -0
  788. package/dist/src/tui/nativecompanion.js +321 -0
  789. package/dist/src/tui/nativecompanion.js.map +1 -0
  790. package/dist/src/tui/openurl.js +17 -0
  791. package/dist/src/tui/openurl.js.map +1 -0
  792. package/dist/src/tui/paint.js +501 -0
  793. package/dist/src/tui/paint.js.map +1 -0
  794. package/dist/src/tui/panes.js +74 -0
  795. package/dist/src/tui/panes.js.map +1 -0
  796. package/dist/src/tui/pipane.js +166 -0
  797. package/dist/src/tui/pipane.js.map +1 -0
  798. package/dist/src/tui/poll-hooks.js +11 -0
  799. package/dist/src/tui/poll-hooks.js.map +1 -0
  800. package/dist/src/tui/poll.js +113 -0
  801. package/dist/src/tui/poll.js.map +1 -0
  802. package/dist/src/tui/proposals.js +715 -0
  803. package/dist/src/tui/proposals.js.map +1 -0
  804. package/dist/src/tui/prpause.js +132 -0
  805. package/dist/src/tui/prpause.js.map +1 -0
  806. package/dist/src/tui/reload.js +351 -0
  807. package/dist/src/tui/reload.js.map +1 -0
  808. package/dist/src/tui/remote.js +312 -0
  809. package/dist/src/tui/remote.js.map +1 -0
  810. package/dist/src/tui/rollover.js +767 -0
  811. package/dist/src/tui/rollover.js.map +1 -0
  812. package/dist/src/tui/scantab.js +1053 -0
  813. package/dist/src/tui/scantab.js.map +1 -0
  814. package/dist/src/tui/setupentry.js +81 -0
  815. package/dist/src/tui/setupentry.js.map +1 -0
  816. package/dist/src/tui/sidebar.js +602 -0
  817. package/dist/src/tui/sidebar.js.map +1 -0
  818. package/dist/src/tui/sshtriage.js +393 -0
  819. package/dist/src/tui/sshtriage.js.map +1 -0
  820. package/dist/src/tui/startup.js +172 -0
  821. package/dist/src/tui/startup.js.map +1 -0
  822. package/dist/src/tui/tabs.js +41 -0
  823. package/dist/src/tui/tabs.js.map +1 -0
  824. package/dist/src/tui/termmirror.js +217 -0
  825. package/dist/src/tui/termmirror.js.map +1 -0
  826. package/dist/src/tui/theme.js +95 -0
  827. package/dist/src/tui/theme.js.map +1 -0
  828. package/dist/src/tui/ticketstab.js +224 -0
  829. package/dist/src/tui/ticketstab.js.map +1 -0
  830. package/dist/src/tui/tmuxsocket.js +101 -0
  831. package/dist/src/tui/tmuxsocket.js.map +1 -0
  832. package/dist/src/tui/trackertickets.js +77 -0
  833. package/dist/src/tui/trackertickets.js.map +1 -0
  834. package/dist/src/tui/unwedge.js +245 -0
  835. package/dist/src/tui/unwedge.js.map +1 -0
  836. package/dist/src/tui/viewer.js +479 -0
  837. package/dist/src/tui/viewer.js.map +1 -0
  838. package/dist/src/tui/viewerinput.js +125 -0
  839. package/dist/src/tui/viewerinput.js.map +1 -0
  840. package/dist/src/updatenotice.js +143 -0
  841. package/dist/src/updatenotice.js.map +1 -0
  842. package/dist/src/usage.js +1007 -0
  843. package/dist/src/usage.js.map +1 -0
  844. package/dist/src/verdicts.js +3848 -0
  845. package/dist/src/verdicts.js.map +1 -0
  846. package/dist/src/version.js +58 -0
  847. package/dist/src/version.js.map +1 -0
  848. package/dist/src/wakes.js +411 -0
  849. package/dist/src/wakes.js.map +1 -0
  850. package/dist/src/webhook.js +725 -0
  851. package/dist/src/webhook.js.map +1 -0
  852. package/dist/src/webhookheal.js +238 -0
  853. package/dist/src/webhookheal.js.map +1 -0
  854. package/dist/src/wire.js +1801 -0
  855. package/dist/src/wire.js.map +1 -0
  856. package/dist/src/worker-session-host.js +531 -0
  857. package/dist/src/worker-session-host.js.map +1 -0
  858. package/dist/src/workerbreaker.js +112 -0
  859. package/dist/src/workerbreaker.js.map +1 -0
  860. package/dist/src/workercontrol.js +49 -0
  861. package/dist/src/workercontrol.js.map +1 -0
  862. package/dist/src/workerlease.js +351 -0
  863. package/dist/src/workerlease.js.map +1 -0
  864. package/dist/src/workerliveness.js +84 -0
  865. package/dist/src/workerliveness.js.map +1 -0
  866. package/dist/src/workerlog.js +65 -0
  867. package/dist/src/workerlog.js.map +1 -0
  868. package/dist/src/workerruntime.js +10 -0
  869. package/dist/src/workerruntime.js.map +1 -0
  870. package/dist/src/workersupervisor.js +1206 -0
  871. package/dist/src/workersupervisor.js.map +1 -0
  872. package/dist/src/workerusage.js +23 -0
  873. package/dist/src/workerusage.js.map +1 -0
  874. package/dist/src/workerworld.js +332 -0
  875. package/dist/src/workerworld.js.map +1 -0
  876. package/dist/src/worktrees.js +984 -0
  877. package/dist/src/worktrees.js.map +1 -0
  878. package/docker/Dockerfile +284 -0
  879. package/docker/Dockerfile.dockerignore +35 -0
  880. package/docker/README.md +221 -0
  881. package/docker/companion/Dockerfile +139 -0
  882. package/docker/companion/agents/evidence.md +34 -0
  883. package/docker/companion/agents/explore.md +26 -0
  884. package/docker/companion/agents/pass-survey.md +49 -0
  885. package/docker/companion/agents/study.md +26 -0
  886. package/docker/companion/entrypoint.sh +343 -0
  887. package/docker/companion/memory-health.mjs +269 -0
  888. package/docker/entrypoint.sh +782 -0
  889. package/docker/memory/Dockerfile +191 -0
  890. package/docker/memory/Dockerfile.dockerignore +20 -0
  891. package/docker/memory/README.md +60 -0
  892. package/docker/memory/entrypoint.sh +163 -0
  893. package/docker/setid/qcr-setid.c +109 -0
  894. package/docker/tunnel/Dockerfile.cloudflared +51 -0
  895. package/docker/tunnel/Dockerfile.ngrok +40 -0
  896. package/docker/tunnel/sidecar.mjs +411 -0
  897. package/docker/vm/tmux.conf +26 -0
  898. package/docker-compose.yml +348 -0
  899. package/extensions/cli/bash-guard-ambient.ts +71 -0
  900. package/extensions/cli/bash-guard.ts +12 -0
  901. package/extensions/cli/companion-guard.ts +8 -0
  902. package/extensions/cli/debug-round.ts +9 -0
  903. package/extensions/cli/inject-bridge.ts +8 -0
  904. package/extensions/cli/ledger-pin.ts +13 -0
  905. package/extensions/cli/lens.ts +22 -0
  906. package/extensions/cli/muted-theme.ts +9 -0
  907. package/extensions/cli/onboarding.ts +8 -0
  908. package/extensions/cli/setup.ts +8 -0
  909. package/extensions/cli/tui-view.ts +8 -0
  910. package/extensions/companion-guard.ts +411 -0
  911. package/extensions/debug-round.ts +281 -0
  912. package/extensions/inject-bridge.ts +630 -0
  913. package/extensions/inline-bash.ts +102 -0
  914. package/extensions/muted-theme.json +68 -0
  915. package/extensions/muted-theme.ts +23 -0
  916. package/extensions/onboarding.ts +233 -0
  917. package/extensions/setup-replay.ts +336 -0
  918. package/extensions/setup-scan.ts +1236 -0
  919. package/extensions/setup-triage.ts +190 -0
  920. package/extensions/setup.ts +1428 -0
  921. package/extensions/tui-view.ts +489 -0
  922. package/extensions/vendor/openviking-pi/LICENSE +201 -0
  923. package/extensions/vendor/openviking-pi/NOTICE +68 -0
  924. package/extensions/vendor/openviking-pi/README.md +550 -0
  925. package/extensions/vendor/openviking-pi/client.ts +588 -0
  926. package/extensions/vendor/openviking-pi/config.json +28 -0
  927. package/extensions/vendor/openviking-pi/config.ts +271 -0
  928. package/extensions/vendor/openviking-pi/index.ts +523 -0
  929. package/extensions/vendor/openviking-pi/lib/capture-adapter.d.mts +10 -0
  930. package/extensions/vendor/openviking-pi/lib/capture-adapter.mjs +88 -0
  931. package/extensions/vendor/openviking-pi/lib/takeover-core.d.mts +80 -0
  932. package/extensions/vendor/openviking-pi/lib/takeover-core.mjs +406 -0
  933. package/extensions/vendor/openviking-pi/lib/uri-guard-adapter.d.mts +1 -0
  934. package/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs +42 -0
  935. package/extensions/vendor/openviking-pi/patches/0000-vendoring-and-build-conformance.patch +726 -0
  936. package/extensions/vendor/openviking-pi/patches/0001-remove-session-before-compact-handler.patch +101 -0
  937. package/extensions/vendor/openviking-pi/patches/0002-no-ambient-work-in-subagent-leaves.patch +202 -0
  938. package/extensions/vendor/openviking-pi/patches/0003-never-auto-create-openviking-sessions.patch +120 -0
  939. package/extensions/vendor/openviking-pi/patches/0004-viking-write-durable-batch-write.patch +521 -0
  940. package/extensions/vendor/openviking-pi/patches/0005-second-memory-namespace.patch +786 -0
  941. package/extensions/vendor/openviking-pi/patches/0006-writes-that-stick-and-honest-errors.patch +996 -0
  942. package/extensions/vendor/openviking-pi/patches/0007-bounded-recall-no-commit.patch +794 -0
  943. package/extensions/vendor/openviking-pi/patches/0008-pr-derived-recall.patch +379 -0
  944. package/extensions/vendor/openviking-pi/patches/0009-pr-session-tools-in-round-areas.patch +375 -0
  945. package/extensions/vendor/openviking-pi/patches/0010-typed-lessons.patch +448 -0
  946. package/extensions/vendor/openviking-pi/patches/0011-review-session-memory-boundary.patch +382 -0
  947. package/extensions/vendor/openviking-pi/patches/0012-typecheck-against-the-real-pi.patch +129 -0
  948. package/extensions/vendor/openviking-pi/patches/0013-createopenviking-factory.patch +1168 -0
  949. package/extensions/vendor/openviking-pi/qcr-hint.ts +313 -0
  950. package/extensions/vendor/openviking-pi/qcr-honest.ts +183 -0
  951. package/extensions/vendor/openviking-pi/qcr-hooks.ts +87 -0
  952. package/extensions/vendor/openviking-pi/qcr-leaf.ts +78 -0
  953. package/extensions/vendor/openviking-pi/qcr-lesson.ts +231 -0
  954. package/extensions/vendor/openviking-pi/qcr-namespaces.ts +198 -0
  955. package/extensions/vendor/openviking-pi/qcr-recall.ts +288 -0
  956. package/extensions/vendor/openviking-pi/qcr-shim.ts +142 -0
  957. package/extensions/vendor/openviking-pi/qcr-write.ts +427 -0
  958. package/extensions/vendor/openviking-pi/recall.ts +149 -0
  959. package/extensions/vendor/openviking-pi/shared/capture-utils.d.mts +9 -0
  960. package/extensions/vendor/openviking-pi/shared/capture-utils.mjs +515 -0
  961. package/extensions/vendor/openviking-pi/shared/credentials.d.mts +14 -0
  962. package/extensions/vendor/openviking-pi/shared/credentials.mjs +228 -0
  963. package/extensions/vendor/openviking-pi/shared/pending-queue.d.mts +19 -0
  964. package/extensions/vendor/openviking-pi/shared/pending-queue.mjs +458 -0
  965. package/extensions/vendor/openviking-pi/shared/profile-inject.d.mts +17 -0
  966. package/extensions/vendor/openviking-pi/shared/profile-inject.mjs +294 -0
  967. package/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs +195 -0
  968. package/extensions/vendor/openviking-pi/shared/recall-core.d.mts +13 -0
  969. package/extensions/vendor/openviking-pi/shared/recall-core.mjs +609 -0
  970. package/extensions/vendor/openviking-pi/shared/retryable.mjs +9 -0
  971. package/extensions/vendor/openviking-pi/shared/session-model.d.mts +3 -0
  972. package/extensions/vendor/openviking-pi/shared/session-model.mjs +57 -0
  973. package/extensions/vendor/openviking-pi/shared/uri-guard.mjs +56 -0
  974. package/extensions/vendor/openviking-pi/shared/workspace-peer.d.mts +5 -0
  975. package/extensions/vendor/openviking-pi/shared/workspace-peer.mjs +16 -0
  976. package/extensions/vendor/openviking-pi/sync.ts +163 -0
  977. package/extensions/vendor/openviking-pi/takeover.ts +36 -0
  978. package/extensions/vendor/openviking-pi/tools.ts +479 -0
  979. package/extensions/vendor/openviking-pi/upstream.json +48 -0
  980. package/package.json +138 -4
  981. package/profiles/default/README.md +21 -0
  982. package/profiles/default/addenda/.gitkeep +0 -0
  983. package/profiles/default/profile.toml +17 -0
  984. package/profiles/example-django/README.md +21 -0
  985. package/profiles/example-django/addenda/10-migration-discipline.md +13 -0
  986. package/profiles/example-django/addenda/20-new-column-nullability.md +12 -0
  987. package/profiles/example-django/addenda/30-test-doctrine.md +12 -0
  988. package/profiles/example-django/addenda/40-orm-usage.md +19 -0
  989. package/profiles/example-django/addenda/50-declared-shape.md +10 -0
  990. package/profiles/example-django/addenda/60-config-placement.md +14 -0
  991. package/profiles/example-django/heuristics.toml +24 -0
  992. package/profiles/example-django/profile.toml +9 -0
  993. package/profiles/fast/README.md +24 -0
  994. package/profiles/fast/profile.toml +59 -0
  995. package/profiles/minimal/README.md +17 -0
  996. package/profiles/minimal/addenda/.gitkeep +0 -0
  997. package/profiles/minimal/profile.toml +8 -0
  998. package/profiles/snappy/README.md +24 -0
  999. package/profiles/snappy/addenda/10-race-as-question.md +6 -0
  1000. package/profiles/snappy/profile.toml +46 -0
  1001. package/prompts/companion-day-open.md +46 -0
  1002. package/prompts/companion-first-run.md +104 -0
  1003. package/prompts/companion.md +821 -0
  1004. package/prompts/conversation-system.md +117 -0
  1005. package/prompts/eod-sweep.md +120 -0
  1006. package/prompts/onboarding.md +74 -0
  1007. package/prompts/pass-common.md +52 -0
  1008. package/prompts/pass-quality-common.md +22 -0
  1009. package/prompts/round-first.md +874 -0
  1010. package/prompts/round-follow-up.md +991 -0
  1011. package/prompts/round-re-review.md +889 -0
  1012. package/prompts/round-recheck.md +196 -0
  1013. package/prompts/round-staleness.md +856 -0
  1014. package/schemas/review-result.v1.json +391 -0
  1015. package/schemas/scan-result.v1.json +421 -0
  1016. package/schemas/version.v1.json +57 -0
  1017. package/scripts/approve-pr.sh +16 -0
  1018. package/scripts/build-stamp.mjs +67 -0
  1019. package/scripts/commit-verdict.sh +155 -0
  1020. package/scripts/companion-e2e.sh +250 -0
  1021. package/scripts/companion-memory-forward.mjs +1966 -0
  1022. package/scripts/config-fingerprint.sh +28 -0
  1023. package/scripts/deploy-manifest.mjs +141 -0
  1024. package/scripts/deploy.sh +1435 -0
  1025. package/scripts/directory-lock.mjs +193 -0
  1026. package/scripts/heartbeat-fresh.mjs +54 -0
  1027. package/scripts/install-locator.sh +328 -0
  1028. package/scripts/install-wrapper.sh +76 -0
  1029. package/scripts/memory-search-check.mjs +98 -0
  1030. package/scripts/mint-token.sh +212 -0
  1031. package/scripts/openviking-embedder.py +392 -0
  1032. package/scripts/openviking-ov-conf.mjs +161 -0
  1033. package/scripts/openviking-provision.mjs +1122 -0
  1034. package/scripts/openviking-reembed.mjs +1154 -0
  1035. package/scripts/post-review.sh +16 -0
  1036. package/scripts/pr-checks.sh +256 -0
  1037. package/scripts/pr-context.py +174 -0
  1038. package/scripts/pr-context.sh +63 -0
  1039. package/scripts/pr-self.sh +144 -0
  1040. package/scripts/pr-threads.sh +145 -0
  1041. package/scripts/qcr +15 -0
  1042. package/scripts/qcr-host.sh +769 -0
  1043. package/scripts/render-review.sh +24 -0
  1044. package/scripts/reply-thread.sh +16 -0
  1045. package/scripts/required-passes.py +112 -0
  1046. package/scripts/smoke-companion.sh +211 -0
  1047. package/scripts/tui-deploy-runner.mjs +61 -0
  1048. package/scripts/verify-dist.mjs +201 -0
  1049. package/scripts/vm-ghcr-login.sh +188 -0
  1050. package/seeds/agents/pass-baseline.md +61 -0
  1051. package/seeds/agents/pass-contracts.md +30 -0
  1052. package/seeds/agents/pass-data-safety.md +54 -0
  1053. package/seeds/agents/pass-delivery.md +37 -0
  1054. package/seeds/agents/pass-prod-risk.md +24 -0
  1055. package/seeds/agents/pass-security.md +31 -0
  1056. package/seeds/agents/pass-statelessness.md +27 -0
  1057. package/seeds/agents/pass-ui.md +23 -0
  1058. package/seeds/agents/pass-validate.md +50 -0
  1059. package/seeds/prompts/conversation-system.md +117 -0
  1060. package/seeds/prompts/eod-sweep.md +120 -0
  1061. package/seeds/prompts/pass-common.md +52 -0
  1062. package/skills/companion/adjudicate/SKILL.md +247 -0
  1063. package/skills/companion/evidence/SKILL.md +150 -0
  1064. package/skills/companion/land/SKILL.md +200 -0
  1065. package/skills/companion/replay/SKILL.md +138 -0
  1066. package/skills/companion/setup/SKILL.md +167 -0
  1067. package/skills/companion/survey/SKILL.md +160 -0
  1068. package/skills/selfimprove/README.md +34 -0
  1069. package/skills/selfimprove/SKILL.md +127 -0
  1070. package/skills/selfimprove/agents/openai.yaml +2 -0
  1071. package/skills/selfimprove/commands/selfimprove.md +6 -0
  1072. package/skills/selfimprove/references/fix-loop.md +49 -0
  1073. package/skills/selfimprove/references/ledger.md +20 -0
  1074. package/skills/selfimprove/references/setup.md +40 -0
  1075. package/src/anomalies.ts +566 -0
  1076. package/src/answerworker.ts +251 -0
  1077. package/src/appstamp.ts +65 -0
  1078. package/src/archive/admission.ts +3 -0
  1079. package/src/archive/archivedb.ts +548 -0
  1080. package/src/archive/archiver.ts +1963 -0
  1081. package/src/archive/archivewrite.ts +279 -0
  1082. package/src/archive/bundle.ts +333 -0
  1083. package/src/archive/dbmove.ts +911 -0
  1084. package/src/archive/duplicatecounts.ts +98 -0
  1085. package/src/archive/eligibility.ts +181 -0
  1086. package/src/archive/extract.ts +342 -0
  1087. package/src/archive/fsutil.ts +415 -0
  1088. package/src/archive/gzfile.ts +370 -0
  1089. package/src/archive/kinds.ts +21 -0
  1090. package/src/archive/livecheckpoint.ts +217 -0
  1091. package/src/archive/liveretention.ts +180 -0
  1092. package/src/archive/manifest.ts +519 -0
  1093. package/src/archive/overseer.ts +336 -0
  1094. package/src/archive/piglobal.ts +174 -0
  1095. package/src/archive/plan.ts +612 -0
  1096. package/src/archive/prarchive.ts +984 -0
  1097. package/src/archive/prfiles.ts +406 -0
  1098. package/src/archive/report.ts +252 -0
  1099. package/src/archive/restore.ts +330 -0
  1100. package/src/archive/rows.ts +187 -0
  1101. package/src/archive/seal.ts +630 -0
  1102. package/src/archive/status.ts +719 -0
  1103. package/src/archive/storepass.ts +581 -0
  1104. package/src/backfill.ts +362 -0
  1105. package/src/bench/cost.ts +113 -0
  1106. package/src/bench/exec.ts +90 -0
  1107. package/src/bench/values.ts +13 -0
  1108. package/src/botcontrol.ts +176 -0
  1109. package/src/botworker.ts +953 -0
  1110. package/src/capture.ts +321 -0
  1111. package/src/cases.ts +1789 -0
  1112. package/src/channelfs.ts +26 -0
  1113. package/src/checklist.ts +506 -0
  1114. package/src/ciretry.ts +141 -0
  1115. package/src/cli.ts +2271 -0
  1116. package/src/cliops.ts +384 -0
  1117. package/src/clonedir.ts +15 -0
  1118. package/src/commandeffects.ts +57 -0
  1119. package/src/commands.ts +1678 -0
  1120. package/src/companioninbox.ts +239 -0
  1121. package/src/compare.ts +957 -0
  1122. package/src/config.ts +2050 -0
  1123. package/src/configcheck.ts +133 -0
  1124. package/src/coreext.ts +47 -0
  1125. package/src/daemon.ts +1302 -0
  1126. package/src/debuground.ts +927 -0
  1127. package/src/debugroundpi.ts +262 -0
  1128. package/src/diagnostics.ts +14 -0
  1129. package/src/digest.ts +183 -0
  1130. package/src/dispatch.ts +2250 -0
  1131. package/src/engine/answerguard.ts +27 -0
  1132. package/src/engine/botsdk.ts +336 -0
  1133. package/src/engine/caserunner-sdk.ts +423 -0
  1134. package/src/engine/debugpi.ts +235 -0
  1135. package/src/eod.ts +669 -0
  1136. package/src/eodpinwatch.ts +556 -0
  1137. package/src/escalation.ts +1253 -0
  1138. package/src/eventloop.ts +1045 -0
  1139. package/src/execboundary.ts +633 -0
  1140. package/src/feedback.ts +1162 -0
  1141. package/src/findingscheck.ts +298 -0
  1142. package/src/fsdenied.ts +24 -0
  1143. package/src/ghread.ts +242 -0
  1144. package/src/github.ts +1497 -0
  1145. package/src/homes.ts +175 -0
  1146. package/src/hostroute.ts +53 -0
  1147. package/src/improvements.ts +787 -0
  1148. package/src/install.ts +1103 -0
  1149. package/src/installkind.ts +50 -0
  1150. package/src/ipc/capability.ts +333 -0
  1151. package/src/ipc/client.ts +269 -0
  1152. package/src/ipc/control.ts +90 -0
  1153. package/src/ipc/ghreadshim.ts +94 -0
  1154. package/src/ipc/launcher.ts +65 -0
  1155. package/src/ipc/permits.ts +362 -0
  1156. package/src/ipc/postshim.ts +164 -0
  1157. package/src/ipc/protocol.ts +342 -0
  1158. package/src/ipc/server.ts +371 -0
  1159. package/src/ipc/workerspec.ts +218 -0
  1160. package/src/learner/learner.ts +1655 -0
  1161. package/src/learner/miner.ts +1290 -0
  1162. package/src/learner/packet.ts +340 -0
  1163. package/src/learner/receipt.ts +168 -0
  1164. package/src/learner/status.ts +107 -0
  1165. package/src/ledgercheck.ts +157 -0
  1166. package/src/lessonledger.ts +703 -0
  1167. package/src/lessonselect.ts +888 -0
  1168. package/src/lessonshadow.ts +810 -0
  1169. package/src/levers.ts +393 -0
  1170. package/src/live/projection.ts +491 -0
  1171. package/src/live/publish.ts +92 -0
  1172. package/src/live/read.ts +86 -0
  1173. package/src/livecli.ts +336 -0
  1174. package/src/loginhint.ts +56 -0
  1175. package/src/loginrefresh/atomic.ts +76 -0
  1176. package/src/loginrefresh/lock.ts +104 -0
  1177. package/src/loginrefresh/main.ts +59 -0
  1178. package/src/loginrefresh/pirefresh.ts +57 -0
  1179. package/src/loginrefresh/refresher.ts +326 -0
  1180. package/src/loginrefresh/supervisor.ts +273 -0
  1181. package/src/loginrefresh/types.ts +35 -0
  1182. package/src/memory/context.ts +385 -0
  1183. package/src/memory/datafence.ts +9 -0
  1184. package/src/memory/delivery.ts +171 -0
  1185. package/src/memory/eventtags.ts +80 -0
  1186. package/src/memory/health.ts +953 -0
  1187. package/src/memory/import.ts +664 -0
  1188. package/src/memory/layout.ts +261 -0
  1189. package/src/memory/legacy-file.ts +104 -0
  1190. package/src/memory/lessons.ts +447 -0
  1191. package/src/memory/ovsession.ts +601 -0
  1192. package/src/memory/relayout.ts +335 -0
  1193. package/src/memory/roundactivity.ts +209 -0
  1194. package/src/memory/selection.ts +989 -0
  1195. package/src/memory/shadowstatus.ts +125 -0
  1196. package/src/memory/store.ts +275 -0
  1197. package/src/memory/textidentity.ts +8 -0
  1198. package/src/metrics.ts +1056 -0
  1199. package/src/missingconfig.ts +7 -0
  1200. package/src/npmverbs.ts +264 -0
  1201. package/src/onboard/choices.ts +222 -0
  1202. package/src/onboard/engine.ts +518 -0
  1203. package/src/onboard/launch.ts +115 -0
  1204. package/src/onboard/steps/appslug.ts +265 -0
  1205. package/src/onboard/steps/bringup.ts +482 -0
  1206. package/src/onboard/steps/compose.ts +459 -0
  1207. package/src/onboard/steps/configdelivery.ts +58 -0
  1208. package/src/onboard/steps/configfill.ts +1352 -0
  1209. package/src/onboard/steps/deploysh.ts +105 -0
  1210. package/src/onboard/steps/embeddings.ts +550 -0
  1211. package/src/onboard/steps/escalation.ts +640 -0
  1212. package/src/onboard/steps/githubapp.ts +1414 -0
  1213. package/src/onboard/steps/golive.ts +577 -0
  1214. package/src/onboard/steps/index.ts +71 -0
  1215. package/src/onboard/steps/ingress.ts +907 -0
  1216. package/src/onboard/steps/inventory.ts +526 -0
  1217. package/src/onboard/steps/llmauth.ts +1095 -0
  1218. package/src/onboard/steps/memory.ts +1290 -0
  1219. package/src/onboard/steps/memorykeys.ts +85 -0
  1220. package/src/onboard/steps/preflight.ts +191 -0
  1221. package/src/onboard/steps/proof.ts +624 -0
  1222. package/src/onboard/steps/ssh.ts +377 -0
  1223. package/src/onboard/steps/topology.ts +337 -0
  1224. package/src/onboard/steps/transport.ts +665 -0
  1225. package/src/onboard/steps/verifyup.ts +448 -0
  1226. package/src/onboard/steps/vmdeploy.ts +442 -0
  1227. package/src/onboard/toml.ts +50 -0
  1228. package/src/opencli.ts +591 -0
  1229. package/src/openpr.ts +568 -0
  1230. package/src/openviking/client.ts +1131 -0
  1231. package/src/openviking/context.ts +263 -0
  1232. package/src/openviking/embedder.ts +516 -0
  1233. package/src/openviking/gapsink.ts +63 -0
  1234. package/src/openviking/health.ts +83 -0
  1235. package/src/openviking/index.ts +119 -0
  1236. package/src/openviking/lessonfind.ts +92 -0
  1237. package/src/openviking/probe.ts +129 -0
  1238. package/src/openviking/proc.ts +110 -0
  1239. package/src/openviking/provisionreport.ts +160 -0
  1240. package/src/openviking/reembed.ts +412 -0
  1241. package/src/openviking/relayout.ts +177 -0
  1242. package/src/openviking/sidecar-main.ts +38 -0
  1243. package/src/openviking/sidecar.ts +106 -0
  1244. package/src/openviking/store.ts +2025 -0
  1245. package/src/openviking/supervisor.ts +474 -0
  1246. package/src/openviking/types.ts +174 -0
  1247. package/src/operator-recovery.ts +237 -0
  1248. package/src/operatormessage.ts +52 -0
  1249. package/src/outcomes.ts +1670 -0
  1250. package/src/piauthcopy.ts +12 -0
  1251. package/src/picli.ts +49 -0
  1252. package/src/picwd.ts +25 -0
  1253. package/src/pilogin.ts +37 -0
  1254. package/src/pingpong.ts +1339 -0
  1255. package/src/posting-journal.ts +549 -0
  1256. package/src/posting-outbox.ts +802 -0
  1257. package/src/posting-receipt.ts +324 -0
  1258. package/src/posting.ts +603 -0
  1259. package/src/postops.ts +832 -0
  1260. package/src/pr-activity.ts +20 -0
  1261. package/src/pr-author.ts +6 -0
  1262. package/src/pr-conversation.ts +432 -0
  1263. package/src/pr-session-lifecycle.ts +631 -0
  1264. package/src/preflight.ts +391 -0
  1265. package/src/priorresolve.ts +343 -0
  1266. package/src/qcrbin.ts +186 -0
  1267. package/src/recheck.ts +1775 -0
  1268. package/src/reconcile.ts +1030 -0
  1269. package/src/recordedfindings.ts +27 -0
  1270. package/src/regression.ts +833 -0
  1271. package/src/replay.ts +816 -0
  1272. package/src/requiredpasses.ts +148 -0
  1273. package/src/resumecheck.ts +246 -0
  1274. package/src/reviewcli.ts +787 -0
  1275. package/src/reviewcontext.ts +35 -0
  1276. package/src/reviewdetach.ts +734 -0
  1277. package/src/reviewhistory.ts +427 -0
  1278. package/src/reviewhome.ts +36 -0
  1279. package/src/reviewmemory.ts +133 -0
  1280. package/src/reviewrendercli.ts +139 -0
  1281. package/src/round-work.ts +42 -0
  1282. package/src/runhost.ts +108 -0
  1283. package/src/scanauth.ts +36 -0
  1284. package/src/scanbox.ts +1081 -0
  1285. package/src/scancli.ts +1296 -0
  1286. package/src/scandriverlog.ts +32 -0
  1287. package/src/session-bridge.ts +139 -0
  1288. package/src/session-command-payload.ts +35 -0
  1289. package/src/session-command-supervisor.ts +1142 -0
  1290. package/src/sessionjsonl.ts +88 -0
  1291. package/src/sessions.ts +659 -0
  1292. package/src/setup/adapters.ts +335 -0
  1293. package/src/setup/baselines.ts +110 -0
  1294. package/src/setup/caserunner.ts +611 -0
  1295. package/src/setup/configcommit.ts +443 -0
  1296. package/src/setup/engine.ts +1001 -0
  1297. package/src/setup/facts.ts +627 -0
  1298. package/src/setup/findings.ts +1264 -0
  1299. package/src/setup/history.ts +443 -0
  1300. package/src/setup/interview.ts +243 -0
  1301. package/src/setup/ledger.ts +324 -0
  1302. package/src/setup/pins.ts +66 -0
  1303. package/src/setup/portrait.ts +635 -0
  1304. package/src/setup/presentation.ts +18 -0
  1305. package/src/setup/profile.ts +508 -0
  1306. package/src/setup/replay.ts +370 -0
  1307. package/src/setup/replaybuild.ts +392 -0
  1308. package/src/setup/replayrun.ts +1096 -0
  1309. package/src/setup/replaysource.ts +198 -0
  1310. package/src/setup/retune.ts +415 -0
  1311. package/src/setup/retunelog.ts +95 -0
  1312. package/src/setup/scan.ts +1033 -0
  1313. package/src/setup/scanbuild.ts +168 -0
  1314. package/src/setup/scanfacts.ts +107 -0
  1315. package/src/setup/scanlease.ts +297 -0
  1316. package/src/setup/scanreport.ts +373 -0
  1317. package/src/setup/scanrun.ts +2268 -0
  1318. package/src/setup/scantree.ts +259 -0
  1319. package/src/setup/stage2.ts +926 -0
  1320. package/src/setup/stage2request.ts +347 -0
  1321. package/src/setup/survey.ts +458 -0
  1322. package/src/setup/surveyrun.ts +758 -0
  1323. package/src/setup/textsniff.ts +95 -0
  1324. package/src/setup/trackersink.ts +433 -0
  1325. package/src/setup/triage.ts +768 -0
  1326. package/src/setup/tuning.ts +766 -0
  1327. package/src/setup/unitcut.ts +523 -0
  1328. package/src/singleflight.ts +86 -0
  1329. package/src/slack/announce.ts +911 -0
  1330. package/src/slack/api.ts +303 -0
  1331. package/src/slack/messages.ts +288 -0
  1332. package/src/slack/origin.ts +599 -0
  1333. package/src/slack/policy.ts +354 -0
  1334. package/src/slack/reply.ts +201 -0
  1335. package/src/slack/router.ts +285 -0
  1336. package/src/slack/socket.ts +384 -0
  1337. package/src/slack/types.ts +108 -0
  1338. package/src/sqlitehint.ts +32 -0
  1339. package/src/ssh-observation.ts +30 -0
  1340. package/src/state.ts +8243 -0
  1341. package/src/statemachine.ts +369 -0
  1342. package/src/stubs.ts +68 -0
  1343. package/src/takeover.ts +634 -0
  1344. package/src/takeoverpi.ts +293 -0
  1345. package/src/terminal-failure.ts +41 -0
  1346. package/src/thread-resolution-refusal.ts +2 -0
  1347. package/src/tmux.ts +153 -0
  1348. package/src/trackerid.ts +41 -0
  1349. package/src/transcriptindex.ts +665 -0
  1350. package/src/tui/actions.ts +484 -0
  1351. package/src/tui/alerts.ts +666 -0
  1352. package/src/tui/app.ts +1979 -0
  1353. package/src/tui/archiveops.ts +192 -0
  1354. package/src/tui/autofile.ts +233 -0
  1355. package/src/tui/board.ts +1432 -0
  1356. package/src/tui/candidates.ts +889 -0
  1357. package/src/tui/cellwidth.ts +148 -0
  1358. package/src/tui/changelog-store.ts +503 -0
  1359. package/src/tui/chord.ts +25 -0
  1360. package/src/tui/clipboard.ts +92 -0
  1361. package/src/tui/cmdbar.ts +296 -0
  1362. package/src/tui/companion.ts +1427 -0
  1363. package/src/tui/companionplan.ts +247 -0
  1364. package/src/tui/companiontab.ts +83 -0
  1365. package/src/tui/confighome.ts +155 -0
  1366. package/src/tui/connect.ts +68 -0
  1367. package/src/tui/deploy-ceremony.ts +104 -0
  1368. package/src/tui/deploy-drain.ts +129 -0
  1369. package/src/tui/deploy-process.ts +265 -0
  1370. package/src/tui/deploytab.ts +1523 -0
  1371. package/src/tui/design.ts +125 -0
  1372. package/src/tui/digesttab.ts +214 -0
  1373. package/src/tui/emptystate.ts +39 -0
  1374. package/src/tui/evidence.ts +999 -0
  1375. package/src/tui/feed.ts +604 -0
  1376. package/src/tui/feedbacktab.ts +1077 -0
  1377. package/src/tui/filters.ts +90 -0
  1378. package/src/tui/ghread.ts +321 -0
  1379. package/src/tui/historypull.ts +81 -0
  1380. package/src/tui/inboxpull.ts +236 -0
  1381. package/src/tui/index.ts +1565 -0
  1382. package/src/tui/issuesink.ts +238 -0
  1383. package/src/tui/jsonfile.ts +42 -0
  1384. package/src/tui/keys.ts +109 -0
  1385. package/src/tui/layout.ts +108 -0
  1386. package/src/tui/learning.ts +627 -0
  1387. package/src/tui/lessonswitch.ts +118 -0
  1388. package/src/tui/livecontrol.ts +228 -0
  1389. package/src/tui/memforward.ts +443 -0
  1390. package/src/tui/memincident.ts +363 -0
  1391. package/src/tui/memory.ts +620 -0
  1392. package/src/tui/memtab.ts +606 -0
  1393. package/src/tui/metricstab.ts +1177 -0
  1394. package/src/tui/model.ts +131 -0
  1395. package/src/tui/mouse.ts +98 -0
  1396. package/src/tui/msg.ts +268 -0
  1397. package/src/tui/nativecompanion.ts +417 -0
  1398. package/src/tui/openurl.ts +21 -0
  1399. package/src/tui/paint.ts +511 -0
  1400. package/src/tui/panes.ts +98 -0
  1401. package/src/tui/pipane.ts +219 -0
  1402. package/src/tui/poll-hooks.ts +12 -0
  1403. package/src/tui/poll.ts +147 -0
  1404. package/src/tui/proposals.ts +838 -0
  1405. package/src/tui/prpause.ts +150 -0
  1406. package/src/tui/reload.ts +436 -0
  1407. package/src/tui/remote.ts +413 -0
  1408. package/src/tui/rollover.ts +969 -0
  1409. package/src/tui/scantab.ts +1290 -0
  1410. package/src/tui/setupentry.ts +93 -0
  1411. package/src/tui/sidebar.ts +749 -0
  1412. package/src/tui/sshtriage.ts +510 -0
  1413. package/src/tui/startup.ts +231 -0
  1414. package/src/tui/tabs.ts +45 -0
  1415. package/src/tui/termmirror.ts +224 -0
  1416. package/src/tui/theme.ts +95 -0
  1417. package/src/tui/ticketstab.ts +310 -0
  1418. package/src/tui/tmuxsocket.ts +129 -0
  1419. package/src/tui/trackertickets.ts +84 -0
  1420. package/src/tui/unwedge.ts +286 -0
  1421. package/src/tui/viewer.ts +575 -0
  1422. package/src/tui/viewerinput.ts +173 -0
  1423. package/src/updatenotice.ts +178 -0
  1424. package/src/usage.ts +1154 -0
  1425. package/src/verdicts.ts +4689 -0
  1426. package/src/version.ts +80 -0
  1427. package/src/wakes.ts +476 -0
  1428. package/src/webhook.ts +942 -0
  1429. package/src/webhookheal.ts +276 -0
  1430. package/src/wire.ts +2153 -0
  1431. package/src/worker-session-host.ts +602 -0
  1432. package/src/workerbreaker.ts +156 -0
  1433. package/src/workercontrol.ts +104 -0
  1434. package/src/workerlease.ts +441 -0
  1435. package/src/workerliveness.ts +103 -0
  1436. package/src/workerlog.ts +79 -0
  1437. package/src/workerruntime.ts +30 -0
  1438. package/src/workersupervisor.ts +1538 -0
  1439. package/src/workerusage.ts +42 -0
  1440. package/src/workerworld.ts +427 -0
  1441. package/src/worktrees.ts +1138 -0
  1442. package/tests/fixtures/regression-cases.json +795 -0
  1443. package/tests/fixtures/seed-manifest.json +19 -0
@@ -0,0 +1,1067 @@
1
+ # quickreviewd — EXAMPLE config. Copy to config.toml and fill in.
2
+ #
3
+ # Every runtime knob lives here (spec §2). The values below are safe defaults:
4
+ # dry_run is ON (every GitHub mutation is recorded to state/dryrun/ instead of
5
+ # executed) and every identity is empty. The ~10 values a new operator must
6
+ # supply are marked "← FILL (n)" — grep for FILL. Flip dry_run to false only
7
+ # as a deliberate cutover act, never as part of setup.
8
+ #
9
+ # YOU DO NOT HAVE TO FILL THIS BY HAND: `scripts/qcr onboard` interviews you
10
+ # for the few values only you can answer, derives the rest, and patches this
11
+ # file in place — every comment survives, and a re-run edits only what changed.
12
+ # It never writes dry_run in either direction; going live is its own explicit
13
+ # step. See docs/onboarding.md.
14
+ # ONE mutation class is exempt and executes for real even here: the App
15
+ # re-pointing its OWN webhook URL (see [ingress] below) — it can never touch
16
+ # the reviewed repo, and every execution is logged loudly.
17
+
18
+ dry_run = true
19
+
20
+ # The operations timezone: whose calendar day the system runs on.
21
+ # Every day-scoped feature (the [feedback] same-day addendum + its daily
22
+ # expiry, metrics day buckets, TUI alert memory, companion day rollover)
23
+ # derives its day from this one knob; [eod] and [slack.policy] `timezone`
24
+ # default from it and may still be overridden in their own sections.
25
+ [ops]
26
+ timezone = "UTC" # ← FILL: your IANA timezone, e.g. "Europe/Warsaw"
27
+
28
+ [github]
29
+ repo = "" # ← FILL (1): the repo to review, "owner/name"
30
+ app_slug = "" # ← FILL (2): your GitHub App slug
31
+ bot_login = "" # ← FILL (3): the App bot login, "<app_slug>[bot]"
32
+ review_team = "" # ← FILL (4): "org/team" whose review request triggers
33
+ # There is no reviewer knob here. The reviewer never hands a PR back: it always
34
+ # decides on the merits and posts a verdict. If you want a named person told
35
+ # about a particular KIND of change, that is the optional [escalation] section
36
+ # further down — off by default.
37
+ trigger_label = "AI review requested"
38
+ in_progress_label = "AI review in progress"
39
+ reviewed_label = "Automatic Review"
40
+ improvement_label = "Bot improvement"
41
+ issue_label = "bot-filed"
42
+ # secrets dir: app_id, app.pem, webhook_secret, tunnel_token; optional openai_api_key (pi, API-key
43
+ # route) and openai_embeddings_api_key (only with embedding_provider = "openai" in the openviking table)
44
+ # "" (recommended) = the install's config home, $XDG_CONFIG_HOME/qcr/<install>/secrets (the old
45
+ # ~/.config/quickreview-bot is never read — `qcr install migrate` moves it). A path here wins.
46
+ secrets_dir = ""
47
+ # The repo's default branch: the improvement filer's PR base, the
48
+ # replay diff base, the CLI-ops fixture base. PR review rounds always use each
49
+ # PR's own base_ref from the GitHub API, never this.
50
+ base_branch = "main" # ← FILL: your default branch ("main"/"master")
51
+ # Base-clone directory name under the sandbox root. "" (recommended) derives
52
+ # it from the repo slug's basename — "owner/name" ⇒ "name".
53
+ clone_dir = ""
54
+
55
+ [owner]
56
+ # The system's ONE accountable human, as a configured role. Every
57
+ # identity surface renders from here: Slack prose, the companion day-open
58
+ # labels, the pinned-memory head framing, the escalation-mention fallback.
59
+ # Empty values degrade to neutral wording ("the owner" / "the operator").
60
+ name = "" # ← FILL: the operator's display name for rendered prose
61
+ slack_id = "" # ← FILL (if enabling Slack): U…; required then, and a [slack.users] key
62
+ # (legacy alias on input: [slack] legacy_owner_slack_id)
63
+ github_login = "" # ← FILL: operator GitHub login; escalation-mention fallback
64
+
65
+ [server]
66
+ hostname = "" # ← FILL (6): the public webhook hostname.
67
+ # Leave empty when your ingress assigns
68
+ # its own (the quick tunnel does) — then
69
+ # [ingress] below carries the shape.
70
+ port = 8787 # loopback only; your HTTPS ingress fronts it
71
+ # (a tunnel sidecar, cloudflared on the
72
+ # host, or any reverse proxy)
73
+
74
+ # [ingress] — webhook-URL self-heal, for tunnels whose hostname
75
+ # ROTATES (the laptop quick-tunnel route). The tunnel sidecar writes
76
+ # its assigned bare hostname (e.g. "abc.trycloudflare.com") to `hostname_file`;
77
+ # the daemon watches it and re-points the GitHub App's own webhook URL on
78
+ # change (JWT-authed PATCH /app/hook/config, read-back verified). This is the
79
+ # ONE mutation class that executes even in dry_run (AGENTS.md invariant 6) — loudly
80
+ # logged, structurally closed to this one kind; it
81
+ # touches only the App's own configuration, never the reviewed repo. Off by
82
+ # default: with the section absent (or shape = "none") no watcher ever starts —
83
+ # a stable hostname (named tunnel, VM route) needs none of this.
84
+ #[ingress]
85
+ #shape = "tunnel-file" # "none" (default) | "tunnel-file"
86
+ #hostname_file = "" # "" ⇒ <root>/state/ingress/hostname
87
+ #debounce_ms = 3000 # settle time after a file change
88
+ #sweep_interval_s = 300 # polling backstop behind fs.watch
89
+
90
+ [daemon]
91
+ poll_interval_s = 300
92
+ # Rounds are network-IO-bound (model calls), not CPU-bound; the container's
93
+ # 2 CPU / 8 GB Docker cap is the hard resource guard.
94
+ max_concurrent_rounds = 12
95
+ round_deadline_min = 75
96
+ # A round overdue with no verdict whose session is dead is
97
+ # self-requeued by the daemon (fresh dispatch to the PR's own session) at most
98
+ # this many times per PR head. Past the cap the round is abandoned as an
99
+ # anomaly and the PR RETURNS TO ITS STANDING-VERDICT STATE — never an approval,
100
+ # and never a park: there is no "awaiting human" state.
101
+ max_self_requeues = 2
102
+ # Lost-prompt net: a running round whose inject file was consumed but whose
103
+ # session shows NO activity since the round started is re-queued (once per
104
+ # head, inside the max_self_requeues cap) after this many minutes — well before
105
+ # the deadline, so a dropped round prompt does not cost a full deadline window.
106
+ round_stall_grace_min = 10
107
+ # Durable daemon→Pi stage leases. Start is short because no model
108
+ # work exists yet; running is a fixed hard cap above the measured 23.4m live
109
+ # maximum and below the 75m defense-in-depth round deadline. Unknown evidence
110
+ # gets one minute once, never an open-ended extension.
111
+ session_command_start_lease_s = 120
112
+ session_command_running_max_min = 45
113
+ # Command-correlated execution milestones: no first pass, incomplete pass plan,
114
+ # and all-passes-done/no-verdict. Absolute start-derived bounds; activity cannot
115
+ # renew them.
116
+ round_first_pass_max_min = 5
117
+ round_passes_max_min = 35
118
+ round_finalize_grace_min = 5
119
+ # Once a round's review is CONFIRMED posted, a stage limit does not cancel
120
+ # it — the session's tail (ledger, findings record, verdict
121
+ # file) gets this long after the posting, and a round still without a verdict
122
+ # then is settled from the posting receipt. Never a requeue, never a second
123
+ # posting.
124
+ round_posted_tail_grace_min = 15
125
+ # A follow-up round whose pre-approval sweep is owed (a whole
126
+ # round-1-style plan after the delta's) gets this many extra minutes for its
127
+ # passes and its hard cap.
128
+ # follow_up_sweep_extra_min = 20
129
+ posting_receipt_grace_s = 120
130
+ # A review POST GitHub answers 5xx (or not at all) is handed to the daemon
131
+ # (receipt `deferred`) and retried at these minutes after the first failure,
132
+ # each attempt through the gate after a marker read; past the window the PR
133
+ # goes FAILED_LOUD (u to recover).
134
+ # posting_retry_offsets_min = [4, 12, 36]
135
+ # posting_retry_window_min = 60
136
+ session_command_unknown_grace_s = 60
137
+ session_command_unknown_max_checks = 1
138
+ session_command_max_start_retries = 2
139
+ # pi refuses every prompt while it compacts, so a command queued
140
+ # behind a compaction the session's inject bridge reports running is late, not
141
+ # lost — its start lease is held open for up to this long. Past it, the
142
+ # bounded same-session redelivery (max_prompt_redeliveries), and only then the
143
+ # kill-and-replay recovery, take over.
144
+ session_compaction_max_s = 600
145
+ # The central lens permit broker (bot workers): the most lens sessions alive at
146
+ # once across EVERY worker, granted first-in first-out. 20 is the VM's ruling
147
+ # (the CPU gate measured 20 sessions fine on 2 cores). Grants are spaced at
148
+ # least lens_grant_stagger_ms apart so a full wave never creates its sessions
149
+ # in one burst (the gate measured a 0.7-2.5 s loop stall for 8-20 at once);
150
+ # 0 turns the spacing off. status.json `permits` shows the use and the queue.
151
+ lens_permits = 20
152
+ lens_grant_stagger_ms = 250
153
+ # The idle-PR answer worker: an operator's message to a PR with no running
154
+ # worker is answered at once by a short worker that resumes the PR's session,
155
+ # replies and exits. It is ended at answer_timeout_s of wall clock and stops at
156
+ # answer_cap_usd of its own spend. It posts only when the message carried
157
+ # may_post (the viewer's Alt-p, `qcr message --may-post`), through the one gate.
158
+ answer_timeout_s = 600
159
+ answer_cap_usd = 2
160
+ round_stage_supervisor_stale_s = 180
161
+ # The daemon watches its own event loop (status.json
162
+ # `daemon.event_loop`, `qcr status`, the TUI board). One delay of
163
+ # event_loop_stall_max_s or more, or a p99 of event_loop_stall_p99_s or more
164
+ # over a window its samples cover, is a stall: it wakes the overseer
165
+ # (`daemon_event_loop_stalled`) at most once per cooldown, naming the cause —
166
+ # "the loop itself blocked" when the daemon itself was on CPU for most of the
167
+ # stall (the stall's own evidence wins; any throttling is named beside it);
168
+ # else "CPU starved" when the container (/sys/fs/cgroup/cpu.stat, over the
169
+ # same window) was throttled in event_loop_starved_throttle_ratio of its CFS
170
+ # periods or more; else "cause unknown" (host contention or a blocking wait).
171
+ event_loop_window_s = 300
172
+ event_loop_stall_max_s = 10
173
+ event_loop_stall_p99_s = 2
174
+ event_loop_wake_cooldown_min = 60
175
+ event_loop_starved_throttle_ratio = 0.2
176
+ # Zombie-round expiry: a round stuck 'overdue' longer than this whose
177
+ # PR has since verdicted/closed (i.e. a rerun would never touch it) is expired.
178
+ # 0 disables the sweep.
179
+ expire_overdue_after_h = 24
180
+
181
+ [eod]
182
+ time = "18:00"
183
+ # timezone defaults from [ops]; uncomment to run the EOD sweep on another clock.
184
+ #timezone = "Europe/Warsaw"
185
+ # Daily overseer heartbeat: anomaly-table + digest review pass.
186
+ heartbeat_time = "09:00"
187
+ # Watch the owner's pinned entries across the sweep. Curation must never
188
+ # touch them; this makes the invariant detectable rather than merely
189
+ # instructed. The window closes early when the day's digest appears.
190
+ pinned_watchdog = true
191
+ pinned_watchdog_window_min = 90
192
+
193
+ [caps]
194
+ improvement_pr_max_lines = 50
195
+ improvement_pr_max_files = 3
196
+ improvement_pr_per_day = 1
197
+ improvement_pr_per_week = 3
198
+ issues_per_day = 3
199
+ # Paths a bot improvement PR may never touch. This value REPLACES
200
+ # the shipped default shown here — adjust to your repo's shape — but files
201
+ # named .env* are refused unconditionally regardless of this list.
202
+ improvement_pr_deny_prefixes = ["migrations/", "infra/", "ansible/", ".github/workflows/"]
203
+
204
+ [models]
205
+ # default for every role; tiered pass models below
206
+ # Provider prefix is `openai-codex/` — the ChatGPT-OAuth route's provider key
207
+ # in pi's auth.json (direct `openai/` needs an API key we don't ship).
208
+ default = "openai-codex/gpt-6.1-sol"
209
+ conversation = "openai-codex/gpt-6.1-sol"
210
+ # Passes always run at sol-high — single variant, not raisable (already top).
211
+ risk_passes = ["pass-security", "pass-prod-risk", "pass-data-safety"]
212
+ # pass-validate's tier — its own configured tier (floored by a repo profile's
213
+ # min_tier for it), never raised to match a lens (src/dispatch.ts
214
+ # validatorTier). Shipped at sol-high: the validator is the adversarial gate
215
+ # over every finding. One validator call per round — not a hot-path multiplier.
216
+ validate_tier = "sol-high"
217
+ # Diffs under this many changed lines (additions+deletions) start at terra-med.
218
+ small_diff_lines = 150
219
+ # [models.pass_tiers] — per-lens tier pins: pass name → tier
220
+ # name (a key of [models.tiers]). SHIPPED DEFAULT (src/config.ts
221
+ # DEFAULT_PASS_TIERS): pass-baseline, pass-sweep and
222
+ # pass-behaviour-delta at "sol-high" (gpt-6.1-sol at high effort) — measured
223
+ # +6 defects on 18 AACR PRs for +18% cost per PR. An entry here replaces that
224
+ # lens's default pin (e.g. "pass-baseline" = "sol-med"); a repo profile lowers
225
+ # one lens's thinking with [lenses.<pass>] effort = "medium". A pinned lens
226
+ # runs at that tier on every PR whatever the diff size — the plan names it, it
227
+ # is not raisable, and every built variant of it carries that tier's spec. The
228
+ # validator never follows a pinned lens (it runs at validate_tier).
229
+ # Not for pass-validate (use validate_tier) nor for a risk pass (always
230
+ # sol-high). A profile min_tier still floors a pin. Unknown passes or tiers
231
+ # are refused at load. e.g.
232
+ # [models.pass_tiers]
233
+ # "pass-sweep" = "sol-high"
234
+ # "pass-baseline" = "sol-high"
235
+
236
+ [models.tiers]
237
+ # PassTier → model spec; the whole spec (incl. the `:thinking` suffix) rides
238
+ # the built agent's `model:` field — pi's --model accepts the suffix, and the
239
+ # native subagent extension reads only that field.
240
+ "terra-med" = "openai-codex/gpt-6.1-sol:medium"
241
+ "sol-med" = "openai-codex/gpt-6.1-sol:medium"
242
+ "sol-high" = "openai-codex/gpt-6.1-sol:high"
243
+
244
+ [models.pricing]
245
+ # Spend rates keyed by bare model id, USD per million tokens. Consumed by
246
+ # spend accounting; empty entries fall back to unpriced.
247
+ # "gpt-6-sol" = { input_per_mtok = 0.0, output_per_mtok = 0.0 }
248
+
249
+ [tui]
250
+ # qcr tui — the operator TUI on the owner's PC, polling the review VM over ssh.
251
+ # Read-only against the VM except the user's own keystrokes + inject files.
252
+ #
253
+ # target — where the daemon container lives relative to this TUI:
254
+ # "ssh" — the VM/server topology (the always-on recommendation): every
255
+ # poll, attach, digest read and evidence copy rides
256
+ # `ssh <ssh_host> …`, sharing one control master.
257
+ # "local" — the laptop topology (everything on THIS machine, e.g. the
258
+ # compose stack): the SAME commands run against local docker
259
+ # directly and no ssh process is ever spawned. `ssh_host` is
260
+ # ignored; `sudo_docker` still decides the sudo prefix. The
261
+ # memory forward follows this knob too — it reaches the daemon
262
+ # container's loopback memory engine with a plain `docker exec`
263
+ # (the forward script's --local mode) instead of the ssh hop.
264
+ # Always explicit: an empty ssh_host does NOT mean local.
265
+ target = "ssh"
266
+ ssh_host = "" # ← FILL (7): ssh alias of the VM running the container
267
+ # (leave "" when target = "local" — it is unused)
268
+ container = "quickreview-sandbox" # bundled local Compose: "quickreview-daemon-1" (onboarding fills this)
269
+ memory_container = "" # the container the memory forward relays into. "" = `container`
270
+ # (OpenViking is the daemon container's child). On a VM running
271
+ # the memory sidecar (the openviking table's endpoint =
272
+ # "remote") set "quickreview-memory"; flip it back with the endpoint.
273
+ remote_state_dir = "/opt/quickreview/state" # host path on ssh; inside the daemon container on local
274
+ remote_sandbox_root = "" # "" = read the container's qcr.layout label (release: /opt/qcr, legacy: /opt/quickreview/sandbox);
275
+ # a value here wins and is never probed
276
+ sudo_docker = true # docker on the VM needs sudo (root-owned socket)
277
+ poll_interval_s = 3
278
+ stale_after_s = 90 # DATA STALE banner past this written_at age
279
+ # (the daemon rewrites status.json every ~30s)
280
+ msg_timeout_s = 30 # quick-message: pending → undelivered after this
281
+ evidence_timeout_s = 60 # evidence copier: per-remote-read
282
+ # budget. A wedged ssh costs one sweep — the
283
+ # copy is retried on the next poll, never
284
+ # blocking the poll or the paint loop.
285
+ evidence_why_interval_s = 10 # evidence sweep pace: at most one
286
+ # `qcr why` per this many seconds (gap from
287
+ # the end of the last one), clamped 5–600 s.
288
+ # No `why` at all while the daemon is draining
289
+ # or its heartbeat is stale.
290
+
291
+ [pi]
292
+ # VERIFY-ON-PIN: package + version mirrored in package.json "qcrPi" block and the
293
+ # ansible group_vars; the image never floats.
294
+ package = "@earendil-works/pi-coding-agent"
295
+ version = "1.4.0"
296
+ session_dir = "state/pi-sessions"
297
+ # The lens settings that used to live here (subagent_max_concurrency,
298
+ # subagent_cache_group, subagent_cache_stagger_ms, subagent_pass_deadline_min)
299
+ # moved to [engine] (lens_max_concurrency, lens_cache_group,
300
+ # lens_cache_stagger_ms, lens_pass_deadline_min); a config that still sets them
301
+ # is refused.
302
+ # Who launches a round's lenses: "engine", our lens tool and discovery wave on
303
+ # an SDK session, the only value ("native", pi's own subagent glue, is retired
304
+ # and refused).
305
+ # lens_runtime = "engine"
306
+ # The round's engine starts the planned discovery wave itself at round start
307
+ # (rule 9) and the main session joins it with lens_wave. false = the main
308
+ # session launches the wave, with the same tools.
309
+ # engine_wave = true
310
+
311
+ # What hosts a pi session on the review, bench and scan routes: "sdk" runs it
312
+ # in-process on the pi SDK (the default and the only value; "proc", pi as a
313
+ # child process, is retired and refused). `qcr review` and the bench (`qcr-bench
314
+ # review`, `defect-judge`) host the SDK: in the bench each case, and each case
315
+ # of the judge's pool, runs in a host process of its own, so one crash or frozen
316
+ # loop costs one case, and `[pi] lens_runtime = "engine"` gives the review our
317
+ # lens tool. A route that has no host yet refuses "sdk".
318
+ # In the image the SDK runs the model's bash as the separate tool uid and
319
+ # fences the file tools off /proc, /run/qcr-in and the agent dir.
320
+ # The scan runs its leaves on the SDK inside its own detached driver process
321
+ # (`qcr scan start`), never inside the companion's pi; a scan the companion
322
+ # drives itself refuses.
323
+ # The lens tool's settings ride here too (docs/prompt-caching.md):
324
+ # lens_max_concurrency cap on running lens sessions per round (default 4);
325
+ # the daemon's [daemon] lens_permits is the bot's
326
+ # cross-worker budget
327
+ # lens_cache_group lens sessions per shared provider prompt-cache key
328
+ # (default 5; 0 = a random id each, no cache hits)
329
+ # lens_cache_stagger_ms how long a group's later sessions wait after its
330
+ # first, so the cache is written first (default 2500)
331
+ # lens_pass_deadline_min per-pass deadline in minutes: a pass still running
332
+ # is aborted and retried ONCE, and a second timeout
333
+ # fails that pass alone; 0 = no deadline (default 8)
334
+ # [engine]
335
+ # runtime = "sdk"
336
+ # lens_max_concurrency = 4
337
+ # lens_cache_group = 5
338
+ # lens_cache_stagger_ms = 2500
339
+ # lens_pass_deadline_min = 8
340
+
341
+ [memory]
342
+ # Round seeding — how much memory rides each round prompt and how
343
+ # long the daemon waits for it. Memory NEVER blocks or delays a round: past
344
+ # the deadline the round dispatches memory-less and logs the gap.
345
+ context_tokens = 2000
346
+ # The seed's whole budget, in ms (clamped 100…15000). One document embedding
347
+ # on a 2-CPU VM takes 3 s or more, and a seed's query queued behind one needs
348
+ # room for it. It costs at most
349
+ # a few seconds on a ~14-minute round. Keep it above the search's own
350
+ # search_timeout_ms (the openviking block, below).
351
+ context_timeout_ms = 9000
352
+ # The embedding tail of one written finding case, in ms (clamped
353
+ # 0…30000, 0 = off): the server goes on embedding a case batch after its
354
+ # write returns, so a round seed that starts within (cases × this) of the
355
+ # write waits that out before it sends its search — inside context_timeout_ms,
356
+ # never past it, keeping 3 s of the budget for the search itself. While any
357
+ # review round runs or is queued, the case writer also holds its backfill,
358
+ # its late activity and every case those two owe (only cases the capture
359
+ # pass's sync owes are written meanwhile).
360
+ case_embed_tail_ms = 4000
361
+ # Memory health (src/memory/health.ts) — how an outage reaches a
362
+ # person. Every probe_interval_s the daemon lists the reviewer memories root
363
+ # AUTHENTICATED, once with its own key and once with the sessions' ovcli.conf.
364
+ # A refused credential wakes memory_auth_failed at once (never graced, never
365
+ # held by a drain); no authenticated answer for down_after_min wakes
366
+ # memory_down (a server still warming up reads "unknown" for boot_grace_min;
367
+ # a drain holds the wake until it lifts). Either re-wakes every rewake_h while
368
+ # it lasts. The state rides status.json `memory`: the TUI board banner, its
369
+ # desktop notification, `qcr status`, and ONE tracker ticket the TUI files for
370
+ # an incident older than incident_ticket_after_min.
371
+ probe_interval_s = 120
372
+ down_after_min = 10
373
+ boot_grace_min = 5
374
+ rewake_h = 6
375
+ incident_ticket_after_min = 120
376
+ # Writes that stick: every [feedback] signal is ledgered with
377
+ # its memory state, and whatever memory has not taken yet the backfill pump
378
+ # writes every backfill_interval_s (at most 20 a tick, only while memory
379
+ # reads healthy). A signal owed for longer than write_backlog_after_min wakes
380
+ # memory_write_backlog (and again every rewake_h while the backlog lasts). A
381
+ # signal memory refused 12 times is given up on, loudly, and queued again at
382
+ # the daemon's next start and once a day.
383
+ backfill_interval_s = 60
384
+ write_backlog_after_min = 120
385
+ # Finding cases (src/cases.ts): one document per posted finding a
386
+ # human answered or whose fate is known, in reviewer memory's `finding-cases/` — the
387
+ # learner's context, searched by the EOD curator and the companion, never by a
388
+ # review round. Every cases_interval_s the daemon works out from state.db which
389
+ # cases are new or changed and, only while memory reads healthy, writes up to 2
390
+ # (one batch-write — each case is ~3.4 s on the VM's one-thread embedder — and
391
+ # never started while a review round is reading memory) and
392
+ # backfills two more PRs from the last cases_backfill_days days (resumable; 0
393
+ # turns the backfill off).
394
+ cases_interval_s = 120
395
+ cases_backfill_days = 60
396
+ # The learner (src/learner/): lessons_mine_lead_min before the EOD
397
+ # sweep (and on `qcr lessons mine`) the daemon mines the human outcomes of the
398
+ # last lessons_mine_days — refuted / contested findings, the [feedback]
399
+ # ledger, human comments and REQUEST_CHANGES on PRs the bot approved, recheck
400
+ # flips, and commits that changed a bot-approved PR's lines within
401
+ # lessons_recall_window_days of its merge — into lesson CANDIDATES. The EOD
402
+ # sweep is handed them as state/eod/<day>/outcomes.md (at most
403
+ # lessons_packet_new_max new a day, misses first; every undecided one is
404
+ # carried; undecided after lessons_expiry_ops_days it expires, recorded) and
405
+ # answers with an `eod-curation-receipt`. No receipt within
406
+ # lessons_receipt_wait_min wakes eod_curation_missing; a refused or unfound
407
+ # lesson wakes eod_lessons_not_persisted. The digests' "Learnings" from
408
+ # lessons_digest_backfill_from..to (written while memory refused every write)
409
+ # become candidates once.
410
+ lessons_mine_lead_min = 15
411
+ lessons_mine_days = 45
412
+ lessons_receipt_wait_min = 180
413
+ lessons_expiry_ops_days = 7
414
+ lessons_packet_new_max = 40
415
+ lessons_recall_window_days = 14
416
+ lessons_recurrence_days = 90
417
+ lessons_digest_backfill_from = "2026-08-31"
418
+ lessons_digest_backfill_to = "2026-10-02"
419
+ # How curated lessons and past finding cases reach a review.
420
+ # "off" — nothing runs: no selection, no shadow ledger.
421
+ # "shadow" — (the shipped value) every round selects the lessons and cases
422
+ # it WOULD carry, through OpenViking — one prefetch per round
423
+ # (two finds: one for the lessons, one for the cases), started
424
+ # after the round's handoff so it never delays the round, at
425
+ # most shadow_budget_ms (≤ 20000) — and the shadow ledger records
426
+ # them, plus every posted finding a delivered dont-raise lesson
427
+ # would have touched. No prompt, task file or agent changes.
428
+ # "on" — delivery: the same selection, awaited beside the round's
429
+ # memory seed within delivery_budget_ms (≤ 2000), reaches each
430
+ # lens's task file, the lessons files of the validator and of
431
+ # any lens the session adds, the main session's "Lessons in
432
+ # force" index and past-review cases (the bleed rule
433
+ # reworded), the validator's demotion-only `lesson-shape`
434
+ # addendum, and the repo facts for the paths a recheck or an
435
+ # author reply touches. A round that selects nothing renders
436
+ # exactly as under "off".
437
+ # Read `qcr lessons shadow-report` (and the `lessons` clause of `qcr status`)
438
+ # before switching to "on". The operator's kill switch sits beside this one:
439
+ # `qcr lessons off|on` and `qcr lessons suppress|unsuppress <lesson>`, through
440
+ # the root-sealed commands/operator/ channel only, stored in state.db.
441
+ delivery = "shadow"
442
+ delivery_budget_ms = 2000
443
+ shadow_budget_ms = 10000
444
+ # HOW MANY items the round's one context search may draw from each area it
445
+ # searches. `context_tokens` above is the budget; this is the corpus — the two
446
+ # bind independently.
447
+ #
448
+ # A round searches `experiences/` ONLY — the curated lessons of the memory
449
+ # layout (src/memory/layout.ts). Ops notes and feedback events live in `events/`,
450
+ # the owner's unpinned instructions in `preferences/` (the pinned ones ride the
451
+ # round's guaranteed head in full), and none of them belongs in a round's
452
+ # recalled context; nor do the built-in `skills`/`resources` overview blurbs
453
+ # that take most of the block when no quotas are set.
454
+ # Any other key here is IGNORED with one log line, and `experiences` defaults
455
+ # to 24 when it is missing. The count is generous on purpose — its job is to
456
+ # name the area, and `context_tokens` decides how much rides the prompt.
457
+ context_quotas = { experiences = 24 }
458
+
459
+ [openviking]
460
+ # OpenViking (github.com/volcengine/OpenViking) — the review system's context
461
+ # store, running as a SECOND process inside the quickreview container on
462
+ # LOOPBACK :1933. The daemon supervises it as a child process
463
+ # (restart + backoff, stdout folded into the daemon log) and reports its
464
+ # health, version, RSS and CPU in the heartbeat.
465
+ #
466
+ # TRIPLE-MIRRORED PINS, same discipline as [pi]: `version` and
467
+ # `llama_cpp_python_version` here == deploy/ansible/group_vars/all.yml
468
+ # (openviking_version / llama_cpp_python_version) == the Dockerfile venv layer,
469
+ # which installs BOTH by referencing those group_vars — never a literal.
470
+ # tests/openviking.test.ts fails on any drift; the heartbeat drift-checks the
471
+ # running server's self-reported /health version against `version` too.
472
+ #
473
+ # Every path below is a CONTAINER path. On a dev PC the binary is absent: the
474
+ # supervisor logs once, reports unavailable, and never crash-loops.
475
+ enabled = true
476
+ # Who runs the server. "local" (the default): the daemon supervises it, and the
477
+ # local embedder, as children of this container. "remote": the memory sidecar
478
+ # (docker/memory/) runs both on `host`:`port` — set host to the sidecar's name
479
+ # on the container network — and the daemon only probes its health. The sidecar
480
+ # owns the boot provisioning and the embedder re-embed. Never publish its port.
481
+ endpoint = "local"
482
+ version = "0.4.15"
483
+ # The vendored pi extension's upstream base commit (extensions/vendor/
484
+ # openviking-pi). Pinned beside the server version so a bump re-verifies the
485
+ # vendored patch series rather than silently rebasing onto new upstream behaviour.
486
+ extension_commit = "d436baa23c83938b22bb0aab08b0ce48568b5ff4"
487
+ # The daemon and every review session act as this user, holding a key the
488
+ # server confines to it — that confinement is what keeps companion memory out
489
+ # of a posted review. NEVER an ADMIN or ROOT key: ADMIN grants no cross-user
490
+ # data access anyway, and can list every user key in plaintext.
491
+ user = "reviewer"
492
+ account = ""
493
+ reviewer_key_file = "openviking_reviewer_key"
494
+ # ov.conf `server.auth_mode`. `api_key` is the required posture: the
495
+ # server confines each USER key to its own tree, and that confinement is the
496
+ # only thing keeping companion memory out of a posted review. `dev` bypasses
497
+ # authentication on loopback, which makes the two-user design nominal.
498
+ # MIRRORED into group_vars (openviking_auth_mode), which the entrypoint renders; tests/openviking.test.ts
499
+ # and the scripts/deploy.sh preflight both refuse on drift.
500
+ auth_mode = "api_key"
501
+ # The SERVER's own root key, by file name under the secrets mount. ov.conf
502
+ # needs it to run in api_key mode and boot provisioning needs it to mint users.
503
+ # It is the server's credential, never a client's: no daemon surface, no review
504
+ # session and no companion process ever holds it (writeOvcliConf refuses it as
505
+ # a session credential; packages/pi-plugin/extensions/bash-guard.ts refuses to read the files that
506
+ # carry it). Mirrored as openviking_root_key_file.
507
+ root_key_file = "openviking_root_key"
508
+ # The users boot provisioning ENSURES exist — created if absent, left exactly
509
+ # as they are if present, and NEVER rotated (a rotation orphans the keys
510
+ # already distributed to the companion's PC). Mirrored as
511
+ # openviking_provision_users (comma-joined).
512
+ provision_users = ["reviewer", "companion"]
513
+ request_timeout_ms = 10000
514
+ # The round seed's one context search, in ms (clamped 100…15000) — above one
515
+ # document embedding's time, and below
516
+ # [memory] context_timeout_ms, and a seed that sent its search late passes
517
+ # the time it has left, which wins when shorter.
518
+ search_timeout_ms = 8000
519
+ default_category = "experiences"
520
+ read_cache_ttl_ms = 15000
521
+ # NOT an openviking dependency — an undeclared optional extra. Without it the
522
+ # default local dense embedder raises EmbeddingConfigurationError at startup,
523
+ # so the official image cannot boot (verified against a running 0.4.15 server).
524
+ # It is also the runtime of the local English embedder (below).
525
+ llama_cpp_python_version = "0.3.35"
526
+ host = "127.0.0.1" # loopback ONLY — the port is never published
527
+ port = 1933
528
+ bin = "/opt/openviking/venv/bin/openviking-server"
529
+ # ~/.openviking is symlinked here at boot: memory lives on the STATE VOLUME so
530
+ # it survives an image rebuild. config_file/workspace derive from this.
531
+ home = "/opt/quickreview/state/openviking"
532
+ # config_file = "" # empty ⇒ <home>/ov.conf
533
+ # workspace = "" # empty ⇒ <home>/workspace
534
+ # ov.conf is TEMPLATED at boot by the entrypoint — the interactive
535
+ # `openviking-server init` wizard is never invoked in-container.
536
+ workers = 1 # ov.conf server.workers, 2-CPU cap
537
+ queue_concurrency = 2 # accepted, unused: the entrypoint takes ov.conf's queue concurrency from the deploy (group_vars openviking_queue_concurrency)
538
+ # Health gate is /ready, NEVER `doctor`: doctor makes live provider calls and
539
+ # exits 1 when no `vlm` is configured, which is our normal state. /health is
540
+ # unauthenticated and carries the version the drift check reads. The heartbeat
541
+ # reports the CACHED sample, so writing status.json never waits on the network.
542
+ health_interval_s = 30
543
+ # The /health + /ready probe and the local embedder's /health, in ms (clamped
544
+ # 100…20000). /ready runs an embedding and queues behind a case batch's
545
+ # embeddings, so a shorter limit flaps /ready under load. Memory health's
546
+ # "serving" half reads this probe.
547
+ health_timeout_ms = 6000
548
+ # The supervisor never gives up: a memory engine that stays down is worse than
549
+ # a slow retry, and every call site already degrades memory-less.
550
+ restart_backoff_ms = [1000, 2000, 5000, 15000, 30000, 60000]
551
+ restart_reset_after_s = 120 # an uptime this long resets the ladder
552
+ # The embedder. LOCAL is the shipped default: a small
553
+ # ENGLISH embedding model (bge-small-en-v1.5, 384 dims) served on LOOPBACK
554
+ # inside the container by scripts/openviking-embedder.py, over the pinned
555
+ # llama-cpp-python — so nothing but the model call ever leaves the machine,
556
+ # memory text included. ov.conf reaches it through the engine's
557
+ # OpenAI-COMPATIBLE client (provider "openai", api_base http://127.0.0.1:<port>/v1,
558
+ # no key): that client is asynchronous, so a search does not stall the
559
+ # server. Hosted embeddings are an explicit opt-in: embedding_provider =
560
+ # "openai" with model "text-embedding-3-small" / dimension 1536, and the
561
+ # credential in the secrets dir under `embedding_key_file` — a SEPARATE file
562
+ # from pi's `openai_api_key`, so either can be set without the other. ov.conf
563
+ # carries NO `vlm` section either way: extraction, summaries and digest are off
564
+ # (memories are authored, never extracted).
565
+ # Changing the embedder changes the vector space: the boot detects it, moves
566
+ # the old vectors aside and re-embeds reviewer memory (docs/memory-embeddings.md).
567
+ # MIRRORED into group_vars (openviking_embedding_*), whose value the VM boot
568
+ # renders — on the VM route an opt-in is written as inventory host vars beside
569
+ # these keys; tests/openviking.test.ts pins the SHIPPED default to local.
570
+ embedding_provider = "local"
571
+ embedding_model = "bge-small-en-v1.5-f16"
572
+ embedding_dimension = 384
573
+ embedding_key_file = "openai_embeddings_api_key"
574
+ # The local embedder's MODEL FILE — a rule-7 pin like `version`: the image
575
+ # downloads the GGUF from `local_embedder_url` at BUILD time and refuses it
576
+ # unless its sha256 matches; the service re-checks the hash at every start.
577
+ # TRIPLE MIRROR: these == group_vars openviking_local_embedder_* == the
578
+ # memory Dockerfile's model layer (tests/openviking.test.ts,
579
+ # tests/memory-image.test.ts and the scripts/deploy.sh preflight refuse on
580
+ # drift). A changed pin needs `scripts/deploy.sh rebuild`.
581
+ local_embedder_file = "/opt/openviking/models/bge-small-en-v1.5-f16.gguf"
582
+ local_embedder_url = "https://huggingface.co/CompendiumLabs/bge-small-en-v1.5-gguf/resolve/d32f8c040ea3b516330eeb75b72bcc2d3a780ab7/bge-small-en-v1.5-f16.gguf"
583
+ local_embedder_sha256 = "f0b2fef971e8366438bfd2d9aefea1b0115919389448806d290237f638bae999"
584
+ # The service: loopback only, never published (mirrored as
585
+ # openviking_local_embedder_port / _threads). One thread is the latency budget
586
+ # the model was chosen on — ~25 ms for a round's context query.
587
+ local_embedder_port = 1934
588
+ local_embedder_threads = 1
589
+
590
+ [companion]
591
+ # The local companion container — an ambient pi session on the owner's
592
+ # PC that watches the daemon through the TUI's feed and raises alert files.
593
+ # Every knob below is commented out: the defaults in src/config.ts
594
+ # (COMPANION_DEFAULTS) are the shipped configuration; uncomment to override.
595
+ # enabled = true # `qcr tui` starts it unless --no-companion
596
+ # container_name = "qcr-companion"
597
+ # image = "qcr-companion:release" # the release image (docker/Dockerfile) in companion mode, built from the app root: qcr companion rebuild
598
+ # pihome_volume = "companion-pihome" # its OWN pi auth — never the VM's auth.json
599
+ # session = "companion" # tmux session inside the container
600
+ # model = "openai-codex/gpt-6.1-sol:medium"
601
+ # repo_dir = "" # host review-sandbox repo → /workspace (rw);
602
+ # # empty = this sandbox root
603
+ # tracker_dir = "~/projects/your-tracker" # → /tracker (rw)
604
+ # tracker_docs_dir = "~/projects/your-tracker-docs"
605
+ # # → /tracker-docs (READ-ONLY): the tracker
606
+ # # protocol the companion follows. Outside
607
+ # # tracker_dir, so it needs its own mount.
608
+ # reviewed_repo_dir = "~/projects/your-reviewed-repo"
609
+ # # → mounted READ-ONLY into the container: the
610
+ # # reviewed repo's source, so the companion
611
+ # # can read the code a review is about. Never
612
+ # # writable — and a missing checkout just
613
+ # # drops the mount (under-equipped, never a
614
+ # # companion that refuses to start).
615
+ # evidence_dir = "~/.local/share/qcr/evidence"
616
+ # # → /evidence (READ-ONLY): finished-
617
+ # # round evidence (transcript, ledger, prompt,
618
+ # # verdict) the TUI copies down from the VM.
619
+ # # The companion reads plain files and gains
620
+ # # NO ssh and no credential. Kept indefinitely
621
+ # # and unbounded, so the default is a
622
+ # # deliberate home OUTSIDE the repo; empty
623
+ # # means <sandbox root>/evidence (gitignored).
624
+ # feed_dir = "" # → /feed; empty = state/companion/feed
625
+ # alerts_dir = "" # → /alerts; empty = state/companion/alerts
626
+ # ssh_dir = "~/.ssh" # accepted, unused: ~/.ssh is never mounted
627
+ # overdue_grace_min = 30 # watcher knobs
628
+ # stale_alert_s = 300
629
+ # awaiting_age_h = 24
630
+ # cooldown_min = 20
631
+
632
+ [sink]
633
+ # Where auto-filed defect flags (#bug reviewer-memory entries) land.
634
+ # "github" — defects filed as ISSUES on the reviewed repo. The TUI writes a
635
+ # file-issue command; the DAEMON files it through the one
636
+ # MutationGate with the [caps] day cap, title dedup and the
637
+ # [github] issue_label. In dry-run the gate writes an intent
638
+ # instead of creating anything. Recommended for new installs.
639
+ # "wayfinder" — tickets in a local filesystem wayfinder tracker on the
640
+ # operator's PC (set root/effort/parent below).
641
+ # "none" — auto-filing off (also the default when [sink] is absent).
642
+ kind = "none" # ← FILL (10): "github", "wayfinder", or "none"
643
+ # root = "" # wayfinder: tracker root; empty = [companion] tracker_dir
644
+ # effort = "" # wayfinder: effort auto-filed tickets land in (required)
645
+ # parent = "" # wayfinder: parent map id stamped into each ticket (required)
646
+ # tickets_effort = "" # TUI [2]-tab ticket projection's effort; empty = `effort`
647
+
648
+ [backfill]
649
+ # One-shot pre-daemon history import (`qcr backfill`) — read-only against
650
+ # GitHub, no gate involvement. Every knob defaults off [github] (see
651
+ # backfillDefaults in src/config.ts); uncomment only to re-run against a
652
+ # renamed label or a different identity.
653
+ # bot_login = "your-app[bot]" # reviews(author:) — with the [bot] suffix
654
+ # bot_actor = "your-app" # same identity as a timeline actor (no suffix)
655
+ # reviewed_label = "Automatic Review" # enumeration: the bot-review era marker
656
+ # trigger_label = "AI review requested" # tier-1 trigger candidate
657
+ # in_progress_label = "AI review in progress" # tier-2 (dispatch moment) fallback
658
+ # review_team_slug = "review" # team review request = tier-1 trigger
659
+ # concurrency = 2 # per-PR detail queries in flight
660
+ # max_search_pages = 10 # 100 hits/page; search caps at 1,000
661
+
662
+ [guards]
663
+ # Posting-time guards. Enforced on the single MutationGate (packages/pi-plugin/src/guards.ts).
664
+ # The sessions' post scripts (post-review.sh, approve-pr.sh, reply-thread.sh)
665
+ # hold no guard logic: they ask the daemon to post over its IPC socket
666
+ # (src/ipc/postshim.ts, src/postops.ts), so every post meets the same guards.
667
+ # All are on; a knob exists so a guard can be taken out of the
668
+ # path deliberately, in one place.
669
+ downgrade_on_human_approval = true # human APPROVED at this head ⇒ COMMENT, not REQUEST_CHANGES
670
+ skip_unchanged_head = true # same head, no author reply since ⇒ post nothing
671
+ recheck_pr_state_before_post = true # re-read the PR right before posting; merged/closed ⇒ refuse
672
+ # Guard 4: no green CI at this head ⇒ APPROVE is unavailable,
673
+ # regardless of findings. The review still posts, as a COMMENT with approval
674
+ # withheld, and the PR is re-queued when CI goes green at that head.
675
+ # Only the MOST RECENT run of each check name counts — GitHub auto-cancels
676
+ # superseded runs, and their permanent `cancelled` husks would otherwise
677
+ # withhold every approval forever. The latest run
678
+ # of every name must succeed; a genuinely failing/cancelled LATEST run still
679
+ # blocks exactly like a failing test.
680
+ block_approve_on_red_ci = true # red/pending CI ⇒ approval withheld, review posts as COMMENT
681
+ # A head with ZERO check-runs (conflicted PR, CI not
682
+ # started) carries no execution evidence — withhold there too. Set true for a repo that
683
+ # always runs CI (then `none` means something is wrong, not "no CI setup").
684
+ no_checks_is_red = true # zero checks at head ⇒ approval withheld until checks pass
685
+ # Guard 5: the head the round actually reviewed must still
686
+ # be the PR's live head at posting time. Sessions export QCR_EXPECTED_HEAD
687
+ # (the round prompt cites the sha) before posting; a mismatch refuses the
688
+ # post — the session ends the round without a verdict and the daemon re-runs
689
+ # against the new head. A missing expectation warns loudly but proceeds
690
+ # (sessions on older prompts — same belt-and-braces as rule 10's legacy input).
691
+ refuse_on_head_drift = true # live head != the sha the round reviewed ⇒ refuse to post
692
+
693
+ [recheck]
694
+ # Post-approval delta recheck. Once a PR is approved, these triggers
695
+ # ask the PR's OWN sticky session one question — "does this delta warrant a
696
+ # review, or change the verdict to REQUEST_CHANGES?" — with the standing
697
+ # verdict UPHELD BY DEFAULT. A trivial or empty delta costs one classification
698
+ # and a no-op; the only transition the path can produce is
699
+ # APPROVE -> REQUEST_CHANGES (never a re-approve, never a park). The fourth
700
+ # trigger, an author reply, is owned by ping-pong (src/pingpong.ts) and has no
701
+ # knob here.
702
+ enabled = true
703
+ on_push = true # a push landing after an approve — the core case
704
+ on_ci = true # CI completing at the approved head (adverse => evidence)
705
+ on_base_advance = true # the base branch moved; no PR-owned file changed => no-op
706
+
707
+ [review]
708
+ # A first-party agent-directive edit (.claude/**, prompts/**,
709
+ # AGENTS.md/CLAUDE.md in the reviewed repo) never auto-blocks on `kind:
710
+ # injection` — the round still decides on the merits (there is no park) and
711
+ # the review carries ONE short escalation comment
712
+ # @-mentioning the most recent human author of the touched directive files. This is the fallback mention when git history yields no
713
+ # attributable human login. It is a comment @-mention through the gated review
714
+ # — never a GitHub reviewer nomination (the never-hand-to-a-human rule).
715
+ escalation_mention_default = "" # ← FILL (8): fallback GitHub login for escalation @-mentions ("" = no @)
716
+ # The review preset: "default" (the measured best value — every
717
+ # benchmark-driven lever on, the lean plan), "max" (every model at its highest
718
+ # reasoning level + the full lever plan; ~2x cost, ~3x time) or "low" (every
719
+ # model at low reasoning; ~half default's cost and time, about the pre-lever
720
+ # review's recall). REVIEW_PRESETS in
721
+ # packages/pi-plugin/src/reviewconfig.ts. A lever set below overrides the preset.
722
+ preset = "default"
723
+ # The default preset fetches the SOURCE of the npm/PyPI packages a PR imports
724
+ # (package names and versions go to the public registries; nothing is
725
+ # installed or run) so passes can read what a library does. Set false to keep
726
+ # the reviewer off those registries — e.g. when your package names are private.
727
+ # dependency_sources = false
728
+ # Code-quality lenses (maintainability, duplication, abstraction; capped below
729
+ # blocking) run once a PR's non-test code adds 20 lines; the style lens runs
730
+ # only when your repo has a written style guide (a STYLEGUIDE/CODE_STYLE file
731
+ # or a "Code style" section in CONTRIBUTING) and applies only that guide.
732
+ # quality_lenses = false
733
+ # style_lens = false
734
+ # How many nits a review posts: "strict" (default — true-but-trivial nits are
735
+ # dropped, and review volume comes out of nits) or "open" (every true nit
736
+ # posts; style still needs your written guide).
737
+ # nits = "open"
738
+ # Per-lens cost knobs — both off by default, and the defaults are the review
739
+ # as shipped. skip_lenses lists passes never planned nor addable (known pass
740
+ # names only; pass-validate is refused — switch the validator off in the
741
+ # profile instead). validate_consequence_rule
742
+ # adds the validator's consequence rules (intent/contract appeals post as a
743
+ # [question], dead or latent code demotes to nit, a CI-enabled lint rule is a
744
+ # build defect, merges need a shared consequence).
745
+ # skip_lenses = ["pass-abstraction", "pass-duplication"]
746
+ # validate_consequence_rule = true
747
+ # Review latency levers (bench/aacr/PERF.md §6) — each removes
748
+ # serial time; none changes which lenses run. All on by default except
749
+ # validator sharding:
750
+ # wide_lens_fanout — a batched lens launch runs as wide as
751
+ # [engine] lens_max_concurrency (deprecated: the lens tool sets its own
752
+ # width);
753
+ # task_files — the daemon writes each lens's complete task to a file, and
754
+ # the engine starts the planned discovery wave from those files at
755
+ # round start and the session's `lens_wave` tool joins it
756
+ # (packages/pi-plugin/src/engine/lens/tool.ts; off ⇒ hand-written per-row `lens` calls);
757
+ # render_outputs — the review body and inline comments are rendered from
758
+ # the findings record instead of being written out a second time;
759
+ # validator_shards — EXPERIMENTAL, off (1), unvalidated: split the
760
+ # candidates over this many pass-validate children. Measured once on a
761
+ # 19-lens PR (PERF.md §7): the validator got SLOWER (101 -> 225 s) and the
762
+ # merged record dropped every doubted and downgraded mark, so it never
763
+ # earned the default; kept as a knob, not a recommended setting.
764
+ # wide_lens_fanout = false # deprecated: a no-op when [engine] runtime = "sdk" (the default)
765
+ # task_files = false
766
+ # render_outputs = false
767
+ # validator_shards = 2
768
+ # Duplicate merge (docs/duplicate-merge.md): one comment per root
769
+ # cause. Lens candidates are grouped deterministically before the validator
770
+ # (same file within 10 lines, a shared named identifier, or the same fix
771
+ # target), the validator merges or splits each group, and a post-check at
772
+ # render time merges two posted findings that are one root cause posted twice.
773
+ # dedup_merge = false
774
+ # Per-file coverage check: after the lenses return, every changed
775
+ # non-test source file no lens raised a finding on gets a targeted pass-sweep
776
+ # row (at most two, packed by line budget), each saying why it ran.
777
+ # coverage_check = false
778
+ # Follow-up rounds (docs/follow-up-rounds.md): every round after the
779
+ # first verifies the prior findings and reviews only the PR-owned change since
780
+ # the last reviewed head (base merges and rebases taken out), with one
781
+ # whole-PR pre-approval sweep before an approval when no full look has run
782
+ # since round 1 (or, once approved, when a push is large). Any doubt (no reviewed head, a rewound base, a git failure, a
783
+ # delta above follow_up_max_delta_ratio of the PR's diff lines) runs a
784
+ # full re-review instead. "full" re-reviews the whole PR every round.
785
+ # follow_up = "full"
786
+ # follow_up_max_delta_ratio = 0.6
787
+ # follow_up_sweep = false
788
+ # After a posted approval the sweep is owed only when the change since it
789
+ # reaches this many lines (additions + deletions); 0 never owes it.
790
+ # follow_up_post_approval_sweep_lines = 500
791
+ # A delta of at most this many lines gets the LEAN plan: no per-file sweep
792
+ # rows, and the quality and style lenses offered as addable instead of
793
+ # planned; 0 never. Read only under follow_up_extent = "rules"; the shipped
794
+ # "session" mode always plans the lean core and leaves this threshold to
795
+ # the session.
796
+ # follow_up_small_delta_lines = 150
797
+ # Split pass-baseline on a very large change: over this many changed
798
+ # lines (prose half; lockfiles, generated and vendored files not counted) the
799
+ # baseline is planned as 2-3 rows, each starting from one group of the
800
+ # change's files with the whole PR still its charter, so the round's longest
801
+ # reading runs in parallel. 2000 splits only the largest PRs; 0 never splits.
802
+ # baseline_split_lines = 2000
803
+ # The round's CONTEXT PACK (docs/prompt-caching.md): "pack-first"
804
+ # writes the diff, the change since the last review and the most-changed
805
+ # files' full text beside the task files, and every lens child carries it at
806
+ # the start of its prompt, after one cached warm-up per cache group — so the
807
+ # lenses read it from cache instead of re-reading it uncached (each lens's
808
+ # instructions move into a developer message after the pack). On by default
809
+ # (measured 40% cheaper on 10 cases, verdicts and recall held); "off" sends
810
+ # no pack. Needs [engine] lens_cache_group > 0.
811
+ # context_pack = "off"
812
+ # context_pack_max_tokens = 40000
813
+ # Loosened-test hint: weakened assertions in the PR's test files
814
+ # (exact → bound or contains, a tolerance widened, a count lowered, a timeout
815
+ # lengthened, an assert removed or commented out, a skip added) are found by
816
+ # code and named in pass-tests' plan reason; their presence also plans it.
817
+ # loosened_test_hint = false
818
+ # Repo profile — names a directory under profiles/ whose house-rule
819
+ # addenda pack (profiles/<name>/addenda/*.md) composes onto the built pass
820
+ # bodies after the built-in generic registry, and whose optional
821
+ # heuristics.toml extends lens selection with your repo's file shapes
822
+ # (framework settings globs, command dirs, flag-library names — ADD-only, the
823
+ # generic selection core always stays). "" = no profile (generic addenda and
824
+ # generic selection only). Ship-with options: "default" (the shipped
825
+ # behaviour — the base your own profile extends with `extends = "default"`),
826
+ # "minimal" (empty pack), "example-django" (a worked illustrative Django pack,
827
+ # heuristics included).
828
+ # See docs/profiles.md for authoring your own.
829
+ profile = ""
830
+
831
+ # EXTENSIONS to the first-party directive-path vocabulary the
832
+ # directive-edit escalation flow keys on (packages/pi-plugin/src/severity.ts). Extend-only by design:
833
+ # these ADD names, the built-ins (.claude/**, .cursor/**, root prompts/**,
834
+ # AGENTS.md/AGENT.md/CLAUDE.md/.cursorrules anywhere,
835
+ # .github/copilot-instructions.md) can never be removed — dropping one would
836
+ # silently re-enable auto-blocking on first-party directive edits. Leave
837
+ # empty unless your repo keeps agent directives under other names.
838
+ [review.directives]
839
+ extra_basenames = [] # e.g. ["COPILOT.md"]
840
+ extra_dir_segments = [] # e.g. [".aider"] — whole subtree, any depth
841
+ extra_root_dirs = [] # ROOT-only directive dirs, like prompts/
842
+ extra_files = [] # exact repo-relative paths
843
+ extra_vendored_segments = [] # extra third-party markers (case-insensitive)
844
+
845
+ # ---------------------------------------------------------------------------
846
+ # [escalation] — OPTIONAL, OFF BY DEFAULT.
847
+ #
848
+ # Two things this does NOT do, and cannot be configured to do:
849
+ #
850
+ # * It never hands the review back. The reviewer always decides on the
851
+ # merits and posts the verdict; an escalation is a note that goes out
852
+ # BESIDE it. Nothing here can withhold, defer or replace a verdict.
853
+ # * It never asks anyone to "review this PR". Every escalation names ONE
854
+ # thing — a file and line range, a migration, a named decision — and why
855
+ # that person. Think of it as a `[check this]` item with a name on it.
856
+ #
857
+ # Leave `enabled = false` and nothing below is read: no rule is evaluated, no
858
+ # extra API call is made, and the round prompts carry no escalation text
859
+ # whatever — the system BEHAVES exactly as a build without the feature.
860
+ # (The placeholder that renders empty leaves a blank line in the prompt, like
861
+ # the sibling notes beside it.)
862
+ # `qcr onboard`'s escalation step writes this section.
863
+ #
864
+ # The configuration cannot be half-done: `enabled = true` with no `targets`,
865
+ # or a rule pointing at a login that is not a target, or a rule that declares
866
+ # no condition, all REFUSE TO LOAD. That is deliberate — escalation switched
867
+ # on with nobody to escalate to is not a configuration.
868
+ [escalation]
869
+ enabled = false
870
+ # "comment" (the default) posts a gated COMMENT review @-mentioning the person
871
+ # with the narrow ask. "review_request" ALSO puts the PR in their
872
+ # review-requested queue — GitHub words that entry "review this pull request",
873
+ # which is exactly the framing this feature rules out, so the comment is still
874
+ # posted and still carries the real ask. "comment" is the shape that matches
875
+ # the intent; pick "review_request" only if your team lives in that queue.
876
+ shape = "comment"
877
+ # The CLOSED set of logins any escalation may reach. A session that names
878
+ # anyone else is silently dropped by the daemon — it is not negotiable.
879
+ targets = []
880
+ # May the PR's session ALSO escalate on its own judgement, bounded to the
881
+ # targets above? Off by default: the rules below stand on their own, and they
882
+ # are the half with no model in the loop.
883
+ session_judgement = false
884
+ # Hard cap per PR, across every round.
885
+ max_per_pr = 2
886
+
887
+ # Deterministic triggers. Each rule is a pure predicate over facts the daemon
888
+ # already has — no LLM judgement anywhere. A rule fires when EVERY condition it
889
+ # declares holds; a rule that declares none refuses to load.
890
+ #
891
+ # Conditions: paths (glob: * within a segment, ** across), labels (PR labels),
892
+ # min_severity (the round posted a finding at or above P0/P1/P2/P3), and
893
+ # failing_checks (the LATEST run of a named check is not green).
894
+ #
895
+ # [[escalation.rules]]
896
+ # name = "migrations"
897
+ # to = "example-teammate" # must appear in `targets` above
898
+ # why = "you own this repo's migration policy"
899
+ # paths = ["**/migrations/*.py"]
900
+ # [[escalation.rules]]
901
+ # name = "blockers-on-payments"
902
+ # to = "example-teammate"
903
+ # why = "payments changes go past you before they merge"
904
+ # paths = ["billing/**"]
905
+ # min_severity = "P1"
906
+
907
+ # Bounds on a SESSION-issued `drain` / `pause-pr`. A pi session
908
+ # (the overseer, or a PR's session on the owner's behalf in Slack) may hold
909
+ # either lever only for a bounded time, drawn from a per-day minute budget —
910
+ # so a session can stop review work for a reason, never indefinitely. The
911
+ # OPERATOR's own levers (`qcr drain on`, the deploy tab's D) are NOT bounded
912
+ # here: the deploy-window drain stands until the new boot's first healthy
913
+ # reconcile lifts it. Which of the two a command is comes
914
+ # from the channel it arrived on (the operator's is the root-owned
915
+ # `commands/operator/` directory a session cannot write into), never from a
916
+ # field in the file. All values are minutes; budgets count per [ops] timezone day.
917
+ [levers]
918
+ session_drain_max_min = 30 # longest single session drain
919
+ session_drain_budget_min_per_day = 90 # total session-drain minutes per day (>= the cap)
920
+ session_pause_max_min = 240 # longest single session pause of one PR
921
+ session_pause_budget_min_per_day = 480 # total session-pause minutes per PR per day (>= the cap)
922
+
923
+ # Archiving (docs/archiving.md): closed-PR history leaves every live
924
+ # path for a compressed archive under <root>/archive/ — nothing of analysis
925
+ # value is deleted, only proven duplicates. The archiver runs on its own timer,
926
+ # never before the first healthy reconcile + start_delay_min, and holds while
927
+ # draining, while the event loop is stalled or the CPU starved, and while
928
+ # either mount's free space is low or unknown. "plan" (the shipped value)
929
+ # computes what it WOULD move — status.json `archive`, `qcr status`,
930
+ # `qcr archive status --plan` — and writes nothing. "on" MOVES, every tick:
931
+ # first it restores reopened PRs' transcripts and payloads to their live paths;
932
+ # then it moves the old reader-less event rows and webhook deliveries into
933
+ # monthly SQLite files under archive/db/ (sealing finished months to .gz);
934
+ # then each eligible closed PR's files — every pi transcript, round prompt,
935
+ # session-command payload, finding, receipt, round file, inject leftover and
936
+ # processed verdict — into archive/pr-<n>/, REMOVING each from the live tree
937
+ # once its compressed copy is verified; then the overseer's non-current
938
+ # transcripts and pi's day-old global session files the same way. Nothing is
939
+ # deleted that is not verified in the archive or a proven duplicate. Read one
940
+ # `qcr archive status --plan` before flipping it. All optional — these are the
941
+ # defaults.
942
+ [archive]
943
+ mode = "plan" # off | plan | on — an unknown value refuses to load
944
+ after_days = 14 # closed PRs' files and webhook deliveries (clamped 7..3650)
945
+ events_after_days = 35 # the reader-less event kinds (clamped 31..3650; keeps qcr metrics d30 exact)
946
+ interval_s = 60 # the archiver's own timer (clamped 10..3600)
947
+ start_delay_min = 10 # after the first healthy reconcile (clamped 0..1440)
948
+ tick_budget_s = 20 # no new file is started after this (clamped 1..300)
949
+ max_prs_per_tick = 5 # (clamped 1..100)
950
+ max_mb_per_s = 8 # input rate cap for compress + verify (clamped 1..200)
951
+ disk_headroom_gb = 2 # free space kept on both mounts (clamped 0.5..1024)
952
+ db_batch_rows = 500 # the DB mover's starting batch; adapts 100..2000 to stay <= 25 ms
953
+ gzip_level = 6 # (clamped 1..9)
954
+ live_retention_days = 30 # a worker round's logs (state/live, state/lens) leave the live tree this long after
955
+ # their last write, once the PR's archive holds a verified copy (clamped 7..3650)
956
+ live_cap_gb = 20 # disk cap on state/live + state/lens; past it the archive_live_cap wake fires (0 = off, max 4096)
957
+
958
+ # The bot login's single refresher (src/loginrefresh/): the VM-only
959
+ # exception to "only the owner's pi /login refreshes" (packages/pi-plugin/src/engine/auth.ts).
960
+ # After the cutover ONE process the daemon spawns and supervises owns
961
+ # pihome/agent/auth.json and every worker borrows a refresh-blanked copy.
962
+ # Off until the cutover's config turns it on: while tmux pi sessions exist they
963
+ # refresh the file themselves, and a second refresher would rotate the refresh
964
+ # token under them. margin_min must exceed [daemon] round_deadline_min.
965
+ [login_refresh]
966
+ enabled = false
967
+ margin_min = 90 # refresh once the token has less than pi's 5 min + this left
968
+
969
+ # The companion's whole-repo scan — read only inside the companion,
970
+ # never on the VM. Stage 1 runs `pass-scan` over every unit of the saved unit
971
+ # cut (tests, migrations, lockfiles and prose never). The FIRST scan at these
972
+ # settings is a calibration run over a few units; every later cost preview is
973
+ # priced from the coverage ledger's actual costs, and a run stops hard at the
974
+ # estimate the operator approved. A repo profile's `[scan]` table overrides
975
+ # effort / tier / validator / exclude / depth / deep_lenses (the profile
976
+ # wins); the rest is the install's. All optional — these are the defaults.
977
+ [scan]
978
+ effort = "low" # stage 1's reasoning level: low | medium | high (= [models] effort_max)
979
+ tier = "sol-med" # whose model pass-scan runs on ([models.tiers])
980
+ validator = true # the skeptic: judges each finding at its lens's tier — confirmed / likely / doubtful, never dropped (its cost is in the price)
981
+ exclude = [] # repo-relative globs never scanned, e.g. ["generated/", "*.pb.go"]
982
+ calibration_units = 3 # units the first-scan calibration run reads
983
+ calibration_max_usd = 3.0 # the calibration run's hard stop
984
+ concurrency = 8 # scan cases in flight at once (stage 1 and stage 2)
985
+ case_max_files = 30 # one case reads at most this much; a bigger unit splits, name kept
986
+ case_max_lines = 3000 # (stage-2 rows too: split a bigger row)
987
+ unmeasured_rate_factor = 4 # stage 2: a deep lens never priced here costs stage 1's rate × this
988
+ depth = "standard" # "deep": stage 1 names a deep lens for every file, every lens digs past its row's
989
+ # files, a stage-2 proposal adds the floor below, and only a deep reading covers a file
990
+ deep_lenses = ["pass-consistency", "pass-delivery", "pass-duplication", "pass-maintainability"]
991
+ # the deep floor: each of these over every file stage 1 reads (one switched off by the profile is skipped);
992
+ # the order is the priority: under a budget the first lens covers the whole tree before the next starts
993
+ # Where `qcr scan start` drives a run (not a profile key). "docker": in a throwaway
994
+ # container from the companion image, mounting only the reviewed repo (read-only),
995
+ # the state home, the companion's pi login (read-only) and this config (read-only)
996
+ # — `qcr scan doctor` checks it all, and an image older than the checkout is
997
+ # refused until `qcr scan rebuild` (which builds it and touches no container).
998
+ # Unset, it is "host" inside the companion container.
999
+ # "host": a detached process on this machine, running the `pi` on the PATH (its own login).
1000
+ #
1001
+ # One login: the companion's. Log its pi in once (`qcr scan login` runs pi's OAuth
1002
+ # login straight away, in the running companion or over its pi home volume); the
1003
+ # companion alone refreshes it.
1004
+ # A scan reads that login read-only and runs every case on a fresh private copy with
1005
+ # the refresh token neutralised, so it never refreshes and never writes anything the
1006
+ # companion reads. The price: a scan case cannot outlive the access token — a start
1007
+ # or a case it would not outlive is refused; open the companion so it refreshes.
1008
+ sandbox = "docker"
1009
+ # pihome_volume = "companion-pihome" # whose login the scan reads; default [companion] pihome_volume
1010
+ # image = "qcr-scan" # the sandbox's image (docker/companion/Dockerfile): qcr scan rebuild
1011
+
1012
+ [slack]
1013
+ # The Slack concierge — ONE channel, one thread per PR. Tokens are
1014
+ # NEVER here: bot_token_file / app_token_file name flat files under
1015
+ # [github].secrets_dir (~/.config/qcr/<install>/secrets, /opt/quickreview/secrets in the
1016
+ # container). Turning `enabled` on is a deliberate deploy-time act: with it on,
1017
+ # a missing token file is a hard startup error, never a silent read-only mode.
1018
+ enabled = false
1019
+ channel = "" # ← FILL (9, if enabling Slack): the ONE channel id (C…)
1020
+ channel_kind = "public" # "public" | "private" (private needs an invite)
1021
+ bot_token_file = "slack_bot_token" # xoxb-…
1022
+ app_token_file = "slack_app_token" # xapp-…, connections:write, socket mode only
1023
+ legacy_owner_slack_id = "" # LEGACY alias of [owner] slack_id — set the [owner] key instead
1024
+ post_min_interval_ms = 1100 # Slack chat.postMessage is ~1 msg/s per channel
1025
+ reconnect_backoff_ms = [1000, 2000, 5000, 15000, 30000]
1026
+ server_ping_timeout_ms = 30000 # no server ping within this ⇒ reconnect
1027
+ catchup_max_age_s = 300 # accepted, unused: Slack inbound turns are retired
1028
+ max_reply_chars = 3000
1029
+ name_cache_ttl_s = 86400
1030
+
1031
+ [slack.users]
1032
+ # Slack member id -> GitHub login. The ONLY source of own-PR rights: a message
1033
+ # from an id that is not listed here can never claim to be a PR's author.
1034
+ # U0OPERATOR = "operator-github-login"
1035
+
1036
+ [slack.policy]
1037
+ # Every cap below is enforced in DAEMON CODE (src/slack/policy.ts), never by
1038
+ # prompt — a session can ask to speak, the daemon decides.
1039
+ daily_turns = 80 # channel-wide model turns per policy day
1040
+ per_user_daily_turns = 20 # per person, same window
1041
+ thread_replies_per_day = 6 # daemon posts into any one thread
1042
+ soft_exchange_limit = 3 # accepted, unused (no reader enforces it)
1043
+ announcements_per_hour = 20 # rolling hour; announcements bypass turn caps
1044
+ default_cooldown_min = 60 # for a non-built-in cause with no cooldown_min of its own
1045
+ # The day boundary for every cap (DST-correct). Defaults from [ops] timezone;
1046
+ # uncomment to run the Slack caps on another clock.
1047
+ #timezone = "Europe/Warsaw"
1048
+ pickup_grace_min = 20
1049
+ downtime_notice_min = 5
1050
+ heartbeat_interval_min = 5
1051
+ storm_corrections = 5 # accepted, unused: no code raises reconcile.storm
1052
+ awaiting_author_stale_h = 48 # accepted, unused: no code raises pr.awaiting_author_stale
1053
+ broadcast_verdicts = "never" # accepted, unused: verdicts always stay in-thread
1054
+
1055
+ [slack.policy.causes]
1056
+ # Per-cause switch + cooldown. Keys are per-PR at runtime ("round.overdue:5263")
1057
+ # so one stuck PR can never silence another.
1058
+ "round.overdue" = { enabled = true, cooldown_min = 60 }
1059
+ "round.malformed_verdict" = { enabled = true, cooldown_min = 60 }
1060
+ "review.failed_loud" = { enabled = true, cooldown_min = 60 }
1061
+ "pr.not_picked_up" = { enabled = true, cooldown_min = 120 }
1062
+ "daemon.up" = { enabled = true, cooldown_min = 0 }
1063
+ "daemon.stopping" = { enabled = true, cooldown_min = 0 }
1064
+ "slack.cap_reached" = { enabled = true, cooldown_min = 0 }
1065
+ "reconcile.storm" = { enabled = false, cooldown_min = 180 }
1066
+ "digest.eod" = { enabled = false, cooldown_min = 0 }
1067
+ "pr.awaiting_author_stale" = { enabled = false, cooldown_min = 1440 }