@herbertgao/pi-extensions 2026.10.2 → 2026.10.4

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 (362) hide show
  1. package/README.md +6 -12
  2. package/THIRD_PARTY_NOTICES.md +5 -1
  3. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +8 -0
  4. package/node_modules/@herbertgao/pi-subagents/README.md +1 -1
  5. package/node_modules/@herbertgao/pi-subagents/package.json +4 -5
  6. package/node_modules/@herbertgao/pi-subagents/src/index.ts +1 -1
  7. package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +1 -1
  8. package/node_modules/@herbertgao/pi-subagents/src/mention-clone.ts +48 -72
  9. package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +1 -1
  10. package/node_modules/@herbertgao/pi-subagents/src/output-file.ts +15 -6
  11. package/node_modules/@herbertgao/pi-subagents/src/workflow/collisions.ts +4 -1
  12. package/node_modules/@herbertgao/pi-subagents/src/workflow/json-schema.ts +9 -8
  13. package/node_modules/@narumitw/pi-caffeinate/dist/index.ts +6 -1
  14. package/node_modules/@narumitw/pi-caffeinate/dist/index.ts.map +2 -2
  15. package/node_modules/@narumitw/pi-caffeinate/package.json +1 -1
  16. package/node_modules/@narumitw/pi-caffeinate/src/dbus-inhibit.ts +13 -1
  17. package/node_modules/pi-lens/CHANGELOG.md +95 -0
  18. package/node_modules/pi-lens/README.md +1 -0
  19. package/node_modules/pi-lens/dist/chunk-2FQ62SPM.js +83 -0
  20. package/node_modules/pi-lens/dist/{chunk-6P62QVEA.js → chunk-2UMYMRI3.js} +2 -2
  21. package/node_modules/pi-lens/dist/{chunk-O6TQT6RI.js → chunk-34OCDWOS.js} +1 -1
  22. package/node_modules/pi-lens/dist/{chunk-XK4CIILI.js → chunk-3FERWMCH.js} +26 -26
  23. package/node_modules/pi-lens/dist/{chunk-ZAWW3AF6.js → chunk-3JL6IFD7.js} +8 -8
  24. package/node_modules/pi-lens/dist/{chunk-OAXNDZJ7.js → chunk-3JSEWUWI.js} +8 -4
  25. package/node_modules/pi-lens/dist/{chunk-RPD5K5NC.js → chunk-3MRXIJ6I.js} +2 -2
  26. package/node_modules/pi-lens/dist/{chunk-IVP5KAB7.js → chunk-3P4PF2BX.js} +14 -14
  27. package/node_modules/pi-lens/dist/{chunk-5THXD6X5.js → chunk-3PNFWVHT.js} +2 -2
  28. package/node_modules/pi-lens/dist/{chunk-VD4JQCQC.js → chunk-3TTPKMEF.js} +37 -37
  29. package/node_modules/pi-lens/dist/{chunk-7F72PXY2.js → chunk-5JHXUETW.js} +3 -3
  30. package/node_modules/pi-lens/dist/{chunk-5ZEJHV35.js → chunk-64LU2OVH.js} +2 -2
  31. package/node_modules/pi-lens/dist/{chunk-ODEEOXPH.js → chunk-6B5I6ICN.js} +11 -11
  32. package/node_modules/pi-lens/dist/{chunk-5RXBNSW2.js → chunk-6P54TMWL.js} +16 -8
  33. package/node_modules/pi-lens/dist/{chunk-K6VYLB2U.js → chunk-6UYA642J.js} +12 -12
  34. package/node_modules/pi-lens/dist/{chunk-V7R425XG.js → chunk-6XX5HCLK.js} +4 -4
  35. package/node_modules/pi-lens/dist/{chunk-D6QS3U6M.js → chunk-7AXO3ZDF.js} +15 -15
  36. package/node_modules/pi-lens/dist/{chunk-YGVYKNSN.js → chunk-7BX5DWSA.js} +59 -12
  37. package/node_modules/pi-lens/dist/{chunk-N3YQJI6O.js → chunk-7ELY2CSM.js} +7 -4
  38. package/node_modules/pi-lens/dist/{chunk-AWE5TMPO.js → chunk-7M4T5N3V.js} +13 -13
  39. package/node_modules/pi-lens/dist/{chunk-AJ3QXTRQ.js → chunk-AFZYMAIV.js} +33 -33
  40. package/node_modules/pi-lens/dist/{chunk-AJXODZY6.js → chunk-ALQRYH6O.js} +12 -12
  41. package/node_modules/pi-lens/dist/{chunk-AJVLWNFN.js → chunk-AXKPQ6ZI.js} +5 -5
  42. package/node_modules/pi-lens/dist/{chunk-HWBZIGMJ.js → chunk-BHWHXMQ2.js} +8 -8
  43. package/node_modules/pi-lens/dist/{chunk-IXEBJSUE.js → chunk-BJF25SUG.js} +10 -10
  44. package/node_modules/pi-lens/dist/{chunk-GVXA6CCE.js → chunk-BNKLYOOO.js} +1 -1
  45. package/node_modules/pi-lens/dist/{chunk-T4ERT73Y.js → chunk-CBD2B5CP.js} +20 -20
  46. package/node_modules/pi-lens/dist/{chunk-O5WILGMI.js → chunk-CFYISHUW.js} +5 -5
  47. package/node_modules/pi-lens/dist/{chunk-EOKRQ3SA.js → chunk-CMU4RMJB.js} +1 -1
  48. package/node_modules/pi-lens/dist/{chunk-YSNFMJKN.js → chunk-CULQYFLU.js} +2 -2
  49. package/node_modules/pi-lens/dist/{chunk-ORTMY4Q4.js → chunk-D65GOCJB.js} +21 -14
  50. package/node_modules/pi-lens/dist/{chunk-NTUJEGDZ.js → chunk-D6YF5HKX.js} +2 -2
  51. package/node_modules/pi-lens/dist/{chunk-BRJKOBZP.js → chunk-DMS52BEP.js} +17 -6
  52. package/node_modules/pi-lens/dist/{chunk-NL5GLMFI.js → chunk-ELVWJYRV.js} +11 -11
  53. package/node_modules/pi-lens/dist/{chunk-4W2PLC4J.js → chunk-EUT3B22Y.js} +12 -12
  54. package/node_modules/pi-lens/dist/{chunk-GUOGVTCQ.js → chunk-F5VLZHUW.js} +1 -1
  55. package/node_modules/pi-lens/dist/{chunk-I7SPGOWI.js → chunk-FGALODG3.js} +1 -1
  56. package/node_modules/pi-lens/dist/{chunk-Q5U6FMDI.js → chunk-G3RLJYA2.js} +12 -6
  57. package/node_modules/pi-lens/dist/{chunk-FJNKANOS.js → chunk-GAYGGICG.js} +9 -9
  58. package/node_modules/pi-lens/dist/{chunk-HVUZXSWK.js → chunk-H2W2AXD3.js} +38 -40
  59. package/node_modules/pi-lens/dist/{chunk-VHQLPIRJ.js → chunk-H5EV3VMF.js} +2 -2
  60. package/node_modules/pi-lens/dist/{chunk-27BBHSZC.js → chunk-HREZQCT3.js} +3 -3
  61. package/node_modules/pi-lens/dist/{chunk-TT22N74J.js → chunk-HSIRMK2D.js} +12 -12
  62. package/node_modules/pi-lens/dist/{chunk-3I5QFT3N.js → chunk-IMSQR4WO.js} +6 -3
  63. package/node_modules/pi-lens/dist/{chunk-B3I2UUT4.js → chunk-IQZXOZ7S.js} +156 -32
  64. package/node_modules/pi-lens/dist/{chunk-RIISMHKN.js → chunk-IR6XFA5P.js} +14 -13
  65. package/node_modules/pi-lens/dist/{chunk-LNAKEO63.js → chunk-IUKPRZER.js} +4 -4
  66. package/node_modules/pi-lens/dist/{chunk-RUOG5D2C.js → chunk-IUR76K6A.js} +5 -5
  67. package/node_modules/pi-lens/dist/{chunk-TO6WL3GM.js → chunk-J3FZR3YY.js} +12 -2
  68. package/node_modules/pi-lens/dist/{chunk-Y4T27COV.js → chunk-J6DFZDFA.js} +4 -4
  69. package/node_modules/pi-lens/dist/{chunk-E4MAEDPM.js → chunk-J7WJZ6W7.js} +11 -11
  70. package/node_modules/pi-lens/dist/{chunk-52H5B5TC.js → chunk-JONGANYH.js} +30 -30
  71. package/node_modules/pi-lens/dist/{chunk-TGPXLY2J.js → chunk-KJCWXUUS.js} +35 -1
  72. package/node_modules/pi-lens/dist/{chunk-I3R7GKDR.js → chunk-KJN4IOEJ.js} +1 -1
  73. package/node_modules/pi-lens/dist/{chunk-RPD4ZSB7.js → chunk-KMGPUKFD.js} +12 -12
  74. package/node_modules/pi-lens/dist/{chunk-OQGFCZJ4.js → chunk-LD7WFTRX.js} +13 -13
  75. package/node_modules/pi-lens/dist/{chunk-DIULIWKU.js → chunk-LNOMA3MP.js} +3 -3
  76. package/node_modules/pi-lens/dist/{chunk-HHYAELLJ.js → chunk-MGIWSROG.js} +5 -5
  77. package/node_modules/pi-lens/dist/{chunk-YLF3PPT5.js → chunk-MQA2YBAH.js} +3 -3
  78. package/node_modules/pi-lens/dist/{chunk-TVN5N6GY.js → chunk-MTDRLSI7.js} +690 -186
  79. package/node_modules/pi-lens/dist/{chunk-DQ2NZ7C4.js → chunk-N2IRDBZI.js} +44 -6
  80. package/node_modules/pi-lens/dist/{chunk-AHDW3GPE.js → chunk-N77WFUL7.js} +22 -22
  81. package/node_modules/pi-lens/dist/{chunk-NXPS2L6U.js → chunk-N7YNJE5R.js} +7 -7
  82. package/node_modules/pi-lens/dist/{chunk-7FBF7NPR.js → chunk-NFXP47RV.js} +13 -12
  83. package/node_modules/pi-lens/dist/{chunk-UY752QSN.js → chunk-NJF2X5XF.js} +17 -17
  84. package/node_modules/pi-lens/dist/{chunk-WONERJTP.js → chunk-O7HZX7CA.js} +1 -1
  85. package/node_modules/pi-lens/dist/{chunk-AS44CFQ4.js → chunk-OC7LYAU5.js} +7 -7
  86. package/node_modules/pi-lens/dist/{chunk-4RERDEXR.js → chunk-OEX24ECI.js} +30 -30
  87. package/node_modules/pi-lens/dist/{chunk-6VCD4VKZ.js → chunk-OYOB3ZFG.js} +2 -2
  88. package/node_modules/pi-lens/dist/{chunk-IIXOAGHR.js → chunk-OYTMZXRF.js} +18 -15
  89. package/node_modules/pi-lens/dist/{chunk-ARFCXG7S.js → chunk-OZJINN4O.js} +2 -2
  90. package/node_modules/pi-lens/dist/{chunk-34U7PLGE.js → chunk-PCHDGUKT.js} +11 -11
  91. package/node_modules/pi-lens/dist/{chunk-VCSRSYLF.js → chunk-RJFED73B.js} +34 -36
  92. package/node_modules/pi-lens/dist/chunk-RTQNRM5X.js +27 -0
  93. package/node_modules/pi-lens/dist/{chunk-PAK6IDME.js → chunk-S6AMWKPC.js} +2 -2
  94. package/node_modules/pi-lens/dist/{chunk-U3VGR4VU.js → chunk-T4QZ6FEH.js} +4 -4
  95. package/node_modules/pi-lens/dist/{chunk-VN2AXLEX.js → chunk-T54VJRAD.js} +54 -12
  96. package/node_modules/pi-lens/dist/{chunk-ZMOL6RQC.js → chunk-TA5L5KWQ.js} +2 -2
  97. package/node_modules/pi-lens/dist/{chunk-JOLITGCC.js → chunk-TQFBZVCG.js} +1 -1
  98. package/node_modules/pi-lens/dist/{chunk-VDBPVIKD.js → chunk-U52SAGRM.js} +1 -1
  99. package/node_modules/pi-lens/dist/{chunk-LW6XKDZQ.js → chunk-UEAHAMEI.js} +284 -35
  100. package/node_modules/pi-lens/dist/{chunk-NMABWBZN.js → chunk-UGSMCQ4D.js} +1 -1
  101. package/node_modules/pi-lens/dist/{chunk-6QIUX4EP.js → chunk-USHG4DLH.js} +7 -7
  102. package/node_modules/pi-lens/dist/{chunk-LSMJ6KBE.js → chunk-V5MEBST3.js} +16 -16
  103. package/node_modules/pi-lens/dist/chunk-VGEVL5EQ.js +29 -0
  104. package/node_modules/pi-lens/dist/{chunk-47D2BO4S.js → chunk-VPWKF3GN.js} +10 -10
  105. package/node_modules/pi-lens/dist/{chunk-UK3CMEAL.js → chunk-VSMJK3ZJ.js} +1 -1
  106. package/node_modules/pi-lens/dist/{chunk-22AVIGXS.js → chunk-VYKKMYVT.js} +7 -7
  107. package/node_modules/pi-lens/dist/{chunk-OS32RNR2.js → chunk-VZHJS6DR.js} +15 -15
  108. package/node_modules/pi-lens/dist/{chunk-E2WFBRHM.js → chunk-WATC3IQR.js} +3 -3
  109. package/node_modules/pi-lens/dist/chunk-WPE5FPGR.js +54 -0
  110. package/node_modules/pi-lens/dist/{chunk-V5PXFSZK.js → chunk-WSEWKCXU.js} +4 -4
  111. package/node_modules/pi-lens/dist/{chunk-NKOUFPQF.js → chunk-WW5BLB74.js} +2 -2
  112. package/node_modules/pi-lens/dist/{chunk-PWFHBTSF.js → chunk-XGUL4SLQ.js} +2 -2
  113. package/node_modules/pi-lens/dist/{chunk-F3P7VQ7H.js → chunk-XHSCVSOL.js} +3 -3
  114. package/node_modules/pi-lens/dist/{chunk-DFVMIKMQ.js → chunk-YLN4K6WD.js} +45 -9
  115. package/node_modules/pi-lens/dist/{chunk-VNMT7C64.js → chunk-Z6BB4JLQ.js} +2 -2
  116. package/node_modules/pi-lens/dist/{chunk-NTHH2J74.js → chunk-Z7QQA2KT.js} +12 -12
  117. package/node_modules/pi-lens/dist/{chunk-F3AU2TMM.js → chunk-ZETYB3XG.js} +15 -15
  118. package/node_modules/pi-lens/dist/{chunk-XECLWQZN.js → chunk-ZMOMPX2Z.js} +12 -10
  119. package/node_modules/pi-lens/dist/{chunk-C2AUYXQH.js → chunk-ZOEYVXSV.js} +4 -4
  120. package/node_modules/pi-lens/dist/{chunk-TLGFBM3F.js → chunk-ZZUFZUQZ.js} +68 -64
  121. package/node_modules/pi-lens/dist/index.js +30113 -28398
  122. package/node_modules/pi-lens/dist/mcp/analyze-cli.js +8 -8
  123. package/node_modules/pi-lens/dist/mcp/cli.js +37 -37
  124. package/node_modules/pi-lens/dist/mcp/server.js +257 -158
  125. package/node_modules/pi-lens/dist/mcp/worker.js +55 -55
  126. package/node_modules/pi-lens/dist/probes/installer.js +19 -19
  127. package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +2 -2
  128. package/node_modules/pi-lens/docs/configuration.md +9 -2
  129. package/node_modules/pi-lens/docs/custom-rules.md +25 -2
  130. package/node_modules/pi-lens/docs/environment-variables.md +34 -6
  131. package/node_modules/pi-lens/docs/features.md +37 -1
  132. package/node_modules/pi-lens/docs/globalconfig.md +1 -1
  133. package/node_modules/pi-lens/docs/lsp-capability-matrix.md +2 -1
  134. package/node_modules/pi-lens/docs/lsp-idle-eviction.md +1 -1
  135. package/node_modules/pi-lens/docs/pi-lens-fixer.md +9 -5
  136. package/node_modules/pi-lens/docs/pi-lens-merge-policy.md +43 -1
  137. package/node_modules/pi-lens/docs/pi-lens-monitor.md +3 -1
  138. package/node_modules/pi-lens/docs/pi-lens-reviewer.md +4 -3
  139. package/node_modules/pi-lens/docs/schema/pi-lens-config-v1.json +530 -0
  140. package/node_modules/pi-lens/docs/servercapabilities.md +4 -1
  141. package/node_modules/pi-lens/docs/word-index.md +6 -0
  142. package/node_modules/pi-lens/package.json +1 -1
  143. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
  144. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
  145. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
  146. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
  147. package/node_modules/pi-lens/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
  148. package/node_modules/pi-lens/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
  149. package/node_modules/pi-provider-qoder/README.md +140 -0
  150. package/node_modules/pi-provider-qoder/dist/index.js +10249 -0
  151. package/node_modules/pi-provider-qoder/package.json +57 -0
  152. package/node_modules/pi-web-access/CHANGELOG.md +28 -0
  153. package/node_modules/pi-web-access/README.md +10 -6
  154. package/node_modules/pi-web-access/ceramic.ts +219 -0
  155. package/node_modules/pi-web-access/curator-page.ts +3 -1
  156. package/node_modules/pi-web-access/curator-server.ts +1 -0
  157. package/node_modules/pi-web-access/dist/index.js +846 -588
  158. package/node_modules/pi-web-access/dist/mcp-cli.js +725 -516
  159. package/node_modules/pi-web-access/gemini-search.ts +8 -4
  160. package/node_modules/pi-web-access/github-extract.ts +34 -2
  161. package/node_modules/pi-web-access/index.ts +72 -30
  162. package/node_modules/pi-web-access/openai-search.ts +3 -3
  163. package/node_modules/pi-web-access/package.json +2 -2
  164. package/node_modules/pi-web-access/page-query.ts +6 -9
  165. package/node_modules/pi-web-access/parallel-mcp.ts +2 -0
  166. package/node_modules/pi-web-access/query-rewrite.ts +2 -2
  167. package/node_modules/pi-web-access/storage.ts +49 -0
  168. package/node_modules/pi-web-access/summary-review.ts +7 -6
  169. package/node_modules/pi-web-access/utils.ts +21 -6
  170. package/node_modules/pi-web-access/web-tool-core.ts +1 -0
  171. package/package.json +10 -12
  172. package/node_modules/pi-lens/dist/chunk-54B42YRX.js +0 -27
  173. package/node_modules/pi-lens/dist/chunk-CGGAIP7J.js +0 -29
  174. package/node_modules/pi-lens/dist/chunk-HMFXILPV.js +0 -83
  175. package/node_modules/pi-lens/dist/chunk-T6D4Q4AQ.js +0 -54
  176. package/node_modules/pi-web-access/opencode-session-headers.ts +0 -24
  177. package/node_modules/remote-pi/LICENSE +0 -21
  178. package/node_modules/remote-pi/README.md +0 -675
  179. package/node_modules/remote-pi/dist/actions/handlers.d.ts +0 -122
  180. package/node_modules/remote-pi/dist/actions/handlers.js +0 -160
  181. package/node_modules/remote-pi/dist/actions/handlers.js.map +0 -1
  182. package/node_modules/remote-pi/dist/actions/registry.d.ts +0 -39
  183. package/node_modules/remote-pi/dist/actions/registry.js +0 -58
  184. package/node_modules/remote-pi/dist/actions/registry.js.map +0 -1
  185. package/node_modules/remote-pi/dist/bin/supervisord.d.ts +0 -2
  186. package/node_modules/remote-pi/dist/bin/supervisord.js +0 -86
  187. package/node_modules/remote-pi/dist/bin/supervisord.js.map +0 -1
  188. package/node_modules/remote-pi/dist/commands/builtin_mirror.d.ts +0 -58
  189. package/node_modules/remote-pi/dist/commands/builtin_mirror.js +0 -71
  190. package/node_modules/remote-pi/dist/commands/builtin_mirror.js.map +0 -1
  191. package/node_modules/remote-pi/dist/commands/list_commands.d.ts +0 -60
  192. package/node_modules/remote-pi/dist/commands/list_commands.js +0 -73
  193. package/node_modules/remote-pi/dist/commands/list_commands.js.map +0 -1
  194. package/node_modules/remote-pi/dist/config.d.ts +0 -62
  195. package/node_modules/remote-pi/dist/config.js +0 -115
  196. package/node_modules/remote-pi/dist/config.js.map +0 -1
  197. package/node_modules/remote-pi/dist/daemon/client.d.ts +0 -20
  198. package/node_modules/remote-pi/dist/daemon/client.js +0 -131
  199. package/node_modules/remote-pi/dist/daemon/client.js.map +0 -1
  200. package/node_modules/remote-pi/dist/daemon/control_protocol.d.ts +0 -176
  201. package/node_modules/remote-pi/dist/daemon/control_protocol.js +0 -63
  202. package/node_modules/remote-pi/dist/daemon/control_protocol.js.map +0 -1
  203. package/node_modules/remote-pi/dist/daemon/cron_log.d.ts +0 -45
  204. package/node_modules/remote-pi/dist/daemon/cron_log.js +0 -72
  205. package/node_modules/remote-pi/dist/daemon/cron_log.js.map +0 -1
  206. package/node_modules/remote-pi/dist/daemon/cron_registry.d.ts +0 -80
  207. package/node_modules/remote-pi/dist/daemon/cron_registry.js +0 -194
  208. package/node_modules/remote-pi/dist/daemon/cron_registry.js.map +0 -1
  209. package/node_modules/remote-pi/dist/daemon/id.d.ts +0 -24
  210. package/node_modules/remote-pi/dist/daemon/id.js +0 -36
  211. package/node_modules/remote-pi/dist/daemon/id.js.map +0 -1
  212. package/node_modules/remote-pi/dist/daemon/install.d.ts +0 -170
  213. package/node_modules/remote-pi/dist/daemon/install.js +0 -547
  214. package/node_modules/remote-pi/dist/daemon/install.js.map +0 -1
  215. package/node_modules/remote-pi/dist/daemon/registry.d.ts +0 -63
  216. package/node_modules/remote-pi/dist/daemon/registry.js +0 -153
  217. package/node_modules/remote-pi/dist/daemon/registry.js.map +0 -1
  218. package/node_modules/remote-pi/dist/daemon/rpc_child.d.ts +0 -194
  219. package/node_modules/remote-pi/dist/daemon/rpc_child.js +0 -389
  220. package/node_modules/remote-pi/dist/daemon/rpc_child.js.map +0 -1
  221. package/node_modules/remote-pi/dist/daemon/supervisor.d.ts +0 -93
  222. package/node_modules/remote-pi/dist/daemon/supervisor.js +0 -596
  223. package/node_modules/remote-pi/dist/daemon/supervisor.js.map +0 -1
  224. package/node_modules/remote-pi/dist/extension_ui_bridge.d.ts +0 -26
  225. package/node_modules/remote-pi/dist/extension_ui_bridge.js +0 -341
  226. package/node_modules/remote-pi/dist/extension_ui_bridge.js.map +0 -1
  227. package/node_modules/remote-pi/dist/index.d.ts +0 -213
  228. package/node_modules/remote-pi/dist/index.js +0 -4996
  229. package/node_modules/remote-pi/dist/index.js.map +0 -1
  230. package/node_modules/remote-pi/dist/mcp/mesh_result.d.ts +0 -10
  231. package/node_modules/remote-pi/dist/mcp/mesh_result.js +0 -42
  232. package/node_modules/remote-pi/dist/mcp/mesh_result.js.map +0 -1
  233. package/node_modules/remote-pi/dist/mcp/mesh_server.d.ts +0 -16
  234. package/node_modules/remote-pi/dist/mcp/mesh_server.js +0 -327
  235. package/node_modules/remote-pi/dist/mcp/mesh_server.js.map +0 -1
  236. package/node_modules/remote-pi/dist/mesh/canonical.d.ts +0 -30
  237. package/node_modules/remote-pi/dist/mesh/canonical.js +0 -61
  238. package/node_modules/remote-pi/dist/mesh/canonical.js.map +0 -1
  239. package/node_modules/remote-pi/dist/mesh/client.d.ts +0 -18
  240. package/node_modules/remote-pi/dist/mesh/client.js +0 -125
  241. package/node_modules/remote-pi/dist/mesh/client.js.map +0 -1
  242. package/node_modules/remote-pi/dist/mesh/encoding.d.ts +0 -38
  243. package/node_modules/remote-pi/dist/mesh/encoding.js +0 -216
  244. package/node_modules/remote-pi/dist/mesh/encoding.js.map +0 -1
  245. package/node_modules/remote-pi/dist/mesh/self_revoke.d.ts +0 -73
  246. package/node_modules/remote-pi/dist/mesh/self_revoke.js +0 -401
  247. package/node_modules/remote-pi/dist/mesh/self_revoke.js.map +0 -1
  248. package/node_modules/remote-pi/dist/mesh/siblings.d.ts +0 -49
  249. package/node_modules/remote-pi/dist/mesh/siblings.js +0 -159
  250. package/node_modules/remote-pi/dist/mesh/siblings.js.map +0 -1
  251. package/node_modules/remote-pi/dist/mesh/types.d.ts +0 -34
  252. package/node_modules/remote-pi/dist/mesh/types.js +0 -11
  253. package/node_modules/remote-pi/dist/mesh/types.js.map +0 -1
  254. package/node_modules/remote-pi/dist/mesh/verify.d.ts +0 -17
  255. package/node_modules/remote-pi/dist/mesh/verify.js +0 -86
  256. package/node_modules/remote-pi/dist/mesh/verify.js.map +0 -1
  257. package/node_modules/remote-pi/dist/pairing/crypto.d.ts +0 -8
  258. package/node_modules/remote-pi/dist/pairing/crypto.js +0 -22
  259. package/node_modules/remote-pi/dist/pairing/crypto.js.map +0 -1
  260. package/node_modules/remote-pi/dist/pairing/handshake.d.ts +0 -28
  261. package/node_modules/remote-pi/dist/pairing/handshake.js +0 -113
  262. package/node_modules/remote-pi/dist/pairing/handshake.js.map +0 -1
  263. package/node_modules/remote-pi/dist/pairing/noise-sha256.d.ts +0 -16
  264. package/node_modules/remote-pi/dist/pairing/noise-sha256.js +0 -103
  265. package/node_modules/remote-pi/dist/pairing/noise-sha256.js.map +0 -1
  266. package/node_modules/remote-pi/dist/pairing/qr.d.ts +0 -59
  267. package/node_modules/remote-pi/dist/pairing/qr.js +0 -125
  268. package/node_modules/remote-pi/dist/pairing/qr.js.map +0 -1
  269. package/node_modules/remote-pi/dist/pairing/storage.d.ts +0 -120
  270. package/node_modules/remote-pi/dist/pairing/storage.js +0 -604
  271. package/node_modules/remote-pi/dist/pairing/storage.js.map +0 -1
  272. package/node_modules/remote-pi/dist/protocol/codec.d.ts +0 -7
  273. package/node_modules/remote-pi/dist/protocol/codec.js +0 -49
  274. package/node_modules/remote-pi/dist/protocol/codec.js.map +0 -1
  275. package/node_modules/remote-pi/dist/protocol/types.d.ts +0 -393
  276. package/node_modules/remote-pi/dist/protocol/types.js +0 -2
  277. package/node_modules/remote-pi/dist/protocol/types.js.map +0 -1
  278. package/node_modules/remote-pi/dist/rooms.d.ts +0 -29
  279. package/node_modules/remote-pi/dist/rooms.js +0 -57
  280. package/node_modules/remote-pi/dist/rooms.js.map +0 -1
  281. package/node_modules/remote-pi/dist/session/address.d.ts +0 -49
  282. package/node_modules/remote-pi/dist/session/address.js +0 -58
  283. package/node_modules/remote-pi/dist/session/address.js.map +0 -1
  284. package/node_modules/remote-pi/dist/session/agent_bridge.d.ts +0 -55
  285. package/node_modules/remote-pi/dist/session/agent_bridge.js +0 -146
  286. package/node_modules/remote-pi/dist/session/agent_bridge.js.map +0 -1
  287. package/node_modules/remote-pi/dist/session/bridge.d.ts +0 -37
  288. package/node_modules/remote-pi/dist/session/bridge.js +0 -130
  289. package/node_modules/remote-pi/dist/session/bridge.js.map +0 -1
  290. package/node_modules/remote-pi/dist/session/broker.d.ts +0 -189
  291. package/node_modules/remote-pi/dist/session/broker.js +0 -507
  292. package/node_modules/remote-pi/dist/session/broker.js.map +0 -1
  293. package/node_modules/remote-pi/dist/session/broker_remote.d.ts +0 -74
  294. package/node_modules/remote-pi/dist/session/broker_remote.js +0 -583
  295. package/node_modules/remote-pi/dist/session/broker_remote.js.map +0 -1
  296. package/node_modules/remote-pi/dist/session/cwd_lock.d.ts +0 -33
  297. package/node_modules/remote-pi/dist/session/cwd_lock.js +0 -126
  298. package/node_modules/remote-pi/dist/session/cwd_lock.js.map +0 -1
  299. package/node_modules/remote-pi/dist/session/envelope.d.ts +0 -33
  300. package/node_modules/remote-pi/dist/session/envelope.js +0 -117
  301. package/node_modules/remote-pi/dist/session/envelope.js.map +0 -1
  302. package/node_modules/remote-pi/dist/session/global_config.d.ts +0 -33
  303. package/node_modules/remote-pi/dist/session/global_config.js +0 -73
  304. package/node_modules/remote-pi/dist/session/global_config.js.map +0 -1
  305. package/node_modules/remote-pi/dist/session/ipc.d.ts +0 -27
  306. package/node_modules/remote-pi/dist/session/ipc.js +0 -22
  307. package/node_modules/remote-pi/dist/session/ipc.js.map +0 -1
  308. package/node_modules/remote-pi/dist/session/leader_election.d.ts +0 -32
  309. package/node_modules/remote-pi/dist/session/leader_election.js +0 -106
  310. package/node_modules/remote-pi/dist/session/leader_election.js.map +0 -1
  311. package/node_modules/remote-pi/dist/session/local_config.d.ts +0 -55
  312. package/node_modules/remote-pi/dist/session/local_config.js +0 -157
  313. package/node_modules/remote-pi/dist/session/local_config.js.map +0 -1
  314. package/node_modules/remote-pi/dist/session/mesh_message.d.ts +0 -20
  315. package/node_modules/remote-pi/dist/session/mesh_message.js +0 -28
  316. package/node_modules/remote-pi/dist/session/mesh_message.js.map +0 -1
  317. package/node_modules/remote-pi/dist/session/mesh_node.d.ts +0 -116
  318. package/node_modules/remote-pi/dist/session/mesh_node.js +0 -573
  319. package/node_modules/remote-pi/dist/session/mesh_node.js.map +0 -1
  320. package/node_modules/remote-pi/dist/session/peer.d.ts +0 -139
  321. package/node_modules/remote-pi/dist/session/peer.js +0 -451
  322. package/node_modules/remote-pi/dist/session/peer.js.map +0 -1
  323. package/node_modules/remote-pi/dist/session/peer_inventory.d.ts +0 -13
  324. package/node_modules/remote-pi/dist/session/peer_inventory.js +0 -48
  325. package/node_modules/remote-pi/dist/session/peer_inventory.js.map +0 -1
  326. package/node_modules/remote-pi/dist/session/peer_limits.d.ts +0 -9
  327. package/node_modules/remote-pi/dist/session/peer_limits.js +0 -21
  328. package/node_modules/remote-pi/dist/session/peer_limits.js.map +0 -1
  329. package/node_modules/remote-pi/dist/session/setup_wizard.d.ts +0 -39
  330. package/node_modules/remote-pi/dist/session/setup_wizard.js +0 -63
  331. package/node_modules/remote-pi/dist/session/setup_wizard.js.map +0 -1
  332. package/node_modules/remote-pi/dist/session/tool_gate.d.ts +0 -5
  333. package/node_modules/remote-pi/dist/session/tool_gate.js +0 -11
  334. package/node_modules/remote-pi/dist/session/tool_gate.js.map +0 -1
  335. package/node_modules/remote-pi/dist/session/tools.d.ts +0 -24
  336. package/node_modules/remote-pi/dist/session/tools.js +0 -252
  337. package/node_modules/remote-pi/dist/session/tools.js.map +0 -1
  338. package/node_modules/remote-pi/dist/session/wizard.d.ts +0 -13
  339. package/node_modules/remote-pi/dist/session/wizard.js +0 -20
  340. package/node_modules/remote-pi/dist/session/wizard.js.map +0 -1
  341. package/node_modules/remote-pi/dist/settings.d.ts +0 -15
  342. package/node_modules/remote-pi/dist/settings.js +0 -52
  343. package/node_modules/remote-pi/dist/settings.js.map +0 -1
  344. package/node_modules/remote-pi/dist/transport/peer_channel.d.ts +0 -37
  345. package/node_modules/remote-pi/dist/transport/peer_channel.js +0 -98
  346. package/node_modules/remote-pi/dist/transport/peer_channel.js.map +0 -1
  347. package/node_modules/remote-pi/dist/transport/pi_forward_client.d.ts +0 -29
  348. package/node_modules/remote-pi/dist/transport/pi_forward_client.js +0 -62
  349. package/node_modules/remote-pi/dist/transport/pi_forward_client.js.map +0 -1
  350. package/node_modules/remote-pi/dist/transport/relay_client.d.ts +0 -91
  351. package/node_modules/remote-pi/dist/transport/relay_client.js +0 -206
  352. package/node_modules/remote-pi/dist/transport/relay_client.js.map +0 -1
  353. package/node_modules/remote-pi/dist/ui/footer.d.ts +0 -32
  354. package/node_modules/remote-pi/dist/ui/footer.js +0 -34
  355. package/node_modules/remote-pi/dist/ui/footer.js.map +0 -1
  356. package/node_modules/remote-pi/docs/daemon.md +0 -289
  357. package/node_modules/remote-pi/package.json +0 -92
  358. package/node_modules/remote-pi/service-templates/launchd.plist.template +0 -35
  359. package/node_modules/remote-pi/service-templates/systemd.service.template +0 -19
  360. package/node_modules/remote-pi/service-templates/task-launcher.vbs.template +0 -10
  361. package/node_modules/remote-pi/service-templates/task-scheduler.xml.template +0 -38
  362. package/node_modules/remote-pi/skills/agent-network/SKILL.md +0 -310
@@ -2,74 +2,74 @@
2
2
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
3
3
  import {
4
4
  analyzeFile
5
- } from "../chunk-TLGFBM3F.js";
6
- import "../chunk-C2AUYXQH.js";
7
- import "../chunk-I3R7GKDR.js";
5
+ } from "../chunk-ZZUFZUQZ.js";
6
+ import "../chunk-ZOEYVXSV.js";
7
+ import "../chunk-KJN4IOEJ.js";
8
8
  import "../chunk-FC4RP4I2.js";
9
- import "../chunk-DFVMIKMQ.js";
10
- import "../chunk-TO6WL3GM.js";
11
- import "../chunk-7F72PXY2.js";
12
- import "../chunk-RPD5K5NC.js";
13
- import "../chunk-ZMOL6RQC.js";
14
- import "../chunk-I7SPGOWI.js";
15
- import "../chunk-AS44CFQ4.js";
16
- import "../chunk-7FBF7NPR.js";
17
- import "../chunk-HHYAELLJ.js";
18
- import "../chunk-V5PXFSZK.js";
19
- import "../chunk-YLF3PPT5.js";
20
- import "../chunk-JOLITGCC.js";
21
- import "../chunk-E2WFBRHM.js";
22
- import "../chunk-6VCD4VKZ.js";
23
- import "../chunk-F3P7VQ7H.js";
24
- import "../chunk-LSMJ6KBE.js";
9
+ import "../chunk-YLN4K6WD.js";
10
+ import "../chunk-J3FZR3YY.js";
11
+ import "../chunk-5JHXUETW.js";
12
+ import "../chunk-3MRXIJ6I.js";
13
+ import "../chunk-TA5L5KWQ.js";
14
+ import "../chunk-FGALODG3.js";
15
+ import "../chunk-OC7LYAU5.js";
16
+ import "../chunk-NFXP47RV.js";
17
+ import "../chunk-MGIWSROG.js";
18
+ import "../chunk-WSEWKCXU.js";
19
+ import "../chunk-MQA2YBAH.js";
20
+ import "../chunk-TQFBZVCG.js";
21
+ import "../chunk-WATC3IQR.js";
22
+ import "../chunk-OYOB3ZFG.js";
23
+ import "../chunk-XHSCVSOL.js";
24
+ import "../chunk-V5MEBST3.js";
25
25
  import "../chunk-3MED75HT.js";
26
- import "../chunk-3I5QFT3N.js";
27
- import "../chunk-TVN5N6GY.js";
28
- import "../chunk-ARFCXG7S.js";
29
- import "../chunk-OAXNDZJ7.js";
26
+ import "../chunk-IMSQR4WO.js";
27
+ import "../chunk-MTDRLSI7.js";
28
+ import "../chunk-OZJINN4O.js";
29
+ import "../chunk-3JSEWUWI.js";
30
30
  import "../chunk-XIMYZ3JA.js";
31
- import "../chunk-B3I2UUT4.js";
32
- import "../chunk-DIULIWKU.js";
33
- import "../chunk-VDBPVIKD.js";
31
+ import "../chunk-IQZXOZ7S.js";
32
+ import "../chunk-LNOMA3MP.js";
33
+ import "../chunk-U52SAGRM.js";
34
34
  import "../chunk-5W3R6LFT.js";
35
- import "../chunk-LW6XKDZQ.js";
35
+ import "../chunk-UEAHAMEI.js";
36
36
  import "../chunk-Z54ZSOBZ.js";
37
- import "../chunk-TGPXLY2J.js";
37
+ import "../chunk-KJCWXUUS.js";
38
38
  import "../chunk-QOZXJ4NA.js";
39
- import "../chunk-V7R425XG.js";
40
- import "../chunk-PAK6IDME.js";
41
- import "../chunk-GUOGVTCQ.js";
42
- import "../chunk-AJVLWNFN.js";
43
- import "../chunk-YGVYKNSN.js";
44
- import "../chunk-LNAKEO63.js";
39
+ import "../chunk-6XX5HCLK.js";
40
+ import "../chunk-S6AMWKPC.js";
41
+ import "../chunk-F5VLZHUW.js";
42
+ import "../chunk-AXKPQ6ZI.js";
43
+ import "../chunk-7BX5DWSA.js";
44
+ import "../chunk-IUKPRZER.js";
45
45
  import "../chunk-Z3CCVDUB.js";
46
- import "../chunk-PWFHBTSF.js";
46
+ import "../chunk-XGUL4SLQ.js";
47
47
  import "../chunk-2BEMIWEW.js";
48
- import "../chunk-OQGFCZJ4.js";
49
- import "../chunk-RUOG5D2C.js";
50
- import "../chunk-U3VGR4VU.js";
51
- import "../chunk-NTUJEGDZ.js";
52
- import "../chunk-EOKRQ3SA.js";
53
- import "../chunk-WONERJTP.js";
54
- import "../chunk-22AVIGXS.js";
55
- import "../chunk-GVXA6CCE.js";
56
- import "../chunk-6QIUX4EP.js";
57
- import "../chunk-VHQLPIRJ.js";
58
- import "../chunk-VN2AXLEX.js";
48
+ import "../chunk-LD7WFTRX.js";
49
+ import "../chunk-IUR76K6A.js";
50
+ import "../chunk-T4QZ6FEH.js";
51
+ import "../chunk-D6YF5HKX.js";
52
+ import "../chunk-CMU4RMJB.js";
53
+ import "../chunk-O7HZX7CA.js";
54
+ import "../chunk-VYKKMYVT.js";
55
+ import "../chunk-BNKLYOOO.js";
56
+ import "../chunk-USHG4DLH.js";
57
+ import "../chunk-H5EV3VMF.js";
58
+ import "../chunk-T54VJRAD.js";
59
59
  import "../chunk-BW5KFIQC.js";
60
60
  import "../chunk-QYF5S6P6.js";
61
- import "../chunk-5ZEJHV35.js";
62
- import "../chunk-DQ2NZ7C4.js";
63
- import "../chunk-VNMT7C64.js";
61
+ import "../chunk-64LU2OVH.js";
62
+ import "../chunk-N2IRDBZI.js";
63
+ import "../chunk-Z6BB4JLQ.js";
64
64
  import "../chunk-2EECBNC5.js";
65
- import "../chunk-N3YQJI6O.js";
66
- import "../chunk-O6TQT6RI.js";
67
- import "../chunk-5THXD6X5.js";
68
- import "../chunk-UK3CMEAL.js";
65
+ import "../chunk-7ELY2CSM.js";
66
+ import "../chunk-34OCDWOS.js";
67
+ import "../chunk-3PNFWVHT.js";
68
+ import "../chunk-VSMJK3ZJ.js";
69
69
  import "../chunk-LJDODBBZ.js";
70
- import "../chunk-NMABWBZN.js";
70
+ import "../chunk-UGSMCQ4D.js";
71
71
  import "../chunk-ABBOA7UD.js";
72
- import "../chunk-Q5U6FMDI.js";
72
+ import "../chunk-G3RLJYA2.js";
73
73
  import "../chunk-NXL4FFQQ.js";
74
74
 
75
75
  // dist/mcp/worker.js
@@ -53,30 +53,30 @@ import {
53
53
  verifyNpmPackageEntry,
54
54
  verifyToolBinary,
55
55
  wasLastResolveTransient
56
- } from "../chunk-OQGFCZJ4.js";
57
- import "../chunk-RUOG5D2C.js";
58
- import "../chunk-U3VGR4VU.js";
59
- import "../chunk-NTUJEGDZ.js";
60
- import "../chunk-EOKRQ3SA.js";
61
- import "../chunk-WONERJTP.js";
62
- import "../chunk-22AVIGXS.js";
63
- import "../chunk-GVXA6CCE.js";
64
- import "../chunk-6QIUX4EP.js";
65
- import "../chunk-VHQLPIRJ.js";
66
- import "../chunk-VN2AXLEX.js";
56
+ } from "../chunk-LD7WFTRX.js";
57
+ import "../chunk-IUR76K6A.js";
58
+ import "../chunk-T4QZ6FEH.js";
59
+ import "../chunk-D6YF5HKX.js";
60
+ import "../chunk-CMU4RMJB.js";
61
+ import "../chunk-O7HZX7CA.js";
62
+ import "../chunk-VYKKMYVT.js";
63
+ import "../chunk-BNKLYOOO.js";
64
+ import "../chunk-USHG4DLH.js";
65
+ import "../chunk-H5EV3VMF.js";
66
+ import "../chunk-T54VJRAD.js";
67
67
  import "../chunk-BW5KFIQC.js";
68
68
  import "../chunk-QYF5S6P6.js";
69
- import "../chunk-5ZEJHV35.js";
70
- import "../chunk-DQ2NZ7C4.js";
71
- import "../chunk-VNMT7C64.js";
69
+ import "../chunk-64LU2OVH.js";
70
+ import "../chunk-N2IRDBZI.js";
71
+ import "../chunk-Z6BB4JLQ.js";
72
72
  import "../chunk-2EECBNC5.js";
73
- import "../chunk-N3YQJI6O.js";
74
- import "../chunk-O6TQT6RI.js";
75
- import "../chunk-5THXD6X5.js";
76
- import "../chunk-UK3CMEAL.js";
73
+ import "../chunk-7ELY2CSM.js";
74
+ import "../chunk-34OCDWOS.js";
75
+ import "../chunk-3PNFWVHT.js";
76
+ import "../chunk-VSMJK3ZJ.js";
77
77
  import "../chunk-LJDODBBZ.js";
78
78
  import "../chunk-ABBOA7UD.js";
79
- import "../chunk-Q5U6FMDI.js";
79
+ import "../chunk-G3RLJYA2.js";
80
80
  import "../chunk-NXL4FFQQ.js";
81
81
  export {
82
82
  GITHUB_TOOLS,
@@ -231,7 +231,7 @@ See [`docs/custom-rules.md`](custom-rules.md) to add your own. Rule sources: `ru
231
231
  | `prefer-structured-clone-js` | warning | no | pi-lens | Use structuredClone() instead of JSON.parse(JSON.stringify()) for deep cloning |
232
232
  | `strict-equality-js` | warning | yes | pi-lens | Use === instead of == |
233
233
  | `strict-inequality-js` | warning | yes | pi-lens | Use !== instead of != |
234
- | `throw-new-error-js` | error | no | pi-lens | Use new Error() not Error() — explicit construction is clearer |
234
+ | `throw-new-error-js` | warning | no | pi-lens | Use new Error() not Error() — explicit construction is clearer |
235
235
  | `unchecked-throwing-call-js` | error | no | pi-lens | $CALL without try/catch — throws on invalid input |
236
236
  | `weak-rsa-key-js` | error | no | pi-lens | Weak RSA key size — use at least 2048 bits |
237
237
 
@@ -547,7 +547,7 @@ See [`docs/custom-rules.md`](custom-rules.md) to add your own. Rule sources: `ru
547
547
  | `strict-equality` | warning | yes | pi-lens | Use === instead of == |
548
548
  | `strict-inequality` | warning | yes | pi-lens | Use !== instead of != |
549
549
  | `switch-without-default` | warning | no | pi-lens | switch has no default clause — values matching no case are silently ignored; add a default (even one that throws) |
550
- | `throw-new-error` | error | no | pi-lens | Use new Error() not Error() — explicit construction is clearer |
550
+ | `throw-new-error` | warning | no | pi-lens | Use new Error() not Error() — explicit construction is clearer |
551
551
  | `ts-array-concat-spread` | warning | no | pi-lens | arr.concat([...items]) - use arr.push(...items) or [...arr, ...items] |
552
552
  | `ts-array-every-some` | warning | no | pi-lens | arr.map(x => x.prop).every(Boolean) - use arr.every(x => !!x.prop) |
553
553
  | `ts-boolean-return-if-else` | warning | no | pi-lens | if/else returning true/false - simplify to return the condition directly |
@@ -10,6 +10,14 @@ There are **two** pi-lens config files:
10
10
  Both files have the same shape, with one exception noted below the example:
11
11
  everything LSP-related lives under an `lsp` namespace inside them.
12
12
 
13
+ The editor-facing JSON Schema is published at
14
+ [`docs/schema/pi-lens-config-v1.json`](schema/pi-lens-config-v1.json). LSP
15
+ server entries also accept canonical argv arrays, optional `name` (defaulting
16
+ to the map id), `enabled`, `role` (`language` or `auxiliary`), `args`, and
17
+ `rootMarkers`. These new fields are experimental; reserved role, root-policy,
18
+ and timing semantics are inert until their planned catalog slices land, so this
19
+ schema slice does not change server launch behavior.
20
+
13
21
  ```jsonc
14
22
  {
15
23
  "$schema": "https://raw.githubusercontent.com/apmantza/pi-lens/master/docs/schema/pi-lens-config-v1.json",
@@ -23,8 +31,7 @@ everything LSP-related lives under an `lsp` namespace inside them.
23
31
  "my-server": {
24
32
  "name": "My Custom LSP",
25
33
  "extensions": [".myext"],
26
- "command": "my-lsp-server",
27
- "args": ["--stdio"],
34
+ "command": ["my-lsp-server", "--stdio"],
28
35
  "covers": ["shellcheck"]
29
36
  }
30
37
  },
@@ -1,6 +1,6 @@
1
1
  # Custom Rules
2
2
 
3
- pi-lens picks up project-local rules automatically alongside its built-ins.
3
+ pi-lens picks up project-local and user-level rules automatically alongside its built-ins.
4
4
  Drop YAML files in the right directory and they are active on the next file dispatch — no config required.
5
5
 
6
6
  > For the full list of bundled rules per language, see the generated catalogs:
@@ -20,7 +20,30 @@ your-project/
20
20
  my-rule.yml ← ast-grep rule, overrides built-in with same id
21
21
  ```
22
22
 
23
- Project ast-grep rules are fingerprinted by relative path and contents, so in-place edits, renames, additions, and removals take effect within one tool call even when mtimes are preserved. Tree-sitter rules retain their directory-mtime cache.
23
+ Both rule families are fingerprinted by relative path and contents, so in-place edits, renames, additions, and removals are picked up without a restart, even when mtimes are preserved.
24
+
25
+ ### When an edit takes effect
26
+
27
+ A per-file dispatch reads the rule corpus fresh every time: its cache key is a
28
+ content fingerprint of every rule file the language's rule set is built from,
29
+ so an edit, addition, or removal is live on the next dispatched file.
30
+
31
+ Whole-project surfaces — a project scan and a structural search — reuse a
32
+ corpus fingerprint computed once per turn, so a rule edit lands on the next
33
+ turn, or immediately if any file is dispatched in between (a dispatch
34
+ republishes the fresh fingerprint for the rest of that turn). This is what
35
+ keeps a warm scan at the cost of a string comparison instead of re-reading
36
+ every rule file on every call.
37
+
38
+ ### User-level rules
39
+
40
+ Rules shared across projects live under the relocatable machine-data directory:
41
+ `<PI_LENS_HOME>/rules/` (or the platform default pi-lens directory when
42
+ `PI_LENS_HOME` is unset). Use the same `tree-sitter-queries/` and
43
+ `ast-grep-rules/` layout shown above. Precedence is project > user > bundled;
44
+ when rule IDs collide, the higher tier wins and the lower definition is
45
+ shadowed from execution. User rules are part of the same fingerprints as
46
+ project rules, so they follow the same timing above.
24
47
 
25
48
  ---
26
49
 
@@ -104,12 +104,14 @@ without changing the steady-state behaviour of an interactive session.
104
104
 
105
105
  ### `PI_LENS_STARTUP_SCAN_VERDICT_TTL_MS`
106
106
 
107
- How long (ms) a persisted `too-many-source-files` startup-scan verdict is
108
- trusted before the source-file count is re-walked (default 24h). The verdict
109
- is cached in the project snapshot so repeated `pi -p` runs in a very large
110
- repo skip the counting walk entirely; a repo that shrinks below the threshold
111
- recovers when the TTL expires. Other verdicts use content-based freshness and
112
- ignore this setting.
107
+ How long (ms) a persisted size-skip startup-scan verdict (`too-many-source-files`
108
+ or `too-many-entries`) is trusted before the project is re-walked (default
109
+ 24h). The verdict is cached in the project snapshot so repeated `pi -p` runs in
110
+ a very large repo skip the counting walk entirely; a repo that shrinks below
111
+ the threshold recovers when the TTL expires. The verdict also records the
112
+ bounds that produced it (`maxProjectFiles`, `PI_LENS_STARTUP_SCAN_MAX_ENTRIES`),
113
+ so raising either one invalidates it at once and the next session re-walks.
114
+ Other verdicts use content-based freshness and ignore this setting.
113
115
 
114
116
  ## Scale and limits
115
117
 
@@ -144,6 +146,24 @@ Minimum wall-clock budget (ms) for every dispatch runner; the effective timeout
144
146
  is `max(runner budget, floor)`. **Default:** `0` (no floor). Also settable via
145
147
  the `dispatch.runnerTimeoutFloorMs` config key, which wins when both are set.
146
148
 
149
+ ### `PI_LENS_WORD_INDEX_MEMO_BACKSTOP_MS`
150
+
151
+ Backstop (ms) for the word index's serialized memo, which is also its
152
+ incremental-serialize cache: it is kept while a run edits (so each per-edit
153
+ persist stays O(dirty tokens)) and released once per run at `agent_settled`.
154
+ The backstop releases it when no persist has refreshed it for this long, for a
155
+ host that never emits `agent_settled` and for a stalled run. It is re-armed by
156
+ every serialize and never keeps the process alive. **Default:** `600000` (10
157
+ minutes). `0`, a negative or a non-numeric value means the default (a backstop
158
+ that fired at once would switch the memo off), and a value above `2147483647`
159
+ (about 24.8 days, Node's largest timer delay) is clamped to it. The default is
160
+ deliberately conservative: the maintainer's
161
+ `latency.log` held only two intra-run gaps between `project_snapshot_persist`
162
+ records (5.8 s), too few to derive a percentile. A release leaves one
163
+ `word_index_memo_released` row in `latency.log` (`trigger`: `settle`,
164
+ `post_settle_persist` or `backstop`). Releasing costs the next persist a full
165
+ re-serialize.
166
+
147
167
  ## Install control
148
168
 
149
169
  ### `PI_LENS_DISABLE_LSP_INSTALL`
@@ -268,6 +288,14 @@ nightly measurement behind each declaration, is in
268
288
  When unset or invalid, `PI_LENS_TS_IDLE_EVICT_MS` (below) is read.
269
289
  **Default:** 20 minutes (`1200000`).
270
290
 
291
+ ### `PI_LENS_EPHEMERAL_LSP_IDLE_EVICT_MS`
292
+
293
+ Idle window (ms) for language-service clients whose workspace is inside a
294
+ temporary or ephemeral Git checkout. This overrides the shared window above
295
+ for those roots; when unset or invalid, the default is 60 seconds (`60000`).
296
+ The nightly idle-eviction measurement temporarily sets this variable alongside
297
+ `PI_LENS_LSP_IDLE_EVICT_MS` so both root policies are measured.
298
+
271
299
  ### `PI_LENS_TS_IDLE_EVICT_MS`
272
300
 
273
301
  The original, TypeScript-named spelling of the same window, retained for
@@ -183,7 +183,7 @@ pi-lens MCP server expose the same shape to Claude Code / any MCP client.
183
183
 
184
184
  At `turn_end`, pi-lens writes `<project-data-dir>/cache/actionable-warnings.json` summarizing fixable warnings introduced by the current turn. This powers the optional conservative autofix at `agent_end`.
185
185
 
186
- `<project-data-dir>` is whatever `getProjectDataDir(cwd)` resolves to: `<project>/.pi-lens` only when that legacy directory already exists, otherwise `~/.pi-lens/projects/<project-slug>` (or a `PILENS_DATA_DIR` location). The turn-end advisory points at `lens_diagnostics mode=delta` first and names the resolved file second, so you never have to work the layout out by hand (#2521).
186
+ `<project-data-dir>` is whatever `getProjectDataDir(cwd)` resolves to: `<project>/.pi-lens` only when that legacy directory already exists when the process first resolves the root (a `.pi-lens` created mid-process takes effect at the next process start), otherwise `~/.pi-lens/projects/<project-slug>` (or a `PILENS_DATA_DIR` location). The turn-end advisory points at `lens_diagnostics mode=delta` first and names the resolved file second, so you never have to work the layout out by hand (#2521).
187
187
 
188
188
  **Report contents:**
189
189
 
@@ -234,6 +234,42 @@ One event per logical write batch (not per file) — e.g. a single eslint `--fix
234
234
 
235
235
  **Kill switch:** `PI_LENS_BUS_PUBLISH=0` disables publishing entirely (see `docs/environment-variables.md`). Publishing is fire-and-forget — a disabled/unavailable/throwing bus never affects the write path's own success or latency.
236
236
 
237
+ ### Bus Events — `pilens:format:*` (#673)
238
+
239
+ Deferred formatting has a separate lifecycle on the same `pi.events` bus:
240
+
241
+ ```
242
+ pilens:format:queued { v: 1, source: "pi-lens", filePath, cwd, tool, kinds,
243
+ ownerSessionId?, turnIndex?, batchId? }
244
+ pilens:format:start { v: 1, source: "pi-lens", cwd, paths, fileCount, kinds,
245
+ ownerSessionId?, turnIndex?, batchId? }
246
+ pilens:format:done { v: 1, source: "pi-lens", cwd, paths, fileCount, kinds,
247
+ ownerSessionId?, turnIndex?, batchId?, settled? }
248
+ ```
249
+
250
+ Paths and `cwd` are absolute, normalized strings. `queued` is emitted when a
251
+ file first enters the deferred queue; `start` is emitted when a non-empty
252
+ claimed format batch begins; and `done` is emitted after all formatters in that
253
+ batch and any late-write resyncs have settled. `paths: []` on `done` means the
254
+ batch changed no bytes. `batchId` is process-unique and monotonic across
255
+ coordinator generations, so
256
+ two same-millisecond reloads cannot share a lifecycle identity. A normal
257
+ `pilens:format:done` has `settled: true` (or omits the additive field for old
258
+ producers). If the formatter remains unsettled after the bounded hook/format
259
+ drain, pi-lens emits one terminal `pilens:format:done` with `settled: false`
260
+ and the still-pending paths, and records one `deferred-format-unsettled`
261
+ degradation for that batch. A later formatter write is resynced by the late
262
+ continuation and does not emit a second done event.
263
+ The session and turn fields let a listener match the lifecycle to its own
264
+ session and turn; consumers must not infer ownership from paths or timing.
265
+
266
+ These are visibility events, not a flush API. They are fire-and-forget and can
267
+ be absent when the bus is disabled, unwired, stale, or throws. Replaced-session
268
+ and aborted drains publish only for work they actually claim and finish; work
269
+ requeued for its owner is not
270
+ announced as done by the replacing session. The events are additive v1 schemas
271
+ and may gain optional fields without a version bump.
272
+
237
273
  **Fix provenance (#502):** `FilesTouchedPayload` gained an additive, optional `fixes` field so a diff/review consumer can distinguish a pi-lens-mechanical hunk from an agent edit:
238
274
 
239
275
  ```
@@ -263,7 +263,7 @@ not corrupt delta baselines.
263
263
 
264
264
  ### `maxProjectFiles`
265
265
 
266
- Single scale knob (default `2000`) that a large-but-healthy repo can raise to scale five independent size budgets together instead of tripping each one separately: the project-diagnostics scanner (0.25×, default 500 files), the review graph (0.5× up to a point, default 1,000 files — see below), the startup scan (1×, default 2,000 source files), jscpd (3×, default 6,000 directory entries), and the word index (3×, default 6,000 files). Raising it (e.g. to `5000`) scales all five proportionally. Each subsystem's own environment-variable override (e.g. `PI_LENS_REVIEW_GRAPH_MAX_FILES`, `PI_LENS_STARTUP_SCAN_MAX_ENTRIES`) still takes precedence over this knob when set, and a separate `PI_LENS_MAX_PROJECT_FILES` environment variable sits below `maxProjectFiles` but above the built-in default. See `clients/project-scale.ts` for the full ratio table and precedence order.
266
+ Single scale knob (default `2000`) that a large-but-healthy repo can raise to scale five independent size budgets together instead of tripping each one separately: the project-diagnostics scanner (0.25×, default 500 files), the review graph (0.5× up to a point, default 1,000 files — see below), the startup scan (1.25×, default 2,500 source files), jscpd (3×, default 6,000 directory entries), and the word index (3×, default 6,000 files). Raising it (e.g. to `5000`) scales all five proportionally. Each subsystem's own environment-variable override (e.g. `PI_LENS_REVIEW_GRAPH_MAX_FILES`, `PI_LENS_STARTUP_SCAN_MAX_ENTRIES`) still takes precedence over this knob when set, and a separate `PI_LENS_MAX_PROJECT_FILES` environment variable sits below `maxProjectFiles` but above the built-in default. See `clients/project-scale.ts` for the full ratio table and precedence order.
267
267
 
268
268
  Unlike the other four, the review graph's budget stops scaling flatly at 0.5× once `maxProjectFiles` climbs past 4,000 — it tapers toward a 5,000-file ceiling instead of growing unbounded (#775). Its higher per-file cold-build cost bounds this default file budget independently of the graph's disk-persist circuit-breaker, whose measured default is now 500,000 elements (#936; override with `PI_LENS_GRAPH_PERSIST_MAX_ELEMENTS`). An over-cap graph persists a centrality-ranked partial snapshot with explicit total-versus-persisted coverage; read-only orientation may use it, but incremental builds never reuse it as a complete base. Below the 4,000 threshold (which covers every typical/default-sized project) it's the same flat 0.5× ratio as before. See `reviewGraph.maxFiles` below for an explicit opt-in past the taper.
269
269
 
@@ -156,6 +156,7 @@ carries the named admission until then.
156
156
  | yaml | yaml-language-server | push-only | publishes-unversioned | direct | 2* | dev+ci |
157
157
  | shell | bash-language-server | push-only | publishes-versioned | direct | 2 | dev+ci |
158
158
  | dockerfile | docker-langserver | push-only | publishes-unversioned | direct | 2* | dev+ci |
159
+ | dockerfile-official | docker-language-server (official) | push-only | unknown | empty-only | ? | dev+ci |
159
160
  | toml | taplo | push-only | publishes-unversioned | direct | 2* | dev+ci |
160
161
  | terraform | terraform-ls | push-only | publishes-unversioned | empty-first | 2* | dev+ci |
161
162
  | prisma | @prisma/language-server | push-only | publishes-unversioned | direct | 2* | dev+ci |
@@ -260,5 +261,5 @@ two-run `clean-behavior` hysteresis and the consecutive-night `idle-eviction`
260
261
  counts (#3989). Regenerated every run; never a measurement.
261
262
 
262
263
  ```json
263
- {"idle-eviction":{"docker":{"nights":[{"day":"2026-10-07","rssMb":64,"coldMs":566}]},"json":{"nights":[{"day":"2026-10-07","rssMb":67,"coldMs":1116}]},"powershell":{"nights":[{"day":"2026-10-07","rssMb":155,"coldMs":2601}]},"python-jedi":{"nights":[{"day":"2026-10-07","rssMb":51,"coldMs":1796}]},"zizmor":{"nights":[{"day":"2026-10-07","rssMb":58,"coldMs":608}]}}}
264
+ {"clean-behavior":{"dockerfile-official":{"pendingBehavior":"publishes-versioned","pendingTier":"2","runs":1}},"idle-eviction":{"docker":{"nights":[{"day":"2026-10-07","rssMb":64,"coldMs":566}]},"json":{"nights":[{"day":"2026-10-07","rssMb":67,"coldMs":1116}]},"powershell":{"nights":[{"day":"2026-10-07","rssMb":155,"coldMs":2601}]},"python-jedi":{"nights":[{"day":"2026-10-07","rssMb":51,"coldMs":1796}]},"zizmor":{"nights":[{"day":"2026-10-07","rssMb":58,"coldMs":608}]}}}
264
265
  ```
@@ -46,7 +46,7 @@ step log only, because it flaps.
46
46
  | dart | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
47
47
  | deno | primary | transparent | eligible | · | ok | preserved |
48
48
  | docker | primary | unmeasured | eligible | · | ok | preserved |
49
- | docker-official | primary | unmeasured | unavailable | no-fixture | n/a | n/a |
49
+ | docker-official | primary | unmeasured | eligible | · | ok | preserved |
50
50
  | elixir | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
51
51
  | expert | primary | unmeasured | eligible | · | ok | preserved |
52
52
  | fish | primary | transparent | eligible | · | ok | preserved |
@@ -34,10 +34,11 @@ mechanics"; a brief supplies only `lane=<name>`, scope, and the grant.
34
34
  preserves or tightens, and show the violating config red on the pre-fix model
35
35
  and green after, or carry `TLA+ unaffected: <family> — <reason>` in the PR
36
36
  body. A row is any-of (one listed family's model move or declaration
37
- satisfies it); a row of 4+ families only prints a note until hunk-level
38
- matching exists (#3878). The map owner is the lane that adds a
39
- `formal/<family>/`: it adds the family and its map row in the same PR, and
40
- `validateCoverageMap` reds the Unit tests lane otherwise.
37
+ satisfies it); a row of 4+ families only prints a note, except `index.ts`,
38
+ whose row gates on the lifecycle hook handler a hunk lands in (#3878). The
39
+ map owner is the lane that adds a `formal/<family>/`: it adds the family and
40
+ its map row in the same PR, and `validateCoverageMap` reds the Unit tests lane
41
+ otherwise.
41
42
  - Seams are named in the brief before the round. A fixer that needs an
42
43
  unconfirmed seam stops and reports it as a finding, not as a test.
43
44
 
@@ -158,7 +159,10 @@ rigor (#2599).
158
159
  must pass, and the hand-back quotes them. A red `PR body (advisory)` check is
159
160
  a fix-before-review item. A changelog fragment is `---` /
160
161
  `section: <Added|Changed|Deprecated|Removed|Fixed|Security>` /
161
- `audience: <user|internal>` / `---` / blank / one `- ` bullet. `audience` is
162
+ `audience: <user|internal>` / `---` / blank / one `- ` bullet. New
163
+ `audience: user` fragments must begin with a bold lead of at most 100
164
+ characters, excluding issue references; internal fragments are exempt.
165
+ `audience` is
162
166
  required: `user` is anything a pi-lens user or agent can observe (tools,
163
167
  diagnostics, messages, config, install, performance, a fixed bug they could
164
168
  hit); `internal` is CI, tests, `formal/`, contributor docs, orchestration, and
@@ -267,7 +267,7 @@ operator's private notes, so a different orchestrator can run the same train.
267
267
  | a new fixture under `tests/fixtures/` | the fixture-contract sweeps for that directory (style-preserving, population guards) — #2782 r2 |
268
268
  | a change that touches identifier uses of a glossary-retired synonym | run `tests/config/glossary-synonym-sweep.test.ts` on the head AND on the merge with `origin/master`, then re-pin in the PR from the sweep's own `UNPINNED`/`STALE` output — #3279, #3283, #3284, #3288 |
269
269
  | a new `vi.mock` in a test file | run `tests/config/vi-mock-export-sweep.test.ts`; whole-module mocks of a production module must spread `importOriginal` — PR #3268's CI red, fixed by trailing commit `621d61c5c` |
270
- | a changelog fragment | front matter `section: <Section>` plus `audience: user` or `audience: internal` and exactly one top-level `- **Title (refs #N)** —` entry, never `CHANGELOG.md`, validated by `node scripts/check-changelog-fragments.mjs` — PR #3268 r1 shipped `category:` and a paragraph |
270
+ | a changelog fragment | front matter `section: <Section>` plus `audience: user` or `audience: internal` and exactly one top-level entry; new user entries open with a bold lead of at most 100 characters (refs excluded), never `CHANGELOG.md`, validated by `node scripts/check-changelog-fragments.mjs` — PR #3268 r1 shipped `category:` and a paragraph |
271
271
  | a PR body | the header gate: exactly one-sentence `## Why`, `## Notes for the reviewer`, `## Change outline`, plus Summary / Tests with `### Test assessment` / Blast radius / Class sweep / Observability; run `node scripts/check-pr-body.mjs --lint-local` before pushing — three PRs this week needed orchestrator body edits |
272
272
  | a whole-tree docs restructure of `AGENTS.md` | every governance test that reads `AGENTS.md`, with markers on their own lines — PR #3265 r1 |
273
273
  | a raw poll in a test | the flake-shape ratchet; the fix is the governed wait, never a header admission — #2781 r1 |
@@ -692,3 +692,45 @@ Each row cost a lane at least once; the prose above carries the record.
692
692
  | Enabling auto-merge before local HEAD equals the pushed SHA | Verify the pushed SHA before enabling auto-merge (#3671) |
693
693
  | Waiting for CI after retargeting a base without a push | Push after a base retarget to re-arm CI (#3679) |
694
694
  | Leaving fork-PR `action_required` runs unapproved | Approve the runs after pushing to a fork PR (#3656) |
695
+ | Writing a closing keyword on a partial delivery | #4021's title said "closes #1513" while its notes said the global-bin walk remained; the merge auto-closed #1513 and it was reopened by hand (2026-10-07). Close only when every acceptance criterion is met; otherwise write `Refs #N` and post the remainder before merging. Title and body must agree |
696
+ | Two writers doing read-modify-write on one shared record without a lock | The orchestrator ledger lost a freshly written row: a sync script read the file, a row was appended, the sync wrote back its stale copy (2026-10-07). Every writer of a shared record holds one lock across the whole read-modify-write (principles §1, "Design shared state once") |
697
+ | Paraphrasing an acceptance criterion into a review brief | A combination-review brief for #3997 said substituted labels "must reject" where they must be accepted when they form an identifier (2026-10-06). Quote the criterion from the PR body or issue; never restate its polarity from memory |
698
+ | Treating a `completed` settlement as delivered when its declared report is missing | Two codex settlements in one batch wrote `REVIEW.md` instead of the declared `REVIEW_4024.md`, or only a GitHub comment (plegma #689; 2026-10-07). Check the declared file exists; else read the file the worker's final line links, and release by hand |
699
+ | Assuming a hook added mid-session is live | A `SubagentStop` hook added to `.claude/settings.local.json` mid-session never fired and did not show under `/hooks` (2026-10-07). Hooks load at session start: confirm under `/hooks` after adding one, or restart before relying on it |
700
+ | Leaving a lane's report inside the checkout that gets torn down | Closing a reviewer's worktree deleted its `REVIEW_4028.md`; the fix round worked from a relayed list (2026-10-07). Reports go outside worktrees (the handbacks directory), and teardown copies any root report out first |
701
+ | Relying on a declared deliverable name the worker never sees | plegma does not pass `deliverables:` into the delivered task; 4 of 4 briefs that omitted the file name got `REVIEW.md` or no file, 2 of 2 that named it were followed (plegma #689; 2026-10-07). Name every declared file in the brief text |
702
+ | Telling a worker to dispatch a workflow without checking what it publishes | A brief asked a fixer to `gh workflow run` its branch; the job publishes `data/test-history` with no ref guard, and the queued run would have pushed unreviewed rollup output with an oldest-row eviction (#4037, cancelled; 2026-10-07). Read the workflow's push and publish steps and their `if:` guards before asking for a branch dispatch |
703
+ | Trusting a `completed` fix round without checking the PR head moved | The #3997 maintainer round settled `completed` while its lease push to the base repo was rejected; the commit sat in the worker tree (plegma #692; 2026-10-07). After each fix round, compare `gh pr view --json headRefOid` with the worker's commit |
704
+ | Raising a timing budget without proving the guard still reds | A request to widen a 300 ms occupancy budget to 500 ms; the yield-removal mutation measured 220 ms locally while healthy CI measured 324–520 ms, so the guard was vacuous at either value (2026-10-07). Mutate the regression the budget exists for before moving the number |
705
+ | Re-running a broad suite after a one-file conflict resolution | A census-conflict merge on #4013 re-ran `tests/scripts` plus governance (~240 files) the reviewer had just run green on the prior head; the 4 affected files already passed (2026-10-07). Run the files the resolution touches; CI runs the rest |
706
+ | Claiming a measured fact from a partial grep | The orchestrator told the maintainer the merge-train warden's last 20 runs "took zero actions"; the grep had counted only update-branch, rerun and cancel calls, and the runs had posted 24 PR comments and 37 label changes (#4105, 2026-10-07). The maintainer decided on the wrong number and had to re-confirm. Count every effect a component can have before calling it inert |
707
+ | Letting one transient backend error re-route a whole day | A single Luna `Selected model is at capacity` failure moved about 15 later fix lanes to Claude Sonnet while codex had 80% weekly budget and 4 free slots; Claude's weekly budget reached 50% (2026-10-07/08). Treat a capacity error as transient, retry on the next dispatch, and check `plegma_quota` before every Claude fixer |
708
+ | Reading CI in a chain whose push silently did nothing | A background chain gated its push on `&&` after a build that never ran, then read the unchanged head's red Windows job as the "fixed head" result and wrote it into #4111's body (2026-10-07). After every push, compare `gh pr view --json headRefOid` with the pushed commit before reading any CI |
709
+ | Diagnosing a red from the first `##[error]` line | #4054's shard-5 red was called "npm registry unreachable"; that line came from a passing stubbed test, and the real failure was a 5 s timeout in check-pr-body.test.ts (#4088, 2026-10-07). Read the FAIL lines; treat annotation lines from stubbed tests as noise |
710
+ | Triggering CI on a bot PR before checking whether a run already exists | land.sh closed and reopened #4084 30 s after an update-branch, before the new run registered, which cancelled the run, and the cancelled aggregate read red (2026-10-07). Reopen only when no run exists for the head after a real wait |
711
+ | Writing a closing keyword where GitHub does not honour it, or by accident | #4121's title said `closes #3873`, which fails the close-keyword check (titles are never honoured); #4094's body said "then fixed #4080", an accidental closing keyword (2026-10-07). Put closing keywords in the body only, and reread the body for `fix(es\|ed) #N` prose |
712
+ | Seeding a group list from the active queue instead of the tracker | The orchestrator's session group held 3 issues while `area:session` had 8 more open p2s, so "is the session group done?" was answered from an incomplete list (2026-10-08). Build a group from the label and the tracker, then subtract what is out of scope |
713
+ | Filing every LOW review finding as an issue | Each review spawned about one follow-up, so the CI group stayed at about 36 open after 16 closures (2026-10-07). Fold or drop LOW findings; file only MEDIUM and above or a reproduced sibling, and give each group a "done when" |
714
+ | No cleanup when lanes end | 78 GB of finished lane trees and a 22 GB leaking test TMPDIR filled the root disk twice; two reviewers lost probe runs and one fixer's test file was truncated (2026-10-07). Remove a lane's trees and TMPDIR when its PR merges, and keep a disk alarm |
715
+ | Deriving the next round from a stale brief or a stale premise | #3871's brief asked for a selection fix #3903 had already shipped, and #3813's assumed every producer was unfixed; both fixers correctly refused to rebuild merged work (2026-10-07). Re-check the premise on current master when a lane starts, not when the issue was filed |
716
+ | Calling a PR-owned hygiene leak pre-existing because the same files fail on a later run | The PR's own CI run exposed the leak, but the reviewer classified it as a flake and fixed an unreachable injected path; the PR review and red-on-base comparison should have owned the finding. The hygiene check now treats a new leak on a green-master PR as CAUSED-BY-PR until red-on-base proves otherwise, and harness children receive a private `TMPDIR` (#4133, #4128). |
717
+ | Passing a commit SHA where a command expected wait seconds | The shell invocation was caught by the command's outcome review; argument-shape validation should have caught it before execution. `land.sh` now validates the wait argument and prints its outcome line. |
718
+ | Losing executable mode in an atomic `.new` to `mv` replacement | The next invocation caught the non-executable script; the file-install check should have compared mode as well as bytes. The replacement now preserves the executable bit. |
719
+ | Reusing a finished PR row for `lane-set --new` | The lane ledger exposed the wrong PR identity; the row allocator should have rejected terminal rows before allocation. New rows now require an unused active identity. |
720
+ | Matching a flake on text that CI never prints | The unmatched CI output was noticed during review; the matcher test should have used a captured CI transcript. The flake matcher now keys on the classifier's actual output. |
721
+ | Letting keyword-title lint contradict the repository convention | The title gate review found the contradiction; the title-convention test should have pinned the accepted form. The lint rule now follows the repository's title convention. |
722
+ | Relaying a shard failure to a fixer without mirroring it on the PR | The fixer noticed the missing scope record; the scope-mirror hook should have rejected the handoff. The handoff path now records the scope on the PR before dispatch. |
723
+ | Treating a repeatedly red advisory lane as harmless | The maintainer's retrospective found the 21% flake after a misleading PR draw; the advisory policy and newest-master comparison should have held the PR. `land.sh` now holds a PR-red/master-green advisory unless `ADVISORY_OK=1`. |
724
+ | Forgetting to arm the landing chain after a trailing fix | A later PR-GREEN event exposed that the fix was waiting unarmed; the trailing-fix command should have verified arming. Rule: after a trailing fix, arm `land.sh` in the same step (not yet mechanised). |
725
+ | Accepting an identity trade-off without a complete timing-cell table | Cloud verification found primary-item loss after the trade-off was accepted from prose; the fixer's state table and review should have enumerated every timing cell. The brief now requires the complete state table before accepting the trade-off. |
726
+ | Letting a scoped test exceed Vitest's default timeout | A repeated cloud review caught the timeout; the local targeted run should have exercised the test under its default timeout. Rule: a scoped review runs new tests under the default Vitest timeout before passing them (not yet mechanised). |
727
+ | Specifying a truncation mechanism instead of an output acceptance criterion | The orchestrator's output read found cut lines after the worker followed the brief; the brief should have stated the required output (complete first sentence, no ellipsis). Rule: acceptance names the required output, not only the mechanism. |
728
+ | Adding a second idle timer without naming the probe consumer | The nightly eviction probe caught the missing configuration coverage; the change's call-tree diff should have listed every idle-timer environment setter. The configuration test now requires every client-read idle timer to be armed by the probe. |
729
+ | Reproducing only one step of a multi-step release-body producer | A user noticed the missing Thanks section; the release-body test should have run the complete producer chain. `bin/relnotes-regen.sh` now runs both steps and refuses to lose the section. |
730
+ | Basing a real-pi premise on an unavailable maintainer-machine probe | The fixer could not rerun the stale probe and the recurrence was found in review; the premise check should have required a repository witness. Fix briefs now require a `tests/real-harness` witness using `withRealPi` and a scripted provider. |
731
+ | Sending a sandboxed verifier a brief path instead of its contents | The verifier reported that the brief was unreadable; the dispatch smoke test should have inspected the delivered argument. Verification now inlines file arguments. |
732
+ | Allowing a mocked handler to throw so every assertion passes vacuously | Verify found the non-blocking degradation; the test double should have failed explicitly when the handler throws. Rule: a test asserting a handler verdict must also assert that no handler-throw degradation was recorded; a shared helper is a candidate, not yet built. |
733
+ | Trusting a worker hand-back that omitted exact test summaries and misreported fixes | Review found nine CAUSED-BY-CHANGE failures and unsupported “fixed” and TLA+ claims; the hand-back check should have required exact summary lines and reviewer red-on-base reruns. Fix lanes now paste the named Vitest summaries and verify identity claims. |
734
+ | Adapting repository fixtures to a Plegma guard failure | Verify caught the harness-specific workaround; the fixture lane should have reported the environment block without changing repository tests. Plegma-guard fixture failures are now reported as environmental. |
735
+ | Reading a piped command's exit status instead of its outcome record | A pending chain was reported as successful because `tail` returned zero; the landing check should have read the chain's own result. `land.sh` now prints `LAND-RESULT #N: <state> (rc=N)`, which callers must read. |
736
+ | Routing a same-seam new defect to a weaker fixer after a prior round | The next verify found the same-seam defect after a Luna-high assignment; round routing should have selected Opus from the seam and round count. Rule: a new same-seam defect after two rounds goes to Opus (cloud fixer when the subscription is short) with the state table and model step first. |
@@ -29,7 +29,9 @@ memory growth:
29
29
  process.externalNonBufferBytes; no tree-count estimate is emitted.
30
30
  - subsystems.wordIndex.wireBytes is the UTF-8 length of the word index's JSON,
31
31
  taken natively while the snapshot persist encodes the body, and is null
32
- until that index's current serialized form is persisted.
32
+ until that index's current serialized form is persisted, and again once the
33
+ serialized form is released at `agent_settled` (the `word_index_memo_released`
34
+ row in latency.log records the release and its trigger).
33
35
  - samplerDurationMs measures the sampler's own record-assembly wall time,
34
36
  excluding the surrounding turn.
35
37
 
@@ -100,9 +100,10 @@ Run every probe the diff can trip and say which ran and what each returned.
100
100
  - **Model covers the change, not only TLC green (#3802).** When the diff
101
101
  touches a file mapped in `formal/coverage-map.json`, require a `.tla`/`.cfg`
102
102
  change under any one of the row's families or a `TLA+ unaffected: <family> —
103
- <reason>` line for any one of them; rows of 4+ families only print a note. A
104
- green `TLA+ models` run over an unchanged model proves nothing about the new
105
- code.
103
+ <reason>` line for any one of them; rows of 4+ families only print a note,
104
+ except `index.ts`, which gates on the lifecycle hook handler a hunk lands in.
105
+ A green `TLA+ models` run over an unchanged model proves nothing about the
106
+ new code.
106
107
  - **Red-proof audit.** A claimed red without its quoted transcript is a finding
107
108
  of its own; reproduce it (step 3).
108
109
  - **Quoted-evidence audit.** Diff every CI line the body quotes against the job