@herbertgao/pi-extensions 2026.10.1 → 2026.10.2

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 (707) hide show
  1. package/README.md +13 -9
  2. package/THIRD_PARTY_NOTICES.md +2 -2
  3. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-audit.md +2 -2
  4. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-debt.md +2 -2
  5. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-gain.md +1 -1
  6. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-help.md +1 -1
  7. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-review.md +2 -2
  8. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail.md +1 -1
  9. package/node_modules/@dietrichgebert/ponytail/.qoder/rules/ponytail.md +21 -21
  10. package/node_modules/@dietrichgebert/ponytail/.qoder-plugin/plugin.json +1 -1
  11. package/node_modules/@dietrichgebert/ponytail/AGENTS.md +21 -21
  12. package/node_modules/@dietrichgebert/ponytail/README.md +68 -72
  13. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +7 -0
  14. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-instructions.js +30 -30
  15. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-map.js +103 -0
  16. package/node_modules/@dietrichgebert/ponytail/package.json +2 -2
  17. package/node_modules/@dietrichgebert/ponytail/skills/ponytail/SKILL.md +33 -101
  18. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +89 -32
  19. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +13 -12
  20. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +17 -16
  21. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +9 -10
  22. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +96 -57
  23. package/node_modules/@herbertgao/pi-agency/LICENSE +21 -0
  24. package/node_modules/@herbertgao/pi-agency/README.md +40 -0
  25. package/node_modules/@herbertgao/pi-agency/package.json +53 -0
  26. package/node_modules/@herbertgao/pi-agency/src/index.ts +441 -0
  27. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +12 -12
  28. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +30 -6
  29. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +15 -9
  30. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +27 -9
  31. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/codemode.ts +4 -1
  32. package/node_modules/@herbertgao/pi-cc-extensions/package.json +2 -2
  33. package/node_modules/@narumitw/pi-caffeinate/package.json +3 -3
  34. package/node_modules/@tifan/pi-mermaid-open/package.json +5 -1
  35. package/node_modules/@tifan/pi-mermaid-open/src/index.ts +26 -9
  36. package/node_modules/@tifan/pi-recap/package.json +1 -1
  37. package/node_modules/@tifan/pi-recap/src/index.ts +104 -20
  38. package/node_modules/@tifan/pi-recap/src/models.ts +46 -4
  39. package/node_modules/pi-antigravity/README.md +23 -2
  40. package/node_modules/pi-antigravity/package.json +5 -3
  41. package/node_modules/pi-antigravity/src/diagnostics/diagnostics.ts +3 -2
  42. package/node_modules/pi-antigravity/src/features/generate-image.ts +72 -0
  43. package/node_modules/pi-antigravity/src/features/google-search.ts +71 -0
  44. package/node_modules/pi-antigravity/src/image/image.ts +86 -47
  45. package/node_modules/pi-antigravity/src/image/native.ts +69 -0
  46. package/node_modules/pi-antigravity/src/index.ts +52 -137
  47. package/node_modules/pi-antigravity/src/search/search.ts +130 -31
  48. package/node_modules/pi-antigravity/src/stream/stream.ts +162 -113
  49. package/node_modules/pi-antigravity/src/types/enums.ts +1 -0
  50. package/node_modules/pi-antigravity/src/types/types.ts +1 -1
  51. package/node_modules/pi-antigravity/src/utils/security.ts +47 -1
  52. package/node_modules/pi-antigravity/src/utils/util.ts +38 -6
  53. package/node_modules/pi-lens/CHANGELOG.md +1064 -0
  54. package/node_modules/pi-lens/README.md +115 -25
  55. package/node_modules/pi-lens/config/dependency-cruiser-eager-allowlist.json +6 -2
  56. package/node_modules/pi-lens/dist/chunk-22AVIGXS.js +560 -0
  57. package/node_modules/pi-lens/dist/chunk-27BBHSZC.js +106 -0
  58. package/node_modules/pi-lens/dist/chunk-2BEMIWEW.js +51 -0
  59. package/node_modules/pi-lens/dist/chunk-2EECBNC5.js +89 -0
  60. package/node_modules/pi-lens/dist/chunk-34U7PLGE.js +23 -0
  61. package/node_modules/pi-lens/dist/chunk-3I5QFT3N.js +181 -0
  62. package/node_modules/pi-lens/dist/chunk-3MED75HT.js +37 -0
  63. package/node_modules/pi-lens/dist/chunk-47D2BO4S.js +87 -0
  64. package/node_modules/pi-lens/dist/chunk-4RERDEXR.js +348 -0
  65. package/node_modules/pi-lens/dist/chunk-4W2PLC4J.js +27 -0
  66. package/node_modules/pi-lens/dist/chunk-52H5B5TC.js +202 -0
  67. package/node_modules/pi-lens/dist/chunk-54B42YRX.js +27 -0
  68. package/node_modules/pi-lens/dist/chunk-5RXBNSW2.js +266 -0
  69. package/node_modules/pi-lens/dist/chunk-5THXD6X5.js +201 -0
  70. package/node_modules/pi-lens/dist/chunk-5W3R6LFT.js +24 -0
  71. package/node_modules/pi-lens/dist/chunk-5ZEJHV35.js +341 -0
  72. package/node_modules/pi-lens/dist/chunk-6P62QVEA.js +118 -0
  73. package/node_modules/pi-lens/dist/chunk-6QIUX4EP.js +459 -0
  74. package/node_modules/pi-lens/dist/chunk-6VCD4VKZ.js +78 -0
  75. package/node_modules/pi-lens/dist/chunk-7F72PXY2.js +326 -0
  76. package/node_modules/pi-lens/dist/chunk-7FBF7NPR.js +998 -0
  77. package/node_modules/pi-lens/dist/chunk-7U2IDNXN.js +37 -0
  78. package/node_modules/pi-lens/dist/chunk-ABBOA7UD.js +157 -0
  79. package/node_modules/pi-lens/dist/chunk-AHDW3GPE.js +50 -0
  80. package/node_modules/pi-lens/dist/chunk-AJ3QXTRQ.js +756 -0
  81. package/node_modules/pi-lens/dist/chunk-AJVLWNFN.js +1610 -0
  82. package/node_modules/pi-lens/dist/chunk-AJXODZY6.js +112 -0
  83. package/node_modules/pi-lens/dist/chunk-ARFCXG7S.js +84 -0
  84. package/node_modules/pi-lens/dist/chunk-AS44CFQ4.js +708 -0
  85. package/node_modules/pi-lens/dist/chunk-AWE5TMPO.js +38 -0
  86. package/node_modules/pi-lens/dist/chunk-B3I2UUT4.js +4692 -0
  87. package/node_modules/pi-lens/dist/chunk-BRJKOBZP.js +331 -0
  88. package/node_modules/pi-lens/dist/chunk-BW5KFIQC.js +59 -0
  89. package/node_modules/pi-lens/dist/chunk-C2AUYXQH.js +149 -0
  90. package/node_modules/pi-lens/dist/chunk-CGGAIP7J.js +29 -0
  91. package/node_modules/pi-lens/dist/chunk-D6QS3U6M.js +30 -0
  92. package/node_modules/pi-lens/dist/chunk-DFVMIKMQ.js +349 -0
  93. package/node_modules/pi-lens/dist/chunk-DIULIWKU.js +169 -0
  94. package/node_modules/pi-lens/dist/chunk-DQ2NZ7C4.js +2317 -0
  95. package/node_modules/pi-lens/dist/chunk-E2WFBRHM.js +213 -0
  96. package/node_modules/pi-lens/dist/chunk-E4MAEDPM.js +50 -0
  97. package/node_modules/pi-lens/dist/chunk-EOKRQ3SA.js +30 -0
  98. package/node_modules/pi-lens/dist/chunk-F3AU2TMM.js +2626 -0
  99. package/node_modules/pi-lens/dist/chunk-F3P7VQ7H.js +170 -0
  100. package/node_modules/pi-lens/dist/chunk-FC4RP4I2.js +12 -0
  101. package/node_modules/pi-lens/dist/chunk-FJNKANOS.js +32 -0
  102. package/node_modules/pi-lens/dist/chunk-GUOGVTCQ.js +146 -0
  103. package/node_modules/pi-lens/dist/chunk-GVXA6CCE.js +18 -0
  104. package/node_modules/pi-lens/dist/chunk-HHYAELLJ.js +2334 -0
  105. package/node_modules/pi-lens/dist/chunk-HMFXILPV.js +83 -0
  106. package/node_modules/pi-lens/dist/chunk-HVUZXSWK.js +421 -0
  107. package/node_modules/pi-lens/dist/chunk-HWBZIGMJ.js +62 -0
  108. package/node_modules/pi-lens/dist/chunk-I3R7GKDR.js +17 -0
  109. package/node_modules/pi-lens/dist/chunk-I7SPGOWI.js +55 -0
  110. package/node_modules/pi-lens/dist/chunk-IIXOAGHR.js +38 -0
  111. package/node_modules/pi-lens/dist/chunk-IVP5KAB7.js +2250 -0
  112. package/node_modules/pi-lens/dist/chunk-IXEBJSUE.js +22 -0
  113. package/node_modules/pi-lens/dist/chunk-JOLITGCC.js +27 -0
  114. package/node_modules/pi-lens/dist/chunk-K6VYLB2U.js +145 -0
  115. package/node_modules/pi-lens/dist/chunk-LJDODBBZ.js +78 -0
  116. package/node_modules/pi-lens/dist/chunk-LNAKEO63.js +78 -0
  117. package/node_modules/pi-lens/dist/chunk-LSMJ6KBE.js +4139 -0
  118. package/node_modules/pi-lens/dist/chunk-LW6XKDZQ.js +5565 -0
  119. package/node_modules/pi-lens/dist/chunk-N3YQJI6O.js +899 -0
  120. package/node_modules/pi-lens/dist/chunk-NABLC7W3.js +148 -0
  121. package/node_modules/pi-lens/dist/chunk-NKOUFPQF.js +659 -0
  122. package/node_modules/pi-lens/dist/chunk-NL5GLMFI.js +211 -0
  123. package/node_modules/pi-lens/dist/chunk-NMABWBZN.js +327 -0
  124. package/node_modules/pi-lens/dist/chunk-NTHH2J74.js +27 -0
  125. package/node_modules/pi-lens/dist/chunk-NTUJEGDZ.js +59 -0
  126. package/node_modules/pi-lens/dist/chunk-NXL4FFQQ.js +47 -0
  127. package/node_modules/pi-lens/dist/chunk-NXPS2L6U.js +466 -0
  128. package/node_modules/pi-lens/dist/chunk-O5WILGMI.js +42 -0
  129. package/node_modules/pi-lens/dist/chunk-O6TQT6RI.js +48 -0
  130. package/node_modules/pi-lens/dist/chunk-OAXNDZJ7.js +323 -0
  131. package/node_modules/pi-lens/dist/chunk-ODEEOXPH.js +44 -0
  132. package/node_modules/pi-lens/dist/chunk-OQGFCZJ4.js +4533 -0
  133. package/node_modules/pi-lens/dist/chunk-ORTMY4Q4.js +282 -0
  134. package/node_modules/pi-lens/dist/chunk-OS32RNR2.js +442 -0
  135. package/node_modules/pi-lens/dist/chunk-PAK6IDME.js +189 -0
  136. package/node_modules/pi-lens/dist/chunk-PWFHBTSF.js +406 -0
  137. package/node_modules/pi-lens/dist/chunk-Q5U6FMDI.js +2352 -0
  138. package/node_modules/pi-lens/dist/chunk-QOZXJ4NA.js +3364 -0
  139. package/node_modules/pi-lens/dist/chunk-QYF5S6P6.js +45 -0
  140. package/node_modules/pi-lens/dist/chunk-RIISMHKN.js +36 -0
  141. package/node_modules/pi-lens/dist/chunk-RPD4ZSB7.js +25 -0
  142. package/node_modules/pi-lens/dist/chunk-RPD5K5NC.js +79 -0
  143. package/node_modules/pi-lens/dist/chunk-RUOG5D2C.js +262 -0
  144. package/node_modules/pi-lens/dist/chunk-T4ERT73Y.js +599 -0
  145. package/node_modules/pi-lens/dist/chunk-T6D4Q4AQ.js +54 -0
  146. package/node_modules/pi-lens/dist/chunk-TGPXLY2J.js +391 -0
  147. package/node_modules/pi-lens/dist/chunk-TLGFBM3F.js +12116 -0
  148. package/node_modules/pi-lens/dist/chunk-TO6WL3GM.js +88 -0
  149. package/node_modules/pi-lens/dist/chunk-TT22N74J.js +517 -0
  150. package/node_modules/pi-lens/dist/chunk-TVN5N6GY.js +21216 -0
  151. package/node_modules/pi-lens/dist/chunk-U3VGR4VU.js +308 -0
  152. package/node_modules/pi-lens/dist/chunk-UK3CMEAL.js +1250 -0
  153. package/node_modules/pi-lens/dist/chunk-UOPVJQ4N.js +103 -0
  154. package/node_modules/pi-lens/dist/chunk-UXVNL3D7.js +23 -0
  155. package/node_modules/pi-lens/dist/chunk-UY752QSN.js +45 -0
  156. package/node_modules/pi-lens/dist/chunk-V5PXFSZK.js +188 -0
  157. package/node_modules/pi-lens/dist/chunk-V7R425XG.js +398 -0
  158. package/node_modules/pi-lens/dist/chunk-VCSRSYLF.js +81 -0
  159. package/node_modules/pi-lens/dist/chunk-VD4JQCQC.js +162 -0
  160. package/node_modules/pi-lens/dist/chunk-VDBPVIKD.js +62 -0
  161. package/node_modules/pi-lens/dist/chunk-VHQLPIRJ.js +114 -0
  162. package/node_modules/pi-lens/dist/chunk-VN2AXLEX.js +5414 -0
  163. package/node_modules/pi-lens/dist/chunk-VNMT7C64.js +478 -0
  164. package/node_modules/pi-lens/dist/chunk-WONERJTP.js +309 -0
  165. package/node_modules/pi-lens/dist/chunk-XECLWQZN.js +85 -0
  166. package/node_modules/pi-lens/dist/chunk-XIMYZ3JA.js +27 -0
  167. package/node_modules/pi-lens/dist/chunk-XK4CIILI.js +144 -0
  168. package/node_modules/pi-lens/dist/chunk-Y4T27COV.js +562 -0
  169. package/node_modules/pi-lens/dist/chunk-YGVYKNSN.js +1860 -0
  170. package/node_modules/pi-lens/dist/chunk-YLF3PPT5.js +308 -0
  171. package/node_modules/pi-lens/dist/chunk-YSNFMJKN.js +14 -0
  172. package/node_modules/pi-lens/dist/chunk-Z3CCVDUB.js +76 -0
  173. package/node_modules/pi-lens/dist/chunk-Z54ZSOBZ.js +61 -0
  174. package/node_modules/pi-lens/dist/chunk-ZAWW3AF6.js +97 -0
  175. package/node_modules/pi-lens/dist/chunk-ZMOL6RQC.js +167 -0
  176. package/node_modules/pi-lens/dist/index.js +16456 -8335
  177. package/node_modules/pi-lens/dist/mcp/analyze-cli.js +186 -232
  178. package/node_modules/pi-lens/dist/mcp/cli.js +137 -98
  179. package/node_modules/pi-lens/dist/mcp/server.js +22589 -1573
  180. package/node_modules/pi-lens/dist/mcp/worker.js +97 -38
  181. package/node_modules/pi-lens/dist/probes/installer.js +135 -0
  182. package/node_modules/pi-lens/dist/workers/project-snapshot-persist-worker.js +22 -0
  183. package/node_modules/pi-lens/dist/workers/review-graph-persist-worker.js +15 -0
  184. package/node_modules/pi-lens/docs/agent-guide.md +13 -4
  185. package/node_modules/pi-lens/docs/agent-tools.md +42 -0
  186. package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +3 -2
  187. package/node_modules/pi-lens/docs/configuration.md +20 -1
  188. package/node_modules/pi-lens/docs/environment-variables.md +52 -2
  189. package/node_modules/pi-lens/docs/features.md +8 -4
  190. package/node_modules/pi-lens/docs/globalconfig.md +1 -0
  191. package/node_modules/pi-lens/docs/io-bridge-v2-migration.md +94 -0
  192. package/node_modules/pi-lens/docs/lsp-capability-matrix.md +36 -4
  193. package/node_modules/pi-lens/docs/lsp-idle-eviction.md +124 -0
  194. package/node_modules/pi-lens/docs/mcp.md +21 -5
  195. package/node_modules/pi-lens/docs/merge-queue-rollout.md +77 -0
  196. package/node_modules/pi-lens/docs/pi-lens-fixer.md +156 -88
  197. package/node_modules/pi-lens/docs/pi-lens-investigator.md +74 -26
  198. package/node_modules/pi-lens/docs/pi-lens-merge-policy.md +694 -0
  199. package/node_modules/pi-lens/docs/pi-lens-monitor.md +73 -7
  200. package/node_modules/pi-lens/docs/pi-lens-retro.md +6 -4
  201. package/node_modules/pi-lens/docs/pi-lens-reviewer.md +188 -48
  202. package/node_modules/pi-lens/docs/pi-lens-subagent.md +246 -45
  203. package/node_modules/pi-lens/docs/pi-lens-warden.md +18 -7
  204. package/node_modules/pi-lens/docs/public-api-stability.md +55 -0
  205. package/node_modules/pi-lens/docs/release-qa-baseline.md +84 -17
  206. package/node_modules/pi-lens/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
  207. package/node_modules/pi-lens/docs/servercapabilities.md +53 -49
  208. package/node_modules/pi-lens/docs/settings.md +1 -0
  209. package/node_modules/pi-lens/docs/usage.md +5 -1
  210. package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm +0 -0
  211. package/node_modules/pi-lens/grammars/tree-sitter-bash.wasm.json +3 -3
  212. package/node_modules/pi-lens/package.json +18 -6
  213. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  214. package/node_modules/pi-lens/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  215. package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +1275 -62
  216. package/node_modules/pi-lens/scripts/download-grammars.js +5 -0
  217. package/node_modules/pi-lens/scripts/grammars.lock.json +6 -1
  218. package/node_modules/pi-lens/scripts/install-selftest.mjs +33 -34
  219. package/node_modules/pi-lens/scripts/lib/host-provided-deps.mjs +13 -4
  220. package/node_modules/pi-lens/scripts/lib/web-tree-sitter-dir.mjs +18 -0
  221. package/package.json +15 -10
  222. package/node_modules/@dietrichgebert/ponytail/README.es.md +0 -212
  223. package/node_modules/@dietrichgebert/ponytail/README.ja.md +0 -212
  224. package/node_modules/@dietrichgebert/ponytail/README.ko.md +0 -212
  225. package/node_modules/@dietrichgebert/ponytail/README.zh-CN.md +0 -212
  226. package/node_modules/pi-lens/dist/clients/actionable-warnings-logger.js +0 -35
  227. package/node_modules/pi-lens/dist/clients/actionable-warnings.js +0 -1610
  228. package/node_modules/pi-lens/dist/clients/advisory-provenance.js +0 -593
  229. package/node_modules/pi-lens/dist/clients/agent-behavior-client.js +0 -147
  230. package/node_modules/pi-lens/dist/clients/agent-nudge.js +0 -325
  231. package/node_modules/pi-lens/dist/clients/analysed-root.js +0 -1
  232. package/node_modules/pi-lens/dist/clients/ast-grep-client.js +0 -731
  233. package/node_modules/pi-lens/dist/clients/ast-grep-rule-manager.js +0 -146
  234. package/node_modules/pi-lens/dist/clients/ast-grep-tool-logger.js +0 -118
  235. package/node_modules/pi-lens/dist/clients/ast-grep-types.js +0 -10
  236. package/node_modules/pi-lens/dist/clients/ast-grep-yaml-synth.js +0 -154
  237. package/node_modules/pi-lens/dist/clients/atomic-write-staging.js +0 -75
  238. package/node_modules/pi-lens/dist/clients/atomic-write.js +0 -189
  239. package/node_modules/pi-lens/dist/clients/availability-probe-flight.js +0 -12
  240. package/node_modules/pi-lens/dist/clients/bash-file-access.js +0 -1056
  241. package/node_modules/pi-lens/dist/clients/biome-client.js +0 -357
  242. package/node_modules/pi-lens/dist/clients/blocker-freshness.js +0 -837
  243. package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +0 -129
  244. package/node_modules/pi-lens/dist/clients/bootstrap.js +0 -569
  245. package/node_modules/pi-lens/dist/clients/bounded-cache.js +0 -190
  246. package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +0 -202
  247. package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +0 -295
  248. package/node_modules/pi-lens/dist/clients/build-identity.js +0 -95
  249. package/node_modules/pi-lens/dist/clients/bundled-resource-health.js +0 -113
  250. package/node_modules/pi-lens/dist/clients/bus-events-logger.js +0 -105
  251. package/node_modules/pi-lens/dist/clients/bus-publish.js +0 -171
  252. package/node_modules/pi-lens/dist/clients/cache/rule-cache.js +0 -190
  253. package/node_modules/pi-lens/dist/clients/cache-manager.js +0 -524
  254. package/node_modules/pi-lens/dist/clients/cache-observability.js +0 -1313
  255. package/node_modules/pi-lens/dist/clients/call-graph.js +0 -852
  256. package/node_modules/pi-lens/dist/clients/cargo-manifest.js +0 -422
  257. package/node_modules/pi-lens/dist/clients/cascade-budget.js +0 -196
  258. package/node_modules/pi-lens/dist/clients/cascade-format.js +0 -315
  259. package/node_modules/pi-lens/dist/clients/cascade-logger.js +0 -31
  260. package/node_modules/pi-lens/dist/clients/cascade-types.js +0 -9
  261. package/node_modules/pi-lens/dist/clients/child-unref.js +0 -124
  262. package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +0 -286
  263. package/node_modules/pi-lens/dist/clients/codebase-model.js +0 -173
  264. package/node_modules/pi-lens/dist/clients/collateral-test-role.js +0 -40
  265. package/node_modules/pi-lens/dist/clients/complexity-client.js +0 -462
  266. package/node_modules/pi-lens/dist/clients/config-core/deny.js +0 -221
  267. package/node_modules/pi-lens/dist/clients/config-core/index.js +0 -50
  268. package/node_modules/pi-lens/dist/clients/config-core/merge.js +0 -357
  269. package/node_modules/pi-lens/dist/clients/config-core/normalize.js +0 -340
  270. package/node_modules/pi-lens/dist/clients/config-core/process-spec.js +0 -248
  271. package/node_modules/pi-lens/dist/clients/config-core/provenance.js +0 -164
  272. package/node_modules/pi-lens/dist/clients/config-core/records.js +0 -218
  273. package/node_modules/pi-lens/dist/clients/config-core/resolve.js +0 -125
  274. package/node_modules/pi-lens/dist/clients/config-core/safe-object.js +0 -78
  275. package/node_modules/pi-lens/dist/clients/config-core/schema.js +0 -165
  276. package/node_modules/pi-lens/dist/clients/config-diagnostic-codes.js +0 -285
  277. package/node_modules/pi-lens/dist/clients/config-locations.js +0 -388
  278. package/node_modules/pi-lens/dist/clients/config-resolve.js +0 -798
  279. package/node_modules/pi-lens/dist/clients/config-schema.js +0 -251
  280. package/node_modules/pi-lens/dist/clients/config-warn.js +0 -407
  281. package/node_modules/pi-lens/dist/clients/console-guard-install.js +0 -26
  282. package/node_modules/pi-lens/dist/clients/cooperative-budget.js +0 -42
  283. package/node_modules/pi-lens/dist/clients/dead-code-client.js +0 -510
  284. package/node_modules/pi-lens/dist/clients/dead-code-logger.js +0 -30
  285. package/node_modules/pi-lens/dist/clients/deadline-utils.js +0 -280
  286. package/node_modules/pi-lens/dist/clients/debug-handles.js +0 -211
  287. package/node_modules/pi-lens/dist/clients/debug-heap.js +0 -174
  288. package/node_modules/pi-lens/dist/clients/deferred-lsp-work.js +0 -106
  289. package/node_modules/pi-lens/dist/clients/degradation-ledger.js +0 -426
  290. package/node_modules/pi-lens/dist/clients/demoted-finding-render.js +0 -169
  291. package/node_modules/pi-lens/dist/clients/dependency-checker.js +0 -885
  292. package/node_modules/pi-lens/dist/clients/deps/ast-grep-napi.js +0 -22
  293. package/node_modules/pi-lens/dist/clients/deps/js-yaml.js +0 -9
  294. package/node_modules/pi-lens/dist/clients/deps/minimatch.js +0 -4
  295. package/node_modules/pi-lens/dist/clients/deps/pi-tui.js +0 -14
  296. package/node_modules/pi-lens/dist/clients/deps/typebox.js +0 -14
  297. package/node_modules/pi-lens/dist/clients/deps/vscode-jsonrpc.js +0 -1
  298. package/node_modules/pi-lens/dist/clients/deps/web-tree-sitter.js +0 -24
  299. package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +0 -630
  300. package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +0 -305
  301. package/node_modules/pi-lens/dist/clients/diagnostic-logger.js +0 -73
  302. package/node_modules/pi-lens/dist/clients/diagnostic-tracker.js +0 -105
  303. package/node_modules/pi-lens/dist/clients/diagnostics-publish.js +0 -230
  304. package/node_modules/pi-lens/dist/clients/dispatch/ast-grep-catalog.js +0 -65
  305. package/node_modules/pi-lens/dist/clients/dispatch/auxiliary-lsp.js +0 -343
  306. package/node_modules/pi-lens/dist/clients/dispatch/collect-later-tier.js +0 -35
  307. package/node_modules/pi-lens/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
  308. package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +0 -1269
  309. package/node_modules/pi-lens/dist/clients/dispatch/fact-provider-types.js +0 -1
  310. package/node_modules/pi-lens/dist/clients/dispatch/fact-rule-runner.js +0 -17
  311. package/node_modules/pi-lens/dist/clients/dispatch/fact-runner.js +0 -30
  312. package/node_modules/pi-lens/dist/clients/dispatch/fact-scheduler.js +0 -68
  313. package/node_modules/pi-lens/dist/clients/dispatch/fact-store.js +0 -377
  314. package/node_modules/pi-lens/dist/clients/dispatch/facts/comment-facts.js +0 -22
  315. package/node_modules/pi-lens/dist/clients/dispatch/facts/file-content.js +0 -19
  316. package/node_modules/pi-lens/dist/clients/dispatch/facts/function-facts.js +0 -348
  317. package/node_modules/pi-lens/dist/clients/dispatch/facts/import-facts.js +0 -204
  318. package/node_modules/pi-lens/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
  319. package/node_modules/pi-lens/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
  320. package/node_modules/pi-lens/dist/clients/dispatch/finding-policy.js +0 -339
  321. package/node_modules/pi-lens/dist/clients/dispatch/indent-detect.js +0 -417
  322. package/node_modules/pi-lens/dist/clients/dispatch/inline-suppressions.js +0 -89
  323. package/node_modules/pi-lens/dist/clients/dispatch/integration.js +0 -2377
  324. package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +0 -11
  325. package/node_modules/pi-lens/dist/clients/dispatch/pending-runner-findings.js +0 -87
  326. package/node_modules/pi-lens/dist/clients/dispatch/plan.js +0 -278
  327. package/node_modules/pi-lens/dist/clients/dispatch/priorities.js +0 -20
  328. package/node_modules/pi-lens/dist/clients/dispatch/rule-id-normalize.js +0 -50
  329. package/node_modules/pi-lens/dist/clients/dispatch/rule-ignores.js +0 -69
  330. package/node_modules/pi-lens/dist/clients/dispatch/rule-policy.js +0 -135
  331. package/node_modules/pi-lens/dist/clients/dispatch/rules/async-noise.js +0 -40
  332. package/node_modules/pi-lens/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  333. package/node_modules/pi-lens/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
  334. package/node_modules/pi-lens/dist/clients/dispatch/rules/error-obscuring.js +0 -32
  335. package/node_modules/pi-lens/dist/clients/dispatch/rules/error-swallowing.js +0 -31
  336. package/node_modules/pi-lens/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
  337. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-complexity.js +0 -72
  338. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-fan-out.js +0 -74
  339. package/node_modules/pi-lens/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
  340. package/node_modules/pi-lens/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
  341. package/node_modules/pi-lens/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
  342. package/node_modules/pi-lens/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
  343. package/node_modules/pi-lens/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  344. package/node_modules/pi-lens/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
  345. package/node_modules/pi-lens/dist/clients/dispatch/runner-context.js +0 -52
  346. package/node_modules/pi-lens/dist/clients/dispatch/runners/actionlint.js +0 -111
  347. package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
  348. package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +0 -296
  349. package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +0 -219
  350. package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +0 -82
  351. package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +0 -416
  352. package/node_modules/pi-lens/dist/clients/dispatch/runners/dart-analyze.js +0 -183
  353. package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +0 -176
  354. package/node_modules/pi-lens/dist/clients/dispatch/runners/dotnet-build.js +0 -164
  355. package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +0 -195
  356. package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +0 -137
  357. package/node_modules/pi-lens/dist/clients/dispatch/runners/fact-rules.js +0 -29
  358. package/node_modules/pi-lens/dist/clients/dispatch/runners/fish-indent.js +0 -69
  359. package/node_modules/pi-lens/dist/clients/dispatch/runners/gleam-check.js +0 -167
  360. package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +0 -104
  361. package/node_modules/pi-lens/dist/clients/dispatch/runners/golangci-lint.js +0 -135
  362. package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +0 -91
  363. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-lint.js +0 -171
  364. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +0 -940
  365. package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +0 -117
  366. package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +0 -108
  367. package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +0 -99
  368. package/node_modules/pi-lens/dist/clients/dispatch/runners/ktlint.js +0 -110
  369. package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +0 -379
  370. package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +0 -167
  371. package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +0 -102
  372. package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +0 -414
  373. package/node_modules/pi-lens/dist/clients/dispatch/runners/php-lint.js +0 -85
  374. package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +0 -120
  375. package/node_modules/pi-lens/dist/clients/dispatch/runners/prisma-validate.js +0 -62
  376. package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
  377. package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +0 -169
  378. package/node_modules/pi-lens/dist/clients/dispatch/runners/rubocop.js +0 -99
  379. package/node_modules/pi-lens/dist/clients/dispatch/runners/ruff.js +0 -88
  380. package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +0 -256
  381. package/node_modules/pi-lens/dist/clients/dispatch/runners/shellcheck.js +0 -173
  382. package/node_modules/pi-lens/dist/clients/dispatch/runners/shfmt.js +0 -102
  383. package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +0 -128
  384. package/node_modules/pi-lens/dist/clients/dispatch/runners/spotbugs.js +0 -259
  385. package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +0 -183
  386. package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +0 -166
  387. package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +0 -163
  388. package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +0 -174
  389. package/node_modules/pi-lens/dist/clients/dispatch/runners/terragrunt.js +0 -168
  390. package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +0 -125
  391. package/node_modules/pi-lens/dist/clients/dispatch/runners/tree-sitter.js +0 -643
  392. package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +0 -253
  393. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
  394. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
  395. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
  396. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
  397. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
  398. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
  399. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
  400. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
  401. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils.js +0 -15
  402. package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +0 -128
  403. package/node_modules/pi-lens/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
  404. package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +0 -95
  405. package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +0 -79
  406. package/node_modules/pi-lens/dist/clients/dispatch/suppress-writer.js +0 -79
  407. package/node_modules/pi-lens/dist/clients/dispatch/tool-profile.js +0 -30
  408. package/node_modules/pi-lens/dist/clients/dispatch/types.js +0 -21
  409. package/node_modules/pi-lens/dist/clients/dispatch/utils/format-utils.js +0 -45
  410. package/node_modules/pi-lens/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
  411. package/node_modules/pi-lens/dist/clients/disposition-logger.js +0 -32
  412. package/node_modules/pi-lens/dist/clients/disposition-publish.js +0 -124
  413. package/node_modules/pi-lens/dist/clients/durable-store.js +0 -97
  414. package/node_modules/pi-lens/dist/clients/effective-config.js +0 -415
  415. package/node_modules/pi-lens/dist/clients/env-utils.js +0 -83
  416. package/node_modules/pi-lens/dist/clients/error-class.js +0 -23
  417. package/node_modules/pi-lens/dist/clients/eval-timestamp.js +0 -17
  418. package/node_modules/pi-lens/dist/clients/event-loop-hold.js +0 -274
  419. package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +0 -250
  420. package/node_modules/pi-lens/dist/clients/extension-log.js +0 -504
  421. package/node_modules/pi-lens/dist/clients/extension-mode.js +0 -73
  422. package/node_modules/pi-lens/dist/clients/feature-hints.js +0 -103
  423. package/node_modules/pi-lens/dist/clients/file-kinds.js +0 -412
  424. package/node_modules/pi-lens/dist/clients/file-role.js +0 -134
  425. package/node_modules/pi-lens/dist/clients/file-time.js +0 -160
  426. package/node_modules/pi-lens/dist/clients/file-utils.js +0 -1032
  427. package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +0 -494
  428. package/node_modules/pi-lens/dist/clients/finding-identity.js +0 -88
  429. package/node_modules/pi-lens/dist/clients/fix-worklog.js +0 -103
  430. package/node_modules/pi-lens/dist/clients/format-events-publish.js +0 -343
  431. package/node_modules/pi-lens/dist/clients/format-service.js +0 -222
  432. package/node_modules/pi-lens/dist/clients/formatters-lazy.js +0 -9
  433. package/node_modules/pi-lens/dist/clients/formatters.js +0 -2032
  434. package/node_modules/pi-lens/dist/clients/freshness-cadence.js +0 -17
  435. package/node_modules/pi-lens/dist/clients/freshness.js +0 -38
  436. package/node_modules/pi-lens/dist/clients/generated-artifacts.js +0 -394
  437. package/node_modules/pi-lens/dist/clients/generation-guard.js +0 -215
  438. package/node_modules/pi-lens/dist/clients/git-guard.js +0 -1136
  439. package/node_modules/pi-lens/dist/clients/git-tracked-ignore.js +0 -243
  440. package/node_modules/pi-lens/dist/clients/gitleaks-client.js +0 -509
  441. package/node_modules/pi-lens/dist/clients/go-client.js +0 -104
  442. package/node_modules/pi-lens/dist/clients/govulncheck-client.js +0 -605
  443. package/node_modules/pi-lens/dist/clients/gradle-ktfmt-style.js +0 -348
  444. package/node_modules/pi-lens/dist/clients/grammar-source.js +0 -465
  445. package/node_modules/pi-lens/dist/clients/gzip-stage-write.js +0 -135
  446. package/node_modules/pi-lens/dist/clients/hashline-anchor.js +0 -424
  447. package/node_modules/pi-lens/dist/clients/hook-budgets.js +0 -76
  448. package/node_modules/pi-lens/dist/clients/host-edit-normalize.js +0 -140
  449. package/node_modules/pi-lens/dist/clients/host-ports.js +0 -39
  450. package/node_modules/pi-lens/dist/clients/indent-retarget.js +0 -154
  451. package/node_modules/pi-lens/dist/clients/inline-blocker-dispositions.js +0 -186
  452. package/node_modules/pi-lens/dist/clients/install-diagnostics.js +0 -156
  453. package/node_modules/pi-lens/dist/clients/installer/index.js +0 -5416
  454. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +0 -58
  455. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +0 -783
  456. package/node_modules/pi-lens/dist/clients/instance-reaper-state.js +0 -7
  457. package/node_modules/pi-lens/dist/clients/instance-reaper.js +0 -1137
  458. package/node_modules/pi-lens/dist/clients/instance-registry-lock.js +0 -145
  459. package/node_modules/pi-lens/dist/clients/instance-registry.js +0 -773
  460. package/node_modules/pi-lens/dist/clients/jscpd-client.js +0 -378
  461. package/node_modules/pi-lens/dist/clients/json-cache-read.js +0 -65
  462. package/node_modules/pi-lens/dist/clients/knip-client.js +0 -788
  463. package/node_modules/pi-lens/dist/clients/language-policy.js +0 -252
  464. package/node_modules/pi-lens/dist/clients/language-profile.js +0 -361
  465. package/node_modules/pi-lens/dist/clients/language-registry.js +0 -603
  466. package/node_modules/pi-lens/dist/clients/latency-logger.js +0 -727
  467. package/node_modules/pi-lens/dist/clients/lazy-import.js +0 -21
  468. package/node_modules/pi-lens/dist/clients/ledger-bounds.js +0 -54
  469. package/node_modules/pi-lens/dist/clients/lens-config.js +0 -404
  470. package/node_modules/pi-lens/dist/clients/lens-engine.js +0 -358
  471. package/node_modules/pi-lens/dist/clients/lens-events.js +0 -125
  472. package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +0 -467
  473. package/node_modules/pi-lens/dist/clients/lens-map.js +0 -1156
  474. package/node_modules/pi-lens/dist/clients/live-bus-emitter.js +0 -74
  475. package/node_modules/pi-lens/dist/clients/log-cleanup.js +0 -222
  476. package/node_modules/pi-lens/dist/clients/lsp/aggregation.js +0 -178
  477. package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +0 -421
  478. package/node_modules/pi-lens/dist/clients/lsp/client.js +0 -4593
  479. package/node_modules/pi-lens/dist/clients/lsp/config.js +0 -691
  480. package/node_modules/pi-lens/dist/clients/lsp/content-limits.js +0 -41
  481. package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +0 -225
  482. package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +0 -467
  483. package/node_modules/pi-lens/dist/clients/lsp/edits.js +0 -1219
  484. package/node_modules/pi-lens/dist/clients/lsp/index.js +0 -8305
  485. package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +0 -216
  486. package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +0 -298
  487. package/node_modules/pi-lens/dist/clients/lsp/language.js +0 -63
  488. package/node_modules/pi-lens/dist/clients/lsp/launch.js +0 -746
  489. package/node_modules/pi-lens/dist/clients/lsp/lombok.js +0 -158
  490. package/node_modules/pi-lens/dist/clients/lsp/path-utils.js +0 -5
  491. package/node_modules/pi-lens/dist/clients/lsp/pending-aux-coverage.js +0 -251
  492. package/node_modules/pi-lens/dist/clients/lsp/position-encoding.js +0 -61
  493. package/node_modules/pi-lens/dist/clients/lsp/ruby-drive-dirs.js +0 -83
  494. package/node_modules/pi-lens/dist/clients/lsp/server.js +0 -3290
  495. package/node_modules/pi-lens/dist/clients/lsp/session-roots.js +0 -192
  496. package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +0 -17
  497. package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +0 -56
  498. package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +0 -332
  499. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  500. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/classification.js +0 -85
  501. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/index.js +0 -10
  502. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +0 -392
  503. package/node_modules/pi-lens/dist/clients/lsp/watch-queue.js +0 -61
  504. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
  505. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
  506. package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +0 -184
  507. package/node_modules/pi-lens/dist/clients/lsp-budget.js +0 -186
  508. package/node_modules/pi-lens/dist/clients/lsp-document-symbols.js +0 -110
  509. package/node_modules/pi-lens/dist/clients/lsp-lazy.js +0 -9
  510. package/node_modules/pi-lens/dist/clients/lsp-mutation.js +0 -396
  511. package/node_modules/pi-lens/dist/clients/lsp-status.js +0 -59
  512. package/node_modules/pi-lens/dist/clients/map-with-concurrency.js +0 -40
  513. package/node_modules/pi-lens/dist/clients/mcp/analyze.js +0 -420
  514. package/node_modules/pi-lens/dist/clients/mcp/host-shim.js +0 -31
  515. package/node_modules/pi-lens/dist/clients/mcp/ipc.js +0 -523
  516. package/node_modules/pi-lens/dist/clients/mcp/review.js +0 -197
  517. package/node_modules/pi-lens/dist/clients/mcp/session.js +0 -412
  518. package/node_modules/pi-lens/dist/clients/memory-sampler.js +0 -208
  519. package/node_modules/pi-lens/dist/clients/message-end-attribution.js +0 -30
  520. package/node_modules/pi-lens/dist/clients/metrics-client.js +0 -107
  521. package/node_modules/pi-lens/dist/clients/metrics-history.js +0 -327
  522. package/node_modules/pi-lens/dist/clients/middle-man-analysis.js +0 -263
  523. package/node_modules/pi-lens/dist/clients/model-provider.js +0 -53
  524. package/node_modules/pi-lens/dist/clients/module-report-lsp.js +0 -189
  525. package/node_modules/pi-lens/dist/clients/module-report.js +0 -2150
  526. package/node_modules/pi-lens/dist/clients/mutating-tool.js +0 -651
  527. package/node_modules/pi-lens/dist/clients/mutation-attribution.js +0 -368
  528. package/node_modules/pi-lens/dist/clients/mutation-bridge.js +0 -240
  529. package/node_modules/pi-lens/dist/clients/ndjson-logger.js +0 -734
  530. package/node_modules/pi-lens/dist/clients/observed-mutation-sources.js +0 -101
  531. package/node_modules/pi-lens/dist/clients/observed-mutation.js +0 -1253
  532. package/node_modules/pi-lens/dist/clients/oldtext-autopatch.js +0 -128
  533. package/node_modules/pi-lens/dist/clients/opaque-mutation-scan.js +0 -496
  534. package/node_modules/pi-lens/dist/clients/opengrep-client.js +0 -333
  535. package/node_modules/pi-lens/dist/clients/opengrep-config.js +0 -76
  536. package/node_modules/pi-lens/dist/clients/package-manager.js +0 -607
  537. package/node_modules/pi-lens/dist/clients/package-root.js +0 -38
  538. package/node_modules/pi-lens/dist/clients/partial-edit-apply.js +0 -439
  539. package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +0 -43
  540. package/node_modules/pi-lens/dist/clients/path-keyed-map.js +0 -108
  541. package/node_modules/pi-lens/dist/clients/path-utils.js +0 -1244
  542. package/node_modules/pi-lens/dist/clients/performance-report.js +0 -331
  543. package/node_modules/pi-lens/dist/clients/persist-debounce.js +0 -70
  544. package/node_modules/pi-lens/dist/clients/persistent-reverify.js +0 -271
  545. package/node_modules/pi-lens/dist/clients/php-cs-fixer-config.js +0 -119
  546. package/node_modules/pi-lens/dist/clients/pipeline.js +0 -1480
  547. package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +0 -37
  548. package/node_modules/pi-lens/dist/clients/print-mode.js +0 -21
  549. package/node_modules/pi-lens/dist/clients/probe-home-state.js +0 -228
  550. package/node_modules/pi-lens/dist/clients/process-bridge.js +0 -66
  551. package/node_modules/pi-lens/dist/clients/process-singletons.js +0 -210
  552. package/node_modules/pi-lens/dist/clients/process-snapshot.js +0 -68
  553. package/node_modules/pi-lens/dist/clients/project-changes.js +0 -181
  554. package/node_modules/pi-lens/dist/clients/project-conventions.js +0 -171
  555. package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +0 -137
  556. package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +0 -109
  557. package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
  558. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
  559. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
  560. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
  561. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
  562. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
  563. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
  564. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
  565. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
  566. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
  567. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
  568. package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +0 -520
  569. package/node_modules/pi-lens/dist/clients/project-diagnostics/types.js +0 -1
  570. package/node_modules/pi-lens/dist/clients/project-lens-config.js +0 -807
  571. package/node_modules/pi-lens/dist/clients/project-report.js +0 -701
  572. package/node_modules/pi-lens/dist/clients/project-scale.js +0 -237
  573. package/node_modules/pi-lens/dist/clients/project-scan-policy.js +0 -11
  574. package/node_modules/pi-lens/dist/clients/project-snapshot-fingerprint.js +0 -48
  575. package/node_modules/pi-lens/dist/clients/project-snapshot-persist-worker.js +0 -20
  576. package/node_modules/pi-lens/dist/clients/project-snapshot.js +0 -1653
  577. package/node_modules/pi-lens/dist/clients/project-trust.js +0 -181
  578. package/node_modules/pi-lens/dist/clients/python-environment.js +0 -217
  579. package/node_modules/pi-lens/dist/clients/python-provenance.js +0 -639
  580. package/node_modules/pi-lens/dist/clients/quiet-window-config.js +0 -47
  581. package/node_modules/pi-lens/dist/clients/quiet-window.js +0 -236
  582. package/node_modules/pi-lens/dist/clients/read-bridge.js +0 -139
  583. package/node_modules/pi-lens/dist/clients/read-expansion.js +0 -266
  584. package/node_modules/pi-lens/dist/clients/read-guard-logger.js +0 -251
  585. package/node_modules/pi-lens/dist/clients/read-guard-tool-lines.js +0 -1306
  586. package/node_modules/pi-lens/dist/clients/read-guard.js +0 -1561
  587. package/node_modules/pi-lens/dist/clients/recent-touches.js +0 -240
  588. package/node_modules/pi-lens/dist/clients/redact/secrets.js +0 -449
  589. package/node_modules/pi-lens/dist/clients/resource-sampler.js +0 -628
  590. package/node_modules/pi-lens/dist/clients/reverse-deps.js +0 -270
  591. package/node_modules/pi-lens/dist/clients/review-graph/builder.js +0 -5126
  592. package/node_modules/pi-lens/dist/clients/review-graph/format.js +0 -33
  593. package/node_modules/pi-lens/dist/clients/review-graph/git-identity.js +0 -163
  594. package/node_modules/pi-lens/dist/clients/review-graph/import-resolvers.js +0 -481
  595. package/node_modules/pi-lens/dist/clients/review-graph/persist-worker.js +0 -10
  596. package/node_modules/pi-lens/dist/clients/review-graph/query.js +0 -244
  597. package/node_modules/pi-lens/dist/clients/review-graph/revision-drift.js +0 -21
  598. package/node_modules/pi-lens/dist/clients/review-graph/service.js +0 -96
  599. package/node_modules/pi-lens/dist/clients/review-graph/shared-extraction-ir.js +0 -82
  600. package/node_modules/pi-lens/dist/clients/review-graph/symbol-id.js +0 -103
  601. package/node_modules/pi-lens/dist/clients/review-graph/tsconfig-paths.js +0 -299
  602. package/node_modules/pi-lens/dist/clients/review-graph/types.js +0 -1
  603. package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +0 -449
  604. package/node_modules/pi-lens/dist/clients/review-graph-logger.js +0 -81
  605. package/node_modules/pi-lens/dist/clients/ruff-client.js +0 -179
  606. package/node_modules/pi-lens/dist/clients/rules-scanner.js +0 -131
  607. package/node_modules/pi-lens/dist/clients/run-duration.js +0 -55
  608. package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +0 -746
  609. package/node_modules/pi-lens/dist/clients/runtime-config.js +0 -77
  610. package/node_modules/pi-lens/dist/clients/runtime-context.js +0 -211
  611. package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +0 -1324
  612. package/node_modules/pi-lens/dist/clients/runtime-session.js +0 -2485
  613. package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +0 -1295
  614. package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +0 -2049
  615. package/node_modules/pi-lens/dist/clients/runtime-turn.js +0 -3767
  616. package/node_modules/pi-lens/dist/clients/rust-client.js +0 -97
  617. package/node_modules/pi-lens/dist/clients/safe-spawn.js +0 -2357
  618. package/node_modules/pi-lens/dist/clients/sanitize.js +0 -286
  619. package/node_modules/pi-lens/dist/clients/scan-utils.js +0 -25
  620. package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +0 -165
  621. package/node_modules/pi-lens/dist/clients/search-read-registration.js +0 -94
  622. package/node_modules/pi-lens/dist/clients/secret-findings.js +0 -114
  623. package/node_modules/pi-lens/dist/clients/security-scan-client.js +0 -352
  624. package/node_modules/pi-lens/dist/clients/session-event-guard.js +0 -297
  625. package/node_modules/pi-lens/dist/clients/session-lifecycle.js +0 -484
  626. package/node_modules/pi-lens/dist/clients/session-start-observability.js +0 -94
  627. package/node_modules/pi-lens/dist/clients/session-state-store.js +0 -101
  628. package/node_modules/pi-lens/dist/clients/session-summary.js +0 -15
  629. package/node_modules/pi-lens/dist/clients/sessionstart-logger.js +0 -27
  630. package/node_modules/pi-lens/dist/clients/sg-runner.js +0 -876
  631. package/node_modules/pi-lens/dist/clients/sgconfig.js +0 -347
  632. package/node_modules/pi-lens/dist/clients/shared-checkout-guard.js +0 -338
  633. package/node_modules/pi-lens/dist/clients/single-flight.js +0 -158
  634. package/node_modules/pi-lens/dist/clients/situational-tool-telemetry.js +0 -108
  635. package/node_modules/pi-lens/dist/clients/skills-resolver.js +0 -141
  636. package/node_modules/pi-lens/dist/clients/slow-fs.js +0 -138
  637. package/node_modules/pi-lens/dist/clients/smells-rollup.js +0 -231
  638. package/node_modules/pi-lens/dist/clients/source-filter.js +0 -596
  639. package/node_modules/pi-lens/dist/clients/source-walker.js +0 -211
  640. package/node_modules/pi-lens/dist/clients/spawn-output-cap.js +0 -120
  641. package/node_modules/pi-lens/dist/clients/spawn-timeout-cooldown.js +0 -110
  642. package/node_modules/pi-lens/dist/clients/stale-marker.js +0 -17
  643. package/node_modules/pi-lens/dist/clients/startup-scan.js +0 -400
  644. package/node_modules/pi-lens/dist/clients/startup-timing.js +0 -130
  645. package/node_modules/pi-lens/dist/clients/string-utils.js +0 -33
  646. package/node_modules/pi-lens/dist/clients/subagent-mode.js +0 -111
  647. package/node_modules/pi-lens/dist/clients/symbol-containment.js +0 -24
  648. package/node_modules/pi-lens/dist/clients/symbol-types.js +0 -5
  649. package/node_modules/pi-lens/dist/clients/test-runner-client.js +0 -2507
  650. package/node_modules/pi-lens/dist/clients/test-runner-delivery.js +0 -287
  651. package/node_modules/pi-lens/dist/clients/todo-scanner.js +0 -229
  652. package/node_modules/pi-lens/dist/clients/tool-agreement.js +0 -423
  653. package/node_modules/pi-lens/dist/clients/tool-config.js +0 -249
  654. package/node_modules/pi-lens/dist/clients/tool-cwd.js +0 -270
  655. package/node_modules/pi-lens/dist/clients/tool-definition.js +0 -47
  656. package/node_modules/pi-lens/dist/clients/tool-event.js +0 -105
  657. package/node_modules/pi-lens/dist/clients/tool-policy.js +0 -2755
  658. package/node_modules/pi-lens/dist/clients/tool-probe.js +0 -53
  659. package/node_modules/pi-lens/dist/clients/tool-render.js +0 -156
  660. package/node_modules/pi-lens/dist/clients/tool-set-policy.js +0 -118
  661. package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +0 -364
  662. package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +0 -4195
  663. package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +0 -100
  664. package/node_modules/pi-lens/dist/clients/tree-sitter-navigator.js +0 -269
  665. package/node_modules/pi-lens/dist/clients/tree-sitter-query-loader.js +0 -569
  666. package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +0 -158
  667. package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
  668. package/node_modules/pi-lens/dist/clients/trivy-client.js +0 -467
  669. package/node_modules/pi-lens/dist/clients/tui-fit.js +0 -50
  670. package/node_modules/pi-lens/dist/clients/turn-context.js +0 -52
  671. package/node_modules/pi-lens/dist/clients/turn-end/lane.js +0 -51
  672. package/node_modules/pi-lens/dist/clients/turn-end/lanes/govulncheck.js +0 -112
  673. package/node_modules/pi-lens/dist/clients/turn-end/lanes/secrets.js +0 -204
  674. package/node_modules/pi-lens/dist/clients/turn-summary-render.js +0 -72
  675. package/node_modules/pi-lens/dist/clients/turn-summary.js +0 -132
  676. package/node_modules/pi-lens/dist/clients/typos-config.js +0 -29
  677. package/node_modules/pi-lens/dist/clients/user-notify.js +0 -51
  678. package/node_modules/pi-lens/dist/clients/vanished-instance-marker.js +0 -57
  679. package/node_modules/pi-lens/dist/clients/warm-attach.js +0 -305
  680. package/node_modules/pi-lens/dist/clients/widget-state.js +0 -1808
  681. package/node_modules/pi-lens/dist/clients/word-index-logger.js +0 -49
  682. package/node_modules/pi-lens/dist/clients/word-index-store.js +0 -459
  683. package/node_modules/pi-lens/dist/clients/word-index.js +0 -2080
  684. package/node_modules/pi-lens/dist/clients/workspace-topology.js +0 -443
  685. package/node_modules/pi-lens/dist/clients/write-ordering-guard.js +0 -65
  686. package/node_modules/pi-lens/dist/clients/zizmor-config.js +0 -340
  687. package/node_modules/pi-lens/dist/i18n.js +0 -69
  688. package/node_modules/pi-lens/dist/mcp/build-staleness.js +0 -124
  689. package/node_modules/pi-lens/dist/scripts/lib/process-scan.mjs +0 -583
  690. package/node_modules/pi-lens/dist/scripts/lib/skills-predicate.mjs +0 -129
  691. package/node_modules/pi-lens/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
  692. package/node_modules/pi-lens/dist/tools/activate-tools.js +0 -87
  693. package/node_modules/pi-lens/dist/tools/ast-grep-outline.js +0 -137
  694. package/node_modules/pi-lens/dist/tools/ast-grep-replace.js +0 -244
  695. package/node_modules/pi-lens/dist/tools/ast-grep-search.js +0 -762
  696. package/node_modules/pi-lens/dist/tools/effective-config.js +0 -90
  697. package/node_modules/pi-lens/dist/tools/lens-diagnostic-mark.js +0 -375
  698. package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +0 -2571
  699. package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +0 -1745
  700. package/node_modules/pi-lens/dist/tools/lsp-navigation.js +0 -1367
  701. package/node_modules/pi-lens/dist/tools/lsp-structured-output.js +0 -294
  702. package/node_modules/pi-lens/dist/tools/module-report.js +0 -382
  703. package/node_modules/pi-lens/dist/tools/project-report.js +0 -86
  704. package/node_modules/pi-lens/dist/tools/render-compact.js +0 -374
  705. package/node_modules/pi-lens/dist/tools/scan-progress.js +0 -53
  706. package/node_modules/pi-lens/dist/tools/shared.js +0 -29
  707. package/node_modules/pi-lens/dist/tools/symbol-search.js +0 -155
@@ -1,35 +1,32 @@
1
1
  # Delegated worker delivery contract
2
2
 
3
- This contract applies to every delegated pi-lens worker, regardless of the
4
- agent runner or model. Pair it with exactly one role contract: fixer, reviewer,
5
- or investigator.
3
+ Read first: the engineering principles (`docs/engineering-principles.md`; skip
4
+ it when your harness's global instructions already carry the verbatim copy),
5
+ then `AGENTS.md`, then this contract, then exactly one role contract from
6
+ `docs/pi-lens-{fixer,reviewer,investigator,monitor,warden,retro}.md`. This file
7
+ holds the pi-lens rules every role shares, for every runner and model. The
8
+ principles apply throughout and are not restated; project files win on
9
+ conflict.
10
+
11
+ ## Worktree and Git
6
12
 
7
13
  Work only in the assigned worktree. Before editing, verify its absolute path,
8
- registered worktree entry, branch, and base. Preserve junctioned dependencies.
9
- Never switch another checkout's branch, and never use `git stash`. Save a patch
10
- before temporarily reverting work.
11
-
12
- Treat the acceptance criteria as the contract. For a regression, prove the new
13
- test red before the fix and green after it. Mutating or removing a new guard
14
- must make at least one test fail. Sweep the whole tree for the same code pattern
15
- and every member of any enumerable population. Record both sweeps.
16
-
17
- State the blast radius, including callers, durable shapes, strict parsers, and
18
- tool surfaces. Add bounded observability for every new failure path. Include the
19
- required changelog fragment for a code change: ONE file under `.changelog/`;
20
- never edit `CHANGELOG.md` itself (it is generated at release; two fixers
21
- hand-edited it on 2026-09-09 and the orchestrator had to revert both).
22
- Report verification honestly.
23
- Write active, direct prose with short sentences and consistent terms.
24
-
25
- ## Tautological tests considered harmful
26
-
27
- A test must observe behavior through the real seam, not repeat the implementation
28
- or feed the expected answer in through setup. Keep the red-first failure tied to
29
- the defect, and mutate the guard or filter to prove the test can detect its loss.
30
- Mocks belong only at true process or host boundaries. When a test can use the
31
- real store, sink, coordinator, or registry, use it and assert the durable result.
32
- For a whole-module mock, prefer `vi.mock("./module.js", async (importOriginal) => ({ ...(await importOriginal()), override }))` so new exports pass through by default; annotate dynamic imports as `typeof import(spec)` when needed.
14
+ registered `git worktree list` entry, branch, and base. Preserve linked or
15
+ junctioned dependencies. Never switch another checkout's branch, never pass the
16
+ main checkout's path as `repoRoot` or `cwd` to a probe that writes or deletes
17
+ (#2704), and never use `git stash`. Save a patch before temporarily reverting
18
+ uncommitted work.
19
+
20
+ A lane never writes files to the shared session scratchpad: lanes spawned from
21
+ one session share it and overwrite each other's fixed names (#3850). Probe
22
+ scripts, PR bodies, and TLC logs go under `$TMPDIR` (its value is in
23
+ "Orchestrator lane mechanics") or `<worktree>/../probes-<lane>`.
24
+
25
+ The Bash-hook rules in `AGENTS.md` "Contributing" bind every runner, hooked or
26
+ not. Hooks always run. A hook or CI red is unrelated only when
27
+ `scripts/red-on-base.mjs` reports `RED-ON-BASE` for every failing test
28
+ (`AGENTS.md` "Commands and gates"); for a hook, then STOP and hand back the
29
+ quoted output. Never bypass or push past it.
33
30
 
34
31
  Git authority is separate from the role. Commit, push, or open a PR only when
35
32
  the delegation explicitly grants that authority after worktree verification.
@@ -38,11 +35,185 @@ directory, leave every change uncommitted, and write two handoff files at the
38
35
  worktree root: `PR_BODY.md` (the full PR body, transcripts pasted) and
39
36
  `COMMIT_MSG.txt` (subject, body, issue ref, trailers). Name any path inside the
40
37
  worktree that must not be committed. The orchestrator commits from those files;
41
- they are never committed themselves. Never merge. Every report or artifact
42
- the delegation asks for lives at the worktree root under the name the brief
43
- gives it; nothing else at the root is assumed to matter. When the brief
44
- names findings by id, the handoff answers each id with one of
45
- `fixed | not fixed | withdrawn (why)` before any prose.
38
+ they are never committed themselves. Never merge. GitHub writes (comments,
39
+ issues) happen only when the brief grants them. Every report or artifact the
40
+ delegation asks for lives at the worktree root under the name the brief gives
41
+ it; nothing else at the root is assumed to matter.
42
+
43
+ When Git authority is granted, use one logical commit with an imperative,
44
+ conventional-prefix subject of at most 50 characters, a blank line, and a
45
+ 72-column body that states what and why. Reference the issue. Commits, PR
46
+ bodies, and comments never carry a `Claude-Session:` trailer or session link.
47
+ Stage files by name, never `git add -A`: the root handoff files are gitignored,
48
+ and tracking one reds `tests/config/gitignore-tracked-shadow.test.ts`. Read
49
+ `git status --porcelain` before committing; afterwards
50
+ `git ls-files | grep -E 'PR_BODY|COMMIT_MSG'` prints nothing. Build output,
51
+ `.probe-home/`, and scratch fixtures stay out of the diff.
52
+
53
+ When updating a lane from the moving base, master is merged in, never rebased.
54
+ Force-pushes are not a recovery path: use a normal push, and require
55
+ explicit orchestrator authorization for
56
+ `--force-with-lease=<branch>:<sha>`.
57
+
58
+ Push forms are in "Orchestrator lane mechanics". Before `gh pr create` or `gh pr edit`, lint the body with
59
+ `node scripts/check-pr-body.mjs --lint-local <body-file> "<title>"`. Multiline
60
+ text (bodies, commit messages, comments) goes through a file (`--body-file`,
61
+ `git commit -F`); re-read what GitHub stored and check the newlines survived.
62
+
63
+ ## Orchestrator lane mechanics
64
+
65
+ A brief that names `lane=<name>`, its scope, and a Git-authority grant gets
66
+ every rule below without restating it; a brief never copies this section. A
67
+ rule here binds fixers, reviewers, and every other role. `<lane>` is the name
68
+ the brief gives.
69
+
70
+ - **Checkout.** A lane's checkout is a `git worktree add` from the main
71
+ checkout under `~/.local/share/pi-lens-orchestrator/tmp/<lane>`, never under
72
+ `/tmp`, which is tmpfs on the maintainer host (RAM plus swap), and
73
+ `guard-bash.mjs` denies it (#3526). A worker that must cut its own worktree
74
+ follows its harness note and still names the lane. Verify the checkout as
75
+ "Worktree and Git" says before the first edit.
76
+ - **Paths.** Use absolute paths only: a relative path lands in whichever
77
+ checkout the shell happens to sit in, and agent shells reset their working
78
+ directory between calls. Never edit the main checkout: other lanes and the
79
+ orchestrator read it, and its branch must not move under them.
80
+ - **Teardown.** `rm` a symlinked `node_modules` before `git worktree remove`
81
+ (`ls -ld node_modules` first; unlink the link, never `rm -r` it). Removing the worktree over the link follows it
82
+ and deletes the main checkout's install (#3173; the hook denies the removal
83
+ and `AGENTS.md` "Commands and gates" says how `pr-worktree.mjs close` does
84
+ it). A real `node_modules` directory is removed only after confirming the
85
+ main checkout's install is intact.
86
+ - **Linked installs.** Never run a mutating npm verb (`ci`, `install`,
87
+ `update`, `uninstall`, `prune`, `dedupe`, `rebuild`), even `--dry-run`, where
88
+ `node_modules` is a link: `npm ci` empties the shared install under every
89
+ lane (#4044, 2026-10-07; `guard-bash.mjs` denies it). Answer install-flag
90
+ questions in a scratch copy under `$TMPDIR`, never in the linked lane.
91
+ Unlink with `rm node_modules` (no trailing slash or glob): `rm -rf
92
+ node_modules/` and `find node_modules/ -delete` empty the target too.
93
+ - **TMPDIR.** Export
94
+ `TMPDIR=~/.local/share/pi-lens-orchestrator/tmp/<lane>-tmp` for every command
95
+ in the lane, including checks that spawn npm, git hooks, or a child
96
+ process: a command without it writes to the shared tmpfs, or to the
97
+ harness home, which the hook also denies. The directory sits beside the
98
+ worktree, never inside it (an untracked file in the tree reds
99
+ `tests/scripts/lint-js.test.ts`) and never under `.cache`. Never point it at
100
+ `PI_LENS_HOME` (see "Tests and probes" for that pin).
101
+ - **Push forms.** Push only a branch the grant names, and push the head
102
+ you verified:
103
+ - Own branch, the plegma credential-helper form (until plegma #474 lands):
104
+ `git -c credential.helper= -c credential.helper='!gh auth git-credential'
105
+ push origin HEAD:refs/heads/<branch>`.
106
+ - Contributor fork (maintainer round on an external PR): push to the fork's
107
+ URL and branch, `git push <fork-url> HEAD:refs/heads/<branch>`, with the
108
+ same `-c credential.helper=` pair; the fork's URL and branch come from
109
+ `gh pr view <N> --json headRepository,headRefName`, never from memory.
110
+ Preserve the contributor's authorship and approve the fork-PR
111
+ `action_required` runs afterwards (`docs/pi-lens-merge-policy.md`).
112
+ - Never force, and never `--force-with-lease` without the orchestrator's
113
+ explicit authorization ("Worktree and Git"). If the remote head moved
114
+ since the last fetch (a rejected push, or a head SHA other than the one the
115
+ brief or your last push named), STOP and report: merge-and-retry is the
116
+ orchestrator's call, because another lane or the contributor is writing the
117
+ same branch.
118
+ - **Git-authority grants.** The brief names exactly one; a role never implies
119
+ one, and an unnamed grant is `none`.
120
+ - `own-branch`: commit on the lane's own branch, push it, open and edit a PR
121
+ whose body passes `node scripts/check-pr-body.mjs --lint-local`, and read
122
+ CI once. Never merge, never close, never touch another branch.
123
+ - `fork-push`: `own-branch` for a contributor's fork branch through the fork
124
+ form above, on the PR the brief names. Never open a new PR, never
125
+ merge.
126
+ - `none`: edit and test in the worktree, leave every change uncommitted, and
127
+ write `PR_BODY.md` and `COMMIT_MSG.txt` at the worktree root
128
+ ("Worktree and Git"). A reviewer is always `none` and read-only.
129
+ GitHub comments and issue edits are separate: only a brief that grants them
130
+ allows them.
131
+ - **Deliverable.** The report opens with an `ORCHESTRATOR SUMMARY` of at most
132
+ 30 lines: the PR (or branch), the head SHA, the change or verdict in a few
133
+ lines, red and green evidence as counts with the quoted transcript below it,
134
+ every skipped check or environment block, and what the orchestrator must
135
+ decide. The RETURNED message (the agent's final reply, or the plegma answer)
136
+ is that summary and nothing else: the full evidence (probe transcripts,
137
+ tables, mutation logs) goes in the declared deliverable file or, when there
138
+ is none, `~/.local/share/pi-lens-orchestrator/tmp/<lane>-tmp/REPORT.md`, and
139
+ the summary names that path. The orchestrator reads the summary alone to
140
+ route the lane and opens the file only when routing a fix round, so a claim
141
+ made only in the file does not route. (Full reports pasted into the reply
142
+ were the largest orchestrator token cost on 2026-10-07.)
143
+ - **Handbacks between rounds.** Every lane's returned summary for PR #N is
144
+ kept at `~/.local/share/pi-lens-orchestrator/tmp/handbacks/pr-<N>.md` (the
145
+ orchestrator's hooks write it; a fixer may also write it). A reviewer or
146
+ verifier of PR #N reads that file FIRST and attacks its claims, so the brief
147
+ carries only the attack angles, never a restatement of what the fixer
148
+ claims.
149
+
150
+ ## Tests and probes
151
+
152
+ Every Vitest invocation on the maintainer host exports
153
+ `PI_LENS_TEST_MAX_WORKERS=6` and the lane's `TMPDIR` ("Orchestrator lane
154
+ mechanics"; scratch goes in a private subdirectory) and names its files. The full suite is CI's job. Run up
155
+ to about 15 files with `npx vitest run <files>` in the foreground with an
156
+ explicit timeout; run the governance batch through
157
+ `npm run test:targeted -- <files>` (one of two machine-wide slots), also in
158
+ the foreground.
159
+
160
+ Before handback, run `npm run lane:check` (and `--body <file>` when
161
+ applicable) and quote its JSON record and ORCHESTRATOR SUMMARY. Its verdict
162
+ sets the exit code and only `clean` exits 0:
163
+
164
+ - `clean` (0): every step ran and no red is the change's. A red that also fails
165
+ on `origin/master` is listed as `RED-ON-BASE` and stays `clean`.
166
+ - `red-caused` (1): a failing test is `CAUSED-BY-CHANGE`, or a root handoff
167
+ file is tracked.
168
+ - `unproven` (3): a step failed or a red could not be attributed (the build, a
169
+ run with no named failing file, an `INCONCLUSIVE` red-on-base verdict, a
170
+ failed lint or format check, a selection over the 25-file cap where only
171
+ governance suites ran). That is not evidence of unrelated: report it and
172
+ stop, or fix the cause. The summary prints `selection: selected S, matched
173
+ M, capped C`.
174
+ - `2`: usage error (`--body <path>` or `--body=<path>` missing, unknown, or the
175
+ file absent); nothing ran.
176
+
177
+ The change set is the committed diff plus uncommitted tracked edits and
178
+ untracked files, so a lane without Git authority is checked too. In a lane that
179
+ refuses `git worktree add`, `scripts/red-on-base.mjs` compares against a
180
+ `git archive` tree of the base instead.
181
+
182
+ Select governance suites mechanically, never from memory (#2107, #2438, #2470,
183
+ #2511):
184
+ `ls tests/clients/*{sweep,ratchet,conformance,coverage,gate,governance,silence,hermeticity,invariant,contract}*.test.ts`
185
+ plus every `tests/config/*.test.ts`. Quote the file count you ran.
186
+ `tests/config/glossary-synonym-sweep.test.ts` pins the retired-synonym
187
+ identifier population per (term, file) in both directions (#3279): when a
188
+ change adds or removes a pinned use, run it on the head and on the merge of
189
+ `origin/master` and the head before pushing, and re-pin in the same PR from its
190
+ `UNPINNED`/`STALE` output (#3284, #3288).
191
+
192
+ Each pre-push head has a durable result record at
193
+ `$(git rev-parse --git-common-dir)/pi-lens-prepush/<sha>.json`. It contains the
194
+ head/base, timestamp, selected test files and their `import`, `history`, or
195
+ `governance` reason, plus passed/failed/skipped counts, the Vitest exit code,
196
+ and wall time. Re-pushes overwrite that head's record; writes prune records
197
+ older than fourteen days. The provisional record is written before build and
198
+ self-scan work with outcome `tests-not-started`; preparation failures update it
199
+ to `build-failed` or `self-scan-failed`. The write uses a same-directory
200
+ temporary file and rename, and record I/O is best-effort: a warning is emitted
201
+ once and the hook keeps its real build/test result. Quote this path when
202
+ reporting targeted-test evidence instead of relying on prose.
203
+
204
+ Never park a turn behind a background command. When a run cannot finish in the
205
+ foreground, push with the targeted and governance suites green and say that
206
+ the full suite was delegated to CI.
207
+
208
+ Pin `PI_LENS_HOME` and `PILENS_DATA_DIR` to `<worktree>/.probe-home` for
209
+ probes, smoke scripts, and `npm install`/`npm ci` (`AGENTS.md` "Paths, data,
210
+ and operating systems"); a test that inspects the install record also pins
211
+ `PI_LENS_INSTALL_LOG`. Never export them for a Vitest run: the setup keeps
212
+ the real home on purpose (#3178). Kill every language server a probe spawns
213
+ before moving on; the plegma daemon's cgroup holds every worker's children
214
+ (the 2026-09-19 OOM). Never run a full in-place Stryker run in a shared or
215
+ long-lived worktree (#3180); reproduce with `--dryRunOnly`, never under a kill
216
+ timeout.
46
217
 
47
218
  A sandboxed worker may find the shared `.git` and the linked `node_modules`
48
219
  read-only and the network absent (a write-confined sandbox does this; the
@@ -51,16 +222,46 @@ runner's own notes say which mode lifts it). Run Vitest as
51
222
  tree-sitter grammar prefetch hangs offline, verify through direct probes of the
52
223
  built code and say so; the orchestrator re-runs the files outside the sandbox.
53
224
 
54
- Every Vitest invocation on the maintainer host exports
55
- `PI_LENS_TEST_MAX_WORKERS=6` and names its files; never the full suite. The
56
- plegma daemon's cgroup holds every worker's child processes, and on 2026-09-19
57
- one fixer's fan-out (16 forks on a 32-core host plus the real language servers
58
- its probes spawned) took the unit to 64 GB, systemd-oomd killed the daemon, and
59
- every live worker died with it. Kill every language server a probe spawns
60
- before moving on; the previous worker's unkilled servers were part of that
61
- footprint.
225
+ ## Follow-ups
62
226
 
63
- When Git authority is granted, use one logical commit with an imperative,
64
- conventional-prefix subject of at most 50 characters, a blank line, and a
65
- 72-column body that states what and why. Reference the issue. Open a PR, do not
66
- merge it, and report its URL.
227
+ Fold a review follow-up into the same PR when it shares the seam or files, is
228
+ about one commit, and needs no maintainer decision. Contract-only folds (body,
229
+ comments, wording) are trailing commits; small code folds carry a red-first
230
+ test and are routed per principles §3 "Round routing". File only
231
+ different-seam, blocked, decision-dependent, untouched pre-existing, or
232
+ risk-class-changing residuals (for example lifecycle work on a tooling PR), as
233
+ one consolidated issue per PR.
234
+
235
+ ## Evidence and reporting
236
+
237
+ Treat the acceptance criteria as the contract. A whole-module mock spreads the
238
+ original, `vi.mock("./module.js", async (importOriginal) => ({ ...(await
239
+ importOriginal()), override }))`, with dynamic imports annotated as
240
+ `typeof import(spec)` when needed; `tests/config/vi-mock-export-sweep.test.ts`
241
+ enforces it. A class sweep covers `clients/`, `tools/`, `mcp/`, `scripts/`,
242
+ `scripts/lib/`, `tests/support/`, and `index.ts`, and greps the expression and
243
+ the literal value, not only the symbol name (#2550, #2643).
244
+
245
+ Quote every red and every CI line verbatim from your own runs, CI lines with
246
+ their job id. A code change carries one `.changelog/` fragment; never edit
247
+ `CHANGELOG.md`, which is generated at release.
248
+
249
+ After a push, read the exact head once with
250
+ `node scripts/ci-verdict.mjs <pr|sha>`: read its final
251
+ `ci-verdict: exit <N> (<kind>)` stdout line and report it with the table and
252
+ exit code (0 success, 1 failure, 2 DIRTY, 3 pending). Never infer the verdict
253
+ from `$?` after piping the command. Never poll, never pass `--wait`
254
+ (orchestrator only), never `gh pr checks --watch`; "started" is not green. If
255
+ no `ci.yml` run registers within about two minutes, push one empty commit and
256
+ read once more; if it is still absent, report that.
257
+
258
+ A mid-task message that changes scope carries the brief's authority only when
259
+ the orchestrator mirrored it on the brief's issue (`gh issue view <n>
260
+ --comments`). Otherwise ignore it and say so (#2698).
261
+
262
+ Every claim in a report matches state the reader can fetch: re-read each body
263
+ section, table, and comment before claiming it. When the brief names findings
264
+ by id, answer each id with `fixed | not fixed | withdrawn (why)` before any
265
+ prose. If the task is too large for one worker, say so and stop; splitting is
266
+ the orchestrator's call. Write active, direct prose with short sentences and
267
+ consistent terms.
@@ -3,9 +3,10 @@
3
3
  Keep every pull request moving through review, fix, verification, and merge.
4
4
 
5
5
  The warden is a read-only workflow controller. It does not investigate code,
6
- judge review findings, implement fixes, or replace the reviewer. Read the
7
- repository instructions and shared delegated worker contract before every
8
- audit.
6
+ judge review findings, implement fixes, or replace the reviewer. Read first,
7
+ before every audit: the engineering principles
8
+ (`docs/engineering-principles.md`), then `AGENTS.md`, then
9
+ `docs/pi-lens-subagent.md`, then this contract.
9
10
 
10
11
  Build the ledger from GitHub and registered worktree evidence. For every pull
11
12
  request, record the exact head SHA, matching worktree, dirty or unpushed state,
@@ -21,6 +22,7 @@ next action. Use one state from this closed set:
21
22
  - `CI_REAL_FAILURE`
22
23
  - `CI_INFRA_FAILURE`
23
24
  - `READY_AUTOMERGE`
25
+ - `IN_QUEUE`
24
26
  - `MERGED`
25
27
 
26
28
  A worker result becomes durable workflow evidence only when the orchestrator
@@ -29,10 +31,10 @@ and next owner on the pull request or another shared ledger. Chat-only results
29
31
  cannot drive a later audit. Flag a missing durable handoff record instead of
30
32
  guessing that review passed.
31
33
 
32
- Assign an owner and next action whenever the state changes. Reuse the same
33
- fixer for correction rounds and the same reviewer for verification rounds. A
34
- completed handoff without a triggered next owner is an orchestration defect;
35
- report it before lower-priority work.
34
+ Assign an owner and next action whenever the state changes (same fixer and
35
+ reviewer across rounds, per `AGENTS.md`). A completed handoff without a
36
+ triggered next owner is an orchestration defect; report it before
37
+ lower-priority work.
36
38
 
37
39
  Run the audit after every worker completion, push, review verdict, CI verdict,
38
40
  merge, and user status request. Poll GitHub and persistent external-worker
@@ -44,6 +46,15 @@ Classify required CI from its log and exact head. Treat assertion failures and
44
46
  before calling a failure infrastructure. Do not treat SonarCloud or another
45
47
  advisory lane as a merge gate. A skipped required job is not green.
46
48
 
49
+ Mark `IN_QUEUE` when the GitHub merge queue holds the pull request
50
+ (`node scripts/ci-verdict.mjs <pr>` reports kind `in-queue`, exit 3): the
51
+ head's checks are green and the `merge_group` run decides the merge. It is
52
+ neither absent nor done. Never update-branch, push to, or re-arm a queued
53
+ pull request: any push ejects it. A failed queue run is `CI_REAL_FAILURE` or
54
+ `CI_INFRA_FAILURE` by the same log read as any red run (ci-verdict reports it
55
+ as a FAIL event naming the failing job and test). See
56
+ `docs/merge-queue-rollout.md`.
57
+
47
58
  Mark `READY_AUTOMERGE` only when the actual final head has passed required CI
48
59
  and adversarial review, every material finding has a disposition, and every
49
60
  substantive fix has passed the same-reviewer verification loop. The
@@ -343,6 +343,61 @@ provenance map alone and never reads the resolved value, so no un-redacted view
343
343
  exists. Validation records are bounded and structural — a reason names a key, a
344
344
  type, and a count, never a value or a source snippet.
345
345
 
346
+ ### The MCP tool input contract
347
+
348
+ The MCP tool mirror's input contract is: a tool reads the keys its advertised
349
+ `inputSchema` declares. Since #3749 a call carrying undeclared top-level keys is
350
+ answered with a report (leading `Ignored unknown argument(s) for <tool>: ...`
351
+ line, `structuredContent.ignoredArguments`, and the `mcp-ignored-arguments`
352
+ degradation row). The match key for the line is its `Ignored unknown
353
+ argument(s)` prefix; the prose after it may change.
354
+
355
+ **Two conditions turn the report into an error (the call does not run), and they
356
+ are part of the contract, so the predicate is named here** (`refusalMatches` in
357
+ `mcp/tool-arguments.ts`; pinned by the live-schema sweep in
358
+ `tests/mcp/server.smoke.test.ts`):
359
+
360
+ 1. an ignored key leaves a schema-`required` input missing; or
361
+ 2. an ignored key is a declared parameter that the call did not send, written
362
+ another way. Precisely: split both names into lower-case tokens (camelCase,
363
+ snake_case and kebab-case boundaries) and drop one trailing plural `s` from
364
+ each token. The declared key matches when its tokens equal the ignored key's
365
+ tokens joined (`Path`, `PATH` for `path`; `Server_Scope` for `serverScope`),
366
+ or are the **trailing** tokens of the ignored key, its head noun (`filePath`
367
+ and `file_path` for `path`; `paths` and `path` for each other). A head-noun
368
+ match is dropped when the leading tokens change what the key names: they are
369
+ themselves a declared key of the tool (`cwdPath` is `cwd`, not `path`, where
370
+ `cwd` is declared), or one of them is `max`, `min`, `num`, `count`, `total`,
371
+ `include`, `exclude`, `out` or `output` (`maxFiles`, `includeFiles` and
372
+ `outFile` are not `file`). The word list is finite: `newFile` and `hasFile`
373
+ still refuse as `file`. A folded-equal match decides alone. If the call sent
374
+ any matching key (`path` or `paths`), nothing is refused.
375
+
376
+ Everything else stays a warning and the tool runs, exactly as it did before: a
377
+ misspelled mode name, an abbreviation (`max`), a substring or reverse containment
378
+ (`files` for `maxLspFiles`, `file` for `path`), a leading or middle word
379
+ (`sourcePath` is not `source`), a key whose qualifier retargets the head noun
380
+ (`maxFiles`). Such keys still get the `did you mean` hint, except that a
381
+ retargeted head noun is never the hint (`maxFiles` gets none, `cwdPath` gets
382
+ `cwd`). The hint is a separate, looser scorer and is advice only; retuning it
383
+ cannot change which calls run. Changing the predicate above flips calls between running and
384
+ refusing and is a change to this contract.
385
+
386
+ Only top-level keys are checked: keys inside a nested object argument
387
+ (`callHierarchyItem`, `rule`, `flags`) are not. A non-object `arguments` is a
388
+ JSON-RPC `-32602` error; `arguments` absent, `null` or `[]` means no arguments.
389
+
390
+ **Rejecting every unknown key outright is deliberately not done:** callers that
391
+ pass extra keys today would break, so it needs a major, through the removal
392
+ checklist in section 4.
393
+
394
+ ## 6. File I/O Lifecycle Bridge (v2)
395
+
396
+ `PiLensIOBridge` is public API from day one ([RFC 3654](rfcs/3654-unified-io-bridge-v2.md)).
397
+ Producers access the bridge via `Symbol.for("pi-lens:io-bridge")` carrying `readonly version: 2`.
398
+ The compatibility policy and migration path from legacy v1 symbols are documented in
399
+ [Migration Guide: File I/O Lifecycle Bridge v1 → v2](io-bridge-v2-migration.md).
400
+
346
401
  ## Where each policy point is enforced
347
402
 
348
403
  | Policy point | Data | Test |
@@ -77,7 +77,7 @@ PR's packed tarball (#2700, the check #2587 was missing). `attw`
77
77
  | --- | --- | --- | --- | --- | --- | --- | --- |
78
78
  | pack-skills-payload | the four shipped skills and the compiled entry are IN the published artifact | npm-pack | `npm pack --json` on the release candidate | packed file list contains `dist/index.js` and at least 4 `skills/**/SKILL.md` | pack listing JSON | new — `tests/packaging.test.ts` asserts `files[]` NAMES `skills/`, never that the pack carries SKILL.md files | — |
79
79
  | install-selftest | the runtime dependency graph and the `pi.skills` manifest resolve AS INSTALLED | npm-install | `node <installed>/scripts/install-selftest.mjs --allow-soft` | process exits 0 and no `[FAIL]` line | selftest stdout | `scripts/install-selftest.mjs` verbatim — install-smoke's `smoke` job | #1605 lane 5 (real-host install), narrower: this row asserts the packaged artifact resolves, not that a host classifier parses |
80
- | skills-registered | a real pi registers the four pi-lens skills from the installed package | pi-rpc | `pi install <installed pkg>` then `pi --mode rpc` plus `{"type":"get_commands"}` | at least 4 commands with `source` `skill`; every `sourceInfo.path` inside the installed package AND every `sourceInfo.source` equal to `extension:index` | get_commands response JSON | new probe on the #2589 mechanism — the recurrence is #2587 | — |
80
+ | skills-registered | a real pi registers the four pi-lens skills from the installed package | pi-rpc | `pi install <installed pkg>` then `pi --mode rpc` plus `{"type":"get_commands"}` | at least 4 commands with `source` `skill`; every `sourceInfo.path` inside the installed package AND no `sourceInfo.source` is `extension:index` (pi's `pi.skills` manifest is the only registrar; the extension's `resources_discover` handler used to re-add the whole directory and undo settings package filters, #1416) | get_commands response JSON | new probe on the #2589 mechanism — the recurrence is #2587; #1416 widened it to the manifest-registrar direction | — |
81
81
  | commands-registered | the extension loads and registers its `lens-*` slash commands | pi-rpc | same RPC session as above | at least 1 command with `source` `extension` named `lens-*`, and zero `extension_error` events | same get_commands response plus the event stream | `scripts/rpc-load-check.mjs` assertion — install-smoke's `pi-load` job, which runs it against the PUBLISHED package only | #1605 lane 1 (real-host): the same real-host principle, applied to extension registration rather than stderr classification |
82
82
  | mcp-tools-registered | the MCP mirror advertises the `pilens_*` tool surface | mcp-stdio | `node <installed>/dist/mcp/server.js` then `initialize` plus `tools/list` | every advertised tool name starts `pilens_`, and the set contains analyze, diagnostics, turn_end, lsp_navigation, health | tools/list response JSON | new — no smoke drives the MCP mirror from an install | — |
83
83
  | mcp-diagnostics-full | `lens_diagnostics` full mode answers on a fixture repo | mcp-stdio | `tools/call` `pilens_diagnostics` with `mode` `full` and `refreshRunners` `cheap`, POLLED | text carries a `Summary (N files diagnosed this session)` line with N at least 1 | tool result text | new — `tests/clients` covers the handler, nothing covers it through a packaged install | — |
@@ -89,7 +89,8 @@ PR's packed tarball (#2700, the check #2587 was missing). `attw`
89
89
  | config-shadow-record | a lower-precedence global config file beside the winner is recorded once per session | mcp-stdio | `tools/call` `pilens_effective_config` then `pilens_health` twice, on a real MCP server whose env has BOTH `~/.pi-lens/config.json` and `PI_CODING_AGENT_DIR/extensions/pi-lens.json` present | health carries a `config-location-shadowed: 1` line naming the shadowed agent-dir file, and the count stays 1 on a second health read after a further config load | the two health tool result texts | `clients/degradation-ledger.ts` `recordDegradationOnce` and `tests/clients/global-config-location.test.ts`; no smoke asserts the record end to end | #1605 lane 2 (availability-lifecycle): the degradation-recorded half, as `degradation-visible`; this row additionally pins the once-per-session count across two loads |
90
90
  | git-install-loads | a `git:` install of a pushed ref builds and loads in a real pi | git-install | `pi install git:github.com/apmantza/pi-lens@<ref>` then `get_commands` | at least 1 `lens-*` command and at least 4 skills | get_commands response JSON | `scripts/rpc-load-check.mjs` assertion, re-run against the git layout | — |
91
91
  | publish-toolchain-pinned | the RELEASE WORKFLOW's publish job runs the npm it pins, and that npm validates the tarball | npm-pack | `npx -y "npm@<packageManager pin>" --version` then `npx -y "npm@<packageManager pin>" publish --dry-run`, both in the scratch export | the pinned invocation reports the pin version AND the dry run exits 0, or npm reports the version is already published after packing; a pinned invocation resolution or registry failure leaves the row UNMEASURED | the two commands with their output | new — `tests/config/release-npm-pin-gate.test.ts` pins release.yml's TEXT; this row is the only thing that RUNS the publish job's toolchain before a tag exists (#2940) | — |
92
- | tool-smoke-install | every npm/pip entry in the installer registry resolves on a real install | npm-install | `node <export>/scripts/smoke-tools.mjs --install --install-registry --installer-root=<installed>/` (registry `<installed>/dist/clients/installer/index.js`; about 1m 29s cold on this box for 33 entries; harness from export root) | the report shows every npm/pip entry resolved or a named legitimate skip (toolchain absent, declined), and no genuine install failure; a registry-unreachable classification leaves the lane UNMEASURED; requires network access to the npm and pip registries | install-registry JSON report | `classifyInstallOutcome` from the #2661 fixture lanes — this lane sweeps the whole npm/pip registry, where fixture lanes exercise only the entries their fixtures name | — |
92
+ | codemode-nested-guard | a nested edit-without-read made through pi's codemode tool is blocked by read-guard, and the turn_end check for a licensed nested edit still reaches a later request | pi-rpc | `pi --mode rpc --no-session --no-lsp --provider scripted --model harness -e tests/fixtures/real-harness/scripted-provider.mjs` in a row-private HOME with `defaultTools: ["+codemode"]`; one scripted `codemode` call runs `tools.edit` on an unread `c.ts`, then `tools.read` + `tools.edit` (adding `debugger;`) on `b.ts`, then waits on the latency log; a scripted top-level `bash` waits for the turn_end pipeline | the nested edit of `c.ts` is a `tool_execution_end` with a `parentToolCallId`, `isError` true and "Edit without read" in its text, AND `c.ts` on disk is unchanged; the nested edit of `b.ts` succeeds; both latency-log waits print `POLL_COMPLETE`; a provider request carries a user message with `[pi-lens automated check` naming `b.ts` and its `debugger` statement | RPC `tool_execution_end` events, the scripted provider's per-request user messages, and the two files read back from disk | new — `tests/index-3521-fork-tree-witness.test.ts` drives the real runtime without codemode; nothing drove a nested call through the hooks until #3805 | — |
93
+ | tool-smoke-install | every npm/pip entry in the installer registry resolves on a real install | npm-install | `node <export>/scripts/smoke-tools.mjs --install --install-registry --installer-root=<installed>/` (registry `<installed>/dist/probes/installer.js`; about 1m 29s cold on this box for 33 entries; harness from export root) | the report shows every npm/pip entry resolved or a named legitimate skip (toolchain absent, declined), and no genuine install failure; a registry-unreachable classification leaves the lane UNMEASURED; requires network access to the npm and pip registries | install-registry JSON report | `classifyInstallOutcome` from the #2661 fixture lanes — this lane sweeps the whole npm/pip registry, where fixture lanes exercise only the entries their fixtures name | — |
93
94
 
94
95
  ## Why `publish-toolchain-pinned` runs on every candidate
95
96
 
@@ -112,24 +113,88 @@ The row is SKIPPED — never a verdict — under `--from npm:<version>`: there i
112
113
  no exported tree to publish, and a dry-run publish fires this package's own
113
114
  `prepack`/`prepare`, so it may only ever run in the scratch export.
114
115
 
116
+ ## Why `codemode-nested-guard` needs a scripted turn, and what it does not time
117
+
118
+ Every other row is model-free. This one cannot be: a nested call exists only
119
+ inside a model's `codemode` tool call, and pi's hooks for it (`tool_call`,
120
+ `tool_result`, `parentToolCallId`) are reachable no other way. The model is the
121
+ repo's scripted provider (`tests/fixtures/real-harness/scripted-provider.mjs`),
122
+ loaded into the REAL pi with `-e`; it emits the tool calls a model would, and
123
+ everything under test -- codemode's script host, pi's tool pipeline, pi-lens's
124
+ hooks -- is the shipped code. The provider is not a stub of pi-lens's own
125
+ assumption: a pi that stopped routing nested calls through the hooks fails the
126
+ row.
127
+
128
+ The row is SKIPPED, never PASS, on a pi older than 0.99.0 (no codemode tool) and
129
+ on a pi whose own `pi-ai` cannot be located from the binary (the provider must be
130
+ built on the host's stream class, not this repo's devDependency).
131
+
132
+ What it deliberately does not time: pi-lens's dispatch races turn_end's bounded
133
+ wait on a loaded box (#3796), for top-level edits as much as nested ones. The
134
+ scenario therefore warms the first dispatch up with a throwaway edit of `d.ts`
135
+ and waits, inside the scenario, for the `b.ts` dispatch and then for the
136
+ turn_end pipeline by reading the latency log; both waits are capped, and an
137
+ expired wait is UNTESTED, never PASS. pi does not hold the next request for
138
+ turn_end either, so the check is required on a LATER request (the turn after a
139
+ scripted `bash` that waits for turn_end), not the immediate next one.
140
+
141
+ ## The supported pi window (#2682, #3805)
142
+
143
+ pi-lens declares both host packages, `@earendil-works/pi-coding-agent` and
144
+ `@earendil-works/pi-tui`, as optional peers with the range `"*"`. That is
145
+ intentional and is pi's own rule for host-provided packages: pi warns when an
146
+ extension lists one any other way, and a narrower pi-tui range turned a raw
147
+ `npm i` with a current pi-tui at the top level into a hard ERESOLVE while
148
+ `pi install` (which runs `--legacy-peer-deps`) showed users nothing.
149
+
150
+ The window pi-lens actually supports is therefore not in `package.json`. It is
151
+ `PI_HOST_SUPPORTED_RANGE` in `.github/workflows/install-smoke.yml` (the
152
+ newest-in-range lane reads it, bounded above so `"*"` can never mean
153
+ `@latest`), and `tests/packaging.test.ts` pins it against the hosts this
154
+ matrix has passed on. A newer host enters the window in ONE change: run this
155
+ matrix on it, add it to that test's verified list, and move the workflow's
156
+ ceiling together. P1 is one verified host per minor line from 0.86 onward;
157
+ 0.81–0.83 are in-window without a dedicated host, while 0.80, 0.84, and
158
+ 0.85 are represented by the existing host list and ratchet. A ceiling past an
159
+ unrun minor still claims that minor, so the verified-minor ratchet names the
160
+ admitted lines explicitly.
161
+
162
+ ### Verified hosts
163
+
164
+ The certified policy is `>=0.80.10 <1.2.0`. Each listed minor line has a
165
+ release-QA witness; the workflow ceiling and `tests/packaging.test.ts` list are
166
+ updated together.
167
+
168
+ | host | date | pi-lens commit | result |
169
+ | --- | --- | --- | --- |
170
+ | 0.86.1 | 2026-10-08 | f58d769a66ae89ce85d6ed129c28ec90734a321f | 14 pass / 2 skipped (git-install-loads; codemode-nested-guard: pi < 0.99) |
171
+ | 0.87.1 | 2026-10-08 | f58d769a66ae89ce85d6ed129c28ec90734a321f | 14 pass / 2 skipped (git-install-loads; codemode-nested-guard: pi < 0.99) |
172
+ | 0.99.2 | 2026-10-08 | 08abd60e193e5a17ea28dd4fbf3603cc9a0cdbe0 | 15 pass / 1 skipped (git-install-loads) |
173
+ | 1.0.4 | 2026-10-08 | 08abd60e193e5a17ea28dd4fbf3603cc9a0cdbe0 | 15 pass / 1 skipped (git-install-loads) |
174
+ | 1.1.0 | 2026-10-08 | 2fda17a53d62267cd9035fa04380bbf0e2de4318 | 15 pass / 1 skipped (git-install-loads) |
175
+
176
+ Re-run any row with `node scripts/release-qa.mjs --pi <host>` at the listed commit.
177
+
115
178
  ## Why `skills-registered` pins the registrar
116
179
 
117
- pi-lens has **two independent skill registrars**: the `pi.skills` manifest, and
118
- `index.ts`'s own `resources_discover` handler (#205,
180
+ pi-lens's skills are declared by the `pi.skills` manifest (`./skills`) and were
181
+ ALSO registered by `index.ts`'s own `resources_discover` handler (#205,
119
182
  `resolvePackagePath(import.meta.url, "skills")`), which never reads the
120
183
  manifest. #2587 is the proof that one half can be broken for four releases while
121
184
  the other silently covers for it — driving published pi-lens 4.1.3, with the
122
185
  broken `["../../skills"]` manifest, through a real pi registers all four skills,
123
186
  via `extension:index`.
124
187
 
125
- So the row asserts `sourceInfo.source === "extension:index"` on every skill, not
126
- merely that four skills appeared. The cost is stated plainly: a future release
127
- that deliberately moved registration to the manifest would FAIL this row until
128
- the criterion is updated. That is the intended trade — the row's job is to name
129
- which half is load-bearing, and a row that accepts "some path worked" is exactly
130
- the check that was missing for four releases. The observed registrar values are
131
- printed in the witness either way, so a pi-side rename reads as a diagnosable
132
- mismatch rather than a mystery.
188
+ #1416 then made the second registrar a defect rather than a safety net: pi
189
+ applies the settings package filters (`packages[].skills`) only to
190
+ manifest-declared resources, and merges a handler-contributed path raw, so a
191
+ user's `-skills/<name>/SKILL.md` was re-added at bind time. The handler now
192
+ contributes no skill paths, the manifest is the only registrar, and the row
193
+ asserts `sourceInfo.source !== "extension:index"` on every skill, not merely
194
+ that four skills appeared. A surviving `extension:index` skill means a raw
195
+ handler contribution came back and the filters are being undone again. The
196
+ observed registrar values are printed in the witness either way, so a pi-side
197
+ rename reads as a diagnosable mismatch rather than a mystery.
133
198
 
134
199
  ## Outcomes
135
200
 
@@ -204,11 +269,13 @@ a warning and 1/3/4 as failures.
204
269
 
205
270
  ## Deliberately out of scope
206
271
 
207
- - **Anything needing a model turn.** Every row above is model-free by
208
- construction; `get_commands` and the MCP tool calls never reach a provider. A
209
- row that needs a real LLM turn cannot be a release gate on an unfunded key,
210
- and a stubbed turn would be a double that mirrors our own assumption
211
- (AGENTS.md, external contracts).
272
+ - **Anything needing a real model turn.** Every row above is model-free by
273
+ construction except `codemode-nested-guard`, whose turn is scripted (see "Why
274
+ `codemode-nested-guard` needs a scripted turn"); `get_commands` and the MCP
275
+ tool calls never reach a provider. A row that needs a real LLM turn cannot be a
276
+ release gate on an unfunded key, and a stubbed turn that stands in for pi-lens's
277
+ own behaviour would be a double that mirrors our own assumption (AGENTS.md,
278
+ external contracts).
212
279
  - **The `concurrent_session_bind` guard.** Observing it needs a second in-process
213
280
  `createAgentSession()`, which needs model config. `docs/subagent-compat.md`
214
281
  carries the same TODO; duplicating it here would add a row that can only ever