@codyswann/lisa 4.22.8 → 4.22.10

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 (278) hide show
  1. package/all/copy-overwrite/scripts/lib/process-tree-runner.mjs +127 -0
  2. package/all/copy-overwrite/scripts/lisa-floor-collisions.mjs +63 -8
  3. package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +36 -6
  4. package/all/copy-overwrite/scripts/lisa-postinstall.mjs +35 -13
  5. package/all/copy-overwrite/scripts/lisa-reconcile-policy.mjs +11 -3
  6. package/all/copy-overwrite/scripts/lisa-run-gates.mjs +41 -8
  7. package/all/copy-overwrite/scripts/lisa-schema-validate.mjs +2 -2
  8. package/all/copy-overwrite/scripts/lisa-work-item.mjs +2 -1
  9. package/cdk/package-lisa/package.lisa.json +1 -1
  10. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  11. package/dist/core/lisa-owned-hash-ledger.js +24 -0
  12. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  13. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  14. package/dist/core/nightly-e2e-guard-behavior-certificate.js.map +1 -1
  15. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  16. package/dist/core/upstream-evidence-manifest.js +61 -51
  17. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  18. package/dist/opencode/plugin-templates/parity-safety-net.sh +36 -6
  19. package/nestjs/package-lisa/package.lisa.json +1 -1
  20. package/package.json +3 -3
  21. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  23. package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/SKILL.md +10 -13
  24. package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +4 -2
  25. package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
  26. package/plugins/lisa/.codex-plugin/skills/lisa-github-sync/SKILL.md +8 -3
  27. package/plugins/lisa/.codex-plugin/skills/lisa-jam-access/SKILL.md +7 -10
  28. package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/SKILL.md +5 -0
  29. package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
  30. package/plugins/lisa/.codex-plugin/skills/lisa-jira-sync/SKILL.md +1 -1
  31. package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +8 -12
  32. package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/SKILL.md +1 -1
  33. package/plugins/lisa/.codex-plugin/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
  34. package/plugins/lisa/.codex-plugin/skills/lisa-notion-access/SKILL.md +7 -10
  35. package/plugins/lisa/.codex-plugin/skills/lisa-posthog-access/SKILL.md +7 -10
  36. package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +19 -3
  37. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
  38. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +95 -44
  39. package/plugins/lisa/.codex-plugin/skills/lisa-sentry-access/SKILL.md +7 -10
  40. package/plugins/lisa/.codex-plugin/skills/lisa-setup-atlassian/SKILL.md +7 -10
  41. package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +9 -12
  42. package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/SKILL.md +7 -10
  43. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-aws/SKILL.md +7 -2
  44. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/SKILL.md +6 -1
  45. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
  46. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
  47. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
  48. package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
  49. package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
  50. package/plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/SKILL.md +7 -10
  51. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-sync/SKILL.md +1 -1
  52. package/plugins/lisa/hooks/parity-safety-net.sh +36 -6
  53. package/plugins/lisa/hooks/threshold-ratchet-families.mjs +31 -7
  54. package/plugins/lisa/rules/reference/base-rules.md +1 -1
  55. package/plugins/lisa/rules/reference/config-resolution.md +5 -14
  56. package/plugins/lisa/scripts/install-remote-agent-aws.mjs +5 -1
  57. package/plugins/lisa/scripts/rollup-blocker-classification.mjs +18 -3
  58. package/plugins/lisa/skills/lisa-atlassian-access/SKILL.md +10 -13
  59. package/plugins/lisa/skills/lisa-doctor/SKILL.md +4 -2
  60. package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
  61. package/plugins/lisa/skills/lisa-github-sync/SKILL.md +8 -3
  62. package/plugins/lisa/skills/lisa-jam-access/SKILL.md +7 -10
  63. package/plugins/lisa/skills/lisa-jira-journey/SKILL.md +5 -0
  64. package/plugins/lisa/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
  65. package/plugins/lisa/skills/lisa-jira-sync/SKILL.md +1 -1
  66. package/plugins/lisa/skills/lisa-linear-access/SKILL.md +8 -12
  67. package/plugins/lisa/skills/lisa-linear-sync/SKILL.md +1 -1
  68. package/plugins/lisa/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
  69. package/plugins/lisa/skills/lisa-notion-access/SKILL.md +7 -10
  70. package/plugins/lisa/skills/lisa-posthog-access/SKILL.md +7 -10
  71. package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +19 -3
  72. package/plugins/lisa/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
  73. package/plugins/lisa/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +95 -44
  74. package/plugins/lisa/skills/lisa-sentry-access/SKILL.md +7 -10
  75. package/plugins/lisa/skills/lisa-setup-atlassian/SKILL.md +7 -10
  76. package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +9 -12
  77. package/plugins/lisa/skills/lisa-setup-notion/SKILL.md +7 -10
  78. package/plugins/lisa/skills/lisa-setup-remote-aws/SKILL.md +7 -2
  79. package/plugins/lisa/skills/lisa-setup-remote-env/SKILL.md +6 -1
  80. package/plugins/lisa/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
  81. package/plugins/lisa/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
  82. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
  83. package/plugins/lisa/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
  84. package/plugins/lisa/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
  85. package/plugins/lisa/skills/lisa-sonarcloud-access/SKILL.md +7 -10
  86. package/plugins/lisa/skills/lisa-tracker-sync/SKILL.md +1 -1
  87. package/plugins/lisa-agy/hooks/parity-safety-net.sh +36 -6
  88. package/plugins/lisa-agy/plugin.json +1 -1
  89. package/plugins/lisa-agy/scripts/install-remote-agent-aws.mjs +5 -1
  90. package/plugins/lisa-agy/scripts/rollup-blocker-classification.mjs +18 -3
  91. package/plugins/lisa-agy/skills/lisa-atlassian-access/SKILL.md +10 -13
  92. package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +4 -2
  93. package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
  94. package/plugins/lisa-agy/skills/lisa-github-sync/SKILL.md +8 -3
  95. package/plugins/lisa-agy/skills/lisa-jam-access/SKILL.md +7 -10
  96. package/plugins/lisa-agy/skills/lisa-jira-journey/SKILL.md +5 -0
  97. package/plugins/lisa-agy/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
  98. package/plugins/lisa-agy/skills/lisa-jira-sync/SKILL.md +1 -1
  99. package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +8 -12
  100. package/plugins/lisa-agy/skills/lisa-linear-sync/SKILL.md +1 -1
  101. package/plugins/lisa-agy/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
  102. package/plugins/lisa-agy/skills/lisa-notion-access/SKILL.md +7 -10
  103. package/plugins/lisa-agy/skills/lisa-posthog-access/SKILL.md +7 -10
  104. package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +19 -3
  105. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
  106. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +95 -44
  107. package/plugins/lisa-agy/skills/lisa-sentry-access/SKILL.md +7 -10
  108. package/plugins/lisa-agy/skills/lisa-setup-atlassian/SKILL.md +7 -10
  109. package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +9 -12
  110. package/plugins/lisa-agy/skills/lisa-setup-notion/SKILL.md +7 -10
  111. package/plugins/lisa-agy/skills/lisa-setup-remote-aws/SKILL.md +7 -2
  112. package/plugins/lisa-agy/skills/lisa-setup-remote-env/SKILL.md +6 -1
  113. package/plugins/lisa-agy/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
  114. package/plugins/lisa-agy/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
  115. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
  116. package/plugins/lisa-agy/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
  117. package/plugins/lisa-agy/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
  118. package/plugins/lisa-agy/skills/lisa-sonarcloud-access/SKILL.md +7 -10
  119. package/plugins/lisa-agy/skills/lisa-tracker-sync/SKILL.md +1 -1
  120. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  121. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  122. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  123. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  124. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  125. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  126. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +36 -6
  127. package/plugins/lisa-copilot/hooks/threshold-ratchet-families.mjs +31 -7
  128. package/plugins/lisa-copilot/rules/reference/base-rules.md +1 -1
  129. package/plugins/lisa-copilot/rules/reference/config-resolution.md +5 -14
  130. package/plugins/lisa-copilot/scripts/install-remote-agent-aws.mjs +5 -1
  131. package/plugins/lisa-copilot/scripts/rollup-blocker-classification.mjs +18 -3
  132. package/plugins/lisa-copilot/skills/lisa-atlassian-access/SKILL.md +10 -13
  133. package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +4 -2
  134. package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
  135. package/plugins/lisa-copilot/skills/lisa-github-sync/SKILL.md +8 -3
  136. package/plugins/lisa-copilot/skills/lisa-jam-access/SKILL.md +7 -10
  137. package/plugins/lisa-copilot/skills/lisa-jira-journey/SKILL.md +5 -0
  138. package/plugins/lisa-copilot/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
  139. package/plugins/lisa-copilot/skills/lisa-jira-sync/SKILL.md +1 -1
  140. package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +8 -12
  141. package/plugins/lisa-copilot/skills/lisa-linear-sync/SKILL.md +1 -1
  142. package/plugins/lisa-copilot/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
  143. package/plugins/lisa-copilot/skills/lisa-notion-access/SKILL.md +7 -10
  144. package/plugins/lisa-copilot/skills/lisa-posthog-access/SKILL.md +7 -10
  145. package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +19 -3
  146. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
  147. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +95 -44
  148. package/plugins/lisa-copilot/skills/lisa-sentry-access/SKILL.md +7 -10
  149. package/plugins/lisa-copilot/skills/lisa-setup-atlassian/SKILL.md +7 -10
  150. package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +9 -12
  151. package/plugins/lisa-copilot/skills/lisa-setup-notion/SKILL.md +7 -10
  152. package/plugins/lisa-copilot/skills/lisa-setup-remote-aws/SKILL.md +7 -2
  153. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/SKILL.md +6 -1
  154. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
  155. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
  156. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
  157. package/plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
  158. package/plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
  159. package/plugins/lisa-copilot/skills/lisa-sonarcloud-access/SKILL.md +7 -10
  160. package/plugins/lisa-copilot/skills/lisa-tracker-sync/SKILL.md +1 -1
  161. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  162. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +36 -6
  163. package/plugins/lisa-cursor/hooks/threshold-ratchet-families.mjs +31 -7
  164. package/plugins/lisa-cursor/rules/base-rules-reference.mdc +1 -1
  165. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +5 -14
  166. package/plugins/lisa-cursor/scripts/install-remote-agent-aws.mjs +5 -1
  167. package/plugins/lisa-cursor/scripts/rollup-blocker-classification.mjs +18 -3
  168. package/plugins/lisa-cursor/skills/lisa-atlassian-access/SKILL.md +10 -13
  169. package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +4 -2
  170. package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
  171. package/plugins/lisa-cursor/skills/lisa-github-sync/SKILL.md +8 -3
  172. package/plugins/lisa-cursor/skills/lisa-jam-access/SKILL.md +7 -10
  173. package/plugins/lisa-cursor/skills/lisa-jira-journey/SKILL.md +5 -0
  174. package/plugins/lisa-cursor/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
  175. package/plugins/lisa-cursor/skills/lisa-jira-sync/SKILL.md +1 -1
  176. package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +8 -12
  177. package/plugins/lisa-cursor/skills/lisa-linear-sync/SKILL.md +1 -1
  178. package/plugins/lisa-cursor/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
  179. package/plugins/lisa-cursor/skills/lisa-notion-access/SKILL.md +7 -10
  180. package/plugins/lisa-cursor/skills/lisa-posthog-access/SKILL.md +7 -10
  181. package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +19 -3
  182. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
  183. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +95 -44
  184. package/plugins/lisa-cursor/skills/lisa-sentry-access/SKILL.md +7 -10
  185. package/plugins/lisa-cursor/skills/lisa-setup-atlassian/SKILL.md +7 -10
  186. package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +9 -12
  187. package/plugins/lisa-cursor/skills/lisa-setup-notion/SKILL.md +7 -10
  188. package/plugins/lisa-cursor/skills/lisa-setup-remote-aws/SKILL.md +7 -2
  189. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/SKILL.md +6 -1
  190. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
  191. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
  192. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
  193. package/plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
  194. package/plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
  195. package/plugins/lisa-cursor/skills/lisa-sonarcloud-access/SKILL.md +7 -10
  196. package/plugins/lisa-cursor/skills/lisa-tracker-sync/SKILL.md +1 -1
  197. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  198. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  199. package/plugins/lisa-expo-agy/plugin.json +1 -1
  200. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  201. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  202. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  203. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  204. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  205. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  206. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  207. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  208. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  209. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  210. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  211. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  212. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  213. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  214. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  215. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  216. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  217. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  218. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  219. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  220. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  221. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  222. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  223. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  224. package/plugins/lisa-rails-agy/plugin.json +1 -1
  225. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  226. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  227. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  228. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  229. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  230. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  231. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  232. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  233. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  234. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  235. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  236. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  237. package/plugins/src/base/hooks/parity-safety-net.sh +36 -6
  238. package/plugins/src/base/hooks/threshold-ratchet-families.mjs +31 -7
  239. package/plugins/src/base/rules/reference/base-rules.md +1 -1
  240. package/plugins/src/base/rules/reference/config-resolution.md +5 -14
  241. package/plugins/src/base/scripts/install-remote-agent-aws.mjs +5 -1
  242. package/plugins/src/base/scripts/rollup-blocker-classification.mjs +18 -3
  243. package/plugins/src/base/skills/lisa-atlassian-access/SKILL.md +10 -13
  244. package/plugins/src/base/skills/lisa-doctor/SKILL.md +4 -2
  245. package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
  246. package/plugins/src/base/skills/lisa-github-sync/SKILL.md +8 -3
  247. package/plugins/src/base/skills/lisa-jam-access/SKILL.md +7 -10
  248. package/plugins/src/base/skills/lisa-jira-journey/SKILL.md +5 -0
  249. package/plugins/src/base/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
  250. package/plugins/src/base/skills/lisa-jira-sync/SKILL.md +1 -1
  251. package/plugins/src/base/skills/lisa-linear-access/SKILL.md +8 -12
  252. package/plugins/src/base/skills/lisa-linear-sync/SKILL.md +1 -1
  253. package/plugins/src/base/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
  254. package/plugins/src/base/skills/lisa-notion-access/SKILL.md +7 -10
  255. package/plugins/src/base/skills/lisa-posthog-access/SKILL.md +7 -10
  256. package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +19 -3
  257. package/plugins/src/base/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
  258. package/plugins/src/base/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +95 -44
  259. package/plugins/src/base/skills/lisa-sentry-access/SKILL.md +7 -10
  260. package/plugins/src/base/skills/lisa-setup-atlassian/SKILL.md +7 -10
  261. package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +9 -12
  262. package/plugins/src/base/skills/lisa-setup-notion/SKILL.md +7 -10
  263. package/plugins/src/base/skills/lisa-setup-remote-aws/SKILL.md +7 -2
  264. package/plugins/src/base/skills/lisa-setup-remote-env/SKILL.md +6 -1
  265. package/plugins/src/base/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
  266. package/plugins/src/base/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
  267. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
  268. package/plugins/src/base/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
  269. package/plugins/src/base/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
  270. package/plugins/src/base/skills/lisa-sonarcloud-access/SKILL.md +7 -10
  271. package/plugins/src/base/skills/lisa-tracker-sync/SKILL.md +1 -1
  272. package/rails/copy-overwrite/scripts/threshold-ratchet-families.mjs +31 -7
  273. package/scripts/lisa-remote-env/session-start.sh +19 -0
  274. package/scripts/lisa-remote-env/setup.sh +1 -0
  275. package/scripts/two-channel-couplings.json +1 -1
  276. package/typescript/copy-contents/.husky/pre-push +1 -1
  277. package/typescript/copy-overwrite/scripts/threshold-ratchet-families.mjs +31 -7
  278. package/typescript/package-lisa/package.lisa.json +1 -1
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env node
2
+ // This file is managed by Lisa and IS replaced on each `lisa` run.
3
+ // Do not edit directly — durable changes belong upstream in Lisa.
4
+
5
+ /**
6
+ * Run one shell command in its own process group and reap the whole group.
7
+ *
8
+ * Node's synchronous timeout signals only the direct child. A gate command is
9
+ * a tree (shell, package manager, test workers), so killing only the shell
10
+ * leaves descendants running against scratch state the caller then removes.
11
+ * This small asynchronous supervisor is invoked through a synchronous parent:
12
+ * it owns the process-group id, applies the deadline, terminates the group, and
13
+ * only then lets the parent continue.
14
+ * @module scripts/lib/process-tree-runner
15
+ */
16
+
17
+ import { spawn, spawnSync } from "node:child_process";
18
+
19
+ import { invokedAsScript } from "./invoked-as-script.mjs";
20
+
21
+ const KILL_GRACE_MS = 750;
22
+
23
+ function parseArguments(argv) {
24
+ const timeoutArg = argv.find(value => value.startsWith("--timeout-ms="));
25
+ const separator = argv.indexOf("--");
26
+ const timeoutMs = Number(timeoutArg?.slice("--timeout-ms=".length));
27
+ const command = separator >= 0 ? argv.slice(separator + 1).join(" ") : "";
28
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0 || !command) {
29
+ throw new Error(
30
+ "usage: process-tree-runner.mjs --timeout-ms=<positive-ms> -- <command>"
31
+ );
32
+ }
33
+ return { command, timeoutMs };
34
+ }
35
+
36
+ function killTree(pid, signal) {
37
+ if (process.platform === "win32") {
38
+ // Windows has no negative-pid process groups. taskkill /T is the native
39
+ // tree primitive; /F is used only for the escalation.
40
+ const args = ["/pid", String(pid), "/T"];
41
+ if (signal === "SIGKILL") args.push("/F");
42
+ spawnSync("taskkill", args, { stdio: "ignore", timeout: KILL_GRACE_MS });
43
+ return;
44
+ }
45
+ try {
46
+ process.kill(-pid, signal);
47
+ } catch {
48
+ // ESRCH means the whole group already exited.
49
+ }
50
+ }
51
+
52
+ export function supervise(command, timeoutMs) {
53
+ return new Promise((resolve, reject) => {
54
+ const shell =
55
+ process.platform === "win32"
56
+ ? process.env.ComSpec || "cmd.exe"
57
+ : "/bin/sh";
58
+ const shellArgs =
59
+ process.platform === "win32"
60
+ ? ["/d", "/s", "/c", command]
61
+ : ["-c", command];
62
+ const child = spawn(shell, shellArgs, {
63
+ detached: true,
64
+ env: process.env,
65
+ stdio: "inherit",
66
+ });
67
+ const pid = child.pid;
68
+ if (pid === undefined) {
69
+ reject(new Error("gate process tree did not start"));
70
+ return;
71
+ }
72
+
73
+ let timedOut = false;
74
+ let settled = false;
75
+ const finish = (code, signal) => {
76
+ if (settled) return;
77
+ settled = true;
78
+ clearTimeout(deadline);
79
+ // A command may leave a background descendant after its direct shell
80
+ // exits. Reap that residue before returning a verdict too.
81
+ killTree(pid, "SIGTERM");
82
+ resolve({ code, signal });
83
+ };
84
+
85
+ const deadline = setTimeout(() => {
86
+ timedOut = true;
87
+ killTree(pid, "SIGTERM");
88
+ setTimeout(() => {
89
+ killTree(pid, "SIGKILL");
90
+ // A signal-shaped result is the existing gate runner vocabulary for
91
+ // "no verdict". It also prevents an ordinary exit code such as 124
92
+ // from being confused with a user command that returned that code.
93
+ if (process.platform === "win32") {
94
+ process.exit(124);
95
+ } else {
96
+ process.kill(process.pid, "SIGKILL");
97
+ }
98
+ }, KILL_GRACE_MS);
99
+ }, timeoutMs);
100
+
101
+ child.once("error", error => {
102
+ clearTimeout(deadline);
103
+ killTree(pid, "SIGKILL");
104
+ reject(error);
105
+ });
106
+ child.once("close", (code, signal) => {
107
+ // On timeout, wait for the forced group reap above before this supervisor
108
+ // ends. Exiting on the direct shell's close is the race that used to leave
109
+ // its descendants alive.
110
+ if (!timedOut) finish(code, signal);
111
+ });
112
+ });
113
+ }
114
+
115
+ async function main() {
116
+ const { command, timeoutMs } = parseArguments(process.argv.slice(2));
117
+ const result = await supervise(command, timeoutMs);
118
+ if (result.signal) {
119
+ process.exitCode = 128;
120
+ } else {
121
+ process.exitCode = result.code ?? 1;
122
+ }
123
+ }
124
+
125
+ if (invokedAsScript(import.meta.url)) {
126
+ await main();
127
+ }
@@ -85,11 +85,45 @@ const DEPENDENCY_SECTIONS = [
85
85
  * means: `^8` is `>=8.0.0 <9.0.0` and `1.x` is `>=1.0.0 <2.0.0`. Only the lower
86
86
  * bound is read here, so the upper half costs nothing to ignore.
87
87
  *
88
- * Still one left-to-right pass: the optional groups each have a literal `.`
89
- * ahead of them, so there is no position at which the engine has two viable
90
- * ways to match and nothing to backtrack over (S5852).
88
+ * This parser deliberately uses no version-shaped regular expression. The
89
+ * collision gate consumes dependency text supplied by a repository, so even a
90
+ * bounded-looking optional-group expression becomes an avoidable ReDoS review
91
+ * burden. A tiny left-to-right scanner is both clearer and constant-work per
92
+ * input character.
91
93
  */
92
- const BRANCH_VERSION = /^[\sv=><~^]*(\d+)(?:\.(\d+))?(?:\.(\d+))?/;
94
+ function parseBranchVersion(branch) {
95
+ let cursor = branch.trimStart();
96
+ while (cursor.startsWith("v")) cursor = cursor.slice(1);
97
+
98
+ const operator = [">=", ">", "=", "^", "~"].find(candidate =>
99
+ cursor.startsWith(candidate)
100
+ );
101
+ if (operator) cursor = cursor.slice(operator.length);
102
+ cursor = cursor.trimStart();
103
+
104
+ let end = 0;
105
+ while (end < cursor.length) {
106
+ const character = cursor[end];
107
+ const digit = character >= "0" && character <= "9";
108
+ const next = cursor[end + 1];
109
+ const componentSeparator = character === "." && next >= "0" && next <= "9";
110
+ if (!digit && !componentSeparator) break;
111
+ end += 1;
112
+ }
113
+
114
+ const parts = cursor.slice(0, end).split(".");
115
+ if (
116
+ parts.length > 3 ||
117
+ parts.some(
118
+ part =>
119
+ part === "" ||
120
+ [...part].some(character => character < "0" || character > "9")
121
+ )
122
+ ) {
123
+ return null;
124
+ }
125
+ return { operator, parts };
126
+ }
93
127
 
94
128
  /**
95
129
  * Lowest version a single disjunction branch permits.
@@ -104,13 +138,34 @@ const BRANCH_VERSION = /^[\sv=><~^]*(\d+)(?:\.(\d+))?(?:\.(\d+))?/;
104
138
  function branchLowerBound(branch) {
105
139
  const trimmed = branch.trim();
106
140
  if (trimmed === "") return null;
107
- if (/^<=?\s*\d/.test(trimmed)) return [0, 0, 0];
108
- const match = BRANCH_VERSION.exec(trimmed);
109
- if (!match) return null;
141
+ const upperOperand = trimmed
142
+ .slice(trimmed.startsWith("<=") ? 2 : 1)
143
+ .trimStart();
144
+ if (
145
+ trimmed.startsWith("<") &&
146
+ upperOperand[0] >= "0" &&
147
+ upperOperand[0] <= "9"
148
+ ) {
149
+ return [0, 0, 0];
150
+ }
151
+ const parsed = parseBranchVersion(trimmed);
152
+ if (!parsed) return null;
110
153
  // An absent minor or patch is zero, not missing: `^8` is `>=8.0.0`. Number()
111
154
  // of undefined is NaN, which would compare as neither higher nor lower than
112
155
  // anything and quietly disable the comparison it feeds.
113
- return [match[1], match[2] ?? "0", match[3] ?? "0"].map(Number);
156
+ const lower = [...parsed.parts, "0", "0"].slice(0, 3).map(Number);
157
+ if (parsed.operator !== ">") return lower;
158
+
159
+ // npm expands a STRICT comparator on a partial version before comparing:
160
+ // `>1` is `>=2.0.0` and `>1.2` is `>=1.3.0`. Reading either as merely
161
+ // 1.0.0/1.2.0 invents versions the range does not permit and can report an
162
+ // adequate dependency line as weaker than its override.
163
+ const lastSpecified = parsed.parts.length - 1;
164
+ lower[lastSpecified] += 1;
165
+ for (let index = lastSpecified + 1; index < lower.length; index += 1) {
166
+ lower[index] = 0;
167
+ }
168
+ return lower;
114
169
  }
115
170
 
116
171
  /**
@@ -1067,8 +1067,38 @@ readonly AGENT_CREDENTIAL='(\.(claude|codex|cursor|copilot|gemini|antigravity)/[
1067
1067
  # 15d. Dotenv files. `.env.example`, `.sample`, `.template`, `.dist` and
1068
1068
  # `.schema` are checked-in documentation of which keys exist, never the values,
1069
1069
  # so they are excluded — that collision is the one this rule most had to avoid.
1070
- readonly DOTENV_SECRET='(^|[[:space:]='"$qc"'./])\.env(\.[[:alnum:]_-]+)?([[:space:]'"$qc"']|$)'
1071
- readonly DOTENV_PUBLIC='\.env\.(example|sample|template|dist|schema|defaults)([[:space:]'"$qc"']|$)'
1070
+ # Decide dotenv privacy per PATH, never by subtracting one command-wide match
1071
+ # from another. A command that names `.env.example` and `.env` contains both a
1072
+ # public path and a private one; seeing the former cannot authorize the latter.
1073
+ #
1074
+ # The one write-only shape this guard has always allowed remains explicit:
1075
+ # seeding a private dotenv destination from one public template. This is safe
1076
+ # because the private path is the destination, not a value being read back.
1077
+ has_private_dotenv_path() {
1078
+ dotenv_scan_status=0
1079
+ dotenv_candidates="$(printf '%s' "$normalized_command_str" \
1080
+ | grep -Eio -- '(^|[[:space:]='"$qc"'./])\.env(\.[[:alnum:]_-]+)?')" \
1081
+ || dotenv_scan_status=$?
1082
+ if [ "$dotenv_scan_status" -gt 1 ]; then
1083
+ block "dotenv path classification failed; denying the credential-store read fail-closed."
1084
+ fi
1085
+
1086
+ while IFS= read -r candidate; do
1087
+ [ -n "$candidate" ] || continue
1088
+ candidate="$(printf '%s' "$candidate" \
1089
+ | tr '[:upper:]' '[:lower:]' \
1090
+ | grep -Eo -- '\.env(\.[[:alnum:]_-]+)?')"
1091
+ case "$candidate" in
1092
+ .env.example | .env.sample | .env.template | .env.dist | .env.schema | .env.defaults) ;;
1093
+ *) return 0 ;;
1094
+ esac
1095
+ done <<EOF
1096
+ $dotenv_candidates
1097
+ EOF
1098
+ return 1
1099
+ }
1100
+
1101
+ readonly SAFE_DOTENV_SEED='^[[:space:]]*(cp|mv)[[:space:]]+\.env\.(example|sample|template|dist|schema|defaults)[[:space:]]+\.env(\.[[:alnum:]_-]+)?[[:space:]]*$'
1072
1102
 
1073
1103
  if matches "$SECRET_READ_VERB"; then
1074
1104
  if matches "$SSH_PRIVATE_KEY"; then
@@ -1080,10 +1110,10 @@ if matches "$SECRET_READ_VERB"; then
1080
1110
  if matches "$AGENT_CREDENTIAL"; then
1081
1111
  block "reading, copying or transmitting a coding-agent or package-registry credential store. These tokens impersonate the operator to every service the agent can reach."
1082
1112
  fi
1083
- # `.env` only when the path is NOT one of the public example forms. Ordered as
1084
- # an exclusion rather than a narrower pattern so a new example suffix is one
1085
- # word to add, and so the reason a file is exempt stays readable.
1086
- if matches "$DOTENV_SECRET" && ! matches "$DOTENV_PUBLIC"; then
1113
+ # A public path elsewhere in the command never exempts a private path. The
1114
+ # narrow public-template -> private-destination seed is write-only and remains
1115
+ # allowed; every other command containing a private dotenv path is refused.
1116
+ if has_private_dotenv_path && ! matches "$SAFE_DOTENV_SEED"; then
1087
1117
  block "reading, copying or transmitting a dotenv file holding real values. \`.env.example\`, \`.env.sample\`, \`.env.template\` and \`.env.dist\` are readable, and WRITING a .env is unaffected — only reading one back is refused."
1088
1118
  fi
1089
1119
  # Fail-closed, narrowly. A read whose DIRECTORY is a known credential store
@@ -47,7 +47,7 @@
47
47
  import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
48
48
  import { dirname, join } from "node:path";
49
49
 
50
- import { boundedSpawnSync } from "./lib/bounded-spawn.mjs";
50
+ import { boundedSpawnSync, isChildTimeout } from "./lib/bounded-spawn.mjs";
51
51
  import { invokedAsScript } from "./lib/invoked-as-script.mjs";
52
52
 
53
53
  /**
@@ -148,18 +148,40 @@ export function runPostinstall(cwd = process.cwd(), env = process.env) {
148
148
  return;
149
149
  }
150
150
 
151
- const child = boundedSpawnSync(
152
- process.execPath,
153
- [LISA_ENTRY, "--yes", "--skip-git-check", "."],
154
- {
155
- cwd,
156
- env: { ...env, LISA_BOOTSTRAP: "1" },
157
- encoding: "utf8",
158
- // Inherited, NOT captured-and-discarded. The whole point.
159
- stdio: ["ignore", "inherit", "pipe"],
160
- timeout: APPLY_BUDGET_MS,
161
- }
162
- );
151
+ let child;
152
+ try {
153
+ child = boundedSpawnSync(
154
+ process.execPath,
155
+ [LISA_ENTRY, "--yes", "--skip-git-check", "."],
156
+ {
157
+ cwd,
158
+ env: { ...env, LISA_BOOTSTRAP: "1" },
159
+ encoding: "utf8",
160
+ // Inherited, NOT captured-and-discarded. The whole point.
161
+ stdio: ["ignore", "inherit", "pipe"],
162
+ timeout: APPLY_BUDGET_MS,
163
+ }
164
+ );
165
+ } catch (error) {
166
+ // A timeout is a failed APPLY, not a failed INSTALL. The bounded child
167
+ // deliberately throws so ordinary callers fail closed; this caller has a
168
+ // stronger, documented contract to leave a durable marker and let the
169
+ // package manager finish. Unknown throws still escape because converting a
170
+ // broken postinstall module into an apparent apply failure would hide the
171
+ // defect that needs fixing.
172
+ if (!isChildTimeout(error)) throw error;
173
+ child = {
174
+ error: Object.assign(
175
+ new Error(
176
+ "Lisa template apply exceeded its ten-minute deadline and was killed."
177
+ ),
178
+ { code: "ETIMEDOUT" }
179
+ ),
180
+ status: null,
181
+ stderr:
182
+ "Lisa template apply exceeded its ten-minute deadline and was killed.\n",
183
+ };
184
+ }
163
185
 
164
186
  const stderr = child.stderr ?? "";
165
187
  if (stderr) process.stderr.write(stderr);
@@ -718,9 +718,17 @@ export function reconcileContexts({
718
718
  if (record.ruleset !== undefined && entry.ruleset !== record.ruleset) {
719
719
  return false;
720
720
  }
721
- return !(
722
- record.integration_id !== undefined &&
723
- entry.integration_id !== record.integration_id
721
+ // Configured ruleset policy defaults to GitHub Actions when it carries no
722
+ // explicit pin. That is the same default the writer applies, so comparison
723
+ // and repair converge. A gate-derived record names no ruleset and remains
724
+ // name-only: it never declared which app may satisfy it.
725
+ if (record.ruleset !== undefined) {
726
+ const expected = record.integration_id ?? ACTIONS_INTEGRATION_ID;
727
+ return entry.integration_id === expected;
728
+ }
729
+ return (
730
+ record.integration_id === undefined ||
731
+ entry.integration_id === record.integration_id
724
732
  );
725
733
  };
726
734
  const unsatisfied = declarations.filter(
@@ -358,10 +358,9 @@ function normaliseExec(raw) {
358
358
  * ## Two kinds that look eligible and are not
359
359
  *
360
360
  * `uncaptured` is NOT here, and the attempt to include it is what proves the
361
- * distinction. Capture is off by default (`LISA_GATES_CAPTURE=1` turns it on),
362
- * so `uncaptured` is the ORDINARY outcome of an ordinary failing gate — four
363
- * existing cases went red the moment it was added, every one of them a plain
364
- * `lint` gate exiting 1. A gate that exited nonzero did measure something; the
361
+ * distinction. Capture is on by default (`LISA_GATES_CAPTURE=0` turns it off),
362
+ * so `uncaptured` is an explicit loss of diagnostic evidence rather than the
363
+ * ordinary outcome. A gate that exited nonzero did measure something; the
365
364
  * runner merely did not keep the transcript. Missing evidence about a real
366
365
  * failure is not the same claim as a captured transcript that describes no
367
366
  * failure at all, which is what `undiagnosed` means.
@@ -888,6 +887,33 @@ const CAPTURE_TAIL_BYTES = 512 * 1024;
888
887
  */
889
888
  const GATE_COMMAND_BUDGET_MS = 2 * 60 * 60 * 1000;
890
889
 
890
+ /** Extra ceiling for the supervisor to reap descendants after its deadline. */
891
+ const PROCESS_TREE_REAP_BUDGET_MS = 10_000;
892
+
893
+ /** The asynchronous supervisor used behind this synchronous gate API. */
894
+ const PROCESS_TREE_RUNNER = fileURLToPath(
895
+ new URL("./lib/process-tree-runner.mjs", import.meta.url)
896
+ );
897
+
898
+ /**
899
+ * Run a shell command under a process-tree deadline.
900
+ * @param {string} command Shell source.
901
+ * @param {object} options Child options passed to the supervisor.
902
+ * @returns {import("node:child_process").SpawnSyncReturns<string>} Result.
903
+ */
904
+ function runProcessTree(command, options = {}) {
905
+ const timeout = options.timeout ?? GATE_COMMAND_BUDGET_MS;
906
+ const { shell: _shell, ...childOptions } = options;
907
+ return boundedSpawnSync(
908
+ process.execPath,
909
+ [PROCESS_TREE_RUNNER, `--timeout-ms=${timeout}`, "--", command],
910
+ {
911
+ ...childOptions,
912
+ timeout: timeout + PROCESS_TREE_REAP_BUDGET_MS,
913
+ }
914
+ );
915
+ }
916
+
891
917
  /**
892
918
  * Convert a killed child into this file's no-verdict answer, or re-raise.
893
919
  *
@@ -916,8 +942,7 @@ function killedOrRethrow(error) {
916
942
  */
917
943
  function plainExec(command) {
918
944
  try {
919
- const child = boundedSpawnSync(command, [], {
920
- shell: true,
945
+ const child = runProcessTree(command, {
921
946
  stdio: "inherit",
922
947
  timeout: GATE_COMMAND_BUDGET_MS,
923
948
  });
@@ -1015,9 +1040,17 @@ export function spawnExec(command) {
1015
1040
  const statusPath = join(dir, "status");
1016
1041
  // Newline-separated inside a group, so a command ending in a trailing
1017
1042
  // comment or redirection still has `echo` run as its own statement.
1018
- const script = `{\n${command}\necho $? > '${statusPath}'\n} 2>&1 | tee '${logPath}'\n`;
1043
+ // Paths travel as data, never as shell source. A TMPDIR containing a quote,
1044
+ // newline, dollar sign, or command substitution must not be able to break
1045
+ // this wrapper or execute content merely because mkdtemp inherited it.
1046
+ const script = `{\n${command}\necho $? > "$LISA_GATE_STATUS_PATH"\n} 2>&1 | tee "$LISA_GATE_LOG_PATH"\n`;
1019
1047
  try {
1020
- const child = boundedSpawnSync("sh", ["-c", script], {
1048
+ const child = runProcessTree(script, {
1049
+ env: {
1050
+ ...process.env,
1051
+ LISA_GATE_LOG_PATH: logPath,
1052
+ LISA_GATE_STATUS_PATH: statusPath,
1053
+ },
1021
1054
  stdio: "inherit",
1022
1055
  timeout: GATE_COMMAND_BUDGET_MS,
1023
1056
  });
@@ -150,9 +150,9 @@ function resolveRef(ref, root) {
150
150
  const defs = isSchemaObject(root.$defs) ? root.$defs : {};
151
151
  const target =
152
152
  match && Object.hasOwn(defs, match[1]) ? defs[match[1]] : undefined;
153
- if (!target) {
153
+ if (!isSchemaObject(target)) {
154
154
  throw new Error(
155
- `unsupported or unresolvable $ref "${ref}" (only #/$defs/<name> is supported)`
155
+ `unsupported or unresolvable $ref "${ref}" (only #/$defs/<name> resolving to a subschema object is supported)`
156
156
  );
157
157
  }
158
158
  return target;
@@ -536,7 +536,8 @@ function verifyLevel(config) {
536
536
  throw new TrackingError(
537
537
  `Unknown workItem.verify '${raw}'. Expected "trailer" (the default: ` +
538
538
  `prove the Work-Item reference, contact no tracker) or "full" (also ` +
539
- `prove the tracker item's repo scope, claimed state, and PR backlink)`
539
+ `prove the tracker item exists and is open, has repo scope, is a leaf, ` +
540
+ `and carries the PR backlink)`
540
541
  );
541
542
  }
542
543
  return value;
@@ -8,7 +8,7 @@
8
8
  "prepare": "husky install || true",
9
9
  "test": "vitest run",
10
10
  "test:unit": "vitest run --exclude='**/integration/**'",
11
- "test:integration:lisa": "vitest run '.integration.' 'integration/' --passWithNoTests",
11
+ "test:integration:lisa": "vitest run '.integration.' 'integration/'",
12
12
  "test:cov": "vitest run --coverage",
13
13
  "test:mutation": "node scripts/lisa-mutation.mjs",
14
14
  "test:watch": "vitest",
@@ -1 +1 @@
1
- {"version":3,"file":"lisa-owned-hash-ledger.d.ts","sourceRoot":"","sources":["../../src/core/lisa-owned-hash-ledger.ts"],"names":[],"mappings":"AACA,6EAA6E;AAE7E;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAitBjC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CACpD,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAonBjC,CAAC"}
1
+ {"version":3,"file":"lisa-owned-hash-ledger.d.ts","sourceRoot":"","sources":["../../src/core/lisa-owned-hash-ledger.ts"],"names":[],"mappings":"AACA,6EAA6E;AAE7E;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CA6tBjC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CACpD,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAgoBjC,CAAC"}
@@ -287,6 +287,9 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
287
287
  "19412df978489b6e0dfb8fd008d91895af9181bc1e6a7c9df616d9137da3e429",
288
288
  "82191900c818a88208669a39563cfed8de1512de699a9ccf7155743e5eff859e",
289
289
  ]),
290
+ "scripts/lib/process-tree-runner.mjs": Object.freeze([
291
+ "fb68902c68b4cd156f26d2f743364f611a54b833bc445b5144b4c844f553f188",
292
+ ]),
290
293
  "scripts/lisa-clean-git-env.sh": Object.freeze([
291
294
  "d15af6f13eedbca41046070972380e69fc0af8f7d903aac12b8644389b9a0c91",
292
295
  "e7121a0ee9e1bf7c01cd2ab55f563dd6d9ab75990739bb6ddf571a513efa10e9",
@@ -333,11 +336,13 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
333
336
  "f936bc8a038a7901ade1ba58cc52e5f5a8b8b2a52a9f0c1516567cc80eb02ccb",
334
337
  ]),
335
338
  "scripts/lisa-floor-collisions.mjs": Object.freeze([
339
+ "04f9455319a501112902794874ca4889feff8c0d9c04cc07fb5720b09ed8fc92",
336
340
  "16f609ebf97f4f52e462ed97a774c2b56a33a99865cc11a5c069fbbbb45b007c",
337
341
  "2d11968f6852ab745cba939de03c6d6cb5f413975d2cfc8fc447bdd0b218e91a",
338
342
  "3136d9c30b9f2945c555c0545fc9dac5ebf9135bda5e89330e351b4313ee8b89",
339
343
  "3c7a0234b4f5609fce49e44711d2ec86af8cf7fb82b0831e4450e3347ecefe45",
340
344
  "41060648b4394d417528f4f560a52f296b4df5b6ec8a5633e08afe4588b6a088",
345
+ "557065f223dfc0715a20c3de76bafee0aefe22f52385c52e17cfc7b9398cce2d",
341
346
  "8870dba7b299ddb528e01fee32ec01cd8994a72118708ea8d3255be3daedfa72",
342
347
  "9cba6e0103c27850703323da25ac149c0136225172f1a1640abe3b3ac4e50a8e",
343
348
  "a612f172282d13ba9318fe5e03689d7c6ff42a0122d0c9d5d39051e1967b93dc",
@@ -533,6 +538,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
533
538
  "1d4fbe135f1bb4e861d286a6512ed201d4522250dfe3f9eba6584bc5ff166a95",
534
539
  "2b1ca7d317dea3af106df1a74b1718e3df9c18e76e9d9d769aa3271b7abf8a3f",
535
540
  "388cf8847581d96a1ff8ea98290a33a5f96d67cdd502ea807a0b8d88efe90e19",
541
+ "450338257697a75a8fce9f06f3fc00bf3417947e50d601794da41f9c520a7cc3",
536
542
  "64546813f168fb446f39e34bc674fd3af85b15bd5e7f4f6bf4503463e701a7b9",
537
543
  "74b5b90fcf15dbeb14a69677cf74e339154421cd056fdaf603d1167b34a74105",
538
544
  "772202ddd42d626625ff719666afbbe83445d8bae1bc7c0fb5ffdcb402be83f8",
@@ -589,6 +595,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
589
595
  "eb3593f201f570db63a9568236446d4324ee8757cda5e234965f3278d653c7db",
590
596
  ]),
591
597
  "scripts/lisa-postinstall.mjs": Object.freeze([
598
+ "3294f390878d7fdb74417e12e9d386027ea8baeb874c5cae56c6d44d1df6261d",
592
599
  "45cf63bc37ef1115bc47e8212c709a7ec4dc09a9d7541297f0e2f090cbfb1fcc",
593
600
  "864bfbdc0b089a9b97e7ff053716f52e813071faff0be220294767b65918967b",
594
601
  "98fe3adf3192a72f40eb75757193ce866f0a6123387377f6041e54d938df8d96",
@@ -599,6 +606,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
599
606
  "07542e977ed41f094d5a51cae512e4a3246fabe10d0f83676a176abc81d91624",
600
607
  "1e8053bb51a01fda0e2489de231ea252473991138da150dbdff72c5292e1ce53",
601
608
  "2512f61074d10216dee0aca748caaebad373e6bba2598bc089f30f977c7a6a83",
609
+ "395897d1dc3f0ac92d7c892eaa9b9ddf12078181bb9f5b228965478190b09a91",
602
610
  "3c062d0b79961a9a93a822507e893dcdaa71d65d735557727d20464c2489d812",
603
611
  "3e67eb4b0710ec195ad7efa4a8c2fd64063897d67725ea2627cf869c7e066201",
604
612
  "4b383ff960d7da53e0dd46e37632ef55c5a38b004fb4aabfe91a25a9fe02d88f",
@@ -629,6 +637,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
629
637
  "6e419a489d0605cc0743af207ff4ff3428d8bcdfbabb7207d164593b9644dfa5",
630
638
  "79055f89eb9c5bf1739867c12dc2d9e30320f86a2a3dd470300ba706c3c9d85e",
631
639
  "94453bdae8ab3dd2eba0883c4b278027396090e0bdc8e2f102414abc6415912a",
640
+ "9b14c8864608e8ca390579048229bc0bbaba3094af0b536f1956085295c68af3",
632
641
  "9fa363107aa5ff033f150ff1a1bb5550d286de383b3d1f7b6c2ac2947730c8f2",
633
642
  "a58af06f1d677d82b780a6857916c1684a44649ba742b2b329d408057ae5700d",
634
643
  "ba610745a8878bb9a21af249d6ab5b384fcf88e7c530db846f4f8163faba7a8e",
@@ -647,6 +656,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
647
656
  "08cb25c2c49e0e5fd01e29861bbb8c90f612f9736ca2df86789fa72bd26d271e",
648
657
  "2ace82daacdebbbb00a7eceb09fbe82cabec04330a083ca10417b2ee4e0a63eb",
649
658
  "3119c557eb49776143f0a4a715a25a2918242baccf39b7660a63d376e4e79791",
659
+ "34d751e4ee98c14ae1c76ae14fe3da1ca913f70f40019a8423733f03ab64bb89",
650
660
  "4a05a0ed70a274827fd2f0fd0c98890c66bee2fde70785b8379943ebe6650473",
651
661
  "83c6e57e8168c5ae9fe538b23eec9016d0c959a4b5470d1ab160562ec2815de3",
652
662
  "8a1684f5c2b4d37fc782d2090273772814f7ad6c61e7ae5459163a1f28b7a5dc",
@@ -665,6 +675,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
665
675
  "238dc2da29938edd92518c2b08192d14c6f2751ed175c07d6e882814829b7b7e",
666
676
  "2d9ca0841db9e75ddfd95e3a4d485fd01aa639a512ef648996f565b7991d8e2b",
667
677
  "4c263fef48c03b3b6c623ea8a6cd55505bfaf28197e5072226ea35f9f3d26885",
678
+ "5a0b82045d9795284a109c28e5e9dd97a5488ff540bb7034b84077d1447ffd7c",
668
679
  "5eb31c284e820a51312d4484f0669128007326af55ee515923fec33700d003a1",
669
680
  "637741a9e5d2904aed24d48efd6bec1326c5573f718a13152807aa0e4b42f0a1",
670
681
  "6a8be8577242588f14ab52b25b2a22b6def53aefa9513b4d3d7c49f4d8027079",
@@ -721,6 +732,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
721
732
  "cf99167b05d210afad01fb41fc4aed548c66ee0e9a7c4decb8afa1f180eb5640",
722
733
  ]),
723
734
  "scripts/threshold-ratchet-families.mjs": Object.freeze([
735
+ "39cb2fb53f1cc939675e7f8d5530a760abac420c2259fc97108d21f15c0275e9",
724
736
  "47d44b2bca383ae395b4e415e06c97a127327ab13762ee95b8c43d0198639bbb",
725
737
  "8fa58cc7276add0b2edf1de92bdcc32d81d840811ef0614ddc724010b59a888c",
726
738
  "93190f926689725418c1ec9eae15c55910b128cff6e3cb10185e466c7b90cc4f",
@@ -1002,6 +1014,9 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1002
1014
  "19412df978489b6e0dfb8fd008d91895af9181bc1e6a7c9df616d9137da3e429",
1003
1015
  "82191900c818a88208669a39563cfed8de1512de699a9ccf7155743e5eff859e",
1004
1016
  ]),
1017
+ "scripts/lib/process-tree-runner.mjs": Object.freeze([
1018
+ "fb68902c68b4cd156f26d2f743364f611a54b833bc445b5144b4c844f553f188",
1019
+ ]),
1005
1020
  "scripts/lisa-clean-git-env.sh": Object.freeze([
1006
1021
  "d15af6f13eedbca41046070972380e69fc0af8f7d903aac12b8644389b9a0c91",
1007
1022
  "e7121a0ee9e1bf7c01cd2ab55f563dd6d9ab75990739bb6ddf571a513efa10e9",
@@ -1047,10 +1062,12 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1047
1062
  "f936bc8a038a7901ade1ba58cc52e5f5a8b8b2a52a9f0c1516567cc80eb02ccb",
1048
1063
  ]),
1049
1064
  "scripts/lisa-floor-collisions.mjs": Object.freeze([
1065
+ "04f9455319a501112902794874ca4889feff8c0d9c04cc07fb5720b09ed8fc92",
1050
1066
  "16f609ebf97f4f52e462ed97a774c2b56a33a99865cc11a5c069fbbbb45b007c",
1051
1067
  "2d11968f6852ab745cba939de03c6d6cb5f413975d2cfc8fc447bdd0b218e91a",
1052
1068
  "3c7a0234b4f5609fce49e44711d2ec86af8cf7fb82b0831e4450e3347ecefe45",
1053
1069
  "41060648b4394d417528f4f560a52f296b4df5b6ec8a5633e08afe4588b6a088",
1070
+ "557065f223dfc0715a20c3de76bafee0aefe22f52385c52e17cfc7b9398cce2d",
1054
1071
  "8870dba7b299ddb528e01fee32ec01cd8994a72118708ea8d3255be3daedfa72",
1055
1072
  "9cba6e0103c27850703323da25ac149c0136225172f1a1640abe3b3ac4e50a8e",
1056
1073
  "a612f172282d13ba9318fe5e03689d7c6ff42a0122d0c9d5d39051e1967b93dc",
@@ -1202,6 +1219,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1202
1219
  "1bf3512bb94923a6cb25b1e7a619a3fc8e1336bffa16f499b459aaee3eaed66d",
1203
1220
  "1d4fbe135f1bb4e861d286a6512ed201d4522250dfe3f9eba6584bc5ff166a95",
1204
1221
  "388cf8847581d96a1ff8ea98290a33a5f96d67cdd502ea807a0b8d88efe90e19",
1222
+ "450338257697a75a8fce9f06f3fc00bf3417947e50d601794da41f9c520a7cc3",
1205
1223
  "64546813f168fb446f39e34bc674fd3af85b15bd5e7f4f6bf4503463e701a7b9",
1206
1224
  "74b5b90fcf15dbeb14a69677cf74e339154421cd056fdaf603d1167b34a74105",
1207
1225
  "772202ddd42d626625ff719666afbbe83445d8bae1bc7c0fb5ffdcb402be83f8",
@@ -1249,6 +1267,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1249
1267
  "eb3593f201f570db63a9568236446d4324ee8757cda5e234965f3278d653c7db",
1250
1268
  ]),
1251
1269
  "scripts/lisa-postinstall.mjs": Object.freeze([
1270
+ "3294f390878d7fdb74417e12e9d386027ea8baeb874c5cae56c6d44d1df6261d",
1252
1271
  "45cf63bc37ef1115bc47e8212c709a7ec4dc09a9d7541297f0e2f090cbfb1fcc",
1253
1272
  "864bfbdc0b089a9b97e7ff053716f52e813071faff0be220294767b65918967b",
1254
1273
  "98fe3adf3192a72f40eb75757193ce866f0a6123387377f6041e54d938df8d96",
@@ -1256,6 +1275,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1256
1275
  ]),
1257
1276
  "scripts/lisa-reconcile-policy.mjs": Object.freeze([
1258
1277
  "2512f61074d10216dee0aca748caaebad373e6bba2598bc089f30f977c7a6a83",
1278
+ "395897d1dc3f0ac92d7c892eaa9b9ddf12078181bb9f5b228965478190b09a91",
1259
1279
  "3c062d0b79961a9a93a822507e893dcdaa71d65d735557727d20464c2489d812",
1260
1280
  "3e67eb4b0710ec195ad7efa4a8c2fd64063897d67725ea2627cf869c7e066201",
1261
1281
  "5c6b8a6ff3010b11f78b70eda0e73e78e1155b634a781b8abec79e40ac286eb7",
@@ -1281,6 +1301,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1281
1301
  "6e419a489d0605cc0743af207ff4ff3428d8bcdfbabb7207d164593b9644dfa5",
1282
1302
  "79055f89eb9c5bf1739867c12dc2d9e30320f86a2a3dd470300ba706c3c9d85e",
1283
1303
  "94453bdae8ab3dd2eba0883c4b278027396090e0bdc8e2f102414abc6415912a",
1304
+ "9b14c8864608e8ca390579048229bc0bbaba3094af0b536f1956085295c68af3",
1284
1305
  "9fa363107aa5ff033f150ff1a1bb5550d286de383b3d1f7b6c2ac2947730c8f2",
1285
1306
  "ba610745a8878bb9a21af249d6ab5b384fcf88e7c530db846f4f8163faba7a8e",
1286
1307
  "beffca5715f5c1309efd95d7a4895a980ae48498501c0cff163820ed5530730f",
@@ -1296,6 +1317,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1296
1317
  "08cb25c2c49e0e5fd01e29861bbb8c90f612f9736ca2df86789fa72bd26d271e",
1297
1318
  "2ace82daacdebbbb00a7eceb09fbe82cabec04330a083ca10417b2ee4e0a63eb",
1298
1319
  "3119c557eb49776143f0a4a715a25a2918242baccf39b7660a63d376e4e79791",
1320
+ "34d751e4ee98c14ae1c76ae14fe3da1ca913f70f40019a8423733f03ab64bb89",
1299
1321
  "4a05a0ed70a274827fd2f0fd0c98890c66bee2fde70785b8379943ebe6650473",
1300
1322
  "8a1684f5c2b4d37fc782d2090273772814f7ad6c61e7ae5459163a1f28b7a5dc",
1301
1323
  "9dd145c0f9dac6ed252b13d32e130dbab964da6cd357981b58541780ecb2f981",
@@ -1312,6 +1334,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1312
1334
  "238dc2da29938edd92518c2b08192d14c6f2751ed175c07d6e882814829b7b7e",
1313
1335
  "2d9ca0841db9e75ddfd95e3a4d485fd01aa639a512ef648996f565b7991d8e2b",
1314
1336
  "4c263fef48c03b3b6c623ea8a6cd55505bfaf28197e5072226ea35f9f3d26885",
1337
+ "5a0b82045d9795284a109c28e5e9dd97a5488ff540bb7034b84077d1447ffd7c",
1315
1338
  "5eb31c284e820a51312d4484f0669128007326af55ee515923fec33700d003a1",
1316
1339
  "6a8be8577242588f14ab52b25b2a22b6def53aefa9513b4d3d7c49f4d8027079",
1317
1340
  "71ff42c2cb8ac7022e0066132476764dd745fb92bf19ccd395000b1fe319abc7",
@@ -1365,6 +1388,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1365
1388
  "cf99167b05d210afad01fb41fc4aed548c66ee0e9a7c4decb8afa1f180eb5640",
1366
1389
  ]),
1367
1390
  "scripts/threshold-ratchet-families.mjs": Object.freeze([
1391
+ "39cb2fb53f1cc939675e7f8d5530a760abac420c2259fc97108d21f15c0275e9",
1368
1392
  "47d44b2bca383ae395b4e415e06c97a127327ab13762ee95b8c43d0198639bbb",
1369
1393
  "8fa58cc7276add0b2edf1de92bdcc32d81d840811ef0614ddc724010b59a888c",
1370
1394
  "93190f926689725418c1ec9eae15c55910b128cff6e3cb10185e466c7b90cc4f",