tinybeeai 0.0.0-stage → 0.16.1

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 (1034) hide show
  1. package/.railway/railway.ts +83 -0
  2. package/.railway/tsconfig.json +13 -0
  3. package/AGENTS.md +102 -0
  4. package/Dockerfile +108 -0
  5. package/LICENSE +21 -0
  6. package/README.md +275 -2
  7. package/bin/localdost.js +29 -0
  8. package/bin/tinybeeai.js +28 -0
  9. package/compose.yml +63 -0
  10. package/demo/payloads/ci_failure.json +46 -0
  11. package/demo/payloads/outage.json +18 -0
  12. package/demo/payloads/pr_comment_edited.json +50 -0
  13. package/demo/payloads/pr_merged.json +80 -0
  14. package/demo/payloads/pr_opened.json +69 -0
  15. package/demo/payloads/pr_synchronize.json +69 -0
  16. package/demo/payloads/ticket_created.json +138 -0
  17. package/demo/sample-app/playwright.config.ts +20 -0
  18. package/demo/sample-app/server.ts +163 -0
  19. package/demo/sample-app/tests/checkout.spec.ts +13 -0
  20. package/demo/sample-app/tests/smoke.spec.ts +8 -0
  21. package/dist/agent/approval-retries.js +59 -0
  22. package/dist/agent/approval-retries.js.map +1 -0
  23. package/dist/agent/approvals.js +390 -0
  24. package/dist/agent/approvals.js.map +1 -0
  25. package/dist/agent/chat-bridge.js +154 -0
  26. package/dist/agent/chat-bridge.js.map +1 -0
  27. package/dist/agent/chat-lead.js +475 -0
  28. package/dist/agent/chat-lead.js.map +1 -0
  29. package/dist/agent/chat-loop.js +106 -0
  30. package/dist/agent/chat-loop.js.map +1 -0
  31. package/dist/agent/chat-mcp.js +49 -0
  32. package/dist/agent/chat-mcp.js.map +1 -0
  33. package/dist/agent/chat-tool-blocks.js +453 -0
  34. package/dist/agent/chat-tool-blocks.js.map +1 -0
  35. package/dist/agent/chat-view.js +94 -0
  36. package/dist/agent/chat-view.js.map +1 -0
  37. package/dist/agent/chat-views.js +781 -0
  38. package/dist/agent/chat-views.js.map +1 -0
  39. package/dist/agent/chat.js +1703 -0
  40. package/dist/agent/chat.js.map +1 -0
  41. package/dist/agent/destinations.js +150 -0
  42. package/dist/agent/destinations.js.map +1 -0
  43. package/dist/agent/llm-cli.js +451 -0
  44. package/dist/agent/llm-cli.js.map +1 -0
  45. package/dist/agent/llm-codex.js +493 -0
  46. package/dist/agent/llm-codex.js.map +1 -0
  47. package/dist/agent/llm-openai.js +211 -0
  48. package/dist/agent/llm-openai.js.map +1 -0
  49. package/dist/agent/llm.js +1464 -0
  50. package/dist/agent/llm.js.map +1 -0
  51. package/dist/agent/memory.js +33 -0
  52. package/dist/agent/memory.js.map +1 -0
  53. package/dist/agent/mock-views.js +93 -0
  54. package/dist/agent/mock-views.js.map +1 -0
  55. package/dist/agent/model-availability.js +207 -0
  56. package/dist/agent/model-availability.js.map +1 -0
  57. package/dist/agent/model-errors.js +188 -0
  58. package/dist/agent/model-errors.js.map +1 -0
  59. package/dist/agent/model-guard.js +311 -0
  60. package/dist/agent/model-guard.js.map +1 -0
  61. package/dist/agent/prompts.js +374 -0
  62. package/dist/agent/prompts.js.map +1 -0
  63. package/dist/agent/qa-lenses/qa-auth.md +32 -0
  64. package/dist/agent/qa-lenses/qa-check-then-act.md +33 -0
  65. package/dist/agent/qa-lenses/qa-control-has-no-effect.md +32 -0
  66. package/dist/agent/qa-lenses/qa-dates.md +31 -0
  67. package/dist/agent/qa-lenses/qa-double-submit.md +34 -0
  68. package/dist/agent/qa-lenses/qa-feature-flag.md +29 -0
  69. package/dist/agent/qa-lenses/qa-migration.md +35 -0
  70. package/dist/agent/qa-lenses/qa-money.md +38 -0
  71. package/dist/agent/qa-lenses/qa-response-shape-break.md +33 -0
  72. package/dist/agent/qa-lenses/qa-validation.md +29 -0
  73. package/dist/agent/qa-prompts.js +660 -0
  74. package/dist/agent/qa-prompts.js.map +1 -0
  75. package/dist/agent/reasoning.js +55 -0
  76. package/dist/agent/reasoning.js.map +1 -0
  77. package/dist/agent/redact.js +48 -0
  78. package/dist/agent/redact.js.map +1 -0
  79. package/dist/agent/rules.js +927 -0
  80. package/dist/agent/rules.js.map +1 -0
  81. package/dist/agent/runs.js +440 -0
  82. package/dist/agent/runs.js.map +1 -0
  83. package/dist/agent/send-retry.js +62 -0
  84. package/dist/agent/send-retry.js.map +1 -0
  85. package/dist/agent/team-notes.js +288 -0
  86. package/dist/agent/team-notes.js.map +1 -0
  87. package/dist/agent/token-meter.js +31 -0
  88. package/dist/agent/token-meter.js.map +1 -0
  89. package/dist/agent/triage.js +506 -0
  90. package/dist/agent/triage.js.map +1 -0
  91. package/dist/api.js +1047 -0
  92. package/dist/api.js.map +1 -0
  93. package/dist/approval-targets.js +107 -0
  94. package/dist/approval-targets.js.map +1 -0
  95. package/dist/bee/cloudflared.js +108 -0
  96. package/dist/bee/cloudflared.js.map +1 -0
  97. package/dist/bee/health.js +99 -0
  98. package/dist/bee/health.js.map +1 -0
  99. package/dist/bee/hive-client.js +75 -0
  100. package/dist/bee/hive-client.js.map +1 -0
  101. package/dist/bee/identity.js +39 -0
  102. package/dist/bee/identity.js.map +1 -0
  103. package/dist/bee/models.js +510 -0
  104. package/dist/bee/models.js.map +1 -0
  105. package/dist/bee/pairing.js +351 -0
  106. package/dist/bee/pairing.js.map +1 -0
  107. package/dist/bee/relay-client.js +50 -0
  108. package/dist/bee/relay-client.js.map +1 -0
  109. package/dist/bee/routes.js +214 -0
  110. package/dist/bee/routes.js.map +1 -0
  111. package/dist/bee/setup-page.js +223 -0
  112. package/dist/bee/setup-page.js.map +1 -0
  113. package/dist/bee/state.js +41 -0
  114. package/dist/bee/state.js.map +1 -0
  115. package/dist/bee/status.js +117 -0
  116. package/dist/bee/status.js.map +1 -0
  117. package/dist/bee/tunnel-manager.js +245 -0
  118. package/dist/bee/tunnel-manager.js.map +1 -0
  119. package/dist/bee/updater.js +268 -0
  120. package/dist/bee/updater.js.map +1 -0
  121. package/dist/boot.js +41 -0
  122. package/dist/boot.js.map +1 -0
  123. package/dist/call/index.js +145 -0
  124. package/dist/call/index.js.map +1 -0
  125. package/dist/case-folders.js +294 -0
  126. package/dist/case-folders.js.map +1 -0
  127. package/dist/cases.js +554 -0
  128. package/dist/cases.js.map +1 -0
  129. package/dist/chat-blocks.js +709 -0
  130. package/dist/chat-blocks.js.map +1 -0
  131. package/dist/chat-parse-util.js +38 -0
  132. package/dist/chat-parse-util.js.map +1 -0
  133. package/dist/chat-results.js +96 -0
  134. package/dist/chat-results.js.map +1 -0
  135. package/dist/chat-stats.js +193 -0
  136. package/dist/chat-stats.js.map +1 -0
  137. package/dist/chat-view-specs.js +186 -0
  138. package/dist/chat-view-specs.js.map +1 -0
  139. package/dist/cli/doctor-ops.js +361 -0
  140. package/dist/cli/doctor-ops.js.map +1 -0
  141. package/dist/cli/doctor.js +289 -0
  142. package/dist/cli/doctor.js.map +1 -0
  143. package/dist/cli/dogfood.js +70 -0
  144. package/dist/cli/dogfood.js.map +1 -0
  145. package/dist/cli/env-file.js +34 -0
  146. package/dist/cli/env-file.js.map +1 -0
  147. package/dist/cli/eval-chat-cases.js +359 -0
  148. package/dist/cli/eval-chat-cases.js.map +1 -0
  149. package/dist/cli/eval-chat-results.js +85 -0
  150. package/dist/cli/eval-chat-results.js.map +1 -0
  151. package/dist/cli/eval-chat.js +508 -0
  152. package/dist/cli/eval-chat.js.map +1 -0
  153. package/dist/cli/eval-designer.js +67 -0
  154. package/dist/cli/eval-designer.js.map +1 -0
  155. package/dist/cli/eval-qa-review.js +284 -0
  156. package/dist/cli/eval-qa-review.js.map +1 -0
  157. package/dist/cli/golden-export.js +35 -0
  158. package/dist/cli/golden-export.js.map +1 -0
  159. package/dist/cli/index.js +90 -0
  160. package/dist/cli/index.js.map +1 -0
  161. package/dist/cli/init.js +746 -0
  162. package/dist/cli/init.js.map +1 -0
  163. package/dist/cli/scan-repo.js +199 -0
  164. package/dist/cli/scan-repo.js.map +1 -0
  165. package/dist/cli/seed.js +108 -0
  166. package/dist/cli/seed.js.map +1 -0
  167. package/dist/cli/tinybee.js +247 -0
  168. package/dist/cli/tinybee.js.map +1 -0
  169. package/dist/config.js +138 -0
  170. package/dist/config.js.map +1 -0
  171. package/dist/connect/aivision-local.js +833 -0
  172. package/dist/connect/aivision-local.js.map +1 -0
  173. package/dist/connect/aivision-token.js +84 -0
  174. package/dist/connect/aivision-token.js.map +1 -0
  175. package/dist/connect/crypto.js +65 -0
  176. package/dist/connect/crypto.js.map +1 -0
  177. package/dist/connect/deps.js +110 -0
  178. package/dist/connect/deps.js.map +1 -0
  179. package/dist/connect/engines.js +144 -0
  180. package/dist/connect/engines.js.map +1 -0
  181. package/dist/connect/github-access.js +74 -0
  182. package/dist/connect/github-access.js.map +1 -0
  183. package/dist/connect/github-app.js +129 -0
  184. package/dist/connect/github-app.js.map +1 -0
  185. package/dist/connect/index.js +9 -0
  186. package/dist/connect/index.js.map +1 -0
  187. package/dist/connect/model-choices.js +201 -0
  188. package/dist/connect/model-choices.js.map +1 -0
  189. package/dist/connect/providers.js +900 -0
  190. package/dist/connect/providers.js.map +1 -0
  191. package/dist/connect/readiness.js +232 -0
  192. package/dist/connect/readiness.js.map +1 -0
  193. package/dist/connect/redact.js +16 -0
  194. package/dist/connect/redact.js.map +1 -0
  195. package/dist/connect/registry.js +406 -0
  196. package/dist/connect/registry.js.map +1 -0
  197. package/dist/connect/store.js +283 -0
  198. package/dist/connect/store.js.map +1 -0
  199. package/dist/connect/tunnel.js +134 -0
  200. package/dist/connect/tunnel.js.map +1 -0
  201. package/dist/connect/types.js +8 -0
  202. package/dist/connect/types.js.map +1 -0
  203. package/dist/connections/index.js +5 -0
  204. package/dist/connections/index.js.map +1 -0
  205. package/dist/connections/manager.js +223 -0
  206. package/dist/connections/manager.js.map +1 -0
  207. package/dist/connections/presets.js +264 -0
  208. package/dist/connections/presets.js.map +1 -0
  209. package/dist/connections/store.js +132 -0
  210. package/dist/connections/store.js.map +1 -0
  211. package/dist/connections/tools.js +206 -0
  212. package/dist/connections/tools.js.map +1 -0
  213. package/dist/db-schema.js +355 -0
  214. package/dist/db-schema.js.map +1 -0
  215. package/dist/db.js +379 -0
  216. package/dist/db.js.map +1 -0
  217. package/dist/delivery.js +49 -0
  218. package/dist/delivery.js.map +1 -0
  219. package/dist/deploy-wait.js +701 -0
  220. package/dist/deploy-wait.js.map +1 -0
  221. package/dist/disk.js +243 -0
  222. package/dist/disk.js.map +1 -0
  223. package/dist/dot-health.js +966 -0
  224. package/dist/dot-health.js.map +1 -0
  225. package/dist/dot-remove.js +246 -0
  226. package/dist/dot-remove.js.map +1 -0
  227. package/dist/events.js +38 -0
  228. package/dist/events.js.map +1 -0
  229. package/dist/evidence-pack.js +423 -0
  230. package/dist/evidence-pack.js.map +1 -0
  231. package/dist/flows/answers.js +289 -0
  232. package/dist/flows/answers.js.map +1 -0
  233. package/dist/flows/change.js +811 -0
  234. package/dist/flows/change.js.map +1 -0
  235. package/dist/flows/checkStatus.js +524 -0
  236. package/dist/flows/checkStatus.js.map +1 -0
  237. package/dist/flows/ci.js +236 -0
  238. package/dist/flows/ci.js.map +1 -0
  239. package/dist/flows/ciFailure.js +76 -0
  240. package/dist/flows/ciFailure.js.map +1 -0
  241. package/dist/flows/common.js +522 -0
  242. package/dist/flows/common.js.map +1 -0
  243. package/dist/flows/default-branch.js +29 -0
  244. package/dist/flows/default-branch.js.map +1 -0
  245. package/dist/flows/defectDraft.js +447 -0
  246. package/dist/flows/defectDraft.js.map +1 -0
  247. package/dist/flows/defects.js +623 -0
  248. package/dist/flows/defects.js.map +1 -0
  249. package/dist/flows/digest.js +295 -0
  250. package/dist/flows/digest.js.map +1 -0
  251. package/dist/flows/impact.js +82 -0
  252. package/dist/flows/impact.js.map +1 -0
  253. package/dist/flows/index.js +23 -0
  254. package/dist/flows/index.js.map +1 -0
  255. package/dist/flows/intent-sources.js +72 -0
  256. package/dist/flows/intent-sources.js.map +1 -0
  257. package/dist/flows/mergeCases.js +169 -0
  258. package/dist/flows/mergeCases.js.map +1 -0
  259. package/dist/flows/nightlyRun.js +82 -0
  260. package/dist/flows/nightlyRun.js.map +1 -0
  261. package/dist/flows/outage.js +64 -0
  262. package/dist/flows/outage.js.map +1 -0
  263. package/dist/flows/postMerge.js +5 -0
  264. package/dist/flows/postMerge.js.map +1 -0
  265. package/dist/flows/prCheck.js +5 -0
  266. package/dist/flows/prCheck.js.map +1 -0
  267. package/dist/flows/prTarget.js +66 -0
  268. package/dist/flows/prTarget.js.map +1 -0
  269. package/dist/flows/qa.js +363 -0
  270. package/dist/flows/qa.js.map +1 -0
  271. package/dist/flows/questions.js +160 -0
  272. package/dist/flows/questions.js.map +1 -0
  273. package/dist/flows/recovery.js +64 -0
  274. package/dist/flows/recovery.js.map +1 -0
  275. package/dist/flows/rerun.js +50 -0
  276. package/dist/flows/rerun.js.map +1 -0
  277. package/dist/flows/testDesign.js +294 -0
  278. package/dist/flows/testDesign.js.map +1 -0
  279. package/dist/flows/testDesignJob.js +46 -0
  280. package/dist/flows/testDesignJob.js.map +1 -0
  281. package/dist/flows/testRepo.js +228 -0
  282. package/dist/flows/testRepo.js.map +1 -0
  283. package/dist/flows/testSavings.js +381 -0
  284. package/dist/flows/testSavings.js.map +1 -0
  285. package/dist/flows/testStatus.js +343 -0
  286. package/dist/flows/testStatus.js.map +1 -0
  287. package/dist/flows/ticketContext.js +425 -0
  288. package/dist/flows/ticketContext.js.map +1 -0
  289. package/dist/flows/ticketReview.js +249 -0
  290. package/dist/flows/ticketReview.js.map +1 -0
  291. package/dist/flows/ticks.js +73 -0
  292. package/dist/flows/ticks.js.map +1 -0
  293. package/dist/hive/admin.js +122 -0
  294. package/dist/hive/admin.js.map +1 -0
  295. package/dist/hive/auth.js +130 -0
  296. package/dist/hive/auth.js.map +1 -0
  297. package/dist/hive/billing.js +278 -0
  298. package/dist/hive/billing.js.map +1 -0
  299. package/dist/hive/config.js +63 -0
  300. package/dist/hive/config.js.map +1 -0
  301. package/dist/hive/db.js +186 -0
  302. package/dist/hive/db.js.map +1 -0
  303. package/dist/hive/embed.js +76 -0
  304. package/dist/hive/embed.js.map +1 -0
  305. package/dist/hive/errors.js +17 -0
  306. package/dist/hive/errors.js.map +1 -0
  307. package/dist/hive/google.js +75 -0
  308. package/dist/hive/google.js.map +1 -0
  309. package/dist/hive/index.js +25 -0
  310. package/dist/hive/index.js.map +1 -0
  311. package/dist/hive/jwt.js +57 -0
  312. package/dist/hive/jwt.js.map +1 -0
  313. package/dist/hive/keys.js +61 -0
  314. package/dist/hive/keys.js.map +1 -0
  315. package/dist/hive/mail.js +27 -0
  316. package/dist/hive/mail.js.map +1 -0
  317. package/dist/hive/native-push.js +255 -0
  318. package/dist/hive/native-push.js.map +1 -0
  319. package/dist/hive/pairing.js +342 -0
  320. package/dist/hive/pairing.js.map +1 -0
  321. package/dist/hive/presence.js +121 -0
  322. package/dist/hive/presence.js.map +1 -0
  323. package/dist/hive/push.js +185 -0
  324. package/dist/hive/push.js.map +1 -0
  325. package/dist/hive/relay.js +205 -0
  326. package/dist/hive/relay.js.map +1 -0
  327. package/dist/hive/routes.js +228 -0
  328. package/dist/hive/routes.js.map +1 -0
  329. package/dist/hive/server.js +12 -0
  330. package/dist/hive/server.js.map +1 -0
  331. package/dist/hive/session.js +28 -0
  332. package/dist/hive/session.js.map +1 -0
  333. package/dist/hive/tenants.js +287 -0
  334. package/dist/hive/tenants.js.map +1 -0
  335. package/dist/hive/tunnel/cloudflare.js +160 -0
  336. package/dist/hive/tunnel/cloudflare.js.map +1 -0
  337. package/dist/hive/tunnel/mock.js +52 -0
  338. package/dist/hive/tunnel/mock.js.map +1 -0
  339. package/dist/hive/tunnel/provider.js +19 -0
  340. package/dist/hive/tunnel/provider.js.map +1 -0
  341. package/dist/hive/updates.js +61 -0
  342. package/dist/hive/updates.js.map +1 -0
  343. package/dist/http-error.js +11 -0
  344. package/dist/http-error.js.map +1 -0
  345. package/dist/impact/classify.js +226 -0
  346. package/dist/impact/classify.js.map +1 -0
  347. package/dist/impact/find.js +259 -0
  348. package/dist/impact/find.js.map +1 -0
  349. package/dist/impact/pr.js +54 -0
  350. package/dist/impact/pr.js.map +1 -0
  351. package/dist/impact/store.js +365 -0
  352. package/dist/impact/store.js.map +1 -0
  353. package/dist/impact/text.js +158 -0
  354. package/dist/impact/text.js.map +1 -0
  355. package/dist/index.js +288 -0
  356. package/dist/index.js.map +1 -0
  357. package/dist/integrations/adf.js +397 -0
  358. package/dist/integrations/adf.js.map +1 -0
  359. package/dist/integrations/bot-marker.js +103 -0
  360. package/dist/integrations/bot-marker.js.map +1 -0
  361. package/dist/integrations/github-issues.js +705 -0
  362. package/dist/integrations/github-issues.js.map +1 -0
  363. package/dist/integrations/github.js +1284 -0
  364. package/dist/integrations/github.js.map +1 -0
  365. package/dist/integrations/issue-create.js +60 -0
  366. package/dist/integrations/issue-create.js.map +1 -0
  367. package/dist/integrations/jira.js +279 -0
  368. package/dist/integrations/jira.js.map +1 -0
  369. package/dist/integrations/linear.js +273 -0
  370. package/dist/integrations/linear.js.map +1 -0
  371. package/dist/integrations/own-identity-warm.js +47 -0
  372. package/dist/integrations/own-identity-warm.js.map +1 -0
  373. package/dist/integrations/own-identity.js +39 -0
  374. package/dist/integrations/own-identity.js.map +1 -0
  375. package/dist/integrations/status-change.js +42 -0
  376. package/dist/integrations/status-change.js.map +1 -0
  377. package/dist/lead-defects.js +202 -0
  378. package/dist/lead-defects.js.map +1 -0
  379. package/dist/lead-digest.js +333 -0
  380. package/dist/lead-digest.js.map +1 -0
  381. package/dist/lead-release.js +286 -0
  382. package/dist/lead-release.js.map +1 -0
  383. package/dist/lead.js +328 -0
  384. package/dist/lead.js.map +1 -0
  385. package/dist/legacy-names.js +51 -0
  386. package/dist/legacy-names.js.map +1 -0
  387. package/dist/limits.js +44 -0
  388. package/dist/limits.js.map +1 -0
  389. package/dist/link-trust.js +224 -0
  390. package/dist/link-trust.js.map +1 -0
  391. package/dist/links.js +219 -0
  392. package/dist/links.js.map +1 -0
  393. package/dist/loopback.js +35 -0
  394. package/dist/loopback.js.map +1 -0
  395. package/dist/model-cap.js +60 -0
  396. package/dist/model-cap.js.map +1 -0
  397. package/dist/model-usage.js +173 -0
  398. package/dist/model-usage.js.map +1 -0
  399. package/dist/monitor/backfill.js +39 -0
  400. package/dist/monitor/backfill.js.map +1 -0
  401. package/dist/monitor/browser-probe.js +198 -0
  402. package/dist/monitor/browser-probe.js.map +1 -0
  403. package/dist/monitor/catch-up.js +31 -0
  404. package/dist/monitor/catch-up.js.map +1 -0
  405. package/dist/monitor/pollers.js +1606 -0
  406. package/dist/monitor/pollers.js.map +1 -0
  407. package/dist/monitor/probes.js +178 -0
  408. package/dist/monitor/probes.js.map +1 -0
  409. package/dist/monitor/self-health.js +228 -0
  410. package/dist/monitor/self-health.js.map +1 -0
  411. package/dist/monitor/statuspage.js +105 -0
  412. package/dist/monitor/statuspage.js.map +1 -0
  413. package/dist/nightly-scheduler.js +127 -0
  414. package/dist/nightly-scheduler.js.map +1 -0
  415. package/dist/nightly.js +141 -0
  416. package/dist/nightly.js.map +1 -0
  417. package/dist/notify/headline.js +114 -0
  418. package/dist/notify/headline.js.map +1 -0
  419. package/dist/notify/push.js +174 -0
  420. package/dist/notify/push.js.map +1 -0
  421. package/dist/object-cards.js +585 -0
  422. package/dist/object-cards.js.map +1 -0
  423. package/dist/object-links.js +47 -0
  424. package/dist/object-links.js.map +1 -0
  425. package/dist/onboarding-checks.js +141 -0
  426. package/dist/onboarding-checks.js.map +1 -0
  427. package/dist/onboarding.js +401 -0
  428. package/dist/onboarding.js.map +1 -0
  429. package/dist/path-filters.js +62 -0
  430. package/dist/path-filters.js.map +1 -0
  431. package/dist/phone/alerts.js +67 -0
  432. package/dist/phone/alerts.js.map +1 -0
  433. package/dist/phone/auth.js +240 -0
  434. package/dist/phone/auth.js.map +1 -0
  435. package/dist/phone/pairing.js +442 -0
  436. package/dist/phone/pairing.js.map +1 -0
  437. package/dist/phone/prefs.js +27 -0
  438. package/dist/phone/prefs.js.map +1 -0
  439. package/dist/phone/tailscale.js +161 -0
  440. package/dist/phone/tailscale.js.map +1 -0
  441. package/dist/pr-scope.js +441 -0
  442. package/dist/pr-scope.js.map +1 -0
  443. package/dist/proc.js +156 -0
  444. package/dist/proc.js.map +1 -0
  445. package/dist/profile/cache.js +108 -0
  446. package/dist/profile/cache.js.map +1 -0
  447. package/dist/profile/ci.js +216 -0
  448. package/dist/profile/ci.js.map +1 -0
  449. package/dist/profile/index.js +8 -0
  450. package/dist/profile/index.js.map +1 -0
  451. package/dist/profile/job.js +135 -0
  452. package/dist/profile/job.js.map +1 -0
  453. package/dist/profile/queries/go-tags.scm +47 -0
  454. package/dist/profile/queries/java-tags.scm +25 -0
  455. package/dist/profile/queries/javascript-tags.scm +104 -0
  456. package/dist/profile/queries/python-tags.scm +19 -0
  457. package/dist/profile/queries/typescript-tags.scm +28 -0
  458. package/dist/profile/scan-thread.js +42 -0
  459. package/dist/profile/scan-thread.js.map +1 -0
  460. package/dist/profile/scan-worker.js +16 -0
  461. package/dist/profile/scan-worker.js.map +1 -0
  462. package/dist/profile/scan.js +351 -0
  463. package/dist/profile/scan.js.map +1 -0
  464. package/dist/profile/stack.js +528 -0
  465. package/dist/profile/stack.js.map +1 -0
  466. package/dist/profile/store.js +35 -0
  467. package/dist/profile/store.js.map +1 -0
  468. package/dist/profile/tests.js +399 -0
  469. package/dist/profile/tests.js.map +1 -0
  470. package/dist/queue.js +350 -0
  471. package/dist/queue.js.map +1 -0
  472. package/dist/refs.js +756 -0
  473. package/dist/refs.js.map +1 -0
  474. package/dist/release-notes.js +272 -0
  475. package/dist/release-notes.js.map +1 -0
  476. package/dist/reports/build.js +243 -0
  477. package/dist/reports/build.js.map +1 -0
  478. package/dist/reports/index.js +211 -0
  479. package/dist/reports/index.js.map +1 -0
  480. package/dist/reports/store.js +150 -0
  481. package/dist/reports/store.js.map +1 -0
  482. package/dist/reports/ticket-titles.js +124 -0
  483. package/dist/reports/ticket-titles.js.map +1 -0
  484. package/dist/reports/trace-map.js +1278 -0
  485. package/dist/reports/trace-map.js.map +1 -0
  486. package/dist/reports/traceability.js +422 -0
  487. package/dist/reports/traceability.js.map +1 -0
  488. package/dist/repos/mirror.js +356 -0
  489. package/dist/repos/mirror.js.map +1 -0
  490. package/dist/repos-github.js +108 -0
  491. package/dist/repos-github.js.map +1 -0
  492. package/dist/repos.js +891 -0
  493. package/dist/repos.js.map +1 -0
  494. package/dist/review/backend-anthropic.js +90 -0
  495. package/dist/review/backend-anthropic.js.map +1 -0
  496. package/dist/review/backend-cli.js +248 -0
  497. package/dist/review/backend-cli.js.map +1 -0
  498. package/dist/review/backend-codex.js +81 -0
  499. package/dist/review/backend-codex.js.map +1 -0
  500. package/dist/review/backend-mock.js +686 -0
  501. package/dist/review/backend-mock.js.map +1 -0
  502. package/dist/review/backend-only.js +168 -0
  503. package/dist/review/backend-only.js.map +1 -0
  504. package/dist/review/backend.js +105 -0
  505. package/dist/review/backend.js.map +1 -0
  506. package/dist/review/baseline/render-v1.js +483 -0
  507. package/dist/review/baseline/render-v1.js.map +1 -0
  508. package/dist/review/change-summary.js +197 -0
  509. package/dist/review/change-summary.js.map +1 -0
  510. package/dist/review/changelog.js +40 -0
  511. package/dist/review/changelog.js.map +1 -0
  512. package/dist/review/check.js +494 -0
  513. package/dist/review/check.js.map +1 -0
  514. package/dist/review/checkout.js +185 -0
  515. package/dist/review/checkout.js.map +1 -0
  516. package/dist/review/classify.js +178 -0
  517. package/dist/review/classify.js.map +1 -0
  518. package/dist/review/coverage.js +347 -0
  519. package/dist/review/coverage.js.map +1 -0
  520. package/dist/review/decision-eval.js +121 -0
  521. package/dist/review/decision-eval.js.map +1 -0
  522. package/dist/review/deliver.js +104 -0
  523. package/dist/review/deliver.js.map +1 -0
  524. package/dist/review/designer-eval.js +280 -0
  525. package/dist/review/designer-eval.js.map +1 -0
  526. package/dist/review/dogfood-digest.js +136 -0
  527. package/dist/review/dogfood-digest.js.map +1 -0
  528. package/dist/review/dogfood-eval.js +486 -0
  529. package/dist/review/dogfood-eval.js.map +1 -0
  530. package/dist/review/environment.js +109 -0
  531. package/dist/review/environment.js.map +1 -0
  532. package/dist/review/eval.js +405 -0
  533. package/dist/review/eval.js.map +1 -0
  534. package/dist/review/glob.js +110 -0
  535. package/dist/review/glob.js.map +1 -0
  536. package/dist/review/golden-export.js +219 -0
  537. package/dist/review/golden-export.js.map +1 -0
  538. package/dist/review/impact.js +406 -0
  539. package/dist/review/impact.js.map +1 -0
  540. package/dist/review/imports.js +542 -0
  541. package/dist/review/imports.js.map +1 -0
  542. package/dist/review/index.js +512 -0
  543. package/dist/review/index.js.map +1 -0
  544. package/dist/review/intent.js +128 -0
  545. package/dist/review/intent.js.map +1 -0
  546. package/dist/review/lenses.js +167 -0
  547. package/dist/review/lenses.js.map +1 -0
  548. package/dist/review/linked-tickets.js +293 -0
  549. package/dist/review/linked-tickets.js.map +1 -0
  550. package/dist/review/merge.js +370 -0
  551. package/dist/review/merge.js.map +1 -0
  552. package/dist/review/on-demand.js +218 -0
  553. package/dist/review/on-demand.js.map +1 -0
  554. package/dist/review/prompt-eval.js +299 -0
  555. package/dist/review/prompt-eval.js.map +1 -0
  556. package/dist/review/prompt-variants.js +37 -0
  557. package/dist/review/prompt-variants.js.map +1 -0
  558. package/dist/review/readability-eval.js +217 -0
  559. package/dist/review/readability-eval.js.map +1 -0
  560. package/dist/review/readability.js +295 -0
  561. package/dist/review/readability.js.map +1 -0
  562. package/dist/review/render.js +2409 -0
  563. package/dist/review/render.js.map +1 -0
  564. package/dist/review/repo.js +194 -0
  565. package/dist/review/repo.js.map +1 -0
  566. package/dist/review/report-plan.js +90 -0
  567. package/dist/review/report-plan.js.map +1 -0
  568. package/dist/review/routes.js +195 -0
  569. package/dist/review/routes.js.map +1 -0
  570. package/dist/review/run-summary.js +34 -0
  571. package/dist/review/run-summary.js.map +1 -0
  572. package/dist/review/run.js +245 -0
  573. package/dist/review/run.js.map +1 -0
  574. package/dist/review/scope.js +454 -0
  575. package/dist/review/scope.js.map +1 -0
  576. package/dist/review/security.js +432 -0
  577. package/dist/review/security.js.map +1 -0
  578. package/dist/review/signals.js +550 -0
  579. package/dist/review/signals.js.map +1 -0
  580. package/dist/review/specs.js +150 -0
  581. package/dist/review/specs.js.map +1 -0
  582. package/dist/review/ste.js +133 -0
  583. package/dist/review/ste.js.map +1 -0
  584. package/dist/review/test-repo-file.js +18 -0
  585. package/dist/review/test-repo-file.js.map +1 -0
  586. package/dist/review/test-repo-lines.js +53 -0
  587. package/dist/review/test-repo-lines.js.map +1 -0
  588. package/dist/review/ticket-on-demand.js +232 -0
  589. package/dist/review/ticket-on-demand.js.map +1 -0
  590. package/dist/review/yaml.js +298 -0
  591. package/dist/review/yaml.js.map +1 -0
  592. package/dist/room.js +361 -0
  593. package/dist/room.js.map +1 -0
  594. package/dist/routes/activity.js +219 -0
  595. package/dist/routes/activity.js.map +1 -0
  596. package/dist/routes/call.js +29 -0
  597. package/dist/routes/call.js.map +1 -0
  598. package/dist/routes/cards.js +40 -0
  599. package/dist/routes/cards.js.map +1 -0
  600. package/dist/routes/cases.js +133 -0
  601. package/dist/routes/cases.js.map +1 -0
  602. package/dist/routes/connect.js +268 -0
  603. package/dist/routes/connect.js.map +1 -0
  604. package/dist/routes/connection-presets.js +32 -0
  605. package/dist/routes/connection-presets.js.map +1 -0
  606. package/dist/routes/connections.js +177 -0
  607. package/dist/routes/connections.js.map +1 -0
  608. package/dist/routes/disk.js +19 -0
  609. package/dist/routes/disk.js.map +1 -0
  610. package/dist/routes/docs.js +71 -0
  611. package/dist/routes/docs.js.map +1 -0
  612. package/dist/routes/dot-suggest.js +1002 -0
  613. package/dist/routes/dot-suggest.js.map +1 -0
  614. package/dist/routes/evidence-pack.js +16 -0
  615. package/dist/routes/evidence-pack.js.map +1 -0
  616. package/dist/routes/health.js +121 -0
  617. package/dist/routes/health.js.map +1 -0
  618. package/dist/routes/impact.js +48 -0
  619. package/dist/routes/impact.js.map +1 -0
  620. package/dist/routes/lead.js +50 -0
  621. package/dist/routes/lead.js.map +1 -0
  622. package/dist/routes/links.js +13 -0
  623. package/dist/routes/links.js.map +1 -0
  624. package/dist/routes/markdown.js +62 -0
  625. package/dist/routes/markdown.js.map +1 -0
  626. package/dist/routes/onboarding.js +47 -0
  627. package/dist/routes/onboarding.js.map +1 -0
  628. package/dist/routes/phone.js +231 -0
  629. package/dist/routes/phone.js.map +1 -0
  630. package/dist/routes/release-notes.js +30 -0
  631. package/dist/routes/release-notes.js.map +1 -0
  632. package/dist/routes/reports.js +102 -0
  633. package/dist/routes/reports.js.map +1 -0
  634. package/dist/routes/repos.js +91 -0
  635. package/dist/routes/repos.js.map +1 -0
  636. package/dist/routes/review.js +283 -0
  637. package/dist/routes/review.js.map +1 -0
  638. package/dist/routes/roles.js +114 -0
  639. package/dist/routes/roles.js.map +1 -0
  640. package/dist/routes/room.js +21 -0
  641. package/dist/routes/room.js.map +1 -0
  642. package/dist/routes/runner.js +156 -0
  643. package/dist/routes/runner.js.map +1 -0
  644. package/dist/routes/runs.js +84 -0
  645. package/dist/routes/runs.js.map +1 -0
  646. package/dist/routes/setup.js +18 -0
  647. package/dist/routes/setup.js.map +1 -0
  648. package/dist/routes/test-runs.js +220 -0
  649. package/dist/routes/test-runs.js.map +1 -0
  650. package/dist/routes/ticket-status.js +17 -0
  651. package/dist/routes/ticket-status.js.map +1 -0
  652. package/dist/routes/traceability.js +143 -0
  653. package/dist/routes/traceability.js.map +1 -0
  654. package/dist/routes/true.js +142 -0
  655. package/dist/routes/true.js.map +1 -0
  656. package/dist/routes/updates.js +70 -0
  657. package/dist/routes/updates.js.map +1 -0
  658. package/dist/runner/adapters/index.js +12 -0
  659. package/dist/runner/adapters/index.js.map +1 -0
  660. package/dist/runner/adapters/playwright.js +68 -0
  661. package/dist/runner/adapters/playwright.js.map +1 -0
  662. package/dist/runner/aivision/cases.js +172 -0
  663. package/dist/runner/aivision/cases.js.map +1 -0
  664. package/dist/runner/aivision/cli.js +201 -0
  665. package/dist/runner/aivision/cli.js.map +1 -0
  666. package/dist/runner/aivision/index.js +281 -0
  667. package/dist/runner/aivision/index.js.map +1 -0
  668. package/dist/runner/aivision/server.js +394 -0
  669. package/dist/runner/aivision/server.js.map +1 -0
  670. package/dist/runner/aivision/shared.js +140 -0
  671. package/dist/runner/aivision/shared.js.map +1 -0
  672. package/dist/runner/artifact-cap.js +189 -0
  673. package/dist/runner/artifact-cap.js.map +1 -0
  674. package/dist/runner/artifacts.js +433 -0
  675. package/dist/runner/artifacts.js.map +1 -0
  676. package/dist/runner/command.js +564 -0
  677. package/dist/runner/command.js.map +1 -0
  678. package/dist/runner/copyfiles.js +221 -0
  679. package/dist/runner/copyfiles.js.map +1 -0
  680. package/dist/runner/engines.js +32 -0
  681. package/dist/runner/engines.js.map +1 -0
  682. package/dist/runner/evidence.js +114 -0
  683. package/dist/runner/evidence.js.map +1 -0
  684. package/dist/runner/host-env.js +160 -0
  685. package/dist/runner/host-env.js.map +1 -0
  686. package/dist/runner/index.js +1221 -0
  687. package/dist/runner/index.js.map +1 -0
  688. package/dist/runner/observe.js +603 -0
  689. package/dist/runner/observe.js.map +1 -0
  690. package/dist/runner/playwright-json.js +108 -0
  691. package/dist/runner/playwright-json.js.map +1 -0
  692. package/dist/runner/pwgen/exec.js +192 -0
  693. package/dist/runner/pwgen/exec.js.map +1 -0
  694. package/dist/runner/pwgen/explore.js +111 -0
  695. package/dist/runner/pwgen/explore.js.map +1 -0
  696. package/dist/runner/pwgen/index.js +423 -0
  697. package/dist/runner/pwgen/index.js.map +1 -0
  698. package/dist/runner/pwgen/propose.js +69 -0
  699. package/dist/runner/pwgen/propose.js.map +1 -0
  700. package/dist/runner/pwgen/source.js +632 -0
  701. package/dist/runner/pwgen/source.js.map +1 -0
  702. package/dist/runner/setup.js +222 -0
  703. package/dist/runner/setup.js.map +1 -0
  704. package/dist/runner/step-reporter.js +107 -0
  705. package/dist/runner/step-reporter.js.map +1 -0
  706. package/dist/runner/test-repo.js +326 -0
  707. package/dist/runner/test-repo.js.map +1 -0
  708. package/dist/runner/typed-value.js +46 -0
  709. package/dist/runner/typed-value.js.map +1 -0
  710. package/dist/runner/verify.js +133 -0
  711. package/dist/runner/verify.js.map +1 -0
  712. package/dist/runner/worktree.js +349 -0
  713. package/dist/runner/worktree.js.map +1 -0
  714. package/dist/sandbox.js +61 -0
  715. package/dist/sandbox.js.map +1 -0
  716. package/dist/server.js +262 -0
  717. package/dist/server.js.map +1 -0
  718. package/dist/shadow-week.js +126 -0
  719. package/dist/shadow-week.js.map +1 -0
  720. package/dist/shutdown.js +92 -0
  721. package/dist/shutdown.js.map +1 -0
  722. package/dist/slack/index.js +645 -0
  723. package/dist/slack/index.js.map +1 -0
  724. package/dist/stages/config.js +147 -0
  725. package/dist/stages/config.js.map +1 -0
  726. package/dist/stages/index.js +41 -0
  727. package/dist/stages/index.js.map +1 -0
  728. package/dist/suites.js +293 -0
  729. package/dist/suites.js.map +1 -0
  730. package/dist/target-url.js +116 -0
  731. package/dist/target-url.js.map +1 -0
  732. package/dist/test-runs.js +662 -0
  733. package/dist/test-runs.js.map +1 -0
  734. package/dist/ticket-keys.js +97 -0
  735. package/dist/ticket-keys.js.map +1 -0
  736. package/dist/ticket-supersede.js +105 -0
  737. package/dist/ticket-supersede.js.map +1 -0
  738. package/dist/tinybee/ed25519.js +99 -0
  739. package/dist/tinybee/ed25519.js.map +1 -0
  740. package/dist/tinybee/models-routes.js +19 -0
  741. package/dist/tinybee/models-routes.js.map +1 -0
  742. package/dist/tinybee/pair-payload.js +41 -0
  743. package/dist/tinybee/pair-payload.js.map +1 -0
  744. package/dist/tinybee/update-manifest.js +77 -0
  745. package/dist/tinybee/update-manifest.js.map +1 -0
  746. package/dist/tinybee/well-known.js +64 -0
  747. package/dist/tinybee/well-known.js.map +1 -0
  748. package/dist/tinybee/workflows/activity.js +23 -0
  749. package/dist/tinybee/workflows/activity.js.map +1 -0
  750. package/dist/tinybee/workflows/cron.js +210 -0
  751. package/dist/tinybee/workflows/cron.js.map +1 -0
  752. package/dist/tinybee/workflows/engine.js +371 -0
  753. package/dist/tinybee/workflows/engine.js.map +1 -0
  754. package/dist/tinybee/workflows/from-text.js +203 -0
  755. package/dist/tinybee/workflows/from-text.js.map +1 -0
  756. package/dist/tinybee/workflows/routes.js +189 -0
  757. package/dist/tinybee/workflows/routes.js.map +1 -0
  758. package/dist/tinybee/workflows/scheduler.js +100 -0
  759. package/dist/tinybee/workflows/scheduler.js.map +1 -0
  760. package/dist/tinybee/workflows/skills.js +227 -0
  761. package/dist/tinybee/workflows/skills.js.map +1 -0
  762. package/dist/tinybee/workflows/store.js +205 -0
  763. package/dist/tinybee/workflows/store.js.map +1 -0
  764. package/dist/tinybee/workflows/types.js +180 -0
  765. package/dist/tinybee/workflows/types.js.map +1 -0
  766. package/dist/tinybee/workflows/yaml.js +323 -0
  767. package/dist/tinybee/workflows/yaml.js.map +1 -0
  768. package/dist/true/api.js +495 -0
  769. package/dist/true/api.js.map +1 -0
  770. package/dist/true/client.js +292 -0
  771. package/dist/true/client.js.map +1 -0
  772. package/dist/true/clock.js +36 -0
  773. package/dist/true/clock.js.map +1 -0
  774. package/dist/true/events.js +125 -0
  775. package/dist/true/events.js.map +1 -0
  776. package/dist/true/hosts.js +98 -0
  777. package/dist/true/hosts.js.map +1 -0
  778. package/dist/true/index.js +29 -0
  779. package/dist/true/index.js.map +1 -0
  780. package/dist/true/key.js +54 -0
  781. package/dist/true/key.js.map +1 -0
  782. package/dist/true/line.js +69 -0
  783. package/dist/true/line.js.map +1 -0
  784. package/dist/true/mask.js +31 -0
  785. package/dist/true/mask.js.map +1 -0
  786. package/dist/true/names.js +114 -0
  787. package/dist/true/names.js.map +1 -0
  788. package/dist/true/outbox.js +233 -0
  789. package/dist/true/outbox.js.map +1 -0
  790. package/dist/true/replay.js +164 -0
  791. package/dist/true/replay.js.map +1 -0
  792. package/dist/true/settings.js +123 -0
  793. package/dist/true/settings.js.map +1 -0
  794. package/dist/true/status.js +189 -0
  795. package/dist/true/status.js.map +1 -0
  796. package/dist/true/sync-cases.js +222 -0
  797. package/dist/true/sync-cases.js.map +1 -0
  798. package/dist/true/sync-manual.js +295 -0
  799. package/dist/true/sync-manual.js.map +1 -0
  800. package/dist/true/sync-runs.js +109 -0
  801. package/dist/true/sync-runs.js.map +1 -0
  802. package/dist/true/worker.js +414 -0
  803. package/dist/true/worker.js.map +1 -0
  804. package/dist/types.js +32 -0
  805. package/dist/types.js.map +1 -0
  806. package/dist/updates/asks.js +38 -0
  807. package/dist/updates/asks.js.map +1 -0
  808. package/dist/updates/index.js +835 -0
  809. package/dist/updates/index.js.map +1 -0
  810. package/dist/updates/owner.js +24 -0
  811. package/dist/updates/owner.js.map +1 -0
  812. package/dist/updates/prefs.js +118 -0
  813. package/dist/updates/prefs.js.map +1 -0
  814. package/dist/updates/route.js +78 -0
  815. package/dist/updates/route.js.map +1 -0
  816. package/dist/updates/sources.js +345 -0
  817. package/dist/updates/sources.js.map +1 -0
  818. package/dist/updates/words.js +452 -0
  819. package/dist/updates/words.js.map +1 -0
  820. package/dist/version.js +53 -0
  821. package/dist/version.js.map +1 -0
  822. package/dist/view-compute.js +382 -0
  823. package/dist/view-compute.js.map +1 -0
  824. package/dist/view-spec.js +894 -0
  825. package/dist/view-spec.js.map +1 -0
  826. package/dist/web/apple-touch-icon.png +0 -0
  827. package/dist/web/assets/ApprovalCard-Br_z5z7G.css +1 -0
  828. package/dist/web/assets/ApprovalCard-CfGhGFo_.js +3 -0
  829. package/dist/web/assets/CardFromRef-BaTGmZ9c.js +2 -0
  830. package/dist/web/assets/CardFromRef-DO7i2uDd.css +1 -0
  831. package/dist/web/assets/Cases-8l_6UcLh.js +2 -0
  832. package/dist/web/assets/Cases-CpfED0uB.css +1 -0
  833. package/dist/web/assets/Chat-BKDiR0qt.js +3 -0
  834. package/dist/web/assets/Chat-DxjdyYUu.css +1 -0
  835. package/dist/web/assets/ConfirmDialog-CIMveD-b.js +2 -0
  836. package/dist/web/assets/ConnectSheet-Cm5vbZdR.js +4 -0
  837. package/dist/web/assets/Docs-HKGuY0WE.js +2 -0
  838. package/dist/web/assets/Docs-fodKx8S7.css +1 -0
  839. package/dist/web/assets/DotDetail-DskS3NWe.js +2 -0
  840. package/dist/web/assets/DotDetail-OWRSD_1x.css +1 -0
  841. package/dist/web/assets/DotStage-BZDclfzV.css +1 -0
  842. package/dist/web/assets/DotStage-CtMNzCN3.js +2 -0
  843. package/dist/web/assets/Dots-BqCsS34m.js +2 -0
  844. package/dist/web/assets/EvidencePack-DQ3kCJX4.js +2 -0
  845. package/dist/web/assets/EvidencePack-DV_9ETsA.css +1 -0
  846. package/dist/web/assets/FailedDeliveries-1F2kFcs9.js +2 -0
  847. package/dist/web/assets/FailedDeliveries-DXa2_VvI.css +1 -0
  848. package/dist/web/assets/Feed-5wiHRTFK.js +2 -0
  849. package/dist/web/assets/GfmView-C-NYaduC.js +4 -0
  850. package/dist/web/assets/ImpactList-C-RNuDB0.js +2 -0
  851. package/dist/web/assets/ImpactList-C612dFdw.css +1 -0
  852. package/dist/web/assets/Inbox-kc1bKVL_.js +2 -0
  853. package/dist/web/assets/JoinScreen-C3L4wmP3.js +2 -0
  854. package/dist/web/assets/JoinScreen-COeAUv5v.css +1 -0
  855. package/dist/web/assets/LeadDialog-N3Zul9Rw.js +8 -0
  856. package/dist/web/assets/LeadDialog-xyWjAuAS.css +1 -0
  857. package/dist/web/assets/ListeningLine-BRFNaczY.js +2 -0
  858. package/dist/web/assets/ListeningLine-pN8CgyiK.css +1 -0
  859. package/dist/web/assets/Mascots-pIyGpxtD.js +2 -0
  860. package/dist/web/assets/ModelChoices-BxO1zyyr.js +2 -0
  861. package/dist/web/assets/ModelChoices-DQJnVxfs.css +1 -0
  862. package/dist/web/assets/NewDotDialog-CDPUWmgN.js +2 -0
  863. package/dist/web/assets/NewDotDialog-DrPPqkSZ.css +1 -0
  864. package/dist/web/assets/NewTestRunDialog-BQBthVHE.js +2 -0
  865. package/dist/web/assets/NoBreakNames-Csxdqdt6.js +2 -0
  866. package/dist/web/assets/Pair-omex_K7H.js +2 -0
  867. package/dist/web/assets/PushSection-CmqHlE_2.js +2 -0
  868. package/dist/web/assets/ReleaseNotes-B6VqFewP.js +2 -0
  869. package/dist/web/assets/ReleaseNotes-DBJUL7Vm.css +1 -0
  870. package/dist/web/assets/ReportPage-BHS1xWEt.js +162 -0
  871. package/dist/web/assets/Reports-BEHnDIb1.js +2 -0
  872. package/dist/web/assets/ReviewChangeDialog-BVSt-cw-.js +2 -0
  873. package/dist/web/assets/ReviewChangeDialog-BbIlHRx0.css +1 -0
  874. package/dist/web/assets/Room-BoG_uge4.js +2 -0
  875. package/dist/web/assets/Room-evAfiW_e.css +1 -0
  876. package/dist/web/assets/RunActions-ZY7yf1AF.js +2 -0
  877. package/dist/web/assets/RunDetail-C8St20GQ.css +1 -0
  878. package/dist/web/assets/RunDetail-qADXjBvd.js +9 -0
  879. package/dist/web/assets/RunRow-BKEJv8ib.js +2 -0
  880. package/dist/web/assets/RunnerTry-Dgpp67-s.js +6 -0
  881. package/dist/web/assets/RunnerTry-DsweWOfO.css +1 -0
  882. package/dist/web/assets/Settings-fs-QJwNM.js +2 -0
  883. package/dist/web/assets/Setup-DI6hBEP-.js +2 -0
  884. package/dist/web/assets/TestRows-wh03T5Li.js +4 -0
  885. package/dist/web/assets/TestRun-DTOyF-Pv.js +2 -0
  886. package/dist/web/assets/TestRuns-ggDjm1Q8.js +2 -0
  887. package/dist/web/assets/TinyBeeAddLaptop-bc3pmh3T.js +2 -0
  888. package/dist/web/assets/TinyBeeAi-CkyOzhm5.js +2 -0
  889. package/dist/web/assets/TinyBeeConnections-B2K_P38u.js +2 -0
  890. package/dist/web/assets/TinyBeeHome-DSpxX5KS.js +3 -0
  891. package/dist/web/assets/TinyBeePlan-BamiLziu.js +2 -0
  892. package/dist/web/assets/TinyBeeSignup-vHcz0Wen.js +2 -0
  893. package/dist/web/assets/TinyBeeSkills-By9RLUse.js +2 -0
  894. package/dist/web/assets/TinyBeeWorkflow-DeNO7Jsh.js +2 -0
  895. package/dist/web/assets/TinyBeeWorkflowEditor-B6OGC2OT.js +2 -0
  896. package/dist/web/assets/TinyBeeWorkflows-BN4-h6lt.js +2 -0
  897. package/dist/web/assets/Trace-BBCI1aIB.css +1 -0
  898. package/dist/web/assets/Trace-aF92UWaH.js +2 -0
  899. package/dist/web/assets/UpdatesSection-CCWEbkue.js +2 -0
  900. package/dist/web/assets/Welcome-CCcy558Q.js +2 -0
  901. package/dist/web/assets/activity-C3qilrDm.css +1 -0
  902. package/dist/web/assets/activity-CBfTSxqw.js +2 -0
  903. package/dist/web/assets/authedMedia-BTYt_tyu.js +2 -0
  904. package/dist/web/assets/beeApi-BHW8Tx1s.js +2 -0
  905. package/dist/web/assets/data-CmXvx3Mj.js +2 -0
  906. package/dist/web/assets/engines-CfdJODFj.css +1 -0
  907. package/dist/web/assets/format-BBZ8vFyT.js +2 -0
  908. package/dist/web/assets/forms-Coc7p2UF.css +1 -0
  909. package/dist/web/assets/hivePush-DZJDokj7.js +2 -0
  910. package/dist/web/assets/impactModel-MY1OFuiP.js +2 -0
  911. package/dist/web/assets/index-B6qKm1NW.js +13 -0
  912. package/dist/web/assets/index-BvKyT1X7.css +1 -0
  913. package/dist/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  914. package/dist/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  915. package/dist/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  916. package/dist/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  917. package/dist/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  918. package/dist/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  919. package/dist/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  920. package/dist/web/assets/lead-BL_P_kri.css +1 -0
  921. package/dist/web/assets/model-BIQy5IVG.js +2 -0
  922. package/dist/web/assets/modelsApi-PUSySRQw.js +2 -0
  923. package/dist/web/assets/newDotModel-BaLLyw57.js +2 -0
  924. package/dist/web/assets/onboarding-bfKqnM4Z.css +1 -0
  925. package/dist/web/assets/phone-Rs7FoyG0.css +1 -0
  926. package/dist/web/assets/phoneApi-BG_1-M-D.js +3 -0
  927. package/dist/web/assets/releaseModel-EynYMVOC.js +2 -0
  928. package/dist/web/assets/releaseNotesModel-A1Rtv3cV.js +2 -0
  929. package/dist/web/assets/reports-BWaA1HhM.js +37 -0
  930. package/dist/web/assets/reports-DXwdWQsB.css +1 -0
  931. package/dist/web/assets/router-W6nZsQ33.js +2 -0
  932. package/dist/web/assets/runs-BY0Owv93.css +1 -0
  933. package/dist/web/assets/shadowWeekModel-BUUiww09.js +2 -0
  934. package/dist/web/assets/storage-yvL36AWt.js +2 -0
  935. package/dist/web/assets/store-IqrqHuFR.js +2 -0
  936. package/dist/web/assets/testruns-BzIZ0cR0.css +1 -0
  937. package/dist/web/assets/testruns-DyaqX4ji.js +2 -0
  938. package/dist/web/assets/true-9Q68cs5b.js +2 -0
  939. package/dist/web/assets/true-DPGBpoir.css +1 -0
  940. package/dist/web/assets/ui-DcmhYyYp.js +13 -0
  941. package/dist/web/assets/ui-DxEDgbIx.css +1 -0
  942. package/dist/web/assets/usePauseDot-BV60ZVy1.js +2 -0
  943. package/dist/web/assets/usePauseDot-NrSzMI1C.css +1 -0
  944. package/dist/web/assets/usePush-Dsm-TjlG.js +2 -0
  945. package/dist/web/assets/useRefChips-CbafNx59.js +68 -0
  946. package/dist/web/assets/useRestoreDot-D0B6W82H.js +2 -0
  947. package/dist/web/assets/view-worker-pyeVAhUT.js +2 -0
  948. package/dist/web/assets/workflowUi-QYsd3n9J.js +2 -0
  949. package/dist/web/favicon.png +0 -0
  950. package/dist/web/icon-192.png +0 -0
  951. package/dist/web/icon-512.png +0 -0
  952. package/dist/web/icon-maskable-512.png +0 -0
  953. package/dist/web/index.html +45 -0
  954. package/dist/web/manifest.webmanifest +23 -0
  955. package/dist/web/mascots/argus-attention.svg +7 -0
  956. package/dist/web/mascots/argus-ok.svg +7 -0
  957. package/dist/web/mascots/argus-outage.svg +7 -0
  958. package/dist/web/mascots/argus-running.svg +7 -0
  959. package/dist/web/mascots/bolt-attention.svg +7 -0
  960. package/dist/web/mascots/bolt-ok.svg +7 -0
  961. package/dist/web/mascots/bolt-outage.svg +7 -0
  962. package/dist/web/mascots/bolt-running.svg +7 -0
  963. package/dist/web/mascots/echo-attention.svg +7 -0
  964. package/dist/web/mascots/echo-ok.svg +7 -0
  965. package/dist/web/mascots/echo-outage.svg +7 -0
  966. package/dist/web/mascots/echo-running.svg +7 -0
  967. package/dist/web/mascots/lens-attention.svg +7 -0
  968. package/dist/web/mascots/lens-ok.svg +7 -0
  969. package/dist/web/mascots/lens-outage.svg +7 -0
  970. package/dist/web/mascots/lens-running.svg +7 -0
  971. package/dist/web/mascots/moss-attention.svg +7 -0
  972. package/dist/web/mascots/moss-ok.svg +7 -0
  973. package/dist/web/mascots/moss-outage.svg +7 -0
  974. package/dist/web/mascots/moss-running.svg +7 -0
  975. package/dist/web/mascots/nit-attention.svg +7 -0
  976. package/dist/web/mascots/nit-ok.svg +7 -0
  977. package/dist/web/mascots/nit-outage.svg +7 -0
  978. package/dist/web/mascots/nit-running.svg +7 -0
  979. package/dist/web/mascots/nova-attention.svg +7 -0
  980. package/dist/web/mascots/nova-ok.svg +7 -0
  981. package/dist/web/mascots/nova-outage.svg +7 -0
  982. package/dist/web/mascots/nova-running.svg +7 -0
  983. package/dist/web/mascots/penn-attention.svg +7 -0
  984. package/dist/web/mascots/penn-ok.svg +7 -0
  985. package/dist/web/mascots/penn-outage.svg +7 -0
  986. package/dist/web/mascots/penn-running.svg +7 -0
  987. package/dist/web/mascots/pip-attention.svg +7 -0
  988. package/dist/web/mascots/pip-ok.svg +7 -0
  989. package/dist/web/mascots/pip-outage.svg +7 -0
  990. package/dist/web/mascots/pip-running.svg +7 -0
  991. package/dist/web/mascots/ward-attention.svg +7 -0
  992. package/dist/web/mascots/ward-ok.svg +7 -0
  993. package/dist/web/mascots/ward-outage.svg +7 -0
  994. package/dist/web/mascots/ward-running.svg +7 -0
  995. package/dist/web/sw.js +98 -0
  996. package/dist/webhook-seen.js +53 -0
  997. package/dist/webhook-seen.js.map +1 -0
  998. package/dist/webhooks.js +625 -0
  999. package/dist/webhooks.js.map +1 -0
  1000. package/dist/zip.js +63 -0
  1001. package/dist/zip.js.map +1 -0
  1002. package/docs/API-V2.md +532 -0
  1003. package/docs/CHAT-EVAL.md +130 -0
  1004. package/docs/CHAT-UI.md +416 -0
  1005. package/docs/CONNECTIONS.md +89 -0
  1006. package/docs/DATA-MODEL.md +518 -0
  1007. package/docs/DEPLOY.md +577 -0
  1008. package/docs/DOGFOOD-LEDGER.md +81 -0
  1009. package/docs/GITHUB.md +148 -0
  1010. package/docs/INTEGRATION-MODEL.md +200 -0
  1011. package/docs/LEAD-DOT.md +553 -0
  1012. package/docs/LIST-PATTERNS.md +52 -0
  1013. package/docs/MULTI-REPO.md +766 -0
  1014. package/docs/PARITY.md +276 -0
  1015. package/docs/PR-REVIEW-QA.md +1266 -0
  1016. package/docs/PR-REVIEW.md +357 -0
  1017. package/docs/SANDBOX.md +320 -0
  1018. package/docs/SETUP.md +776 -0
  1019. package/docs/SLACK.md +80 -0
  1020. package/docs/STAGES.md +619 -0
  1021. package/docs/TRACE-MAP.md +89 -0
  1022. package/docs/TRACKERS.md +225 -0
  1023. package/docs/VOICE.md +36 -0
  1024. package/docs/tinybee/00-README.md +45 -0
  1025. package/docs/tinybee/01-PRD.md +216 -0
  1026. package/docs/tinybee/02-architecture-pairing.md +199 -0
  1027. package/docs/tinybee/03-local-agent.md +222 -0
  1028. package/docs/tinybee/04-local-setup-ui.md +128 -0
  1029. package/docs/tinybee/05-mobile-app-ux.md +199 -0
  1030. package/docs/tinybee/06-environments-and-delivery.md +148 -0
  1031. package/docs/tinybee/07-coding-agent-handoff.md +116 -0
  1032. package/docs/tinybee/OPEN-QUESTIONS.md +26 -0
  1033. package/docs/tinybee/PROGRESS.md +134 -0
  1034. package/package.json +111 -4
@@ -0,0 +1,357 @@
1
+ # PR review
2
+
3
+ The PR review reads a change the way a QA engineer would before it ships: what could break for users, which tests to run, and which tests the change puts at risk. It runs on every PR check (opened, new commits, reopened) and every post-merge check of a dot that watches a repo. The design, prompts, schemas, and evals are in [PR-REVIEW-QA.md](PR-REVIEW-QA.md). This page covers what you see and what you can configure.
4
+
5
+ ## What the review contains
6
+
7
+ The review appears in three places: one sticky comment on the PR, the check result, and the run page in the app.
8
+
9
+ ### Sticky comment
10
+
11
+ localdost keeps one comment per PR and edits it on each new commit. The comment is written for a manual tester, in plain words (KAT-376). It reports results and never gives merge advice: the team decides the merge. From the top:
12
+
13
+ 1. **The first line**, in bold, says what happened and whether anything blocks: `localdost: nothing blocks this PR. 2 things need a person to try.` A failed test says `the check failed. 1 test failed.`; a failure the verdict blames on the test or its setup adds that localdost reads it that way and not as a bug in the PR.
14
+ 2. **One line of counts**, in plain words: `1 automated test passed (the home page loads). No automated test covers Search yet.` The counts appear here once. The words in brackets are what the test checked, left out when the test's name holds a tool word such as smoke or spec. A skipped test did not run, so it is never counted as ran: `85 automated tests ran and passed. 53 were skipped (they do not apply to this project).` With a failure the line is `3 automated tests ran: 2 passed, 1 failed.` followed by the skipped sentence, and a run where every test was skipped says `All 53 automated tests were skipped (they do not apply to this project).` The line of a Tests repo keeps the rule: `Ran 85 tests from e2e: 85 passed. 53 were skipped (they do not apply to this project).`, and the shared build note shows only when a test ran. Details under What I tested repeats it (`Ran 85 selected tests: 85 passed, 0 failed. 53 were skipped (...)`). The consistency check that runs before a report is drafted reads these numbers back: a text that says more tests ran than passed, failed and flaky tests add up to, a different skipped count, or a line that lists skipped tests under a ran count holds the draft, a sentence in the dot's own notes that gives a test count is left out of the report because the counts come from the run, and the facts the safety reviewer reads say that a skipped test did not run (KAT-402). Tests of the PR's own CI show as `The build ran 12 tests: 12 passed.`
15
+ 3. **Areas**, only when the change touches two or more: **What this change does** (2 or 3 sentences, no file names) and a table with each area's size and risk. A change in one area explains itself in Details. See [Change summary](#change-summary).
16
+ 4. **Bugs found**: each bug in one line, then what was expected, what happened, how often it failed (`Failed 3 of 3 times.`), and what became of its bug report. A bug is a test that failed or a risk that a failing check reproduced. Each bug is also drafted as a defect, see [Defects](#defects). Steps and evidence are in Details.
17
+ 5. **Questions for the team** and **Behavior changes to confirm**, when a finding has no concrete expected result or the PR description, a linked ticket or the docs say the change does it on purpose. A question that goes to a linked ticket as a draft comment is asked once per PR and set of questions, so a push that changes nothing about them draws no second draft; a PR is its repo plus its number, so PR 12 of one repo of a dot and PR 12 of another repo each ask (KAT-400).
18
+ 6. **Please try by hand**: a task list. Each item is something a person tries, with its steps, its test data and its expected result under it. A risk the review could not confirm, or one that no check with steps covers, is an item too, worded from the PR description, a linked ticket or the docs when they say the change does it on purpose (`If users should see something else here, this is a bug.`). A check with no steps and no expected result, and an automated test that did not run, are no tasks for a tester: they are listed in Details.
19
+ 7. **Tests to update**: specs that a ticket of the PR changes and the PR leaves alone, as tick items for the author. An item names the test and links it when the repo is known; the file path is in Details.
20
+ 8. **Who ticks** (the PR author or QA, anyone with write access), then the footer: `Open the full check` when the server has a public address, and how to check again. `Reply /localdost review to check again` shows only on a server that GitHub has sent a signed event to; a server that only polls says `Push a new commit to check again.`
21
+ 9. **Details for developers**, collapsed: bugs with steps and evidence, risks, what ran (the selected run and the `Tests in CI: 12 passed (job unit) on 7c6d5e4.` line, see [CI results](#ci-results)), open checks that are no task for a tester, suggestions (test gaps to close and tests the change may break), the changelog note, the test notes from the model, the change summary, risk ids with why and user impact, check ids with steps, expected results, test data and where to start, impact areas and test gaps, the regression scope, the head commit, coverage, what the verifier did, the engines and timings, confidence, and release-note impact.
22
+
23
+ When a repo has a `CHANGELOG.md` and the change touches `src/` or `client/` (tests excluded) without adding a line under Unreleased, Details carries a **Note** that says so. It is a note, not a task item and not a bug, and it does not count as an untested check.
24
+
25
+ A comment for a run with no QA review has the same layout with the verdict's test ideas as the things to try by hand. Each idea is a tick item with a hidden id, so its tick carries over, and the comment says who ticks. A failure found only by reading the code says `the check failed. 1 bug found by reading the code.`
26
+
27
+ When a new push arrives, the comment becomes `This report is out of date. localdost is checking your latest push now.`, then what to do if no new report appears within 15 minutes, and the old report folds under `Earlier report, for the previous push`. Ticks in the old report carry over to the new one.
28
+
29
+ Sentences stay under 20 words in active voice, and ids, shas, file paths, scope and verifier counts stay inside Details. Risks below the display threshold are counted in Details. When the comment would pass GitHub's size limit, Details parts drop from the end first.
30
+
31
+ A review is **incomplete** when the reviewer could not see every changed range, for example when GitHub sent no patch for a file. Details names the reason.
32
+
33
+ The Inbox, the run page, and report pages render the comment as GitHub does: task lists, tables, details and summary, code, and links. When the dot's GitHub connection works, the preview is GitHub's own HTML (`POST /markdown`, mode `gfm`, the repo as context), cached by content hash. Otherwise a local sanitised renderer shows it. **Show Markdown** shows the raw text. localdost markers (`<!-- localdost:... -->`) never show.
34
+
35
+ ### Change summary
36
+
37
+ A QA engineer reads the change summary instead of every diff (KAT-144). The reviewer writes **What this change does** under ASD-STE100 rules (Simplified Technical English), which the review prompt carries as a rule block:
38
+
39
+ - 2 or 3 sentences. A description has at most 25 words, and an instruction has at most 20 words and starts with the verb.
40
+ - Active voice, one word for one meaning, and everyday words. A list of banned words with their plain replacements (`utilize`, `leverage`, `refactor`, `functionality` and others) lives in `src/review/ste.ts`.
41
+ - No file names, paths, function names, ids or line numbers.
42
+
43
+ The answer check sends a broken rule back to the reviewer. If the text still breaks a rule, localdost keeps only the sentences that pass. When fewer than two pass, or no model ran, a template writes the text from the areas, so the summary is never empty.
44
+
45
+ The areas and their numbers do not come from the model. Every changed file goes into exactly one area: the review's strongest impact area that lists it (owner map areas from `.localdost/review.yml` included), else a path group (Documentation, Automated tests, Build and setup, Other code).
46
+
47
+ | Field | Rule |
48
+ |---|---|
49
+ | Size | Small: under 50 changed lines and at most 3 files. Large: 400 lines or more, or 15 files or more. Medium: the rest. Lock files and build output do not count. |
50
+ | Risk | High when the area has a critical or high risk the verifier did not refute; medium for a medium risk; low otherwise. A large area with no risk found is medium. |
51
+
52
+ The same summary leads the run page and the PR comment. When a new commit makes the comment stale, the stale notice moves to the top with the earlier test result.
53
+
54
+ ### Defects
55
+
56
+ Every bug becomes one `file_defect` action: a Bug in the dot's Jira project, an issue in its Linear team, or a GitHub issue on the repo when the dot has no tracker. The default rule for **File defects** is **Ask**, so each draft waits in the Inbox with its steps, expected and actual results, and evidence. A bug is drafted once per PR: later pushes link the same draft or the filed issue, and a rejected draft is not drafted again. A test that failed on every retry in a product failure drafts an `issue_create` instead (rule **Create issues**, default Ask) with a signature marker, and a repeat of the same failure becomes a comment on the open issue. See [TRACKERS.md](TRACKERS.md#defects-filed-as-issues).
57
+
58
+ A risk that no test reproduced is not a bug, but it is still filed when the reviewer can point at the code: one cited file and line, and one input that breaks it, such as "a cart with two items and the coupon SAVE10 entered twice". That draft is labelled **found by reading the code**. The label shows on the Inbox card, in the report ("Found by reading the code, not reproduced (lower confidence)"), in the draft body next to the file and line and the failing input, and as a label on the tracker issue. Confidence is lower than for a failing test. The risk stays a "risk to test" in the headline and the counts. A vague risk (no input, or "some edge cases") is never filed: it stays a note under **Risks to test**. A decision the PR states on purpose, or an Expected that is a design question, still wins over both.
59
+
60
+ Every defect carries the label `localdost`, and a Linear defect goes to the project named by the tracker's `projectName` when the dot has one. [TRACKERS.md](TRACKERS.md#defects-the-dot-files) has the details.
61
+
62
+ Before it drafts a bug that has no draft yet, the dot looks for an open issue about the same bug in the tracker: the open issues labeled `localdost` in Jira and GitHub, the open issues of the team (and project) in Linear. An issue matches when it names the same PR or the same repo, and its title shares at least 60 percent of the words with the new title, or it cites the same file and line, or the same file in the same PR. On a match the dot drafts no second defect. It adds the new evidence and the head commit as a comment on the existing issue, once per head commit, and the report links that issue as filed. The comment is a `ticket_comment` action, so its rule applies: with the default **Ask**, it waits in the Inbox. If the tracker cannot be read, or the dot runs in demo mode, the dot drafts the defect as usual.
63
+
64
+ ### CI results
65
+
66
+ The dot's own run often covers only the smoke tests, so the unit tests of the PR would show as not run. localdost also reads the PR's own CI. It lists the check runs of the reviewed head commit (`GET /commits/{sha}/check-runs`), keeps those whose head sha is the reviewed head, and reads the log of each finished GitHub Actions job (5 MB at most per log). A job whose conclusion is success, neutral, or skipped counts no failed test, and linter or compiler summary lines such as `✖ 31 problems (0 errors, 31 warnings)` are not tests. Passing and failing test lines are parsed from vitest and jest check marks, `ok N - title` and `not ok N - title` TAP lines, node:test marks, Playwright list lines, and `x title` lines.
67
+
68
+ A checklist item with an existing test that the dot's run left not run is matched against those lines by test title (case-insensitive substring, taken from the item's `existingTitle`) and, when the log prints a file, by file path. A match becomes `Passed` or `Failed` with the note `passed in CI job <name>`. A job that is still queued or running settles nothing: its items stay not run, and the reason says the CI job is still running. The comment also gets the line `Tests in CI: N passed (job X) on <sha7>.` (only jobs that printed a test line are listed), and Details lists each job with its conclusion and the counts parsed.
69
+
70
+ A missing permission (the check runs need the Checks read permission), an API error, or a log that cannot be read means no CI evidence for that part. It never fails a review. A manual tick does not replace a CI result.
71
+
72
+ ### Check result
73
+
74
+ In App mode, the check run named "localdost" carries the same report as its text and adds a line annotation for each shown risk and each test at risk, at the first line the item cites. In PAT mode, GitHub allows only a commit status, so you get the conclusion and a title without annotations. See [GITHUB.md](GITHUB.md).
75
+
76
+ The title is the result in under 60 characters, which is where GitHub cuts a longer one: `1 test failed: discount applied at checkout`, `Passed. 2 things to try by hand`, `Passed`, `Tests did not run`. The body opens with one sentence on what users may see and whether the check blocks merging (a failed check "blocks merging only if your repo requires it"; any other says it does not block), then the counts, each bug with its areas, what was expected and what happened, then the same sections as the comment: Questions for the team, Behavior changes to confirm, what is left to try by hand and Tests to update, each cut at a few lines with an `And N more` line. The developer details are in the check text under `Details for developers`.
77
+
78
+ The conclusion follows results: `failure` when a selected test failed. A bug that only the review found (no failing test) is `failure` only when `blockOn` is set and the bug is at or above that severity, and `neutral` otherwise. The conclusion is also `neutral` when the tests could not run, and `success` when every selected test passed and no bug was found.
79
+
80
+ ### Run page
81
+
82
+ On PR and merge runs the page opens with the change summary: what the change does, the size of the whole change, one chip per area with its size and risk, and the test result line from the PR comment. A chip filters **Changed files** to that area and opens its group. **Changed files** groups the files by area, collapsed, with a file count and +/- per group, and **Raw diff** shows the unified diff of the files in view in one click. Screenshots in the Artifacts tab and the Browser view carry the test title in plain words, such as `Chat: a suggested question streams a reply with a tool card`, with the file name below it. Runs from before the change summary get one built from the stored diff with the same rules.
83
+
84
+ The run page also shows the same sections as the comment with live test results. Each risk has a **Not a risk** button. A mark hides nothing on the PR. It saves the risk and its diff hunks under `<LOCALDOST_DATA_DIR>/eval-candidates/`, so a maintainer can turn a false positive into an eval fixture.
85
+
86
+ ## How the review works
87
+
88
+ 1. **Scope.** localdost collects the changed lines from the PR files, the raw diff, or `git diff` in a checkout. Common secret shapes in the diff are masked before anything reaches a prompt.
89
+ 2. **Impact.** Changed files map to impact areas through `.localdost/review.yml`, `CODEOWNERS`, routes, the import graph, and spec links.
90
+ 3. **Signals and lenses.** Deterministic checks look for untouched tests, uncovered lines, disabled tests, removed assertions, changed test config, selector drift, changed routes, and more. The QA lenses below match changed lines and add their checklists to the prompt.
91
+ 4. **Security and robustness pass.** See [below](#security-and-robustness-pass).
92
+ 5. **Reviewer pass.** A model writes risks, What to test items, tests at risk, test gaps, the regression scope, and release-note impact. Every risk must cite a changed line.
93
+ 6. **Verifier pass.** A second model pass checks each risk against the code and marks it confirmed, uncertain, or refuted. Turn it off with `verify: false`.
94
+ 7. **Script checks and merge.** Code checks reject citations of lines the change does not contain, ask the model to correct them, apply confidence floors, and merge the passes.
95
+
96
+ The review uses the dot's model backend. With `LOCALDOST_LLM=mock`, it returns canned output.
97
+
98
+ ### Rule-based fallback
99
+
100
+ Without a model, or when the model pass fails, a rule-based review stands in. It only reports what the changed lines show. Each risk must cite a changed line of a changed file, and the text of that line must match a pattern for the risk kind: money (`amount`, `price`, `total`, `round`, `currency`, `tax`), auth (`auth`, `token`, `permission`, `role`, `session`, `acl`, `can[A-Z]`, `isAdmin`, `login`), dates (`new Date`, `Date.`, `moment`, `dayjs`, `toISOString`, `timezone`), concurrency (`await`, `Promise`, `setTimeout`, `debounce`, `async`, `lock`, `queue`), migration (`ALTER`, `CREATE`, `DROP`, `migrat`), feature flags (`flag`, `feature`, `toggle`, `enabled`), and a few more. A risk that fails is dropped, together with its checklist items and test gaps, and its signal is listed as dropped with the reason `Rule-based review: the line does not show the pattern`.
101
+
102
+ A risk that stays is a guess. Its severity is `medium` at most, `low` when only a comment or a string shows the pattern, and its text starts with `Rule-based guess, not verified:`. The one-letter-search guard (`<x>.length >= N`) fires only when `<x>` names text a user types (`q`, `query`, `search`, `term`, `text`, `input`, `value`, `keyword`, `filter`, `name`, `title`, `str`, `s`, or a name made from `trim()`, `toLowerCase()`, or a debounce hook of one of those) and the line is source code. The summary names at most three product areas and never lists test files.
103
+
104
+ ## Repo files
105
+
106
+ Both files are read from the **base** branch of the PR. A PR cannot change the rules of its own review. When a PR edits one of them, the review uses the base copy and notes it.
107
+
108
+ ### .localdost/review.yml
109
+
110
+ An owner map that names your product areas, the paths that belong to each area, the user flows they carry, and the specs that test them:
111
+
112
+ ```yaml
113
+ areas:
114
+ - name: Checkout
115
+ paths:
116
+ - src/checkout/**
117
+ - src/payments/**
118
+ flows:
119
+ - Pay with a saved card
120
+ - Apply a coupon
121
+ specs:
122
+ - tests/checkout*.spec.ts
123
+ - name: Search
124
+ paths: [src/search/**]
125
+ flows: [Search by product name]
126
+ specs: [tests/search.spec.ts]
127
+ ```
128
+
129
+ | Key | Required | Meaning |
130
+ |---|---|---|
131
+ | `areas[].name` | yes | Area name shown in the review |
132
+ | `areas[].paths` | yes | Globs of files in the area |
133
+ | `areas[].flows` | no | User flows the area carries. The reviewer uses them in risks and What to test items |
134
+ | `areas[].specs` | no | Globs of specs that cover the area. They run when the area changes |
135
+
136
+ A file in the wrong shape is skipped, and the review details say why. Without the file, the review falls back to `CODEOWNERS` teams, routes, and paths.
137
+
138
+ ### .localdost/review.md
139
+
140
+ Free-text instructions from the repo owners, for example:
141
+
142
+ ```markdown
143
+ - Prices are integers in cents. Flag any float arithmetic on amounts.
144
+ - The admin app under src/admin is internal. Rate its risks one level lower.
145
+ - Do not flag copy changes in src/i18n unless a placeholder changed.
146
+ ```
147
+
148
+ The reviewer reads the file as quoted data that widens or narrows what it flags. It cannot change the output format or the rules of the review.
149
+
150
+ ## Security and robustness pass
151
+
152
+ The pass starts when the changed lines touch process execution, git clone or checkout, file system paths or copies, tokens or auth, webhooks or event intake, deletes, temp folders, the clock in a test, an approval or status path, or the result of an exported function. It adds a fixed checklist to the reviewer prompt, with only the questions that apply:
153
+
154
+ | Question id | Kind | Question |
155
+ |---|---|---|
156
+ | `attacker_choice` | security | Can an attacker choose what runs or which commit is checked out (forged event fields, unsigned webhooks)? |
157
+ | `path_safety` | security | Path traversal, a symlink on the way, a swap between the check and the use (TOCTOU), a special file such as a named pipe? |
158
+ | `delete_in_flight` | robustness | What happens to in-flight runs, jobs and approvals when their object is deleted? |
159
+ | `caller_access` | security | Who may call this: no token, a phone token, the owner token? |
160
+ | `changed_contract` | robustness | Which callers of a function whose result changed still expect the old one? |
161
+ | `temp_cleanup` | robustness | New temp folders or files without cleanup on every path? |
162
+ | `time_dependent_test` | robustness | A test that depends on "today", a local time, or a date near midnight? |
163
+ | `open_status` | robustness | An approval, check or status with no close path when it is rejected, expires or fails? |
164
+
165
+ Script detectors in `src/review/security.ts` add leads for five questions: a git checkout of an event commit with no head or signature check in the file, a copy by name after path checks with no file descriptor or `O_NOFOLLOW`, an exported `delete<Thing>` whose body names runs, jobs or approvals, a changed return or throw with every unchanged caller listed from the import graph, and a clock-bound assertion in a test that uses the real clock. Each lead cites a changed line and a failure scenario. It goes to the reviewer as a signal, and the rule-based review turns it into a risk. The other questions go to the reviewer model with no lead.
166
+
167
+ A risk from the pass has kind `security` or `robustness` and source `security:<question id>`. It is a risk to test, not a bug. Even when the verifier confirms it, it becomes a bug only when a test reproduces it, for example a failed test in the run.
168
+
169
+ ## Lenses
170
+
171
+ A lens is a checklist for one kind of change. When a lens matches a changed line, its text goes into the prompt, at most four lenses per review, most specific first. Each lens has a confidence floor: a risk that the lens raised needs at least that confidence to show.
172
+
173
+ | Lens | Fires on | Floor | Severity hint |
174
+ |---|---|---|---|
175
+ | `qa-auth` | Login, session, role, or permission logic | 0.65 | critical |
176
+ | `qa-money` | Money arithmetic, rounding, currency, or sign | 0.65 | critical |
177
+ | `qa-migration` | A schema or data migration | 0.65 | critical |
178
+ | `qa-check-then-act` | A read followed by a write on shared state, or parallel work on it | 0.7 | high |
179
+ | `qa-response-shape-break` | A response, serializer, or returned object that changed its fields | 0.7 | high |
180
+ | `qa-dates` | Date, time zone, or calendar arithmetic | 0.6 | high |
181
+ | `qa-double-submit` | An async UI action, timer, debounce, or throttle | 0.65 | high |
182
+ | `qa-feature-flag` | A feature flag, an experiment, or its default | 0.6 | high |
183
+ | `qa-control-has-no-effect` | UI state that a control sets | 0.65 | medium |
184
+ | `qa-validation` | Input validation rules | 0.6 | medium |
185
+
186
+ The lenses live in `src/agent/qa-lenses/` of the localdost checkout. To add one, add a Markdown file there with YAML frontmatter and restart the server:
187
+
188
+ ```markdown
189
+ ---
190
+ name: qa-tax
191
+ kind: money
192
+ description: Tax rate or tax rounding changed on a changed line
193
+ triggers:
194
+ files: ["src/**/*.ts"]
195
+ line_regex: 'taxRate|vatRate|roundTax\('
196
+ confidence_floor: 0.7
197
+ severity_hint: high
198
+ ---
199
+
200
+ A change touches how tax is computed. Check ...
201
+
202
+ ## What to test
203
+
204
+ - ...
205
+ ```
206
+
207
+ | Frontmatter key | Meaning |
208
+ |---|---|
209
+ | `name` | Kebab-case name |
210
+ | `kind` | One of the signal kinds, for example `money`, `auth`, `dates`, `concurrency`, `migration`, `feature_flag`, `validation_changed`, `ui_state`, `response_shape` |
211
+ | `description` | One line shown in the review |
212
+ | `triggers.files` | Globs of files the lens reads. Empty means every file |
213
+ | `triggers.line_regex` | Matched against added lines |
214
+ | `triggers.removed_regex` | Matched against removed lines |
215
+ | `triggers.classes` | File classes where the lens fires once per file |
216
+ | `triggers.line_flags` | Regex flags, from `i`, `m`, `s`, `u` |
217
+ | `confidence_floor` | 0 to 1, default 0.6 |
218
+ | `severity_hint` | `critical`, `high`, `medium`, or `low` |
219
+ | `skip_comments` | `false` to also match comment-only lines |
220
+
221
+ A lens needs at least one of `line_regex`, `removed_regex`, or `classes`. A lens file with an error breaks every review until you fix it, so run `npm test` after you add one.
222
+
223
+ ## Options
224
+
225
+ Each dot has PR review options. Change them in the app under the Change reviewer stage of the dot dialog (Settings on the dot page, then Settings under Change reviewer), or with `PUT /api/dots/:id/review`:
226
+
227
+ | Option | Default | Meaning |
228
+ |---|---|---|
229
+ | `enabled` | `true` when the dot has a repo | Runs the review |
230
+ | `verify` | `true` | Runs the verifier pass |
231
+ | `minConfidence` | `0.6` | Lowest confidence a risk needs to show. A lens floor can raise it |
232
+ | `showFrom` | `medium` | Lowest severity listed in the comment and annotated |
233
+ | `blockOn` | `null` | A severity. A confirmed risk at or above it is recorded as blocking on the run and fails the check. Without it, a bug found only by the review leaves the check `neutral`; a failed test still fails it |
234
+ | `maxPromptKb` | `160` | Prompt size budget, 16 to 1024 |
235
+ | `toolMode` | `none` | `none` or `read`. Stored for a later version; the review does not read it yet |
236
+
237
+ ```bash
238
+ curl -X PUT http://localhost:4319/api/dots/<dot id>/review \
239
+ -H 'content-type: application/json' \
240
+ -d '{"blockOn":"high","showFrom":"low"}'
241
+ ```
242
+
243
+ ## Ticking the checklist
244
+
245
+ Each item under Please try by hand and Tests to update in the sticky comment is a checkbox, and every tick stays when the dot later rewrites the comment. When a tester runs a check from the review by hand (an item with its steps and expected result) and ticks it on GitHub, localdost also records a manual pass on the run. A tick on a possible bug, on a Tests to update item, or on a thing to try in a comment without a review stays in the comment and records no result on the run. localdost counts a tick only when:
246
+
247
+ - The GitHub Issue comment webhook reaches localdost. Polling does not see comment edits.
248
+ - The person who edited has write, maintain, or admin access to the repo. localdost asks GitHub for the editor's permission and ignores the edit when GitHub cannot answer.
249
+ - The editor is not a bot.
250
+
251
+ You can also tick an item on the run page in the app, which calls `POST /api/runs/:id/review/tested`. An item that the test run already covered keeps the runner's result and cannot be ticked.
252
+
253
+ ## Evals
254
+
255
+ `test/fixtures/qa-review/` holds 17 eval fixtures: a diff, the head files, and the expected review for each. `test/fixtures/qa-review/dogfood/` holds 5 of them: golden cases from the real misses in `docs/DOGFOOD-LEDGER.md` on the `dogfood/fp-fn-ledger` branch, each the actual diff at that head. A golden case passes when the review names the risk. `--only dogfood` runs the group. `npm test` runs them through the mock backend to check the plumbing. `npm run eval:qa-review -- --backend claude-cli --runs 3` (or `LOCALDOST_LLM=claude-cli npm run eval:qa-review`) runs them against a live model and writes the median metrics to `test-results/qa-review-eval.json`. `--compare <old.json>` shows what changed against an earlier run, `--only <name>` picks fixtures, and `--gate` exits 1 when a target fails.
256
+
257
+ ### Eval results
258
+
259
+ 2026-10-08, Claude CLI backend (`sonnet` for reviewer and verifier), 12 fixtures, verifier on.
260
+
261
+ | Metric | Target | Before | After |
262
+ |---|---|---|---|
263
+ | Precision after verifier | 0.8 or more | 0.75 | 1.0 |
264
+ | Recall | 0.7 or more | 0.89 (8 of 9) | 1.0 (9 of 9) |
265
+ | Negative-control false positives | 0 | 0 | 0 |
266
+ | Verifier recall loss | 1 or less | 1 | 0 |
267
+ | Must-not-flag hits | 0 | 1 | 0.5 |
268
+ | Coverage complete | 12 | 12 | 12 |
269
+ | Precision before verifier | | 0.77 | 0.83 |
270
+
271
+ Before is one run on the prompts at `b4a9956`; after is the median of two runs. The misses were a refuted prompt-injection risk and duplicate risks for one root cause (a caller, a type or a skipped test raised as its own risk). The fixes: the merge stage folds risks that share a cited line and test-only risks into the product risk, the verifier may not drop a prompt-injection risk, and the reviewer prompt asks for one risk per root cause and no contrast citations. The remaining must-not-flag hit is `auth-guard-removed` citing the intact sibling guard as further evidence in one run of two.
272
+
273
+ The same build reviewed the demo shop PR (duonghaijoe/localdost-demo-shop#1) from a fresh clone. It flagged the double-subtracted total, the additive member and promo stacking, and the free-shipping check on the pre-discount subtotal, and asked for a Gold plus TRAIL10 checkout test.
274
+
275
+ ### Readability
276
+
277
+ `npm run eval:qa-review -- --readability` also renders each fixture review in the old comment format (frozen in `src/review/baseline/render-v1.ts`) and in the current one, and scores both. `--db <copy of localdost.db> --pr 3 --pr 4` adds the latest reviewed run of those PRs; open a copy, never the live database. `--readability-only` skips the fixture metrics, and `--gate` fails when the gate fails.
278
+
279
+ The script rubric checks the part a reader sees without opening Details:
280
+
281
+ | Check | Passes when |
282
+ |---|---|
283
+ | Summary first | The first line says what happened and whether anything blocks (an older comment: what was tested, the bugs found, and what is not tested yet) |
284
+ | No merge advice | Nowhere does the comment say safe to merge, hold, approve, or merge readiness |
285
+ | Bugs reproducible | Every bug says what was expected and what happened (an older comment: also steps and evidence) |
286
+ | Checklist actionable | Every Please try by hand item opens with the action, carries its steps or expected result under it, and stays under 45 words (an older Not tested yet item says why and how) |
287
+ | Plain words | At most 1 in 10 sentences is over 20 words |
288
+ | No jargon | No internal ids, regression scope, verifier, coverage, confidence, or shas |
289
+ | Length | 350 words or fewer, not counting the change summary block |
290
+ | STE summary | The opening lines are short, active, free of banned words and file names; a change in two or more areas also shows What this change does with its areas table (an older comment opens with it in 2 or 3 sentences) |
291
+
292
+ Then a judge compares the two comments for each sample, once with the new comment in slot A and once in slot B, and gives weights to A and B instead of a bare winner. `--judge codex` (default) runs `codex exec -m gpt-5.5 --sandbox read-only --ephemeral -c "mcp_servers={}"`; `--judge claude` runs `claude -p` when Codex is unavailable. The gate passes when every new comment passes all eight checks and the mean weight for the new format is above 0.5.
293
+
294
+ 2026-10-08, 12 fixtures (mock reviewer) and the latest reviewed runs of PR #3 and PR #4 from a copy of the dogfood database:
295
+
296
+ | | Old format | New format |
297
+ |---|---|---|
298
+ | Script rubric, mean | 0.43 (3 of 7) | 1.0 (7 of 7 on all 14) |
299
+ | Codex weight, both orders, mean | 0.08 | 0.92 |
300
+ | Samples where Codex prefers it | 0 of 14 | 14 of 14, no order flips |
301
+
302
+ The lowest Codex weight for the new format was 0.735, on `docs-only`, where both comments are short. A fresh-context Claude Opus judge on 6 of the samples, run while Codex was over its spend cap, gave the new format 0.86 to 0.94.
303
+
304
+ Every PR check also scores its own comment and records a Readability step on the run, so each dogfood round shows the score.
305
+
306
+ #### STE check (KAT-144)
307
+
308
+ `src/review/ste.ts` holds the ASD-STE100 checks a script can run. A sentence that starts with a QA verb (test, check, open, run, press) is an instruction with a 20-word limit; any other sentence is a description with a 25-word limit. Passive voice is a be-verb or "get" followed by a past participle, minus a short list of adjectives such as "based". The check is a heuristic: it misses a passive without a be-verb and can flag a rare adjective. The banned words and their replacements are the same list the prompt carries. "One meaning per word" stays a prompt rule, as no script can check it.
309
+
310
+ The eval reports, for the old and the new comment, the sentences over their STE limit, the passive phrases and the banned words in the visible text, and gates the change summary block on all of them.
311
+
312
+ 2026-10-08, after the change summary. Codex was over its spend cap, so a fresh-context `claude -p` Opus judge ran both slot orders on 4 fixtures (mock reviewer) and the latest reviewed runs of PR #12 and PR #4 from a copy of the dogfood database. Those two runs predate KAT-144, so their summary comes from the stored diff and the review summary, as on the run page.
313
+
314
+ | Sample | Rubric old | Rubric new | STE old: long, passive, banned | STE new: long, passive, banned | Judge weight for new |
315
+ |---|---|---|---|---|---|
316
+ | docs-only | 4 of 8 | 8 of 8 | 0 of 7, 0, 0 | 0 of 5, 0, 0 | 0.90 |
317
+ | money-rounding | 3 of 8 | 8 of 8 | 0 of 14, 0, 0 | 0 of 19, 0, 0 | 0.865 |
318
+ | pure-refactor | 4 of 8 | 8 of 8 | 0 of 10, 0, 1 | 0 of 10, 0, 0 | 0.85 |
319
+ | selector-drift | 3 of 8 | 8 of 8 | 0 of 14, 0, 0 | 0 of 21, 0, 0 | 0.85 |
320
+ | PR #12 | 1 of 8 | 7 of 8 | 7 of 30, 2, 0 | 3 of 49, 0, 0 | 0.835 |
321
+ | PR #4 | 2 of 8 | 7 of 8 | 1 of 41, 0, 0 | 5 of 57, 0, 0 | 0.865 |
322
+
323
+ All 12 fixtures pass 8 of 8 with the script rubric alone. The judge preferred the new comment on every sample, with no order flips. PR #12 and PR #4 fail only Length (467 and 514 words outside Details, limit 350). They failed it on `main` before this change too (465 and 512 words): the long part is their Not tested yet list, and the change summary block does not count toward the limit.
324
+
325
+ ### Prompt comparison
326
+
327
+ `npm run eval:qa-review -- --backend claude-cli --variant <name>` runs the 12 fixtures through the shipped reviewer prompt and through a variant from `src/review/prompt-variants.ts`, renders both reviews as the sticky comment, and has a judge compare the two comments for each fixture. `--baseline <name>` picks the other side (default `current`). `--reviews <file>` caches each generated review, so a second judge pass does not rerun the reviewer.
328
+
329
+ The judge follows the ranking rules for comparing candidates:
330
+
331
+ - It sees the diff and both comments together, never one comment alone.
332
+ - Each pair runs twice, with the variant in slot A and then in slot B. A judge that always prefers one slot scores 0.5 and the run counts it as an order flip.
333
+ - For readability, correctness and overall, the judge spreads a weight of 1 over five grades, from A much better to B much better. The score is the expectation over the grades, from 0 (baseline much better) to 1 (variant much better).
334
+
335
+ The readability rubric is the reader check from the table above: testing summary first, actionable Not tested yet items, plain words, no jargon outside Details, and length. The correctness rubric asks whether each bug cites a changed line that shows the problem, whether any finding has no support in the diff, whether the comment catches the regressions the diff introduces, and whether the suggested tests would catch them. Beside the judge, the script reports the readability rubric for both sides, how many shown risks cite a changed line, and the section 7.2 recall and precision.
336
+
337
+ `--judge codex` (default) asks Codex and falls back to `claude -p` for any call where Codex fails. `--judge claude` asks only Claude. The variant wins clearly when its mean overall score is 0.6 or more, its correctness score is at least 0.5, its script recall, precision and must-not-flag hits are no worse, and at most a quarter of the fixtures flip with the slot order. A clear winner is then gated on the section 7.2 targets, which stay pass or fail; `--gate` exits 1 when the variant fails one.
338
+
339
+ 2026-10-08, Claude CLI reviewer and verifier (`sonnet`), Codex judge (`gpt-5.5`, all 24 calls answered by Codex). Baseline `current` against the `actual-result` variant. The variant asks for the observed wrong result in userImpact, which the comment prints as the bug's Actual line, 3 to 5 short steps, a concrete expected value, the common term for the trigger condition, and a before-and-after statement in why.
340
+
341
+ | | Baseline | Variant |
342
+ |---|---|---|
343
+ | Readability rubric, mean | 0.964 | 0.964 |
344
+ | Shown risks on a changed line | 11 of 11 | 11 of 11 |
345
+ | Recall | 9 of 9 | 9 of 9 |
346
+ | Precision after verifier | 0.909 | 0.909 |
347
+ | Section 7.2 gate | pass | pass |
348
+
349
+ | Judge expectation for the variant | Score |
350
+ |---|---|
351
+ | Readability | 0.518 |
352
+ | Correctness | 0.500 |
353
+ | Overall | 0.509 |
354
+ | Fixtures where the slot order flips the winner | 5 of 12 |
355
+
356
+ No clear winner, so `QA_REVIEW_SYSTEM` stays as shipped and the variant stays in `prompt-variants.ts` as a recorded candidate. The variant won `flag-default-flip` (0.78) and `date-timezone` (0.69), where the Actual line now names what the tester sees. It lost `auth-guard-removed` (0.32) and `money-rounding` (0.35): Codex found a delete-route test gap that the diff does not support, and example totals that the diff does not support. `false-positive-bait` (0.38) went to the baseline for a sharper visible summary. An earlier judge pass on the same reviews gave 0.528 overall with 7 flips, so one pass moves the mean by about 0.02. Both prompts already pass the script rubric on 11 or 12 of 12 fixtures, which leaves little room for a prompt change to separate them.
357
+