@codyswann/lisa 4.54.13 → 4.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (578) hide show
  1. package/all/copy-contents/.gitattributes +8 -0
  2. package/all/copy-overwrite/scripts/check-orphaned-branches.mjs +78 -9
  3. package/all/copy-overwrite/scripts/check-third-party-action-pins.mjs +17 -1
  4. package/all/copy-overwrite/scripts/lib/process-tree-runner.mjs +194 -7
  5. package/all/copy-overwrite/scripts/lisa-enforcement-fallback.sh +31 -0
  6. package/all/copy-overwrite/scripts/lisa-hooks/block-blind-automerge.sh +81 -2
  7. package/all/copy-overwrite/scripts/lisa-hooks/block-direct-issue-create.sh +293 -8
  8. package/all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh +21 -0
  9. package/all/copy-overwrite/scripts/lisa-hooks/block-managed-file-edits.sh +78 -15
  10. package/all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh +21 -0
  11. package/all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh +21 -0
  12. package/all/copy-overwrite/scripts/lisa-hooks/guard-dedupe.bash +340 -0
  13. package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +29 -1
  14. package/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.mjs +183 -1
  15. package/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.sh +21 -0
  16. package/all/copy-overwrite/scripts/lisa-postinstall.mjs +21 -1
  17. package/all/copy-overwrite/scripts/lisa-run-gates.mjs +100 -5
  18. package/all/copy-overwrite/scripts/lisa-work-item.mjs +1085 -80
  19. package/all/create-only/.github/workflows/continuous-gates.yml +7 -0
  20. package/cdk/create-only/.github/workflows/ci.yml +7 -0
  21. package/cdk/create-only/.github/workflows/deploy.yml +21 -0
  22. package/dist/cli/apply.d.ts.map +1 -1
  23. package/dist/cli/apply.js +9 -1
  24. package/dist/cli/apply.js.map +1 -1
  25. package/dist/cli/doctor-apply-deletions.d.ts +61 -0
  26. package/dist/cli/doctor-apply-deletions.d.ts.map +1 -0
  27. package/dist/cli/doctor-apply-deletions.js +137 -0
  28. package/dist/cli/doctor-apply-deletions.js.map +1 -0
  29. package/dist/cli/doctor-cdk-preset-adoption.d.ts +15 -0
  30. package/dist/cli/doctor-cdk-preset-adoption.d.ts.map +1 -0
  31. package/dist/cli/doctor-cdk-preset-adoption.js +316 -0
  32. package/dist/cli/doctor-cdk-preset-adoption.js.map +1 -0
  33. package/dist/cli/doctor-config-shadowing.d.ts +22 -0
  34. package/dist/cli/doctor-config-shadowing.d.ts.map +1 -0
  35. package/dist/cli/doctor-config-shadowing.js +123 -0
  36. package/dist/cli/doctor-config-shadowing.js.map +1 -0
  37. package/dist/cli/doctor-rails-deploy-intent.d.ts +15 -0
  38. package/dist/cli/doctor-rails-deploy-intent.d.ts.map +1 -0
  39. package/dist/cli/doctor-rails-deploy-intent.js +197 -0
  40. package/dist/cli/doctor-rails-deploy-intent.js.map +1 -0
  41. package/dist/cli/doctor-seeded-artifacts.d.ts +12 -0
  42. package/dist/cli/doctor-seeded-artifacts.d.ts.map +1 -0
  43. package/dist/cli/doctor-seeded-artifacts.js +54 -0
  44. package/dist/cli/doctor-seeded-artifacts.js.map +1 -0
  45. package/dist/cli/doctor-stale-banner-scan.d.ts +44 -0
  46. package/dist/cli/doctor-stale-banner-scan.d.ts.map +1 -0
  47. package/dist/cli/doctor-stale-banner-scan.js +152 -0
  48. package/dist/cli/doctor-stale-banner-scan.js.map +1 -0
  49. package/dist/cli/doctor-stale-managed-banner.d.ts +19 -0
  50. package/dist/cli/doctor-stale-managed-banner.d.ts.map +1 -0
  51. package/dist/cli/doctor-stale-managed-banner.js +198 -0
  52. package/dist/cli/doctor-stale-managed-banner.js.map +1 -0
  53. package/dist/cli/doctor.d.ts.map +1 -1
  54. package/dist/cli/doctor.js +16 -0
  55. package/dist/cli/doctor.js.map +1 -1
  56. package/dist/cli/ui-detected-stacks.d.ts.map +1 -1
  57. package/dist/cli/ui-detected-stacks.js +3 -2
  58. package/dist/cli/ui-detected-stacks.js.map +1 -1
  59. package/dist/cli/update-check.d.ts.map +1 -1
  60. package/dist/cli/update-check.js +14 -0
  61. package/dist/cli/update-check.js.map +1 -1
  62. package/dist/cli/worktree-liveness.d.ts +5 -0
  63. package/dist/cli/worktree-liveness.d.ts.map +1 -1
  64. package/dist/cli/worktree-liveness.js +7 -6
  65. package/dist/cli/worktree-liveness.js.map +1 -1
  66. package/dist/cli/worktree-ownership.d.ts +13 -0
  67. package/dist/cli/worktree-ownership.d.ts.map +1 -1
  68. package/dist/cli/worktree-ownership.js +14 -0
  69. package/dist/cli/worktree-ownership.js.map +1 -1
  70. package/dist/configs/eslint/base.d.ts +34 -0
  71. package/dist/configs/eslint/base.d.ts.map +1 -1
  72. package/dist/configs/eslint/base.js +34 -0
  73. package/dist/configs/eslint/base.js.map +1 -1
  74. package/dist/core/apply-receipt.d.ts +65 -0
  75. package/dist/core/apply-receipt.d.ts.map +1 -1
  76. package/dist/core/apply-receipt.js +62 -2
  77. package/dist/core/apply-receipt.js.map +1 -1
  78. package/dist/core/cdk-preset-adoption.d.ts +136 -0
  79. package/dist/core/cdk-preset-adoption.d.ts.map +1 -0
  80. package/dist/core/cdk-preset-adoption.js +135 -0
  81. package/dist/core/cdk-preset-adoption.js.map +1 -0
  82. package/dist/core/config-shadowing.d.ts +36 -0
  83. package/dist/core/config-shadowing.d.ts.map +1 -1
  84. package/dist/core/config-shadowing.js +38 -0
  85. package/dist/core/config-shadowing.js.map +1 -1
  86. package/dist/core/config.d.ts +11 -0
  87. package/dist/core/config.d.ts.map +1 -1
  88. package/dist/core/config.js.map +1 -1
  89. package/dist/core/learnings-merge-driver.d.ts +10 -0
  90. package/dist/core/learnings-merge-driver.d.ts.map +1 -1
  91. package/dist/core/learnings-merge-driver.js +18 -0
  92. package/dist/core/learnings-merge-driver.js.map +1 -1
  93. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  94. package/dist/core/lisa-owned-hash-ledger.js +136 -0
  95. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  96. package/dist/core/lisa.d.ts.map +1 -1
  97. package/dist/core/lisa.js +9 -1
  98. package/dist/core/lisa.js.map +1 -1
  99. package/dist/core/nightly-e2e-guard-behavior-certificate.d.ts +5 -5
  100. package/dist/core/nightly-e2e-guard-behavior-certificate.js +7 -7
  101. package/dist/core/nightly-e2e-guard-behavior-certificate.js.map +1 -1
  102. package/dist/core/ownership-header.d.ts +74 -0
  103. package/dist/core/ownership-header.d.ts.map +1 -0
  104. package/dist/core/ownership-header.js +76 -0
  105. package/dist/core/ownership-header.js.map +1 -0
  106. package/dist/core/rails-deploy-production-intent.d.ts +36 -0
  107. package/dist/core/rails-deploy-production-intent.d.ts.map +1 -0
  108. package/dist/core/rails-deploy-production-intent.js +79 -0
  109. package/dist/core/rails-deploy-production-intent.js.map +1 -0
  110. package/dist/core/stale-managed-banner.d.ts +78 -0
  111. package/dist/core/stale-managed-banner.d.ts.map +1 -0
  112. package/dist/core/stale-managed-banner.js +118 -0
  113. package/dist/core/stale-managed-banner.js.map +1 -0
  114. package/dist/core/two-channel-delivery-scan.d.ts +33 -1
  115. package/dist/core/two-channel-delivery-scan.d.ts.map +1 -1
  116. package/dist/core/two-channel-delivery-scan.js +133 -6
  117. package/dist/core/two-channel-delivery-scan.js.map +1 -1
  118. package/dist/core/two-channel-delivery.d.ts +101 -4
  119. package/dist/core/two-channel-delivery.d.ts.map +1 -1
  120. package/dist/core/two-channel-delivery.js +121 -13
  121. package/dist/core/two-channel-delivery.js.map +1 -1
  122. package/dist/core/two-channel-staleness.d.ts +137 -0
  123. package/dist/core/two-channel-staleness.d.ts.map +1 -0
  124. package/dist/core/two-channel-staleness.js +268 -0
  125. package/dist/core/two-channel-staleness.js.map +1 -0
  126. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  127. package/dist/core/upstream-evidence-manifest.js +265 -121
  128. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  129. package/dist/core/workflow-deletion-ownership.d.ts +6 -24
  130. package/dist/core/workflow-deletion-ownership.d.ts.map +1 -1
  131. package/dist/core/workflow-deletion-ownership.js +22 -42
  132. package/dist/core/workflow-deletion-ownership.js.map +1 -1
  133. package/dist/detection/detectors/cdk.d.ts.map +1 -1
  134. package/dist/detection/detectors/cdk.js +2 -1
  135. package/dist/detection/detectors/cdk.js.map +1 -1
  136. package/dist/health/template-inspection.d.ts.map +1 -1
  137. package/dist/health/template-inspection.js +2 -1
  138. package/dist/health/template-inspection.js.map +1 -1
  139. package/dist/migrations/ensure-lisa-postinstall.d.ts +16 -0
  140. package/dist/migrations/ensure-lisa-postinstall.d.ts.map +1 -1
  141. package/dist/migrations/ensure-lisa-postinstall.js +16 -0
  142. package/dist/migrations/ensure-lisa-postinstall.js.map +1 -1
  143. package/dist/migrations/ensure-pinned-reusable-workflow-refs.d.ts +2 -2
  144. package/dist/migrations/ensure-pinned-reusable-workflow-refs.d.ts.map +1 -1
  145. package/dist/migrations/ensure-pinned-reusable-workflow-refs.js +98 -34
  146. package/dist/migrations/ensure-pinned-reusable-workflow-refs.js.map +1 -1
  147. package/dist/migrations/ensure-playwright-dedicated-caller.d.ts.map +1 -1
  148. package/dist/migrations/ensure-playwright-dedicated-caller.js +1 -0
  149. package/dist/migrations/ensure-playwright-dedicated-caller.js.map +1 -1
  150. package/dist/opencode/hooks-installer.d.ts.map +1 -1
  151. package/dist/opencode/hooks-installer.js +1 -0
  152. package/dist/opencode/hooks-installer.js.map +1 -1
  153. package/dist/opencode/plugin-templates/block-managed-file-edits.sh +78 -15
  154. package/dist/opencode/plugin-templates/block-no-verify.sh +21 -0
  155. package/dist/opencode/plugin-templates/guard-dedupe.bash +337 -0
  156. package/dist/opencode/plugin-templates/lisa-block-direct-issue-create.ts +242 -55
  157. package/dist/opencode/plugin-templates/parity-safety-net.sh +29 -1
  158. package/dist/strategies/package-lisa.d.ts.map +1 -1
  159. package/dist/strategies/package-lisa.js +2 -1
  160. package/dist/strategies/package-lisa.js.map +1 -1
  161. package/dist/utils/path-utils.d.ts +29 -0
  162. package/dist/utils/path-utils.d.ts.map +1 -1
  163. package/dist/utils/path-utils.js +41 -0
  164. package/dist/utils/path-utils.js.map +1 -1
  165. package/expo/create-only/.github/workflows/ci.yml +21 -0
  166. package/expo/create-only/.github/workflows/deploy.yml +28 -0
  167. package/expo/create-only/.github/workflows/maestro-e2e.yml +7 -0
  168. package/expo/create-only/.github/workflows/nightly-e2e-bypass-reaper.yml +124 -13
  169. package/expo/create-only/.github/workflows/nightly-e2e-health.yml +7 -0
  170. package/expo/create-only/.github/workflows/nightly-e2e-report.yml +7 -0
  171. package/expo/create-only/.github/workflows/nightly-e2e-tracking.yml +8 -0
  172. package/expo/create-only/.github/workflows/playwright-e2e.yml +7 -0
  173. package/harper-fabric/copy-overwrite/.github/workflows/ci.yml +7 -0
  174. package/harper-fabric/create-only/.github/workflows/deploy.yml +14 -0
  175. package/nestjs/create-only/.github/workflows/ci.yml +14 -0
  176. package/nestjs/create-only/.github/workflows/deploy.yml +28 -0
  177. package/package.json +10 -5
  178. package/phaser/copy-overwrite/.github/workflows/ci.yml +7 -0
  179. package/plugins/lisa/.claude-plugin/plugin.json +28 -1
  180. package/plugins/lisa/.codex-plugin/hooks.json +27 -0
  181. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  182. package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
  183. package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/SKILL.md +27 -4
  184. package/plugins/lisa/.codex-plugin/skills/lisa-github-prd-intake/SKILL.md +1 -1
  185. package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +22 -0
  186. package/plugins/lisa/.codex-plugin/skills/lisa-github-verify/SKILL.md +14 -0
  187. package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +51 -0
  188. package/plugins/lisa/.codex-plugin/skills/lisa-intake/SKILL.md +1 -1
  189. package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/SKILL.md +27 -4
  190. package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  191. package/plugins/lisa/.codex-plugin/skills/lisa-jira-verify/SKILL.md +14 -0
  192. package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +51 -0
  193. package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +55 -2
  194. package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +27 -4
  195. package/plugins/lisa/.codex-plugin/skills/lisa-linear-prd-intake/SKILL.md +47 -30
  196. package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  197. package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  198. package/plugins/lisa/.codex-plugin/skills/lisa-linear-verify/SKILL.md +14 -0
  199. package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +54 -3
  200. package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  201. package/plugins/lisa/.codex-plugin/skills/lisa-qa-clear/SKILL.md +19 -7
  202. package/plugins/lisa/.codex-plugin/skills/lisa-qa-fail/SKILL.md +28 -3
  203. package/plugins/lisa/.codex-plugin/skills/lisa-qa-queue/SKILL.md +28 -3
  204. package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +94 -24
  205. package/plugins/lisa/.codex-plugin/skills/lisa-rework-triage/SKILL.md +32 -2
  206. package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +4 -4
  207. package/plugins/lisa/.codex-plugin/skills/lisa-track/SKILL.md +1 -1
  208. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-build-intake/SKILL.md +9 -0
  209. package/plugins/lisa/agents/linear-prd-intake.md +8 -8
  210. package/plugins/lisa/hooks/block-blind-automerge.sh +81 -2
  211. package/plugins/lisa/hooks/block-direct-issue-create.agy.sh +64 -16
  212. package/plugins/lisa/hooks/block-direct-issue-create.sh +293 -8
  213. package/plugins/lisa/hooks/block-instruction-file-edits.sh +21 -0
  214. package/plugins/lisa/hooks/block-managed-file-edits.sh +78 -15
  215. package/plugins/lisa/hooks/block-no-verify.sh +21 -0
  216. package/plugins/lisa/hooks/block-shell-json-parsing.sh +21 -0
  217. package/plugins/lisa/hooks/failure-signature-index.mjs +240 -5
  218. package/plugins/lisa/hooks/guard-dedupe.bash +337 -0
  219. package/plugins/lisa/hooks/inject-rules.sh +13 -5
  220. package/plugins/lisa/hooks/operational-hazards.mjs +736 -0
  221. package/plugins/lisa/hooks/operational-hazards.sh +28 -0
  222. package/plugins/lisa/hooks/parity-safety-net.sh +29 -1
  223. package/plugins/lisa/hooks/threshold-ratchet-compare.mjs +102 -21
  224. package/plugins/lisa/hooks/threshold-ratchet-families.mjs +130 -2
  225. package/plugins/lisa/hooks/threshold-ratchet.mjs +63 -13
  226. package/plugins/lisa/hooks/worktree-binding-guard.mjs +183 -1
  227. package/plugins/lisa/hooks/worktree-binding-guard.sh +21 -0
  228. package/plugins/lisa/rules/eager/00-rule-index.md +1 -0
  229. package/plugins/lisa/rules/eager/operational-hazards.md +50 -0
  230. package/plugins/lisa/rules/eager/tracked-work.md +1 -1
  231. package/plugins/lisa/rules/reference/config-resolution.md +1 -1
  232. package/plugins/lisa/rules/reference/leaf-only-lifecycle.md +1 -1
  233. package/plugins/lisa/rules/reference/operational-hazards.md +115 -0
  234. package/plugins/lisa/rules/reference/work-item-trailer-definition.md +129 -0
  235. package/plugins/lisa/scripts/intake-blocker-reprobe.mjs +407 -26
  236. package/plugins/lisa/scripts/qa-signal-lifecycle.mjs +507 -0
  237. package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
  238. package/plugins/lisa/skills/lisa-github-build-intake/SKILL.md +27 -4
  239. package/plugins/lisa/skills/lisa-github-prd-intake/SKILL.md +1 -1
  240. package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +22 -0
  241. package/plugins/lisa/skills/lisa-github-verify/SKILL.md +14 -0
  242. package/plugins/lisa/skills/lisa-github-write-issue/SKILL.md +51 -0
  243. package/plugins/lisa/skills/lisa-intake/SKILL.md +1 -1
  244. package/plugins/lisa/skills/lisa-jira-build-intake/SKILL.md +27 -4
  245. package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  246. package/plugins/lisa/skills/lisa-jira-verify/SKILL.md +14 -0
  247. package/plugins/lisa/skills/lisa-jira-write-ticket/SKILL.md +51 -0
  248. package/plugins/lisa/skills/lisa-linear-access/SKILL.md +55 -2
  249. package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +27 -4
  250. package/plugins/lisa/skills/lisa-linear-prd-intake/SKILL.md +48 -31
  251. package/plugins/lisa/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  252. package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  253. package/plugins/lisa/skills/lisa-linear-verify/SKILL.md +14 -0
  254. package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +54 -3
  255. package/plugins/lisa/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  256. package/plugins/lisa/skills/lisa-qa-clear/SKILL.md +19 -7
  257. package/plugins/lisa/skills/lisa-qa-fail/SKILL.md +28 -3
  258. package/plugins/lisa/skills/lisa-qa-queue/SKILL.md +28 -3
  259. package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +94 -24
  260. package/plugins/lisa/skills/lisa-rework-triage/SKILL.md +32 -2
  261. package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +5 -5
  262. package/plugins/lisa/skills/lisa-track/SKILL.md +1 -1
  263. package/plugins/lisa/skills/lisa-tracker-build-intake/SKILL.md +9 -0
  264. package/plugins/lisa-agy/agents/linear-prd-intake.md +8 -8
  265. package/plugins/lisa-agy/hooks/block-blind-automerge.sh +81 -2
  266. package/plugins/lisa-agy/hooks/block-direct-issue-create.agy.sh +64 -16
  267. package/plugins/lisa-agy/hooks/block-direct-issue-create.sh +293 -8
  268. package/plugins/lisa-agy/hooks/block-instruction-file-edits.sh +21 -0
  269. package/plugins/lisa-agy/hooks/block-managed-file-edits.sh +78 -15
  270. package/plugins/lisa-agy/hooks/block-shell-json-parsing.sh +21 -0
  271. package/plugins/lisa-agy/hooks/guard-dedupe.bash +337 -0
  272. package/plugins/lisa-agy/hooks/parity-safety-net.sh +29 -1
  273. package/plugins/lisa-agy/hooks.json +1 -1
  274. package/plugins/lisa-agy/plugin.json +1 -1
  275. package/plugins/lisa-agy/scripts/intake-blocker-reprobe.mjs +407 -26
  276. package/plugins/lisa-agy/scripts/qa-signal-lifecycle.mjs +507 -0
  277. package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
  278. package/plugins/lisa-agy/skills/lisa-github-build-intake/SKILL.md +27 -4
  279. package/plugins/lisa-agy/skills/lisa-github-prd-intake/SKILL.md +1 -1
  280. package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +22 -0
  281. package/plugins/lisa-agy/skills/lisa-github-verify/SKILL.md +14 -0
  282. package/plugins/lisa-agy/skills/lisa-github-write-issue/SKILL.md +51 -0
  283. package/plugins/lisa-agy/skills/lisa-intake/SKILL.md +1 -1
  284. package/plugins/lisa-agy/skills/lisa-jira-build-intake/SKILL.md +27 -4
  285. package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  286. package/plugins/lisa-agy/skills/lisa-jira-verify/SKILL.md +14 -0
  287. package/plugins/lisa-agy/skills/lisa-jira-write-ticket/SKILL.md +51 -0
  288. package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +55 -2
  289. package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +27 -4
  290. package/plugins/lisa-agy/skills/lisa-linear-prd-intake/SKILL.md +48 -31
  291. package/plugins/lisa-agy/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  292. package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  293. package/plugins/lisa-agy/skills/lisa-linear-verify/SKILL.md +14 -0
  294. package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +54 -3
  295. package/plugins/lisa-agy/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  296. package/plugins/lisa-agy/skills/lisa-qa-clear/SKILL.md +19 -7
  297. package/plugins/lisa-agy/skills/lisa-qa-fail/SKILL.md +28 -3
  298. package/plugins/lisa-agy/skills/lisa-qa-queue/SKILL.md +28 -3
  299. package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +94 -24
  300. package/plugins/lisa-agy/skills/lisa-rework-triage/SKILL.md +32 -2
  301. package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +5 -5
  302. package/plugins/lisa-agy/skills/lisa-track/SKILL.md +1 -1
  303. package/plugins/lisa-agy/skills/lisa-tracker-build-intake/SKILL.md +9 -0
  304. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  305. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  306. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  307. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  308. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  309. package/plugins/lisa-copilot/.claude-plugin/plugin.json +19 -1
  310. package/plugins/lisa-copilot/agents/linear-prd-intake.agent.md +8 -8
  311. package/plugins/lisa-copilot/hooks/block-blind-automerge.sh +81 -2
  312. package/plugins/lisa-copilot/hooks/block-direct-issue-create.sh +293 -8
  313. package/plugins/lisa-copilot/hooks/block-instruction-file-edits.sh +21 -0
  314. package/plugins/lisa-copilot/hooks/block-managed-file-edits.sh +78 -15
  315. package/plugins/lisa-copilot/hooks/block-no-verify.sh +21 -0
  316. package/plugins/lisa-copilot/hooks/block-shell-json-parsing.sh +21 -0
  317. package/plugins/lisa-copilot/hooks/failure-signature-index.mjs +240 -5
  318. package/plugins/lisa-copilot/hooks/guard-dedupe.bash +337 -0
  319. package/plugins/lisa-copilot/hooks/inject-rules.sh +13 -5
  320. package/plugins/lisa-copilot/hooks/operational-hazards.mjs +736 -0
  321. package/plugins/lisa-copilot/hooks/operational-hazards.sh +28 -0
  322. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +29 -1
  323. package/plugins/lisa-copilot/hooks/threshold-ratchet-compare.mjs +102 -21
  324. package/plugins/lisa-copilot/hooks/threshold-ratchet-families.mjs +130 -2
  325. package/plugins/lisa-copilot/hooks/threshold-ratchet.mjs +63 -13
  326. package/plugins/lisa-copilot/hooks/worktree-binding-guard.mjs +183 -1
  327. package/plugins/lisa-copilot/hooks/worktree-binding-guard.sh +21 -0
  328. package/plugins/lisa-copilot/rules/eager/00-rule-index.md +1 -0
  329. package/plugins/lisa-copilot/rules/eager/operational-hazards.md +50 -0
  330. package/plugins/lisa-copilot/rules/eager/tracked-work.md +1 -1
  331. package/plugins/lisa-copilot/rules/reference/config-resolution.md +1 -1
  332. package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +1 -1
  333. package/plugins/lisa-copilot/rules/reference/operational-hazards.md +115 -0
  334. package/plugins/lisa-copilot/rules/reference/work-item-trailer-definition.md +129 -0
  335. package/plugins/lisa-copilot/scripts/intake-blocker-reprobe.mjs +407 -26
  336. package/plugins/lisa-copilot/scripts/qa-signal-lifecycle.mjs +507 -0
  337. package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
  338. package/plugins/lisa-copilot/skills/lisa-github-build-intake/SKILL.md +27 -4
  339. package/plugins/lisa-copilot/skills/lisa-github-prd-intake/SKILL.md +1 -1
  340. package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +22 -0
  341. package/plugins/lisa-copilot/skills/lisa-github-verify/SKILL.md +14 -0
  342. package/plugins/lisa-copilot/skills/lisa-github-write-issue/SKILL.md +51 -0
  343. package/plugins/lisa-copilot/skills/lisa-intake/SKILL.md +1 -1
  344. package/plugins/lisa-copilot/skills/lisa-jira-build-intake/SKILL.md +27 -4
  345. package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  346. package/plugins/lisa-copilot/skills/lisa-jira-verify/SKILL.md +14 -0
  347. package/plugins/lisa-copilot/skills/lisa-jira-write-ticket/SKILL.md +51 -0
  348. package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +55 -2
  349. package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +27 -4
  350. package/plugins/lisa-copilot/skills/lisa-linear-prd-intake/SKILL.md +48 -31
  351. package/plugins/lisa-copilot/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  352. package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  353. package/plugins/lisa-copilot/skills/lisa-linear-verify/SKILL.md +14 -0
  354. package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +54 -3
  355. package/plugins/lisa-copilot/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  356. package/plugins/lisa-copilot/skills/lisa-qa-clear/SKILL.md +19 -7
  357. package/plugins/lisa-copilot/skills/lisa-qa-fail/SKILL.md +28 -3
  358. package/plugins/lisa-copilot/skills/lisa-qa-queue/SKILL.md +28 -3
  359. package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +94 -24
  360. package/plugins/lisa-copilot/skills/lisa-rework-triage/SKILL.md +32 -2
  361. package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +5 -5
  362. package/plugins/lisa-copilot/skills/lisa-track/SKILL.md +1 -1
  363. package/plugins/lisa-copilot/skills/lisa-tracker-build-intake/SKILL.md +9 -0
  364. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  365. package/plugins/lisa-cursor/agents/linear-prd-intake.md +8 -8
  366. package/plugins/lisa-cursor/hooks/block-blind-automerge.sh +81 -2
  367. package/plugins/lisa-cursor/hooks/block-direct-issue-create.sh +293 -8
  368. package/plugins/lisa-cursor/hooks/block-instruction-file-edits.sh +21 -0
  369. package/plugins/lisa-cursor/hooks/block-managed-file-edits.sh +78 -15
  370. package/plugins/lisa-cursor/hooks/block-no-verify.sh +21 -0
  371. package/plugins/lisa-cursor/hooks/block-shell-json-parsing.sh +21 -0
  372. package/plugins/lisa-cursor/hooks/failure-signature-index.mjs +240 -5
  373. package/plugins/lisa-cursor/hooks/guard-dedupe.bash +337 -0
  374. package/plugins/lisa-cursor/hooks/hooks.json +10 -0
  375. package/plugins/lisa-cursor/hooks/operational-hazards.mjs +736 -0
  376. package/plugins/lisa-cursor/hooks/operational-hazards.sh +28 -0
  377. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +29 -1
  378. package/plugins/lisa-cursor/hooks/threshold-ratchet-compare.mjs +102 -21
  379. package/plugins/lisa-cursor/hooks/threshold-ratchet-families.mjs +130 -2
  380. package/plugins/lisa-cursor/hooks/threshold-ratchet.mjs +63 -13
  381. package/plugins/lisa-cursor/hooks/worktree-binding-guard.mjs +183 -1
  382. package/plugins/lisa-cursor/hooks/worktree-binding-guard.sh +21 -0
  383. package/plugins/lisa-cursor/rules/00-rule-index.mdc +1 -0
  384. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +1 -1
  385. package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +1 -1
  386. package/plugins/lisa-cursor/rules/operational-hazards-reference.mdc +120 -0
  387. package/plugins/lisa-cursor/rules/operational-hazards.mdc +55 -0
  388. package/plugins/lisa-cursor/rules/tracked-work.mdc +1 -1
  389. package/plugins/lisa-cursor/rules/work-item-trailer-definition-reference.mdc +134 -0
  390. package/plugins/lisa-cursor/scripts/intake-blocker-reprobe.mjs +407 -26
  391. package/plugins/lisa-cursor/scripts/qa-signal-lifecycle.mjs +507 -0
  392. package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
  393. package/plugins/lisa-cursor/skills/lisa-github-build-intake/SKILL.md +27 -4
  394. package/plugins/lisa-cursor/skills/lisa-github-prd-intake/SKILL.md +1 -1
  395. package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +22 -0
  396. package/plugins/lisa-cursor/skills/lisa-github-verify/SKILL.md +14 -0
  397. package/plugins/lisa-cursor/skills/lisa-github-write-issue/SKILL.md +51 -0
  398. package/plugins/lisa-cursor/skills/lisa-intake/SKILL.md +1 -1
  399. package/plugins/lisa-cursor/skills/lisa-jira-build-intake/SKILL.md +27 -4
  400. package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  401. package/plugins/lisa-cursor/skills/lisa-jira-verify/SKILL.md +14 -0
  402. package/plugins/lisa-cursor/skills/lisa-jira-write-ticket/SKILL.md +51 -0
  403. package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +55 -2
  404. package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +27 -4
  405. package/plugins/lisa-cursor/skills/lisa-linear-prd-intake/SKILL.md +48 -31
  406. package/plugins/lisa-cursor/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  407. package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  408. package/plugins/lisa-cursor/skills/lisa-linear-verify/SKILL.md +14 -0
  409. package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +54 -3
  410. package/plugins/lisa-cursor/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  411. package/plugins/lisa-cursor/skills/lisa-qa-clear/SKILL.md +19 -7
  412. package/plugins/lisa-cursor/skills/lisa-qa-fail/SKILL.md +28 -3
  413. package/plugins/lisa-cursor/skills/lisa-qa-queue/SKILL.md +28 -3
  414. package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +94 -24
  415. package/plugins/lisa-cursor/skills/lisa-rework-triage/SKILL.md +32 -2
  416. package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +5 -5
  417. package/plugins/lisa-cursor/skills/lisa-track/SKILL.md +1 -1
  418. package/plugins/lisa-cursor/skills/lisa-tracker-build-intake/SKILL.md +9 -0
  419. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  420. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  421. package/plugins/lisa-expo-agy/plugin.json +1 -1
  422. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  423. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  424. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  425. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  426. package/plugins/lisa-harper-fabric/hooks/inject-rules.sh +14 -3
  427. package/plugins/lisa-harper-fabric/rules/eager/harper-fabric.md +31 -0
  428. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  429. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  430. package/plugins/lisa-harper-fabric-copilot/hooks/inject-rules.sh +14 -3
  431. package/plugins/lisa-harper-fabric-copilot/rules/eager/harper-fabric.md +31 -0
  432. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  433. package/plugins/lisa-harper-fabric-cursor/rules/harper-fabric-reference.mdc +57 -0
  434. package/plugins/lisa-harper-fabric-cursor/rules/harper-fabric.mdc +32 -53
  435. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  436. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  437. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  438. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  439. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  440. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  441. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  442. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  443. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  444. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  445. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  446. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  447. package/plugins/lisa-phaser/hooks/inject-rules.sh +14 -3
  448. package/plugins/lisa-phaser/rules/eager/phaser.md +44 -0
  449. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  450. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  451. package/plugins/lisa-phaser-copilot/hooks/inject-rules.sh +14 -3
  452. package/plugins/lisa-phaser-copilot/rules/eager/phaser.md +44 -0
  453. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  454. package/plugins/lisa-phaser-cursor/rules/phaser-reference.mdc +189 -0
  455. package/plugins/lisa-phaser-cursor/rules/phaser.mdc +45 -185
  456. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  457. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  458. package/plugins/lisa-rails/hooks/inject-rules.sh +14 -4
  459. package/plugins/lisa-rails/rules/eager/rails-conventions.md +23 -0
  460. package/plugins/lisa-rails-agy/plugin.json +1 -1
  461. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  462. package/plugins/lisa-rails-copilot/hooks/inject-rules.sh +14 -4
  463. package/plugins/lisa-rails-copilot/rules/eager/rails-conventions.md +23 -0
  464. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  465. package/plugins/lisa-rails-cursor/rules/rails-conventions-reference.mdc +181 -0
  466. package/plugins/lisa-rails-cursor/rules/rails-conventions.mdc +24 -177
  467. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  468. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  469. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  470. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  471. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  472. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  473. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  474. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  475. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  476. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  477. package/plugins/materialized-artifacts.json +1 -0
  478. package/plugins/src/base/.claude-plugin/plugin.json +27 -0
  479. package/plugins/src/base/agents/linear-prd-intake.md +8 -8
  480. package/plugins/src/base/hooks/block-blind-automerge.sh +81 -2
  481. package/plugins/src/base/hooks/block-direct-issue-create.agy.sh +64 -16
  482. package/plugins/src/base/hooks/block-direct-issue-create.sh +293 -8
  483. package/plugins/src/base/hooks/block-instruction-file-edits.sh +21 -0
  484. package/plugins/src/base/hooks/block-managed-file-edits.sh +78 -15
  485. package/plugins/src/base/hooks/block-no-verify.sh +21 -0
  486. package/plugins/src/base/hooks/block-shell-json-parsing.sh +21 -0
  487. package/plugins/src/base/hooks/failure-signature-index.mjs +240 -5
  488. package/plugins/src/base/hooks/guard-dedupe.bash +337 -0
  489. package/plugins/src/base/hooks/inject-rules.sh +13 -5
  490. package/plugins/src/base/hooks/operational-hazards.mjs +736 -0
  491. package/plugins/src/base/hooks/operational-hazards.sh +28 -0
  492. package/plugins/src/base/hooks/parity-safety-net.sh +29 -1
  493. package/plugins/src/base/hooks/threshold-ratchet-compare.mjs +102 -21
  494. package/plugins/src/base/hooks/threshold-ratchet-families.mjs +130 -2
  495. package/plugins/src/base/hooks/threshold-ratchet.mjs +63 -13
  496. package/plugins/src/base/hooks/worktree-binding-guard.mjs +183 -1
  497. package/plugins/src/base/hooks/worktree-binding-guard.sh +21 -0
  498. package/plugins/src/base/rules/eager/00-rule-index.md +1 -0
  499. package/plugins/src/base/rules/eager/operational-hazards.md +50 -0
  500. package/plugins/src/base/rules/eager/tracked-work.md +1 -1
  501. package/plugins/src/base/rules/reference/config-resolution.md +1 -1
  502. package/plugins/src/base/rules/reference/leaf-only-lifecycle.md +1 -1
  503. package/plugins/src/base/rules/reference/operational-hazards.md +115 -0
  504. package/plugins/src/base/rules/reference/work-item-trailer-definition.md +129 -0
  505. package/plugins/src/base/scripts/intake-blocker-reprobe.mjs +407 -26
  506. package/plugins/src/base/scripts/qa-signal-lifecycle.mjs +507 -0
  507. package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
  508. package/plugins/src/base/skills/lisa-github-build-intake/SKILL.md +27 -4
  509. package/plugins/src/base/skills/lisa-github-prd-intake/SKILL.md +1 -1
  510. package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +22 -0
  511. package/plugins/src/base/skills/lisa-github-verify/SKILL.md +14 -0
  512. package/plugins/src/base/skills/lisa-github-write-issue/SKILL.md +51 -0
  513. package/plugins/src/base/skills/lisa-intake/SKILL.md +1 -1
  514. package/plugins/src/base/skills/lisa-jira-build-intake/SKILL.md +27 -4
  515. package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  516. package/plugins/src/base/skills/lisa-jira-verify/SKILL.md +14 -0
  517. package/plugins/src/base/skills/lisa-jira-write-ticket/SKILL.md +51 -0
  518. package/plugins/src/base/skills/lisa-linear-access/SKILL.md +55 -2
  519. package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +27 -4
  520. package/plugins/src/base/skills/lisa-linear-prd-intake/SKILL.md +48 -31
  521. package/plugins/src/base/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  522. package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  523. package/plugins/src/base/skills/lisa-linear-verify/SKILL.md +14 -0
  524. package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +54 -3
  525. package/plugins/src/base/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  526. package/plugins/src/base/skills/lisa-qa-clear/SKILL.md +19 -7
  527. package/plugins/src/base/skills/lisa-qa-fail/SKILL.md +28 -3
  528. package/plugins/src/base/skills/lisa-qa-queue/SKILL.md +28 -3
  529. package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +94 -24
  530. package/plugins/src/base/skills/lisa-rework-triage/SKILL.md +32 -2
  531. package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +5 -5
  532. package/plugins/src/base/skills/lisa-track/SKILL.md +1 -1
  533. package/plugins/src/base/skills/lisa-tracker-build-intake/SKILL.md +9 -0
  534. package/plugins/src/harper-fabric/hooks/inject-rules.sh +14 -3
  535. package/plugins/src/harper-fabric/rules/eager/harper-fabric.md +31 -0
  536. package/plugins/src/phaser/hooks/inject-rules.sh +14 -3
  537. package/plugins/src/phaser/rules/eager/phaser.md +44 -0
  538. package/plugins/src/rails/hooks/inject-rules.sh +14 -4
  539. package/plugins/src/rails/rules/eager/rails-conventions.md +23 -0
  540. package/rails/copy-overwrite/scripts/check-threshold-ratchet.mjs +63 -13
  541. package/rails/copy-overwrite/scripts/threshold-ratchet-compare.mjs +102 -21
  542. package/rails/copy-overwrite/scripts/threshold-ratchet-families.mjs +130 -2
  543. package/rails/create-only/.github/workflows/ci.yml +8 -0
  544. package/rails/create-only/.github/workflows/deploy.yml +22 -0
  545. package/scripts/build-plugins.sh +2 -1
  546. package/scripts/check-engine-floor.mjs +361 -0
  547. package/scripts/check-guard-parity-notes.mjs +709 -0
  548. package/scripts/check-template-workflow-refs.mjs +9 -0
  549. package/scripts/check-third-party-action-pins.mjs +17 -1
  550. package/scripts/check-workflow-contract-assertions.mjs +480 -0
  551. package/scripts/copy-opencode-plugin-templates.mjs +1 -0
  552. package/scripts/deployed-guard-advice.mjs +636 -0
  553. package/scripts/generate-agy-plugin-artifacts.mjs +35 -10
  554. package/scripts/generate-export-surface.mjs +105 -19
  555. package/scripts/generate-two-channel-couplings.ts +143 -212
  556. package/scripts/lisa-enforcement-fallback.sh +31 -0
  557. package/scripts/measure-scripts-profile-gap.mts +361 -0
  558. package/scripts/mutation-performance-measure.mjs +21 -5
  559. package/scripts/reconcile-release-tags.mjs +65 -84
  560. package/scripts/two-channel-couplings.json +302 -70
  561. package/scripts/workflow-contract-assertion.sh +47 -0
  562. package/typescript/copy-overwrite/.lintstagedrc.json +1 -0
  563. package/typescript/copy-overwrite/eslint.ignore.config.json +1 -0
  564. package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +527 -53
  565. package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +301 -13
  566. package/typescript/copy-overwrite/scripts/check-threshold-ratchet.mjs +63 -13
  567. package/typescript/copy-overwrite/scripts/threshold-ratchet-compare.mjs +102 -21
  568. package/typescript/copy-overwrite/scripts/threshold-ratchet-families.mjs +130 -2
  569. package/typescript/create-only/.github/workflows/ci.yml +7 -0
  570. /package/plugins/lisa-harper-fabric/rules/{harper-fabric.md → reference/harper-fabric.md} +0 -0
  571. /package/plugins/lisa-harper-fabric-copilot/rules/{harper-fabric.md → reference/harper-fabric.md} +0 -0
  572. /package/plugins/lisa-phaser/rules/{phaser.md → reference/phaser.md} +0 -0
  573. /package/plugins/lisa-phaser-copilot/rules/{phaser.md → reference/phaser.md} +0 -0
  574. /package/plugins/lisa-rails/rules/{rails-conventions.md → reference/rails-conventions.md} +0 -0
  575. /package/plugins/lisa-rails-copilot/rules/{rails-conventions.md → reference/rails-conventions.md} +0 -0
  576. /package/plugins/src/harper-fabric/rules/{harper-fabric.md → reference/harper-fabric.md} +0 -0
  577. /package/plugins/src/phaser/rules/{phaser.md → reference/phaser.md} +0 -0
  578. /package/plugins/src/rails/rules/{rails-conventions.md → reference/rails-conventions.md} +0 -0
@@ -43,4 +43,45 @@ export function getDirname(filePath) {
43
43
  export function getBasename(filePath) {
44
44
  return path.basename(filePath);
45
45
  }
46
+ /**
47
+ * Whether one path is a root itself or lies beneath it, judged on a path
48
+ * boundary rather than a string prefix.
49
+ *
50
+ * ## The defect this exists against
51
+ *
52
+ * `"/a/land3716-tmp/f".startsWith("/a/land3716")` is true, so a bare prefix
53
+ * comparison reports a SIBLING as being inside the root (CodySwannGT/lisa#3808).
54
+ * The convention agents follow makes that the common shape, not the exotic one:
55
+ * a scratch worktree at `<TMPDIR>/<name>` and its scratch directory at
56
+ * `<TMPDIR>/<name>-tmp` are siblings, and the second string-prefixes the first.
57
+ *
58
+ * ## What it decides, and what it does not
59
+ *
60
+ * It is **lexical**. Both arguments are resolved to absolute paths and `..`
61
+ * segments are collapsed, so traversal and relative inputs are handled, and a
62
+ * trailing separator is irrelevant. It does NOT follow symlinks: a link inside
63
+ * the root whose target is outside it still reports as inside, because the path
64
+ * as written is inside. A caller that must refuse such an escape has to resolve
65
+ * the real paths itself and ask this question about those instead.
66
+ *
67
+ * It fails closed. An argument that cannot name a path — the empty string,
68
+ * which `path.resolve` would silently turn into the working directory — reads
69
+ * as NOT contained, because "inside" is the answer that grants access.
70
+ * @param root Directory the candidate is tested against
71
+ * @param candidate Path being tested
72
+ * @returns True when `candidate` is `root` or lives beneath it
73
+ */
74
+ export function isPathInside(root, candidate) {
75
+ if (root === "" || candidate === "") {
76
+ return false;
77
+ }
78
+ const relative = path.relative(path.resolve(root), path.resolve(candidate));
79
+ if (relative === "") {
80
+ return true;
81
+ }
82
+ if (path.isAbsolute(relative)) {
83
+ return false;
84
+ }
85
+ return relative !== ".." && !relative.startsWith(`..${path.sep}`);
86
+ }
46
87
  //# sourceMappingURL=path-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/utils/path-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,UAAkB;IAClE,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAG,QAAkB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/utils/path-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,UAAkB;IAClE,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAG,QAAkB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,SAAiB;IAC1D,IAAI,IAAI,KAAK,EAAE,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5E,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACpE,CAAC"}
@@ -40,6 +40,13 @@ jobs:
40
40
  pull-requests: read
41
41
  uses: CodySwannGT/lisa/.github/workflows/quality.yml@main
42
42
  with:
43
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
44
+ # reusable workflows are tracked at `@main`, so that file changes under
45
+ # this repository with no pull request here. This is the contract major it
46
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
47
+ # declared a break, and says NOT DETERMINED if this line goes missing
48
+ # (CodySwannGT/lisa#3698).
49
+ expected_workflow_contract_major: '1'
43
50
  node_version: '22.21.1'
44
51
  package_manager: 'bun'
45
52
  skip_jobs: 'test:e2e,playwright_e2e'
@@ -66,6 +73,13 @@ jobs:
66
73
  needs: [quality]
67
74
  uses: CodySwannGT/lisa/.github/workflows/lighthouse.yml@main
68
75
  with:
76
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
77
+ # reusable workflows are tracked at `@main`, so that file changes under
78
+ # this repository with no pull request here. This is the contract major it
79
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
80
+ # declared a break, and says NOT DETERMINED if this line goes missing
81
+ # (CodySwannGT/lisa#3698).
82
+ expected_workflow_contract_major: '1'
69
83
  node_version: '22.21.1'
70
84
  package_manager: 'bun'
71
85
 
@@ -74,5 +88,12 @@ jobs:
74
88
  needs: [quality]
75
89
  uses: CodySwannGT/lisa/.github/workflows/zap-baseline-expo.yml@main
76
90
  with:
91
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
92
+ # reusable workflows are tracked at `@main`, so that file changes under
93
+ # this repository with no pull request here. This is the contract major it
94
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
95
+ # declared a break, and says NOT DETERMINED if this line goes missing
96
+ # (CodySwannGT/lisa#3698).
97
+ expected_workflow_contract_major: '1'
77
98
  node_version: '22.21.1'
78
99
  package_manager: 'bun'
@@ -106,6 +106,13 @@ jobs:
106
106
  uses: CodySwannGT/lisa/.github/workflows/gates.yml@main
107
107
  needs: [determine_environment]
108
108
  with:
109
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
110
+ # reusable workflows are tracked at `@main`, so that file changes under
111
+ # this repository with no pull request here. This is the contract major it
112
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
113
+ # declared a break, and says NOT DETERMINED if this line goes missing
114
+ # (CodySwannGT/lisa#3698).
115
+ expected_workflow_contract_major: '1'
109
116
  moment: pre-deploy:${{ needs.determine_environment.outputs.environment }}
110
117
  node_version: '22.21.1'
111
118
  package_manager: 'bun'
@@ -121,6 +128,13 @@ jobs:
121
128
  contents: write
122
129
  pull-requests: read
123
130
  with:
131
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
132
+ # reusable workflows are tracked at `@main`, so that file changes under
133
+ # this repository with no pull request here. This is the contract major it
134
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
135
+ # declared a break, and says NOT DETERMINED if this line goes missing
136
+ # (CodySwannGT/lisa#3698).
137
+ expected_workflow_contract_major: '1'
124
138
  environment: ${{ needs.determine_environment.outputs.environment }}
125
139
  release_strategy: 'standard-version'
126
140
  skip_jobs: 'test:e2e,test:unit,test:integration'
@@ -196,6 +210,13 @@ jobs:
196
210
  permissions:
197
211
  contents: read
198
212
  with:
213
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
214
+ # reusable workflows are tracked at `@main`, so that file changes under
215
+ # this repository with no pull request here. This is the contract major it
216
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
217
+ # declared a break, and says NOT DETERMINED if this line goes missing
218
+ # (CodySwannGT/lisa#3698).
219
+ expected_workflow_contract_major: '1'
199
220
  environment: ${{ needs.determine_environment.outputs.environment }}
200
221
  secrets:
201
222
  EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
@@ -347,6 +368,13 @@ jobs:
347
368
  needs: [determine_environment, deploy]
348
369
  if: ${{ always() && !cancelled() && needs.deploy.result == 'success' }}
349
370
  with:
371
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
372
+ # reusable workflows are tracked at `@main`, so that file changes under
373
+ # this repository with no pull request here. This is the contract major it
374
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
375
+ # declared a break, and says NOT DETERMINED if this line goes missing
376
+ # (CodySwannGT/lisa#3698).
377
+ expected_workflow_contract_major: '1'
350
378
  moment: post-deploy:${{ needs.determine_environment.outputs.environment }}
351
379
  node_version: '22.21.1'
352
380
  package_manager: 'bun'
@@ -96,6 +96,13 @@ jobs:
96
96
  name: 📱 Maestro Native E2E
97
97
  uses: CodySwannGT/lisa/.github/workflows/maestro-native-e2e.yml@main
98
98
  with:
99
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
100
+ # reusable workflows are tracked at `@main`, so that file changes under
101
+ # this repository with no pull request here. This is the contract major it
102
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
103
+ # declared a break, and says NOT DETERMINED if this line goes missing
104
+ # (CodySwannGT/lisa#3698).
105
+ expected_workflow_contract_major: '1'
99
106
  platform: ${{ inputs.platform || 'all' }}
100
107
  # Return the shared environment to a known state before either platform
101
108
  # starts. Both lifecycle commands are mandatory. If this project needs no
@@ -3,7 +3,8 @@
3
3
 
4
4
  name: 🧹 Nightly E2E Bypass Reaper
5
5
 
6
- # Removes a used `nightly-e2e-bypass` label when its pull request closes.
6
+ # Writes the durable waiver record, then removes a used `nightly-e2e-bypass`
7
+ # label, when its pull request closes.
7
8
  #
8
9
  # ## Why removal happens on CLOSE and not on USE
9
10
  #
@@ -20,12 +21,36 @@ name: 🧹 Nightly E2E Bypass Reaper
20
21
  # applied (default 24, hard ceiling 72). The reaper keeps the label list honest;
21
22
  # it is not what bounds the waiver's lifetime.
22
23
  #
23
- # ## Why the audit survives removal
24
+ # ## Why the RECORD is written before the label is stripped
24
25
  #
25
- # The audit record lives in the gate's job summary, its `::notice::` annotation
26
- # and its `audit_json` output on the run that honoured the bypass — none of which
27
- # this workflow touches. Removing the label removes the REQUEST, never the
28
- # RECORD.
26
+ # The audit lives on the gate run that honoured the bypass — its job summary,
27
+ # its `::notice::` annotation, its `audit_json` output and none of that is
28
+ # reachable from the pull request a reviewer is looking at, nor from any
29
+ # repository-wide question. Measured on a consumer: the LABEL was the only
30
+ # index of "which merges went past this gate on a waiver", and stripping it
31
+ # withdrew the REQUEST and erased the INDEX in the same call. After a waived
32
+ # merge closed, the repository could no longer answer "what shipped on a
33
+ # waiver, and why" — a compliance question as much as an engineering one.
34
+ #
35
+ # So this workflow re-derives the waiver from the live pull request FIRST and
36
+ # posts a marker-delimited record comment, and only then strips the label. The
37
+ # ordering is the whole point, and it is enforced by the step order plus the
38
+ # refusal below: if the record could not be established, the label is LEFT ON.
39
+ # A label nobody removed is untidy; an unrecorded waived merge is unauditable,
40
+ # and untidy is the cheaper of the two.
41
+ #
42
+ # ## Why an EXPIRED waiver is still recorded
43
+ #
44
+ # By the time a pull request closes the waiver has often lapsed, and the
45
+ # re-derivation says `refused`. That is not a reason to write nothing — an
46
+ # expired waiver still shipped something, and those are exactly the merges most
47
+ # worth being able to find later. The record carries the state it was recorded
48
+ # in rather than pretending the waiver was fine.
49
+ #
50
+ # The one state that is NOT recorded is `not_determined`: the live pull request
51
+ # could not be read, so nothing was established. Writing a confident-looking
52
+ # record there would be worse than writing none, so the workflow fails and
53
+ # leaves the label in place for a re-run to catch.
29
54
 
30
55
  on:
31
56
  pull_request_target:
@@ -33,8 +58,8 @@ on:
33
58
 
34
59
  permissions:
35
60
  contents: read
36
- # The one write in the whole nightly-gate standard, scoped to removing one
37
- # label from an already-closed PR.
61
+ # The one write in the whole nightly-gate standard: posting the waiver record
62
+ # and removing one label from an already-closed PR.
38
63
  pull-requests: write
39
64
 
40
65
  concurrency:
@@ -43,23 +68,109 @@ concurrency:
43
68
 
44
69
  jobs:
45
70
  reap:
46
- name: 🧹 Remove used bypass label
71
+ name: 🧹 Record the waiver, then remove its label
47
72
  # `pull_request_target` runs with a writable token against the BASE repo, so
48
73
  # this job must never check out or execute pull-request code. It does not:
49
- # there is no checkout step and the only command is a `gh` API call.
74
+ # the checkout below pins the BASE ref explicitly and nothing in this file
75
+ # names the pull request's head commit, so the only code that runs here is
76
+ # code already merged into the base branch and reviewed on its own terms.
77
+ #
78
+ # The reaper checks out at all because it re-derives the waiver through the
79
+ # SAME guard the gate uses. The alternative — restating that derivation in
80
+ # shell here — is a second implementation of "is this waiver good?", and two
81
+ # of those drift.
50
82
  if: contains(github.event.pull_request.labels.*.name, 'nightly-e2e-bypass')
51
83
  runs-on: ubuntu-latest
52
- timeout-minutes: 5
84
+ timeout-minutes: 10
53
85
  steps:
86
+ - name: 📥 Checkout the BASE branch (never the pull request's head)
87
+ uses: actions/checkout@v6
88
+ with:
89
+ ref: ${{ github.event.pull_request.base.ref }}
90
+ persist-credentials: false
91
+
92
+ - name: 🔧 Setup Node.js
93
+ uses: actions/setup-node@v6
94
+ with:
95
+ package-manager-cache: false
96
+ node-version: '22'
97
+
98
+ - name: 🔎 Locate the guard
99
+ id: guard
100
+ env:
101
+ # Two addresses for the SAME file, not a fallback to a different
102
+ # implementation: `lisa apply` installs the guard into `scripts/`, and
103
+ # a repository that has not run it yet still carries the template.
104
+ INSTALLED: scripts/check-nightly-e2e-health.mjs
105
+ TEMPLATE: typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs
106
+ run: |
107
+ set -euo pipefail
108
+ if [[ -f "$INSTALLED" ]]; then
109
+ echo "path=$INSTALLED" >> "$GITHUB_OUTPUT"
110
+ elif [[ -f "$TEMPLATE" ]]; then
111
+ echo "path=$TEMPLATE" >> "$GITHUB_OUTPUT"
112
+ else
113
+ echo "::error title=Nightly E2E guard is not installed::Neither '$INSTALLED' nor '$TEMPLATE' exists on this branch, so the waiver cannot be re-derived. Refusing to strip the bypass label: that would erase the only index of this waived merge. Run \`lisa apply\`."
114
+ exit 1
115
+ fi
116
+
117
+ - name: 🧾 Re-derive the waiver from the live pull request
118
+ id: waiver
119
+ # A refused waiver exits 1 by design — that exit code is the merge-time
120
+ # contract — and on THIS path a refusal is an ordinary outcome to be
121
+ # recorded, not a failure. The state is read from the output instead,
122
+ # and the step below decides what each state means here.
123
+ continue-on-error: true
124
+ env:
125
+ GITHUB_TOKEN: ${{ github.token }}
126
+ GITHUB_REPOSITORY: ${{ github.repository }}
127
+ NIGHTLY_PR_NUMBER: ${{ github.event.pull_request.number }}
128
+ NIGHTLY_BYPASS_LABEL: nightly-e2e-bypass
129
+ GUARD: ${{ steps.guard.outputs.path }}
130
+ run: node "$GUARD" --waiver-verdict
131
+
132
+ - name: 🗒️ Post the durable waiver record
133
+ env:
134
+ GH_TOKEN: ${{ github.token }}
135
+ REPO: ${{ github.repository }}
136
+ PR: ${{ github.event.pull_request.number }}
137
+ STATE: ${{ steps.waiver.outputs.waiver_state }}
138
+ RECORD: ${{ steps.waiver.outputs.waiver_record }}
139
+ MARKER: NIGHTLY-E2E-BYPASS-RECORD
140
+ run: |
141
+ set -euo pipefail
142
+ if [[ "$STATE" == "none" ]]; then
143
+ echo "::notice title=No waiver to record::The live pull request carries no bypass label, so somebody removed it between the close event and this run. There is nothing to record and nothing to strip."
144
+ exit 0
145
+ fi
146
+ if [[ "$STATE" != "waived" && "$STATE" != "refused" ]]; then
147
+ echo "::error title=Waiver NOT recorded::The waiver could not be re-derived (state: '${STATE:-unreadable}'), so nothing was established about it. Refusing to write a record that would look authoritative and refusing to strip the label, which is currently the only index of this waived merge. Re-run this workflow once the API is readable."
148
+ exit 1
149
+ fi
150
+ # Idempotent. `pull_request_target` can fire more than once for a
151
+ # close, and two identical records read as two waived merges.
152
+ if gh api --paginate "repos/$REPO/issues/$PR/comments" \
153
+ --jq '.[].body' 2>/dev/null | grep -qF "$MARKER"; then
154
+ echo "::notice title=Waiver already recorded::#$PR already carries a $MARKER comment. Not posting a second one."
155
+ exit 0
156
+ fi
157
+ printf '%s\n' \
158
+ "Recorded by the nightly-E2E bypass reaper when this pull request closed, BEFORE its \`nightly-e2e-bypass\` label was stripped." \
159
+ "" \
160
+ "$RECORD" > "$RUNNER_TEMP/waiver-record.md"
161
+ gh pr comment "$PR" --repo "$REPO" --body-file "$RUNNER_TEMP/waiver-record.md"
162
+ echo "::notice title=Waiver recorded::The waiver on #$PR is now durable: it survives the label removal below."
163
+
54
164
  - name: 🧹 Strip the bypass label
55
165
  env:
56
166
  GH_TOKEN: ${{ github.token }}
57
167
  REPO: ${{ github.repository }}
58
168
  PR: ${{ github.event.pull_request.number }}
59
169
  LABEL: nightly-e2e-bypass
170
+ MERGED: ${{ github.event.pull_request.merged && 'merged' || 'closed' }}
60
171
  run: |
61
172
  set -euo pipefail
62
- echo "Removing '$LABEL' from $REPO#$PR (state: ${{ github.event.pull_request.merged && 'merged' || 'closed' }})."
173
+ echo "Removing '$LABEL' from $REPO#$PR (state: $MERGED)."
63
174
  # ONE delete. Someone removing the label between the event and this
64
175
  # run is the desired end state, not a failure — but a permission or
65
176
  # API problem must NEVER look like a successful reap, or the label
@@ -75,7 +186,7 @@ jobs:
75
186
  deleted=$?
76
187
  set -e
77
188
  if [[ $deleted -eq 0 ]]; then
78
- echo "::notice title=Nightly E2E bypass label removed::'$LABEL' cleared from #$PR after close. The audit record on the gate run that honoured it is unaffected."
189
+ echo "::notice title=Nightly E2E bypass label removed::'$LABEL' cleared from #$PR after close. The waiver record posted above outlives it, and the audit on the gate run that honoured it is unaffected."
79
190
  exit 0
80
191
  fi
81
192
  if gh api "repos/$REPO/issues/$PR/labels" --jq '.[].name' 2>/dev/null \
@@ -166,6 +166,13 @@ jobs:
166
166
  # `scripts/check-template-workflow-refs.mjs`.
167
167
  uses: CodySwannGT/lisa/.github/workflows/nightly-e2e-health.yml@main
168
168
  with:
169
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
170
+ # reusable workflows are tracked at `@main`, so that file changes under
171
+ # this repository with no pull request here. This is the contract major it
172
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
173
+ # declared a break, and says NOT DETERMINED if this line goes missing
174
+ # (CodySwannGT/lisa#3698).
175
+ expected_workflow_contract_major: '1'
169
176
  branch: dev
170
177
  # Structured JSON, schema-validated before any API call. Duplicated
171
178
  # labels, unanchored regexes, unknown keys and zero-match patterns are all
@@ -96,6 +96,13 @@ jobs:
96
96
  # detects a mismatch. Enforced by `scripts/check-template-workflow-refs.mjs`.
97
97
  uses: CodySwannGT/lisa/.github/workflows/nightly-e2e-report.yml@main
98
98
  with:
99
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
100
+ # reusable workflows are tracked at `@main`, so that file changes under
101
+ # this repository with no pull request here. This is the contract major it
102
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
103
+ # declared a break, and says NOT DETERMINED if this line goes missing
104
+ # (CodySwannGT/lisa#3698).
105
+ expected_workflow_contract_major: '1'
99
106
  branch: dev
100
107
  # The status-check context the GATE publishes, used to MEASURE whether it
101
108
  # is actually required on `branch`. This default is the composite GitHub
@@ -35,4 +35,12 @@ jobs:
35
35
  # including the gate whose job is checking these refs — it reported this
36
36
  # file as having none at all.
37
37
  uses: CodySwannGT/lisa/.github/workflows/nightly-e2e-tracking.yml@main
38
+ with:
39
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
40
+ # reusable workflows are tracked at `@main`, so that file changes under
41
+ # this repository with no pull request here. This is the contract major it
42
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
43
+ # declared a break, and says NOT DETERMINED if this line goes missing
44
+ # (CodySwannGT/lisa#3698).
45
+ expected_workflow_contract_major: '1'
38
46
  secrets: inherit
@@ -130,6 +130,13 @@ jobs:
130
130
  name: 🎭 Playwright Web E2E
131
131
  uses: CodySwannGT/lisa/.github/workflows/playwright-e2e.yml@main
132
132
  with:
133
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
134
+ # reusable workflows are tracked at `@main`, so that file changes under
135
+ # this repository with no pull request here. This is the contract major it
136
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
137
+ # declared a break, and says NOT DETERMINED if this line goes missing
138
+ # (CodySwannGT/lisa#3698).
139
+ expected_workflow_contract_major: '1'
133
140
  node_version: '22.21.1'
134
141
  package_manager: 'bun'
135
142
  # The moment this workflow's cadence corresponds to. It is what makes the
@@ -19,6 +19,13 @@ jobs:
19
19
  pull-requests: read
20
20
  uses: CodySwannGT/lisa/.github/workflows/quality.yml@main
21
21
  with:
22
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
23
+ # reusable workflows are tracked at `@main`, so that file changes under
24
+ # this repository with no pull request here. This is the contract major it
25
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
26
+ # declared a break, and says NOT DETERMINED if this line goes missing
27
+ # (CodySwannGT/lisa#3698).
28
+ expected_workflow_contract_major: '1'
22
29
  node_version: '22.21.1'
23
30
  package_manager: 'bun'
24
31
  skip_jobs: ''
@@ -33,6 +33,13 @@ jobs:
33
33
  name: 🚦 Pre-Deploy Gates
34
34
  uses: CodySwannGT/lisa/.github/workflows/gates.yml@main
35
35
  with:
36
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
37
+ # reusable workflows are tracked at `@main`, so that file changes under
38
+ # this repository with no pull request here. This is the contract major it
39
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
40
+ # declared a break, and says NOT DETERMINED if this line goes missing
41
+ # (CodySwannGT/lisa#3698).
42
+ expected_workflow_contract_major: '1'
36
43
  moment: pre-deploy:${{ github.ref_name }}
37
44
  node_version: '22.21.1'
38
45
  package_manager: 'bun'
@@ -117,6 +124,13 @@ jobs:
117
124
  needs: [deploy]
118
125
  if: ${{ always() && !cancelled() && needs.deploy.result == 'success' }}
119
126
  with:
127
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
128
+ # reusable workflows are tracked at `@main`, so that file changes under
129
+ # this repository with no pull request here. This is the contract major it
130
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
131
+ # declared a break, and says NOT DETERMINED if this line goes missing
132
+ # (CodySwannGT/lisa#3698).
133
+ expected_workflow_contract_major: '1'
120
134
  moment: post-deploy:${{ github.ref_name }}
121
135
  node_version: '22.21.1'
122
136
  package_manager: 'bun'
@@ -21,6 +21,13 @@ jobs:
21
21
  pull-requests: read
22
22
  uses: CodySwannGT/lisa/.github/workflows/quality.yml@main
23
23
  with:
24
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
25
+ # reusable workflows are tracked at `@main`, so that file changes under
26
+ # this repository with no pull request here. This is the contract major it
27
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
28
+ # declared a break, and says NOT DETERMINED if this line goes missing
29
+ # (CodySwannGT/lisa#3698).
30
+ expected_workflow_contract_major: '1'
24
31
  node_version: '22.21.1'
25
32
  package_manager: 'bun'
26
33
  skip_jobs: 'test:e2e,playwright_e2e'
@@ -42,5 +49,12 @@ jobs:
42
49
  needs: [quality]
43
50
  uses: CodySwannGT/lisa/.github/workflows/zap-baseline-nestjs.yml@main
44
51
  with:
52
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
53
+ # reusable workflows are tracked at `@main`, so that file changes under
54
+ # this repository with no pull request here. This is the contract major it
55
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
56
+ # declared a break, and says NOT DETERMINED if this line goes missing
57
+ # (CodySwannGT/lisa#3698).
58
+ expected_workflow_contract_major: '1'
45
59
  node_version: '22.21.1'
46
60
  package_manager: 'bun'
@@ -102,6 +102,13 @@ jobs:
102
102
  uses: CodySwannGT/lisa/.github/workflows/gates.yml@main
103
103
  needs: [determine_environment]
104
104
  with:
105
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
106
+ # reusable workflows are tracked at `@main`, so that file changes under
107
+ # this repository with no pull request here. This is the contract major it
108
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
109
+ # declared a break, and says NOT DETERMINED if this line goes missing
110
+ # (CodySwannGT/lisa#3698).
111
+ expected_workflow_contract_major: '1'
105
112
  moment: pre-deploy:${{ needs.determine_environment.outputs.environment }}
106
113
  node_version: '22.21.1'
107
114
  package_manager: 'bun'
@@ -117,6 +124,13 @@ jobs:
117
124
  contents: write
118
125
  pull-requests: read
119
126
  with:
127
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
128
+ # reusable workflows are tracked at `@main`, so that file changes under
129
+ # this repository with no pull request here. This is the contract major it
130
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
131
+ # declared a break, and says NOT DETERMINED if this line goes missing
132
+ # (CodySwannGT/lisa#3698).
133
+ expected_workflow_contract_major: '1'
120
134
  environment: ${{ needs.determine_environment.outputs.environment }}
121
135
  release_strategy: 'standard-version'
122
136
  skip_jobs: 'test:e2e,test:unit,test:integration,test'
@@ -430,6 +444,13 @@ jobs:
430
444
  needs: [determine_environment, deploy]
431
445
  if: ${{ always() && !cancelled() && needs.deploy.result == 'success' }}
432
446
  with:
447
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
448
+ # reusable workflows are tracked at `@main`, so that file changes under
449
+ # this repository with no pull request here. This is the contract major it
450
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
451
+ # declared a break, and says NOT DETERMINED if this line goes missing
452
+ # (CodySwannGT/lisa#3698).
453
+ expected_workflow_contract_major: '1'
433
454
  moment: post-deploy:${{ needs.determine_environment.outputs.environment }}
434
455
  node_version: '22.21.1'
435
456
  package_manager: 'bun'
@@ -447,6 +468,13 @@ jobs:
447
468
  (needs.determine_environment.outputs.environment == 'staging' || needs.determine_environment.outputs.environment == 'stage')
448
469
  uses: CodySwannGT/lisa/.github/workflows/load-test.yml@main
449
470
  with:
471
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
472
+ # reusable workflows are tracked at `@main`, so that file changes under
473
+ # this repository with no pull request here. This is the contract major it
474
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
475
+ # declared a break, and says NOT DETERMINED if this line goes missing
476
+ # (CodySwannGT/lisa#3698).
477
+ expected_workflow_contract_major: '1'
450
478
  environment: ${{ needs.determine_environment.outputs.environment }}
451
479
  test_scenario: 'smoke' # Start with smoke test after deployment
452
480
  base_url: ${{ needs.deploy.outputs.environment_url }}
package/package.json CHANGED
@@ -19,8 +19,10 @@
19
19
  "lint": "oxlint --disable-nested-config && eslint . --quiet",
20
20
  "lint:fix": "oxlint --fix --disable-nested-config && eslint . --fix",
21
21
  "lint:slow": "eslint . --config eslint.slow.config.ts --quiet",
22
- "typecheck": "tsc --noEmit && bun run typecheck:tests",
22
+ "typecheck": "tsc --noEmit && bun run typecheck:tests && bun run typecheck:engine-floor",
23
23
  "typecheck:tests": "node scripts/check-typecheck-tests.mjs",
24
+ "typecheck:engine-floor": "node scripts/check-engine-floor.mjs",
25
+ "measure:scripts-profile-gap": "bun scripts/measure-scripts-profile-gap.mts",
24
26
  "format:check": "prettier --check .",
25
27
  "format": "prettier --check . --write",
26
28
  "knip:check": "knip",
@@ -68,6 +70,7 @@
68
70
  "check:empty-subject-guards": "node scripts/check-empty-subject-guards.mjs",
69
71
  "check:cwd-resolution-corpus": "node scripts/check-cwd-resolution-corpus.mjs",
70
72
  "check:probe-absence-direction": "node scripts/check-probe-absence-direction.mjs",
73
+ "check:guard-parity-notes": "node scripts/check-guard-parity-notes.mjs",
71
74
  "check:shell-guard-refusals": "bun run build && $npm_execpath run lisa-test-run -- --adapter direct -- node scripts/check-shell-guard-refusal-coverage.mjs --trace-out .lisa/shell-guard-trace.jsonl",
72
75
  "check:workflow-inputs": "node scripts/detect-stale-workflow-inputs.mjs --project . --project typescript/create-only --project rails/create-only --json",
73
76
  "check:conflict-markers": "node all/copy-overwrite/scripts/check-conflict-markers.mjs",
@@ -76,7 +79,9 @@
76
79
  "check:merge-drivers": "node scripts/check-merge-driver-registration.mjs",
77
80
  "check:failure-signatures": "node plugins/src/base/hooks/failure-signature-index.mjs --check",
78
81
  "check:withdrawn-rulings": "node plugins/src/base/hooks/withdrawn-rulings.mjs --check",
82
+ "check:operational-hazards": "node plugins/src/base/hooks/operational-hazards.mjs --check",
79
83
  "check:template-workflow-refs": "node scripts/check-template-workflow-refs.mjs",
84
+ "check:workflow-contract-assertions": "node scripts/check-workflow-contract-assertions.mjs",
80
85
  "check:third-party-action-pins": "node scripts/check-third-party-action-pins.mjs",
81
86
  "check:workflow-package-paths": "node scripts/check-workflow-package-paths.mjs",
82
87
  "check:delivery-deletion-conflicts": "node scripts/check-delivery-deletion-conflicts.mjs",
@@ -181,7 +186,7 @@
181
186
  "zod-validation-error": "^4.0.0"
182
187
  },
183
188
  "name": "@codyswann/lisa",
184
- "version": "4.54.13",
189
+ "version": "4.55.0",
185
190
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
186
191
  "main": "dist/index.js",
187
192
  "exports": {
@@ -329,7 +334,7 @@
329
334
  "test": "tests"
330
335
  },
331
336
  "types": "./dist/index.d.ts",
332
- "lisaReleaseCommit": "01138bafd69dc080f1cbf16b725477234cbde58a",
333
- "gitHead": "01138bafd69dc080f1cbf16b725477234cbde58a",
334
- "lisaReleaseTag": "v4.54.13"
337
+ "lisaReleaseCommit": "e01ec6ad7d10e2f097c3cb8034b7903fbf66534d",
338
+ "gitHead": "e01ec6ad7d10e2f097c3cb8034b7903fbf66534d",
339
+ "lisaReleaseTag": "v4.55.0"
335
340
  }
@@ -22,6 +22,13 @@ jobs:
22
22
  pull-requests: read
23
23
  uses: CodySwannGT/lisa/.github/workflows/quality.yml@main
24
24
  with:
25
+ # Travels with the `uses:` line above — the two are one unit. Lisa's
26
+ # reusable workflows are tracked at `@main`, so that file changes under
27
+ # this repository with no pull request here. This is the contract major it
28
+ # spoke when Lisa seeded this file; the run fails loudly if it has since
29
+ # declared a break, and says NOT DETERMINED if this line goes missing
30
+ # (CodySwannGT/lisa#3698).
31
+ expected_workflow_contract_major: '1'
25
32
  node_version: '22.21.1'
26
33
  package_manager: 'bun'
27
34
  skip_jobs: ''