@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
@@ -1,3 +1,72 @@
1
+ /**
2
+ * Read the fast channel: which caller-tree paths a `@main` reusable workflow
3
+ * names, and whether anything on a faster channel already covers them.
4
+ *
5
+ * Split from `core/two-channel-delivery` on the seam the signatures already
6
+ * drew: that module knows verdicts and remedies and nothing about YAML; this
7
+ * one knows how a workflow spells a path and nothing about what the answer
8
+ * means. Both are pure — reaching the filesystem belongs to the caller, so the
9
+ * same functions serve Lisa's own CI gate and `lisa doctor` on a consumer.
10
+ *
11
+ * ## What counts as a caller-tree read
12
+ *
13
+ * A path under `scripts/`, `bin/`, or `tools/` carrying a file extension, not
14
+ * preceded by another path segment. The negative lookbehind is what keeps
15
+ * `node_modules/@codyswann/lisa/all/copy-overwrite/scripts/lisa-gates.mjs`
16
+ * from being read as a caller-tree path — it is a PACKAGE path, and whether it
17
+ * survives a release is a different question with its own gate (#2960).
18
+ *
19
+ * ## Why full-line comments are stripped and inline prose is not
20
+ *
21
+ * These workflows are heavily commented, and a comment naming a script is
22
+ * prose rather than a claim. Full-line comments are dropped. Prose INSIDE a
23
+ * `run:` block — an `echo "::error …"` naming the very script the step failed
24
+ * to find — is not, because there is no reliable way to tell it from a command
25
+ * without parsing shell. It costs nothing: such a mention is always in a step
26
+ * that already reads the path, and couplings are deduplicated per workflow and
27
+ * path, so the pair collapses to the one entry it should have been.
28
+ *
29
+ * ## Why deduplication resolves conservatively
30
+ *
31
+ * When one workflow reads the same path from several steps, `packageBacked` is
32
+ * true only if EVERY occurrence names a package candidate — one host-only step
33
+ * is enough to make the coupling host-only, because that step is the one that
34
+ * will fail. `guarded` runs the other way and is true if ANY occurrence is
35
+ * guarded, because one silent-skip path is enough to make the absence silent.
36
+ * Both directions point at reporting more rather than less.
37
+ *
38
+ * ## Why the handling signals are literal, and stay literal
39
+ *
40
+ * `guarded` says the step can TELL the path is missing. It has never said what
41
+ * the step then does, and a narrative that inferred the consequence from it
42
+ * asserted control flow nothing had read (CodySwannGT/lisa#3860). Deciding what
43
+ * an absent branch does needs a shell parser, and the answer would still be a
44
+ * guess. So this module reports the other checkable thing: which literal
45
+ * absence-handling tokens the step's own text contains. `else-branch` does not
46
+ * mean the else covers this read — it means the characters are there, so a
47
+ * reader who was about to conclude "this skips silently" is told, in the same
48
+ * sentence, that the step has a branch they have not read.
49
+ *
50
+ * ## Why the staleness probe is reported at two scopes
51
+ *
52
+ * The second dimension — can this coupling tell an OLD artifact from a current
53
+ * one — needs the same treatment, with one wrinkle the handling signals do not
54
+ * have. A read can reach the step it is used in through a `workflow_call`
55
+ * input default: `nightly-e2e-health.yml` defaults `guard_script` to
56
+ * `scripts/check-nightly-e2e-health.mjs`, and the step that compares contract
57
+ * versions names `$GUARD` and never the path. A step-scoped signal would
58
+ * therefore MISS a handshake that exists — a false negative on the one arm
59
+ * where a false negative reads as "this cannot detect staleness".
60
+ *
61
+ * So both scopes are reported, under names that say which is which:
62
+ * `step-requests-version` is exact for the step that reads the path, and
63
+ * `workflow-requests-version` says only that some step of this workflow asks.
64
+ * Neither is allowed to conclude anything alone — the artifact half, which the
65
+ * caller supplies and which IS exact for the path, is what bounds them.
66
+ * @module core/two-channel-delivery-scan
67
+ */
68
+ import { HANDLING_SIGNALS, } from "./two-channel-delivery.js";
69
+ import { requestsVersion, STALENESS_SIGNALS, } from "./two-channel-staleness.js";
1
70
  /** How a workflow spells a path inside the installed Lisa package. */
2
71
  const PACKAGE_PREFIX = "node_modules/@codyswann/lisa/";
3
72
  /** Directories a consumer keeps its own executable artifacts in. */
@@ -125,6 +194,30 @@ function isGuarded(body, callerPath) {
125
194
  before.includes(HASH_FILES));
126
195
  });
127
196
  }
197
+ /**
198
+ * Literal tokens in a step's text that bear on what an absent path does.
199
+ *
200
+ * Deliberately shallow. Each entry asks only "do these characters appear in
201
+ * this step", which is checkable by reading the step; none of them claims the
202
+ * token governs the read. The set is closed and small: an unnamed signal is
203
+ * reported as no signal, which is why the detail says which names exist.
204
+ */
205
+ const SIGNAL_PATTERNS = {
206
+ "else-branch": /(?:^|[\s;])(?:else|elif)(?:[\s;]|$)/,
207
+ "exit-zero": /(?:^|[\s;])exit\s+0(?!\d)/,
208
+ "exit-nonzero": /(?:^|[\s;])exit\s+[1-9]\d*/,
209
+ "error-annotation": /::error/,
210
+ "notice-annotation": /::(?:notice|warning)/,
211
+ "failure-suppression": /\|\|\s*true|continue-on-error:|set\s+\+e/,
212
+ };
213
+ /**
214
+ * Which absence-handling tokens one step's text contains.
215
+ * @param body - The step's text
216
+ * @returns Signal names, in the vocabulary's declared order
217
+ */
218
+ function handlingSignalsIn(body) {
219
+ return HANDLING_SIGNALS.filter(name => SIGNAL_PATTERNS[name].test(body));
220
+ }
128
221
  /**
129
222
  * Every caller-tree read in one step.
130
223
  * @param step - The step
@@ -132,32 +225,60 @@ function isGuarded(body, callerPath) {
132
225
  */
133
226
  function occurrencesIn(step) {
134
227
  const packagePaths = matchesIn(PACKAGE_PATH, step.body);
228
+ const handling = handlingSignalsIn(step.body);
229
+ const stepRequestsVersion = requestsVersion(step.body);
135
230
  return matchesIn(CALLER_PATH, step.body).map(callerPath => ({
136
231
  step: step.name,
137
232
  path: callerPath,
138
233
  packageBacked: isPackageBacked(packagePaths, callerPath),
139
234
  guarded: isGuarded(step.body, callerPath),
235
+ handling,
236
+ stepRequestsVersion,
140
237
  }));
141
238
  }
239
+ /**
240
+ * The staleness tokens one coupling carries, across both scopes.
241
+ *
242
+ * Deduplicated through `STALENESS_SIGNALS` so the order is the vocabulary's
243
+ * and two runs over the same tree emit the same bytes.
244
+ * @param context - The workflow-level inputs
245
+ * @param callerPath - The caller-tree path
246
+ * @param found - Every occurrence of that path in this workflow
247
+ * @returns Signal names in the vocabulary's declared order
248
+ */
249
+ function stalenessSignalsFor(context, callerPath, found) {
250
+ const present = [
251
+ ...(context.artifactSignalsFor(callerPath) ?? []),
252
+ ...(found.some(occurrence => occurrence.stepRequestsVersion)
253
+ ? ["step-requests-version"]
254
+ : []),
255
+ ...(context.workflowRequestsVersion
256
+ ? ["workflow-requests-version"]
257
+ : []),
258
+ ];
259
+ return STALENESS_SIGNALS.filter(name => present.includes(name));
260
+ }
142
261
  /**
143
262
  * Collapse repeated reads of one path into the single coupling they are.
144
- * @param workflow - Workflow file name
263
+ * @param context - Workflow name, lane and artifact lookups, workflow-scope signal
145
264
  * @param occurrences - Every occurrence found in that workflow
146
- * @param lanesFor - Delivery lanes shipping a caller path
147
265
  * @returns One coupling per distinct path, sorted by path
148
266
  */
149
- function collapse(workflow, occurrences, lanesFor) {
267
+ function collapse(context, occurrences) {
150
268
  const paths = [...new Set(occurrences.map(occurrence => occurrence.path))];
151
269
  return paths
152
270
  .map(callerPath => {
153
271
  const found = occurrences.filter(occurrence => occurrence.path === callerPath);
154
272
  return {
155
- workflow,
273
+ workflow: context.workflow,
156
274
  step: found[0]?.step ?? "",
157
275
  path: callerPath,
158
- lanes: lanesFor(callerPath),
276
+ lanes: context.lanesFor(callerPath),
159
277
  packageBacked: found.every(occurrence => occurrence.packageBacked),
160
278
  guarded: found.some(occurrence => occurrence.guarded),
279
+ handling: HANDLING_SIGNALS.filter(name => found.some(occurrence => occurrence.handling.includes(name))),
280
+ staleness: stalenessSignalsFor(context, callerPath, found),
281
+ artifactRead: context.artifactSignalsFor(callerPath) !== null,
161
282
  };
162
283
  })
163
284
  .sort((left, right) => left.path.localeCompare(right.path));
@@ -168,11 +289,17 @@ function collapse(workflow, occurrences, lanesFor) {
168
289
  * @param options.workflow - Workflow file name, as a consumer spells it after `@main`
169
290
  * @param options.text - Raw workflow YAML
170
291
  * @param options.lanesFor - Delivery lanes shipping a caller path
292
+ * @param options.artifactSignalsFor - Staleness tokens the delivered artifact carries, or null when nothing is delivered there
171
293
  * @returns One coupling per distinct caller path, sorted by path
172
294
  */
173
295
  export function scanWorkflow(options) {
174
296
  const steps = extractSteps(options.text);
175
- return collapse(options.workflow, steps.flatMap(occurrencesIn), options.lanesFor);
297
+ return collapse({
298
+ workflow: options.workflow,
299
+ lanesFor: options.lanesFor,
300
+ artifactSignalsFor: options.artifactSignalsFor,
301
+ workflowRequestsVersion: steps.some(step => requestsVersion(step.body)),
302
+ }, steps.flatMap(occurrencesIn));
176
303
  }
177
304
  /**
178
305
  * Whether a workflow can be called by another repository at all.
@@ -1 +1 @@
1
- {"version":3,"file":"two-channel-delivery-scan.js","sourceRoot":"","sources":["../../src/core/two-channel-delivery-scan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"two-channel-delivery-scan.js","sourceRoot":"","sources":["../../src/core/two-channel-delivery-scan.ts"],"names":[],"mappings":"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"}
@@ -64,8 +64,32 @@
64
64
  * as unmeasured rather than as a clean sweep. An empty comparison and a
65
65
  * converged consumer must not produce the same output — this whole subject is
66
66
  * failures that read as normal, and reproducing that here would be perverse.
67
+ *
68
+ * ## Absence and staleness are two dimensions, not two values of one
69
+ *
70
+ * Everything above is about the read path being ABSENT, and absence is the
71
+ * benign half: an absent artifact makes a step skip or fail, and neither
72
+ * outcome is a wrong answer. The harmful half is PRESENT-AND-OLD — a gate that
73
+ * posts a red required check derived from superseded logic, which every reader
74
+ * believes (CodySwannGT/lisa#3477).
75
+ *
76
+ * So `detection` is a SECOND dimension hung off the same entry rather than an
77
+ * extra member of `CouplingVerdict`. A coupling can be `apply-lagged` and carry
78
+ * a version handshake; it can be `package-backed` and carry none. Folding the
79
+ * two together would force a choice between the questions instead of answering
80
+ * both.
81
+ *
82
+ * The dimension is DERIVED, never declared. What a reader is allowed to record
83
+ * by hand is the DECISION — whether the staleness half is worth closing here —
84
+ * and even that is checked against the tree: a decision claiming a handshake
85
+ * that the delivered artifact and the workflow do not between them show is a
86
+ * failure, not a note. Silence is the one thing the dimension may never mean:
87
+ * a coupling whose delivered artifact cannot be read at all is `unchecked`,
88
+ * said out loud, rather than defaulted to current.
67
89
  * @module core/two-channel-delivery
68
90
  */
91
+ import { type StalenessDecision, type StalenessDetection, type StalenessRecord, type StalenessSignal } from "./two-channel-staleness.js";
92
+ export type { StalenessDecision, StalenessDetection, StalenessRecord, StalenessSignal, } from "./two-channel-staleness.js";
69
93
  /**
70
94
  * How one artifact reaches a consumer that already exists.
71
95
  *
@@ -102,6 +126,17 @@ export type CouplingVerdict =
102
126
  | "undelivered";
103
127
  /** What to do about one verdict. */
104
128
  export type CouplingRemedy = "none" | "run-lisa-apply" | "adopt-the-artifact" | "author-the-artifact";
129
+ /**
130
+ * Every absence-handling token a step's text may carry, in report order.
131
+ *
132
+ * The vocabulary lives here beside the verdicts rather than beside the
133
+ * patterns that find it, for the same reason the verdicts do: the detail must
134
+ * be able to say which names it looked for, and a scan that stopped looking
135
+ * must not be able to render as a step that carries nothing.
136
+ */
137
+ export declare const HANDLING_SIGNALS: readonly ["else-branch", "exit-zero", "exit-nonzero", "error-annotation", "notice-annotation", "failure-suppression"];
138
+ /** One absence-handling token name. */
139
+ export type HandlingSignal = (typeof HANDLING_SIGNALS)[number];
105
140
  /** One host-relative path read by one step of one reusable workflow. */
106
141
  export interface CouplingInput {
107
142
  /** Workflow file name, as a consumer spells it after `@main`. */
@@ -121,12 +156,40 @@ export interface CouplingInput {
121
156
  * Whether the read sits behind a file-existence test.
122
157
  *
123
158
  * Not a verdict, and deliberately not one. A guard changes the SHAPE of the
124
- * failure rather than its existence: unguarded, an absent path fails the job
125
- * loudly; guarded, the step skips and the gate silently proves nothing. The
126
- * second is the worse outcome and the one #3050 is about, so it is recorded
127
- * on the entry and said in the detail rather than folded into the verdict.
159
+ * failure rather than its existence, and the shape #3050 is about is the
160
+ * silent one so it is recorded on the entry and said in the detail rather
161
+ * than folded into the verdict.
162
+ *
163
+ * It says the step can TELL the path is missing. It does NOT say what the
164
+ * step then does; see `handling`.
128
165
  */
129
166
  readonly guarded: boolean;
167
+ /**
168
+ * Literal absence-handling tokens present in the step's own text.
169
+ *
170
+ * Evidence, not a conclusion. A name here means those characters appear in
171
+ * the step; it never means the token governs this read. Its job is to stop a
172
+ * reader completing the sentence the scan refuses to complete.
173
+ */
174
+ readonly handling: readonly HandlingSignal[];
175
+ /**
176
+ * Literal staleness-probe tokens found for this coupling.
177
+ *
178
+ * Evidence for the second dimension, held to the same rule as `handling`: a
179
+ * name means the characters were found where the name says to look. The
180
+ * artifact-side names are exact for this path; the workflow-side one is
181
+ * workflow-scoped and says so in its own name.
182
+ */
183
+ readonly staleness: readonly StalenessSignal[];
184
+ /**
185
+ * Whether any delivered artifact was available at this path to inspect.
186
+ *
187
+ * False is NOT "the artifact has no version probe" — it is "there was no
188
+ * artifact to ask". The two must not collapse: one is a measurement, the
189
+ * other is the absence of one, and reporting the second as the first is the
190
+ * defect this module is named after.
191
+ */
192
+ readonly artifactRead: boolean;
130
193
  }
131
194
  /** One coupling, its verdict, and the evidence behind it. */
132
195
  export interface CouplingEntry extends CouplingInput {
@@ -138,6 +201,12 @@ export interface CouplingEntry extends CouplingInput {
138
201
  readonly verdict: CouplingVerdict;
139
202
  /** The action this verdict calls for. */
140
203
  readonly remedy: CouplingRemedy;
204
+ /** What this coupling can tell about the artifact's AGE. Derived. */
205
+ readonly detection: StalenessDetection;
206
+ /** The recorded decision about the staleness half, or null if none was. */
207
+ readonly decision: StalenessDecision | null;
208
+ /** The reason recorded beside that decision, or null. */
209
+ readonly reason: string | null;
141
210
  /** One operator-readable sentence. */
142
211
  readonly detail: string;
143
212
  }
@@ -175,6 +244,32 @@ export interface TwoChannelReport {
175
244
  * which is how an allowlist added to harden a guard becomes the bypass.
176
245
  */
177
246
  readonly staleRatifications: readonly string[];
247
+ /** How many LEDGERED entries carry each detection. Every key is present. */
248
+ readonly detectionCounts: Readonly<Record<StalenessDetection, number>>;
249
+ /** How many LEDGERED entries carry each decision. Every key is present. */
250
+ readonly decisionCounts: Readonly<Record<StalenessDecision, number>>;
251
+ /** How many ledgered entries the run classified, the tally's denominator. */
252
+ readonly classifiable: number;
253
+ /**
254
+ * Ledgered couplings with no recorded staleness decision.
255
+ *
256
+ * The forcing function. A derived detection arrives free for entry 24; the
257
+ * decision does not, and this is what refuses the entry until somebody makes
258
+ * one.
259
+ */
260
+ readonly unclassified: readonly string[];
261
+ /** Recorded decisions the tree refuses to support, one sentence each. */
262
+ readonly contradictions: readonly string[];
263
+ /** Recorded decisions that are unusable as written, one sentence each. */
264
+ readonly malformed: readonly string[];
265
+ /**
266
+ * Staleness decisions matching no live coupling.
267
+ *
268
+ * Reported for the same reason a stale ratification is: a decision about a
269
+ * coupling that no longer exists is an unexamined exemption the next
270
+ * matching path inherits for free.
271
+ */
272
+ readonly staleClassifications: readonly string[];
178
273
  /** False when the run did not actually measure anything. */
179
274
  readonly measured: boolean;
180
275
  /** Why the run measured nothing, or null when it measured something. */
@@ -205,11 +300,13 @@ export declare function resolveDeliveryChannel(lanes: readonly string[]): Delive
205
300
  * @param options.couplings - Every caller-tree path read that was found
206
301
  * @param options.inspected - What the run looked at
207
302
  * @param options.ratified - Ratification reasons, keyed `<workflow>::<path>`
303
+ * @param options.classified - Staleness decisions, keyed `<workflow>::<path>`
208
304
  * @returns The measurement
209
305
  */
210
306
  export declare function classifyTwoChannelDelivery(options: {
211
307
  couplings: readonly CouplingInput[];
212
308
  inspected: InspectionCounts;
213
309
  ratified: Readonly<Record<string, string>>;
310
+ classified: Readonly<Record<string, StalenessRecord>>;
214
311
  }): TwoChannelReport;
215
312
  //# sourceMappingURL=two-channel-delivery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"two-channel-delivery.d.ts","sourceRoot":"","sources":["../../src/core/two-channel-delivery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"two-channel-delivery.d.ts","sourceRoot":"","sources":["../../src/core/two-channel-delivery.ts"],"names":[],"mappings":"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"}
@@ -64,8 +64,31 @@
64
64
  * as unmeasured rather than as a clean sweep. An empty comparison and a
65
65
  * converged consumer must not produce the same output — this whole subject is
66
66
  * failures that read as normal, and reproducing that here would be perverse.
67
+ *
68
+ * ## Absence and staleness are two dimensions, not two values of one
69
+ *
70
+ * Everything above is about the read path being ABSENT, and absence is the
71
+ * benign half: an absent artifact makes a step skip or fail, and neither
72
+ * outcome is a wrong answer. The harmful half is PRESENT-AND-OLD — a gate that
73
+ * posts a red required check derived from superseded logic, which every reader
74
+ * believes (CodySwannGT/lisa#3477).
75
+ *
76
+ * So `detection` is a SECOND dimension hung off the same entry rather than an
77
+ * extra member of `CouplingVerdict`. A coupling can be `apply-lagged` and carry
78
+ * a version handshake; it can be `package-backed` and carry none. Folding the
79
+ * two together would force a choice between the questions instead of answering
80
+ * both.
81
+ *
82
+ * The dimension is DERIVED, never declared. What a reader is allowed to record
83
+ * by hand is the DECISION — whether the staleness half is worth closing here —
84
+ * and even that is checked against the tree: a decision claiming a handshake
85
+ * that the delivered artifact and the workflow do not between them show is a
86
+ * failure, not a note. Silence is the one thing the dimension may never mean:
87
+ * a coupling whose delivered artifact cannot be read at all is `unchecked`,
88
+ * said out loud, rather than defaulted to current.
67
89
  * @module core/two-channel-delivery
68
90
  */
91
+ import { contradictionIn, detectStaleness, malformedIn, stalenessShape, STALENESS_DECISIONS, STALENESS_DETECTIONS, } from "./two-channel-staleness.js";
69
92
  /** The channel a refreshing lane puts an artifact on. */
70
93
  const CHANNEL_APPLY = "apply";
71
94
  /** The channel a scaffold-time-only lane puts an artifact on. */
@@ -98,6 +121,22 @@ const REMEDIES = {
98
121
  };
99
122
  /** Every verdict, so a count of zero is still a stated zero. */
100
123
  const VERDICTS = Object.keys(REMEDIES);
124
+ /**
125
+ * Every absence-handling token a step's text may carry, in report order.
126
+ *
127
+ * The vocabulary lives here beside the verdicts rather than beside the
128
+ * patterns that find it, for the same reason the verdicts do: the detail must
129
+ * be able to say which names it looked for, and a scan that stopped looking
130
+ * must not be able to render as a step that carries nothing.
131
+ */
132
+ export const HANDLING_SIGNALS = [
133
+ "else-branch",
134
+ "exit-zero",
135
+ "exit-nonzero",
136
+ "error-annotation",
137
+ "notice-annotation",
138
+ "failure-suppression",
139
+ ];
101
140
  /** Verdicts where nothing Lisa does on its own ever closes the gap. */
102
141
  const UNRESTORABLE = new Set([
103
142
  NEVER_DELIVERED,
@@ -144,14 +183,46 @@ function verdictFor(input, channel) {
144
183
  return UNDELIVERED;
145
184
  }
146
185
  /**
147
- * How an absent path shows up, which is not the same as whether it is absent.
186
+ * What the scan saw about a guard, and what it explicitly did not see.
187
+ *
188
+ * This clause used to finish the reader's sentence for them: guarded meant "an
189
+ * absent path SKIPS rather than fails … nothing reads as broken", asserted as
190
+ * though observed. It was inferred from one syntactic signal — that the read
191
+ * sits behind an `-f` test — and it was wrong about the first two steps it was
192
+ * ever quoted for, both of which fall back, annotate and verify rather than
193
+ * skip (CodySwannGT/lisa#3860). Generated prose that states a reader's thesis
194
+ * verbatim is the most persuasive evidence available and the least verified.
195
+ *
196
+ * So the consequence is no longer claimed. What is stated is what a guard
197
+ * establishes (the step can tell the path is missing), what was not read (the
198
+ * other branch, any fallback, any exit, any post-run verification), and which
199
+ * literal handling tokens the step's text carries.
148
200
  * @param guarded - Whether the read sits behind an existence test
149
- * @returns One clause describing the failure's shape
201
+ * @returns One clause describing what was and was not examined
150
202
  */
151
- function absenceShape(guarded) {
203
+ function guardShape(guarded) {
152
204
  return guarded
153
- ? "The read is guarded by an existence test, so an absent path SKIPS rather than fails — the step posts no context, and an absent required context is not a red one. Nothing reads as broken."
154
- : "The read is unguarded, so an absent path fails the job loudly. Visible, which makes it the better of the two failures.";
205
+ ? "The read sits behind an existence test, which is ALL this scan examined of the step's control flow: it did not read the test's other branch, any fallback, any explicit `exit`, or any verification of the step's output. Whether an absent path skips quietly, falls back, or fails loudly is therefore NOT MEASURED read the step before concluding it proves nothing. The shape worth ruling out is the silent one, where a skip posts no context and an absent required context is not a red one."
206
+ : "No existence test guards the read, which is ALL this scan examined of the step's control flow: it did not read anything that could absorb the failure. An absent path most likely fails the job loudly the better of the two failures, because it is visible — but that is inferred from the missing guard, NOT MEASURED.";
207
+ }
208
+ /**
209
+ * Which handling tokens the step's text carries, named without interpretation.
210
+ * @param handling - Signal names the scan found
211
+ * @returns One clause listing them, or saying none of the known names appear
212
+ */
213
+ function handlingShape(handling) {
214
+ const quoted = (names) => names.map(name => `\`${name}\``).join(", ");
215
+ return handling.length === 0
216
+ ? `The step's text carries none of the tokens this scan can see (${quoted(HANDLING_SIGNALS)}), which is a statement about those names and not about the step's behaviour.`
217
+ : `The step's text does carry ${quoted(handling)} — located in the step, deliberately NOT related to this read, and enough to make "it skips silently" a claim to check rather than assume.`;
218
+ }
219
+ /**
220
+ * How an absent path shows up, which is not the same as whether it is absent.
221
+ * @param input - The coupling
222
+ * @returns Two clauses: what was examined, and what tokens were located
223
+ */
224
+ function absenceShape(input) {
225
+ return `${guardShape(input.guarded)} ${handlingShape(input.handling)}`;
155
226
  }
156
227
  /**
157
228
  * The sentence one verdict is explained with.
@@ -165,12 +236,12 @@ function detailFor(input, verdict) {
165
236
  return `${called} It resolves \`${input.path}\` only after a package-relative candidate, which travels with the installed package — the caller-tree copy is a fallback, not the delivery channel.`;
166
237
  }
167
238
  if (verdict === APPLY_LAGGED) {
168
- return `${called} It reads \`${input.path}\` from the CALLER's tree with no package-relative candidate, and Lisa delivers that path on the \`lisa apply\` channel (${input.lanes.join(", ")}). The two halves land in the wrong order: this step is live everywhere immediately, the file it needs is live only where somebody applied. ${absenceShape(input.guarded)}`;
239
+ return `${called} It reads \`${input.path}\` from the CALLER's tree with no package-relative candidate, and Lisa delivers that path on the \`lisa apply\` channel (${input.lanes.join(", ")}). The two halves land in the wrong order: this step is live everywhere immediately, the file it needs is live only where somebody applied. ${absenceShape(input)}`;
169
240
  }
170
241
  if (verdict === NEVER_DELIVERED) {
171
- return `${called} It reads \`${input.path}\` from the CALLER's tree, and Lisa ships that path create-only (${input.lanes.join(", ")}) — written once at scaffold time and never refreshed, so an existing consumer NEVER receives it. Fixing it upstream does not mean a bump brings it; adoption is a manual step the consumer must take. ${absenceShape(input.guarded)}`;
242
+ return `${called} It reads \`${input.path}\` from the CALLER's tree, and Lisa ships that path create-only (${input.lanes.join(", ")}) — written once at scaffold time and never refreshed, so an existing consumer NEVER receives it. Fixing it upstream does not mean a bump brings it; adoption is a manual step the consumer must take. ${absenceShape(input)}`;
172
243
  }
173
- return `${called} It reads \`${input.path}\` from the CALLER's tree, and Lisa ships no such path in any delivery lane — no apply and no bump ever produces it. Either the consumer authors it or this step proves nothing wherever it is absent. ${absenceShape(input.guarded)}`;
244
+ return `${called} It reads \`${input.path}\` from the CALLER's tree, and Lisa ships no such path in any delivery lane — no apply and no bump ever produces it. Either the consumer authors it, or whatever the step does where the path is missing runs instead — and that branch is the part this scan does not read. ${absenceShape(input)}`;
174
245
  }
175
246
  /**
176
247
  * Compare `<workflow>::<path>` keys the same way everywhere, so two runs over
@@ -185,20 +256,27 @@ function byKey(left, right) {
185
256
  /**
186
257
  * Turn one raw coupling into a classified entry.
187
258
  * @param input - The coupling
259
+ * @param classified - Recorded staleness decisions, keyed `<workflow>::<path>`
188
260
  * @returns The entry
189
261
  */
190
- function toEntry(input) {
262
+ function toEntry(input, classified) {
191
263
  const channel = input.packageBacked
192
264
  ? CHANNEL_PACKAGE
193
265
  : resolveDeliveryChannel(input.lanes);
194
266
  const verdict = verdictFor(input, channel);
267
+ const key = `${input.workflow}::${input.path}`;
268
+ const detection = detectStaleness(input);
269
+ const record = classified[key];
195
270
  return {
196
271
  ...input,
197
- key: `${input.workflow}::${input.path}`,
272
+ key,
198
273
  channel,
199
274
  verdict,
200
275
  remedy: REMEDIES[verdict],
201
- detail: detailFor(input, verdict),
276
+ detection,
277
+ decision: record?.decision ?? null,
278
+ reason: record?.reason ?? null,
279
+ detail: `${detailFor(input, verdict)} ${stalenessShape(input, detection)}`,
202
280
  };
203
281
  }
204
282
  /**
@@ -233,14 +311,23 @@ function unmeasuredReasonFor(inspected) {
233
311
  * @param options.couplings - Every caller-tree path read that was found
234
312
  * @param options.inspected - What the run looked at
235
313
  * @param options.ratified - Ratification reasons, keyed `<workflow>::<path>`
314
+ * @param options.classified - Staleness decisions, keyed `<workflow>::<path>`
236
315
  * @returns The measurement
237
316
  */
238
317
  export function classifyTwoChannelDelivery(options) {
239
- const { couplings, inspected, ratified } = options;
240
- const entries = couplings.map(toEntry).sort(byKey);
318
+ const { couplings, inspected, ratified, classified } = options;
319
+ const entries = couplings
320
+ .map(input => toEntry(input, classified))
321
+ .sort(byKey);
241
322
  const unrestorable = entries.filter(entry => UNRESTORABLE.has(entry.verdict));
242
323
  const live = new Set(unrestorable.map(entry => entry.key));
243
324
  const unmeasuredReason = unmeasuredReasonFor(inspected);
325
+ // The staleness dimension is asked of the LEDGERED couplings only. A
326
+ // package-backed step is covered by the fast channel and is not written to
327
+ // the ledger, so requiring a hand-authored decision for one would demand a
328
+ // sentence about an entry no reader can see.
329
+ const ledgered = entries.filter(entry => entry.verdict !== PACKAGE_BACKED);
330
+ const ledgeredKeys = new Set(ledgered.map(entry => entry.key));
244
331
  return {
245
332
  entries,
246
333
  counts: Object.fromEntries(VERDICTS.map(verdict => [
@@ -252,6 +339,27 @@ export function classifyTwoChannelDelivery(options) {
252
339
  staleRatifications: Object.keys(ratified)
253
340
  .filter(key => !live.has(key))
254
341
  .sort((left, right) => left.localeCompare(right)),
342
+ detectionCounts: Object.fromEntries(STALENESS_DETECTIONS.map(detection => [
343
+ detection,
344
+ ledgered.filter(entry => entry.detection === detection).length,
345
+ ])),
346
+ decisionCounts: Object.fromEntries(STALENESS_DECISIONS.map(decision => [
347
+ decision,
348
+ ledgered.filter(entry => entry.decision === decision).length,
349
+ ])),
350
+ classifiable: ledgered.length,
351
+ unclassified: ledgered
352
+ .filter(entry => entry.decision === null)
353
+ .map(entry => entry.key),
354
+ contradictions: ledgered
355
+ .map(contradictionIn)
356
+ .filter((sentence) => sentence !== null),
357
+ malformed: ledgered
358
+ .map(malformedIn)
359
+ .filter((sentence) => sentence !== null),
360
+ staleClassifications: Object.keys(classified)
361
+ .filter(key => !ledgeredKeys.has(key))
362
+ .sort((left, right) => left.localeCompare(right)),
255
363
  measured: unmeasuredReason === null,
256
364
  unmeasuredReason,
257
365
  };
@@ -1 +1 @@
1
- {"version":3,"file":"two-channel-delivery.js","sourceRoot":"","sources":["../../src/core/two-channel-delivery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"two-channel-delivery.js","sourceRoot":"","sources":["../../src/core/two-channel-delivery.ts"],"names":[],"mappings":"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"}