@codyswann/lisa 4.55.2 → 4.55.3

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 (367) hide show
  1. package/all/copy-overwrite/scripts/check-orphaned-branches.mjs +49 -13
  2. package/all/copy-overwrite/scripts/lisa-enforcement-fallback.sh +9 -1
  3. package/all/copy-overwrite/scripts/lisa-hooks/block-blind-automerge.sh +10 -5
  4. package/all/copy-overwrite/scripts/lisa-hooks/block-direct-issue-create.sh +4 -0
  5. package/all/copy-overwrite/scripts/lisa-hooks/block-managed-file-edits.sh +73 -2
  6. package/all/copy-overwrite/scripts/lisa-hooks/guard-dedupe.bash +63 -29
  7. package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +2 -1
  8. package/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.sh +2 -1
  9. package/all/copy-overwrite/scripts/lisa-run-gates.mjs +7 -2
  10. package/all/copy-overwrite/scripts/lisa-work-item.mjs +50 -14
  11. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  12. package/dist/core/lisa-owned-hash-ledger.js +36 -0
  13. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  14. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  15. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  16. package/dist/core/upstream-evidence-manifest.js +86 -75
  17. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  18. package/dist/opencode/plugin-templates/block-managed-file-edits.sh +76 -2
  19. package/dist/opencode/plugin-templates/block-no-verify.sh +3 -0
  20. package/dist/opencode/plugin-templates/guard-dedupe.bash +66 -29
  21. package/dist/opencode/plugin-templates/parity-safety-net-heredoc.py +3 -0
  22. package/dist/opencode/plugin-templates/parity-safety-net.sh +5 -1
  23. package/dist/opencode/support-file-resolver.d.ts.map +1 -1
  24. package/dist/opencode/support-file-resolver.js +3 -1
  25. package/dist/opencode/support-file-resolver.js.map +1 -1
  26. package/expo/copy-overwrite/plugins/withAndroidSplashNoClientExit.js +23 -21
  27. package/expo/create-only/.github/required-checks.json +1 -1
  28. package/nestjs/create-only/.github/required-checks.json +1 -1
  29. package/package.json +4 -4
  30. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  32. package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/SKILL.md +18 -10
  33. package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/SKILL.md +18 -9
  34. package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +45 -6
  35. package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +18 -7
  36. package/plugins/lisa/.codex-plugin/skills/lisa-linear-prd-intake/SKILL.md +12 -2
  37. package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +1 -18
  38. package/plugins/lisa/.codex-plugin/skills/lisa-linear-verify/SKILL.md +0 -17
  39. package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +3 -34
  40. package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  41. package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +46 -6
  42. package/plugins/lisa/.codex-plugin/skills/lisa-rework-triage/SKILL.md +2 -1
  43. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/providers.mjs +2 -1
  44. package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +1 -1
  45. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/preflight-tools.mjs +7 -2
  46. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +11 -4
  47. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/toolchain.mjs +17 -5
  48. package/plugins/lisa/.codex-plugin/skills/lisa-track/SKILL.md +18 -4
  49. package/plugins/lisa/hooks/block-blind-automerge.sh +13 -5
  50. package/plugins/lisa/hooks/block-direct-issue-create.sh +7 -0
  51. package/plugins/lisa/hooks/block-instruction-file-edits.sh +3 -0
  52. package/plugins/lisa/hooks/block-managed-file-edits.sh +76 -2
  53. package/plugins/lisa/hooks/block-no-verify.sh +3 -0
  54. package/plugins/lisa/hooks/block-shell-json-parsing.sh +3 -0
  55. package/plugins/lisa/hooks/guard-dedupe.bash +66 -29
  56. package/plugins/lisa/hooks/parity-safety-net-heredoc.py +3 -0
  57. package/plugins/lisa/hooks/parity-safety-net.sh +5 -1
  58. package/plugins/lisa/hooks/worktree-binding-guard.mjs +3 -0
  59. package/plugins/lisa/hooks/worktree-binding-guard.sh +5 -1
  60. package/plugins/lisa/rules/eager/00-rule-index.md +1 -0
  61. package/plugins/lisa/rules/eager/base-rules.md +3 -1
  62. package/plugins/lisa/rules/eager/withdrawn-rulings.md +14 -3
  63. package/plugins/lisa/rules/reference/automation-runbook-contract.md +1 -1
  64. package/plugins/lisa/rules/reference/bdd-e2e-coverage.md +1 -1
  65. package/plugins/lisa/rules/reference/blocker-containment.md +3 -3
  66. package/plugins/lisa/rules/reference/claim-archaeology.md +1 -1
  67. package/plugins/lisa/rules/reference/claim-evidence-mapping.md +1 -1
  68. package/plugins/lisa/rules/reference/claim-time-guards.md +1 -1
  69. package/plugins/lisa/rules/reference/control-reachability.md +1 -1
  70. package/plugins/lisa/rules/reference/convergent-review.md +1 -1
  71. package/plugins/lisa/rules/reference/credential-substrate-precedence.md +1 -1
  72. package/plugins/lisa/rules/reference/dependency-decision-records.md +1 -1
  73. package/plugins/lisa/rules/reference/dependency-internalization-kit.md +1 -1
  74. package/plugins/lisa/rules/reference/dependency-trust-classes.md +1 -1
  75. package/plugins/lisa/rules/reference/deployed-state-readback.md +1 -1
  76. package/plugins/lisa/rules/reference/derived-branch-plan.md +1 -1
  77. package/plugins/lisa/rules/reference/design-source-of-truth.md +1 -1
  78. package/plugins/lisa/rules/reference/design-value-binding.md +1 -1
  79. package/plugins/lisa/rules/reference/documentation-source-paths.md +1 -1
  80. package/plugins/lisa/rules/reference/leaf-only-lifecycle.md +1 -1
  81. package/plugins/lisa/rules/reference/observability-audit.md +1 -1
  82. package/plugins/lisa/rules/reference/prd-definition-of-ready.md +1 -1
  83. package/plugins/lisa/rules/reference/prd-lifecycle-rollup.md +1 -1
  84. package/plugins/lisa/rules/reference/pre-flight-autofill.md +1 -1
  85. package/plugins/lisa/rules/reference/promotion-contract.md +1 -1
  86. package/plugins/lisa/rules/reference/readiness-rubric.md +1 -1
  87. package/plugins/lisa/rules/reference/ready-role-filing.md +1 -1
  88. package/plugins/lisa/rules/reference/rejection-detection.md +1 -1
  89. package/plugins/lisa/rules/reference/repo-scope-split.md +9 -10
  90. package/plugins/lisa/rules/reference/reset-seed-coverage.md +1 -1
  91. package/plugins/lisa/rules/reference/usage-accounting.md +1 -1
  92. package/plugins/lisa/rules/reference/work-item-definition-of-ready.md +1 -1
  93. package/plugins/lisa/skills/lisa-github-build-intake/SKILL.md +18 -10
  94. package/plugins/lisa/skills/lisa-jira-build-intake/SKILL.md +18 -9
  95. package/plugins/lisa/skills/lisa-linear-access/SKILL.md +45 -6
  96. package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +18 -7
  97. package/plugins/lisa/skills/lisa-linear-prd-intake/SKILL.md +12 -2
  98. package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +1 -18
  99. package/plugins/lisa/skills/lisa-linear-verify/SKILL.md +0 -17
  100. package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +3 -34
  101. package/plugins/lisa/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  102. package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +46 -6
  103. package/plugins/lisa/skills/lisa-rework-triage/SKILL.md +2 -1
  104. package/plugins/lisa/skills/lisa-secrets-access/scripts/providers.mjs +2 -1
  105. package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +1 -1
  106. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/preflight-tools.mjs +7 -2
  107. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +11 -4
  108. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/toolchain.mjs +17 -5
  109. package/plugins/lisa/skills/lisa-track/SKILL.md +18 -4
  110. package/plugins/lisa-agy/hooks/block-blind-automerge.sh +13 -5
  111. package/plugins/lisa-agy/hooks/block-direct-issue-create.sh +7 -0
  112. package/plugins/lisa-agy/hooks/block-instruction-file-edits.sh +3 -0
  113. package/plugins/lisa-agy/hooks/block-managed-file-edits.sh +76 -2
  114. package/plugins/lisa-agy/hooks/block-shell-json-parsing.sh +3 -0
  115. package/plugins/lisa-agy/hooks/guard-dedupe.bash +66 -29
  116. package/plugins/lisa-agy/hooks/parity-safety-net-heredoc.py +3 -0
  117. package/plugins/lisa-agy/hooks/parity-safety-net.sh +5 -1
  118. package/plugins/lisa-agy/plugin.json +1 -1
  119. package/plugins/lisa-agy/skills/lisa-github-build-intake/SKILL.md +18 -10
  120. package/plugins/lisa-agy/skills/lisa-jira-build-intake/SKILL.md +18 -9
  121. package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +45 -6
  122. package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +18 -7
  123. package/plugins/lisa-agy/skills/lisa-linear-prd-intake/SKILL.md +12 -2
  124. package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +1 -18
  125. package/plugins/lisa-agy/skills/lisa-linear-verify/SKILL.md +0 -17
  126. package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +3 -34
  127. package/plugins/lisa-agy/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  128. package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +46 -6
  129. package/plugins/lisa-agy/skills/lisa-rework-triage/SKILL.md +2 -1
  130. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/providers.mjs +2 -1
  131. package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +1 -1
  132. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/preflight-tools.mjs +7 -2
  133. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +11 -4
  134. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/toolchain.mjs +17 -5
  135. package/plugins/lisa-agy/skills/lisa-track/SKILL.md +18 -4
  136. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  137. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  138. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  139. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  140. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  141. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  142. package/plugins/lisa-copilot/hooks/block-blind-automerge.sh +13 -5
  143. package/plugins/lisa-copilot/hooks/block-direct-issue-create.sh +7 -0
  144. package/plugins/lisa-copilot/hooks/block-instruction-file-edits.sh +3 -0
  145. package/plugins/lisa-copilot/hooks/block-managed-file-edits.sh +76 -2
  146. package/plugins/lisa-copilot/hooks/block-no-verify.sh +3 -0
  147. package/plugins/lisa-copilot/hooks/block-shell-json-parsing.sh +3 -0
  148. package/plugins/lisa-copilot/hooks/guard-dedupe.bash +66 -29
  149. package/plugins/lisa-copilot/hooks/parity-safety-net-heredoc.py +3 -0
  150. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +5 -1
  151. package/plugins/lisa-copilot/hooks/worktree-binding-guard.mjs +3 -0
  152. package/plugins/lisa-copilot/hooks/worktree-binding-guard.sh +5 -1
  153. package/plugins/lisa-copilot/rules/eager/00-rule-index.md +1 -0
  154. package/plugins/lisa-copilot/rules/eager/base-rules.md +3 -1
  155. package/plugins/lisa-copilot/rules/eager/withdrawn-rulings.md +14 -3
  156. package/plugins/lisa-copilot/rules/reference/automation-runbook-contract.md +1 -1
  157. package/plugins/lisa-copilot/rules/reference/bdd-e2e-coverage.md +1 -1
  158. package/plugins/lisa-copilot/rules/reference/blocker-containment.md +3 -3
  159. package/plugins/lisa-copilot/rules/reference/claim-archaeology.md +1 -1
  160. package/plugins/lisa-copilot/rules/reference/claim-evidence-mapping.md +1 -1
  161. package/plugins/lisa-copilot/rules/reference/claim-time-guards.md +1 -1
  162. package/plugins/lisa-copilot/rules/reference/control-reachability.md +1 -1
  163. package/plugins/lisa-copilot/rules/reference/convergent-review.md +1 -1
  164. package/plugins/lisa-copilot/rules/reference/credential-substrate-precedence.md +1 -1
  165. package/plugins/lisa-copilot/rules/reference/dependency-decision-records.md +1 -1
  166. package/plugins/lisa-copilot/rules/reference/dependency-internalization-kit.md +1 -1
  167. package/plugins/lisa-copilot/rules/reference/dependency-trust-classes.md +1 -1
  168. package/plugins/lisa-copilot/rules/reference/deployed-state-readback.md +1 -1
  169. package/plugins/lisa-copilot/rules/reference/derived-branch-plan.md +1 -1
  170. package/plugins/lisa-copilot/rules/reference/design-source-of-truth.md +1 -1
  171. package/plugins/lisa-copilot/rules/reference/design-value-binding.md +1 -1
  172. package/plugins/lisa-copilot/rules/reference/documentation-source-paths.md +1 -1
  173. package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +1 -1
  174. package/plugins/lisa-copilot/rules/reference/observability-audit.md +1 -1
  175. package/plugins/lisa-copilot/rules/reference/prd-definition-of-ready.md +1 -1
  176. package/plugins/lisa-copilot/rules/reference/prd-lifecycle-rollup.md +1 -1
  177. package/plugins/lisa-copilot/rules/reference/pre-flight-autofill.md +1 -1
  178. package/plugins/lisa-copilot/rules/reference/promotion-contract.md +1 -1
  179. package/plugins/lisa-copilot/rules/reference/readiness-rubric.md +1 -1
  180. package/plugins/lisa-copilot/rules/reference/ready-role-filing.md +1 -1
  181. package/plugins/lisa-copilot/rules/reference/rejection-detection.md +1 -1
  182. package/plugins/lisa-copilot/rules/reference/repo-scope-split.md +9 -10
  183. package/plugins/lisa-copilot/rules/reference/reset-seed-coverage.md +1 -1
  184. package/plugins/lisa-copilot/rules/reference/usage-accounting.md +1 -1
  185. package/plugins/lisa-copilot/rules/reference/work-item-definition-of-ready.md +1 -1
  186. package/plugins/lisa-copilot/skills/lisa-github-build-intake/SKILL.md +18 -10
  187. package/plugins/lisa-copilot/skills/lisa-jira-build-intake/SKILL.md +18 -9
  188. package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +45 -6
  189. package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +18 -7
  190. package/plugins/lisa-copilot/skills/lisa-linear-prd-intake/SKILL.md +12 -2
  191. package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +1 -18
  192. package/plugins/lisa-copilot/skills/lisa-linear-verify/SKILL.md +0 -17
  193. package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +3 -34
  194. package/plugins/lisa-copilot/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  195. package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +46 -6
  196. package/plugins/lisa-copilot/skills/lisa-rework-triage/SKILL.md +2 -1
  197. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/providers.mjs +2 -1
  198. package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +1 -1
  199. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/preflight-tools.mjs +7 -2
  200. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +11 -4
  201. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/toolchain.mjs +17 -5
  202. package/plugins/lisa-copilot/skills/lisa-track/SKILL.md +18 -4
  203. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  204. package/plugins/lisa-cursor/hooks/block-blind-automerge.sh +13 -5
  205. package/plugins/lisa-cursor/hooks/block-direct-issue-create.sh +7 -0
  206. package/plugins/lisa-cursor/hooks/block-instruction-file-edits.sh +3 -0
  207. package/plugins/lisa-cursor/hooks/block-managed-file-edits.sh +76 -2
  208. package/plugins/lisa-cursor/hooks/block-no-verify.sh +3 -0
  209. package/plugins/lisa-cursor/hooks/block-shell-json-parsing.sh +3 -0
  210. package/plugins/lisa-cursor/hooks/guard-dedupe.bash +66 -29
  211. package/plugins/lisa-cursor/hooks/parity-safety-net-heredoc.py +3 -0
  212. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +5 -1
  213. package/plugins/lisa-cursor/hooks/worktree-binding-guard.mjs +3 -0
  214. package/plugins/lisa-cursor/hooks/worktree-binding-guard.sh +5 -1
  215. package/plugins/lisa-cursor/rules/00-rule-index.mdc +1 -0
  216. package/plugins/lisa-cursor/rules/automation-runbook-contract-reference.mdc +1 -1
  217. package/plugins/lisa-cursor/rules/base-rules.mdc +3 -1
  218. package/plugins/lisa-cursor/rules/bdd-e2e-coverage-reference.mdc +1 -1
  219. package/plugins/lisa-cursor/rules/blocker-containment-reference.mdc +3 -3
  220. package/plugins/lisa-cursor/rules/claim-archaeology-reference.mdc +1 -1
  221. package/plugins/lisa-cursor/rules/claim-evidence-mapping-reference.mdc +1 -1
  222. package/plugins/lisa-cursor/rules/claim-time-guards-reference.mdc +1 -1
  223. package/plugins/lisa-cursor/rules/control-reachability-reference.mdc +1 -1
  224. package/plugins/lisa-cursor/rules/convergent-review-reference.mdc +1 -1
  225. package/plugins/lisa-cursor/rules/credential-substrate-precedence-reference.mdc +1 -1
  226. package/plugins/lisa-cursor/rules/dependency-decision-records-reference.mdc +1 -1
  227. package/plugins/lisa-cursor/rules/dependency-internalization-kit-reference.mdc +1 -1
  228. package/plugins/lisa-cursor/rules/dependency-trust-classes-reference.mdc +1 -1
  229. package/plugins/lisa-cursor/rules/deployed-state-readback-reference.mdc +1 -1
  230. package/plugins/lisa-cursor/rules/derived-branch-plan-reference.mdc +1 -1
  231. package/plugins/lisa-cursor/rules/design-source-of-truth-reference.mdc +1 -1
  232. package/plugins/lisa-cursor/rules/design-value-binding-reference.mdc +1 -1
  233. package/plugins/lisa-cursor/rules/documentation-source-paths-reference.mdc +1 -1
  234. package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +1 -1
  235. package/plugins/lisa-cursor/rules/observability-audit-reference.mdc +1 -1
  236. package/plugins/lisa-cursor/rules/prd-definition-of-ready-reference.mdc +1 -1
  237. package/plugins/lisa-cursor/rules/prd-lifecycle-rollup-reference.mdc +1 -1
  238. package/plugins/lisa-cursor/rules/pre-flight-autofill-reference.mdc +1 -1
  239. package/plugins/lisa-cursor/rules/promotion-contract-reference.mdc +1 -1
  240. package/plugins/lisa-cursor/rules/readiness-rubric-reference.mdc +1 -1
  241. package/plugins/lisa-cursor/rules/ready-role-filing-reference.mdc +1 -1
  242. package/plugins/lisa-cursor/rules/rejection-detection-reference.mdc +1 -1
  243. package/plugins/lisa-cursor/rules/repo-scope-split-reference.mdc +9 -10
  244. package/plugins/lisa-cursor/rules/reset-seed-coverage-reference.mdc +1 -1
  245. package/plugins/lisa-cursor/rules/usage-accounting-reference.mdc +1 -1
  246. package/plugins/lisa-cursor/rules/withdrawn-rulings.mdc +14 -3
  247. package/plugins/lisa-cursor/rules/work-item-definition-of-ready-reference.mdc +1 -1
  248. package/plugins/lisa-cursor/skills/lisa-github-build-intake/SKILL.md +18 -10
  249. package/plugins/lisa-cursor/skills/lisa-jira-build-intake/SKILL.md +18 -9
  250. package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +45 -6
  251. package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +18 -7
  252. package/plugins/lisa-cursor/skills/lisa-linear-prd-intake/SKILL.md +12 -2
  253. package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +1 -18
  254. package/plugins/lisa-cursor/skills/lisa-linear-verify/SKILL.md +0 -17
  255. package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +3 -34
  256. package/plugins/lisa-cursor/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  257. package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +46 -6
  258. package/plugins/lisa-cursor/skills/lisa-rework-triage/SKILL.md +2 -1
  259. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/providers.mjs +2 -1
  260. package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +1 -1
  261. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/preflight-tools.mjs +7 -2
  262. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +11 -4
  263. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/toolchain.mjs +17 -5
  264. package/plugins/lisa-cursor/skills/lisa-track/SKILL.md +18 -4
  265. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  266. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  267. package/plugins/lisa-expo-agy/plugin.json +1 -1
  268. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  269. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  270. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  271. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  272. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  273. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  274. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  275. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  276. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  277. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  278. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  279. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  280. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  281. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  282. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  283. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  284. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  285. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  286. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  287. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  288. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  289. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  290. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  291. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  292. package/plugins/lisa-rails-agy/plugin.json +1 -1
  293. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  294. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  295. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  296. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  297. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  298. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  299. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  300. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  301. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  302. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  303. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  304. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  305. package/plugins/materialized-artifacts.json +11 -0
  306. package/plugins/src/base/hooks/block-blind-automerge.sh +10 -5
  307. package/plugins/src/base/hooks/block-direct-issue-create.sh +4 -0
  308. package/plugins/src/base/hooks/block-managed-file-edits.sh +73 -2
  309. package/plugins/src/base/hooks/guard-dedupe.bash +63 -29
  310. package/plugins/src/base/hooks/parity-safety-net.sh +2 -1
  311. package/plugins/src/base/hooks/worktree-binding-guard.sh +2 -1
  312. package/plugins/src/base/rules/eager/00-rule-index.md +1 -0
  313. package/plugins/src/base/rules/eager/base-rules.md +3 -1
  314. package/plugins/src/base/rules/eager/withdrawn-rulings.md +14 -3
  315. package/plugins/src/base/rules/reference/automation-runbook-contract.md +1 -1
  316. package/plugins/src/base/rules/reference/bdd-e2e-coverage.md +1 -1
  317. package/plugins/src/base/rules/reference/blocker-containment.md +3 -3
  318. package/plugins/src/base/rules/reference/claim-archaeology.md +1 -1
  319. package/plugins/src/base/rules/reference/claim-evidence-mapping.md +1 -1
  320. package/plugins/src/base/rules/reference/claim-time-guards.md +1 -1
  321. package/plugins/src/base/rules/reference/control-reachability.md +1 -1
  322. package/plugins/src/base/rules/reference/convergent-review.md +1 -1
  323. package/plugins/src/base/rules/reference/credential-substrate-precedence.md +1 -1
  324. package/plugins/src/base/rules/reference/dependency-decision-records.md +1 -1
  325. package/plugins/src/base/rules/reference/dependency-internalization-kit.md +1 -1
  326. package/plugins/src/base/rules/reference/dependency-trust-classes.md +1 -1
  327. package/plugins/src/base/rules/reference/deployed-state-readback.md +1 -1
  328. package/plugins/src/base/rules/reference/derived-branch-plan.md +1 -1
  329. package/plugins/src/base/rules/reference/design-source-of-truth.md +1 -1
  330. package/plugins/src/base/rules/reference/design-value-binding.md +1 -1
  331. package/plugins/src/base/rules/reference/documentation-source-paths.md +1 -1
  332. package/plugins/src/base/rules/reference/leaf-only-lifecycle.md +1 -1
  333. package/plugins/src/base/rules/reference/observability-audit.md +1 -1
  334. package/plugins/src/base/rules/reference/prd-definition-of-ready.md +1 -1
  335. package/plugins/src/base/rules/reference/prd-lifecycle-rollup.md +1 -1
  336. package/plugins/src/base/rules/reference/pre-flight-autofill.md +1 -1
  337. package/plugins/src/base/rules/reference/promotion-contract.md +1 -1
  338. package/plugins/src/base/rules/reference/readiness-rubric.md +1 -1
  339. package/plugins/src/base/rules/reference/ready-role-filing.md +1 -1
  340. package/plugins/src/base/rules/reference/rejection-detection.md +1 -1
  341. package/plugins/src/base/rules/reference/repo-scope-split.md +9 -10
  342. package/plugins/src/base/rules/reference/reset-seed-coverage.md +1 -1
  343. package/plugins/src/base/rules/reference/usage-accounting.md +1 -1
  344. package/plugins/src/base/rules/reference/work-item-definition-of-ready.md +1 -1
  345. package/plugins/src/base/skills/lisa-github-build-intake/SKILL.md +18 -10
  346. package/plugins/src/base/skills/lisa-jira-build-intake/SKILL.md +18 -9
  347. package/plugins/src/base/skills/lisa-linear-access/SKILL.md +45 -6
  348. package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +18 -7
  349. package/plugins/src/base/skills/lisa-linear-prd-intake/SKILL.md +12 -2
  350. package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +1 -18
  351. package/plugins/src/base/skills/lisa-linear-verify/SKILL.md +0 -17
  352. package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +3 -34
  353. package/plugins/src/base/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  354. package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +46 -6
  355. package/plugins/src/base/skills/lisa-rework-triage/SKILL.md +2 -1
  356. package/plugins/src/base/skills/lisa-secrets-access/scripts/providers.mjs +2 -1
  357. package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +1 -1
  358. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/preflight-tools.mjs +7 -2
  359. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +11 -4
  360. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/toolchain.mjs +17 -5
  361. package/plugins/src/base/skills/lisa-track/SKILL.md +18 -4
  362. package/scripts/build-plugins.sh +4 -0
  363. package/scripts/copy-opencode-plugin-templates.mjs +5 -1
  364. package/scripts/lisa-enforcement-fallback.sh +9 -1
  365. package/scripts/two-channel-couplings.json +5 -33
  366. package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +551 -13
  367. package/typescript/create-only/.github/required-checks.json +1 -1
@@ -54,7 +54,8 @@ if [ -r "$lisa_guard_dedupe_lib" ]; then
54
54
  # shellcheck source=guard-dedupe.bash
55
55
  . "$lisa_guard_dedupe_lib"
56
56
  trap 'lisa_guard_dedupe_record $?' EXIT
57
- lisa_guard_dedupe worktree-binding-guard "$input"
57
+ lisa_guard_dedupe worktree-binding-guard "$input" \
58
+ "$lisa_guard_hook_dir/worktree-binding-guard.mjs"
58
59
  fi
59
60
 
60
61
  if ! command -v node >/dev/null 2>&1; then
@@ -68,6 +68,7 @@ Paths are relative to this file.
68
68
 
69
69
  | Slug | Read it when | Body |
70
70
  |---|---|---|
71
+ | `operational-hazards` | looking up or publishing an active operational hazard that other sessions must see | [../reference/operational-hazards.md](../reference/operational-hazards.md) |
71
72
  | `automation-runbook-contract` | registering a loop, or ending any flow with its run outcome | [../reference/automation-runbook-contract.md](../reference/automation-runbook-contract.md) |
72
73
  | `convergent-review` | reviewing a PR or resolving review findings | [../reference/convergent-review.md](../reference/convergent-review.md) |
73
74
  | `credential-substrate-precedence` | writing or editing an `*-access` skill | [../reference/credential-substrate-precedence.md](../reference/credential-substrate-precedence.md) |
@@ -7,7 +7,7 @@ These are mandatory disciplines that apply to every session. Full prose, JIRA de
7
7
  You are factory machinery, not a chat assistant. Three consequences bind every session:
8
8
 
9
9
  - **Do not pause mid-flow to ask a human whether to proceed.** Handoff happens at the gates — the ready-role flips and intake's adversarial validation — never in the middle of a flow.
10
- - **Every flow must work headless**: no interactive prompts, idempotent re-runs, clean exits on empty queues. Flows run under native schedulers as often as under a human.
10
+ - **Every admitted flow must work headless**: no interactive prompts after admission, idempotent re-runs, clean exits on empty queues. Resolve required input before admission: interactive requests may need clarification; unattended requests with missing input return `recovery-required` without guessing or applying side effects. Flows run under native schedulers as often as under a human.
11
11
  - **Never weaken a gate to get work through it — fix the work.**
12
12
 
13
13
  The model these follow from (the four factories, the gate, the loops, the brownfield on-ramp) is [reference/factory-model.md](../reference/factory-model.md); read it when you need the shape rather than the obligations.
@@ -16,6 +16,8 @@ The model these follow from (the four factories, the gate, the loops, the brownf
16
16
 
17
17
  Treat every request as potentially underspecified. Before starting any work:
18
18
 
19
+ **Unattended: override stop-and-ask below.** Missing input means `recovery-required`: no guessing, prompts or side effects. Ask only before interactive admission.
20
+
19
21
  1. Identify ambiguities that would prevent completion. If any exist, stop and ask.
20
22
  2. Identify open questions whose answers would change your approach. If any exist, stop and ask.
21
23
  3. Define how you will empirically verify the work is complete by USING the resulting software, not just running tests. If you cannot define this, stop and ask.
@@ -25,14 +25,25 @@ The result is one-directional propagation. **New guidance travels; corrections d
25
25
  - **Record every withdrawal in the ledger, with one command.** Retracting a claim you circulated,
26
26
  wrote down, or published is not done until this has run:
27
27
 
28
+ ```sh
29
+ node "$CLAUDE_PLUGIN_ROOT/hooks/withdrawn-rulings.mjs" --withdraw "<id>" \
30
+ --claim "<the withdrawn claim, verbatim>" \
31
+ --because "<what disproved it>" \
32
+ --derived "<an artifact you left standing on it>"
28
33
  ```
29
- node "$CLAUDE_PLUGIN_ROOT/hooks/withdrawn-rulings.mjs" --withdraw <id> \
34
+
35
+ If the audit found no surviving derived artifact, use this alternative:
36
+
37
+ ```sh
38
+ node "$CLAUDE_PLUGIN_ROOT/hooks/withdrawn-rulings.mjs" --withdraw "<id>" \
30
39
  --claim "<the withdrawn claim, verbatim>" \
31
40
  --because "<what disproved it>" \
32
- --derived "<an artifact you left standing on it>" ... | --derived none \
33
- [--superseded-by <id>] [--reached <channel> ...]
41
+ --derived none
34
42
  ```
35
43
 
44
+ Repeat `--derived "<artifact>"` for additional artifacts. Either form may also
45
+ include `--superseded-by "<id>"` and repeated `--reached "<channel>"` arguments.
46
+
36
47
  The verbatim claim is required and the command refuses without it: **a tombstone the holder of the
37
48
  claim cannot recognise reaches them without reaching them.**
38
49
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Automation Runbook Contract (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## BDD Behavior Contract & E2E Coverage (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Blocker Containment (load-bearing)
8
8
 
@@ -39,7 +39,7 @@ A false negative (left blocked) costs a cycle and is visible. A false positive (
39
39
 
40
40
  ## The one carve-out: a blocker with no code
41
41
 
42
- A dependency need not deliver code. A blocker **closed as completed** that positively declares no code deliverable — `Target Backend Environment: None — no runtime behavior change` (doc-only / config-only / type-only), no linked PR, no merge commit — is **cleared**, because there is no artifact whose location could matter.
42
+ A dependency need not deliver code. A blocker **closed as completed** that positively declares no code deliverable — `## Target Backend Environment` reading `None — no runtime behavior change: <kind>` (`doc-only` / `config-only` / `type-only`), no linked PR, no merge commit — is **cleared**, because there is no artifact whose location could matter.
43
43
 
44
44
  This requires a **positive determination**, never an absence. "I could not find a PR" is fail-closed under the rule above; "the item declares it ships no code" is this carve-out. Collapsing the two turns the carve-out into a universal bypass.
45
45
 
@@ -131,7 +131,7 @@ A blocker is cleared under this carve-out when **all** of the following hold:
131
131
 
132
132
  1. it is **closed as completed** (not `not planned` — see `rejection-detection`, where *not planned* is a durable decline);
133
133
  2. it **positively declares no code deliverable** — `## Target Backend Environment` reading `None — no runtime behavior change: doc-only` (or `config-only` / `type-only`), per the grammar `derived-branch-plan` already defines;
134
- 3. it has **no linked merged PR**. If it has one, the normal containment test applies regardless of what the section declares — the code is the authority over the prose.
134
+ 3. it has **no linked PR and no merge commit**. Any linked PR requires the normal containment test regardless of what the section declares; an open or unmerged PR remains blocking — the code is the authority over the prose.
135
135
 
136
136
  This is a **positive determination, never an absence.** "I could not find a PR" is `no-pr` in the fail-closed table above. "The item declares that it ships no code" is this carve-out. Collapsing the two converts a narrow carve-out into a universal bypass, and it is the single most likely way for this rule to be implemented wrongly.
137
137
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Claim-Time Archaeology (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Claim → Evidence Mapping Contract (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Claim-Time Guards (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Control Reachability — A Prescribed Control Must Reach the Changed Path (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Convergent Review
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Credential-Substrate Precedence (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Dependency Decisions (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Dependency Internalization Kit (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Dependency Trust Classes (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Deployed-State Readback (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Derived Branch Plan (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Design Source of Truth (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Design Value Binding (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Documentation Source Paths (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Leaf-Only Build-Ready Invariant (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Observability Audit (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## PRD Definition of Ready (requirement atoms)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## PRD Lifecycle Rollup & Generated-Top-Level-Work Contract (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Pre-Flight Spec Autofill — Draft-Then-Block (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Promotion Contract (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Repository Readiness Rubric (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Ready-Role Filing (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Rejection Detection at Claim Time (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Repo Scope & Work-Time Splitting (load-bearing)
8
8
 
@@ -42,9 +42,10 @@ A tracker can oversee multiple repos. Build-intake claims only current-repo tick
42
42
 
43
43
  Then, for each ready candidate:
44
44
 
45
- 1. **Read `repo:<name>` label.** Wrong repo → skip. Current repo → leaf-only gate + claim. Unlabeled → determine + stamp + re-apply.
46
- 2. **Multi-repo leaf → split, never claim.** Each split sibling is created build-ready and stamped with its own `repo:<name>`.
47
- 3. **Wrong-repo single-repo leaf → skip** (label keeps it cheap next cycle).
45
+ 1. **Count distinct repository markers first** — all `repo:<name>` labels plus recognized JIRA repository components, deduplicated by repository. Containers go to the leaf-only gate; do not split them.
46
+ 2. **Multi-repo leaf → split, never claim.** More than one repository uses the work-time split; each sibling is build-ready and stamped with its own `repo:<name>`.
47
+ 3. **Exactly one repository:** current repo → leaf-only gate + claim; wrong repo → skip.
48
+ 4. **No repository marker:** determine from content and code, stamp the resolved markers, then re-apply this decision from the count.
48
49
 
49
50
  ---
50
51
 
@@ -86,12 +87,10 @@ A ticketing system can oversee multiple repos (one JIRA project / Linear team fo
86
87
 
87
88
  Resolve the current repo per the `config-resolution` "Repo scoping" section (config `repo` → `github.repo` → git remote basename; stop with a clear error if unresolvable). Then walk the ready candidates in priority order and apply the **repo-scope decision** to each before claiming:
88
89
 
89
- 1. **Read the candidate's repo marker** — the `repo:<name>` label (JIRA: also a component equal to a repo name).
90
- - **Labeled for another repo** → **skip** cheaply (do not claim, do not re-determine); it stays `ready` for that repo's own intake. Move to the next candidate.
91
- - **Labeled for the current repo** → proceed to the leaf-only gate + claim (the cheap, common path once labels exist).
92
- - **Unlabeled** → **determine** the target repo(s) from the ticket (description, acceptance criteria, technical approach) confirmed against the actual code surfaces the change requires — the same detection as step 1 of the work-time split. Then **stamp** the resolved `repo:<name>` label(s) so future cycles filter cheaply, and re-apply this decision with the now-known repo.
93
- 2. **Multi-repo leaf → split, never claim.** If determination finds the leaf touches more than one repo, run the **work-time split procedure** below to break it into single-repo siblings — each created **build-ready** (`build_ready: true`, so the build queue auto-claims it) and stamped with its own `repo:<name>`. After the split, the current repo's sibling (if any) becomes a normal current-repo candidate; the others are separate single-repo `ready` leaves for their repos. A multi-repo leaf is never claimed as-is.
94
- 3. **Wrong repo → skip.** A single-repo leaf whose `repo:<name>` ≠ the current repo is left `ready` (and labeled) and skipped; intake moves on until it finds a claimable current-repo leaf, then stops (one item per cycle).
90
+ 1. **Count distinct repository markers first** — all `repo:<name>` labels and JIRA components equal to recognized repository names, deduplicated by repository. Containers go to the leaf-only gate and are never split or claimed here.
91
+ 2. **Multi-repo leaf → split, never claim.** More than one distinct repository takes the work-time split procedure before any wrong-repository skip. Each sibling is created **build-ready** (`build_ready: true`) and stamped with its own `repo:<name>`. The current repo's sibling, if any, becomes a normal candidate.
92
+ 3. **Exactly one repository:** a single-repo leaf for the current repo proceeds to the leaf-only gate + claim; a leaf for another repo is skipped and left ready for its own intake.
93
+ 4. **No repository marker:** determine the target repo(s) from description, acceptance criteria, technical approach and actual code surfaces. Stamp the resolved `repo:<name>` labels and re-apply from step 1. Continue until one current-repo leaf is claimed or the candidates are exhausted.
95
94
 
96
95
  **Query-time pre-filter (the cheapest arm — apply before the per-candidate walk).** When the queue is queryable, scope the candidate **query itself** to the current repo so sibling-repo tickets never even enter the set — instead of pulling the whole project's ready tickets and skipping the wrong ones one-by-one (a full wasted scan when none belong to the current repo, e.g. a JIRA project shared across `frontend`/`backend`/`infrastructure`). On JIRA, append to the JQL:
97
96
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Reset/Seed Coverage & State Classification (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Usage Accounting (load-bearing)
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
4
4
  > section below is the former eager head, preserved verbatim; the full
5
- > contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
5
+ > contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
6
6
 
7
7
  ## Work-Item Definition of Ready (type-keyed)
8
8
 
@@ -215,9 +215,15 @@ nothing survives, exit on the denominator-stated summary from `summarizeDryLane`
215
215
  A blocker is a **claim with a timestamp, not a fact** — it goes stale the moment its condition comes
216
216
  true, and nothing re-read one before this phase. For each `$BLOCKED` candidate:
217
217
 
218
- 1. **Human gate first, and it is absolute.** An issue carrying the configured human-needed label
219
- (`github.labels.build.human_needed`, default `human-needed`) or a `[lisa-human-gate]` marker in
220
- its body is **never** auto-selected, whatever any probe says.
218
+ 1. **Read release comments before applying the human gate.** Pass all item comments, labels,
219
+ body and configured `humanNeededLabel` to `classifyReadyCandidate(...)`. For a discharged hold,
220
+ call `planHumanGateRelease({ labels, body, comments, humanNeededLabel, readyLabel, lifecycleLabels, alreadyNotified })`
221
+ and retain its plan. Apply human-marker cleanup only as planned; defer any ready-role restoration
222
+ until steps 2–5 have cleared the remaining blockers (map the role to the vendor's state or label).
223
+ A still-active hold is never auto-selected, whatever any probe says. An absent or unreadable
224
+ comment history cannot discharge a hold. A release removes only the human hold: continue the
225
+ remaining blocker checks below before selecting the item.
226
+
221
227
  2. **Extract the stated discharge condition**, then **probe it**. Machine-testable conditions — a
222
228
  version on trunk, a published package, a CI run history, an advisory's patched status — rot
223
229
  fastest and are cheapest to check. A human decision is not machine-testable; leave it.
@@ -335,8 +341,9 @@ other gate's verdict — however conclusive — may promote an item a person par
335
341
  is the same repair the leaf-only gate already performs for a ready item that must not be
336
342
  dispatched.
337
343
  4. **On `claimable: true` for an item that still carries a hold, RELEASE it — do not just proceed.**
338
- The hold left durable state behind: the item is out of the queue and flagged as needing a person,
339
- and answering the question does not undo either. Call
344
+ This ready-lane candidate can retain a historical body marker and a human-needed label.
345
+ This step reconciles only candidates still in the ready lane; released holds outside it are
346
+ recovered by `lisa-repair-intake` step 2b (or Phase 2.5 when included in this cycle). Call
340
347
  `planHumanGateRelease({ labels, body, comments, humanNeededLabel, readyLabel, lifecycleLabels, alreadyNotified })`
341
348
  and apply exactly the actions it returns: remove the configured human-needed marker, add the
342
349
  configured ready role back, and post `formatHumanGateReleaseNote()` once. It is the exact inverse
@@ -369,11 +376,12 @@ GitHub Issues live in one repo by definition, so the scanned repo's issues are u
369
376
  1. **Resolve the current repo** per `config-resolution` "Repo scoping" (`.repo` → `.github.repo` → `git remote get-url origin` basename). If unresolvable, stop and report.
370
377
  2. **Cheap path first.** Prefer candidates already carrying the `repo:<current>` label. Keep the Phase 2 scan broad so unlabeled issues are still seen, determined, and stamped.
371
378
  3. **Per candidate, apply the repo-scope decision (`repo-scope-split`):**
372
- - Carries `repo:<other>` → **skip** (leave it `ready` for that repo's own intake); next candidate.
373
- - **Unlabeled** → determine the target repo(s) from the issue + code surfaces, then **stamp** `repo:<name>` via `gh issue edit <n> --add-label "repo:<name>"` (create the label lazily) so later cycles filter cheaply; re-apply with the now-known repo. (An issue whose work is entirely in the scanned repo is simply labeled `repo:<current>`.)
374
- - **Container visibility is allowed.** A multi-repo Epic / Story / Spike may legitimately carry multiple `repo:<name>` labels for operator visibility. Do not split or claim it here; leave the repo markers intact and fall through to the leaf-only gate, which repairs the stale build-ready label instead of dispatching the container.
375
- - **Multi-repo leaf → split, never claim.** Run the `repo-scope-split` work-time procedure into single-repo siblings, each created **build-ready** (`build_ready: true`) and stamped with its own `repo:<name>`; the current repo's sibling becomes a normal candidate.
376
- - **Single-repo leaf for the current repo** → fall through to 3a (leaf-only gate) and 3b (claim).
379
+ - **Count distinct repository markers first**: collect all `repo:<name>` labels and, on JIRA, recognized repository components; deduplicate by repository. A container may carry multiple `repo:<name>` labels. Do not split or claim it here; send it to the leaf-only gate.
380
+ - **Multi-repo leaf → split, never claim.** More than one repository takes the work-time split before any wrong-repository skip. Each sibling is **build-ready** (`build_ready: true`) and stamped with its own `repo:<name>`; the current repo's sibling becomes a normal candidate.
381
+ - **Exactly one other repository** (`repo:<other>`) → **skip**, leaving the item ready for that repo's intake.
382
+ - **No repository marker** → determine target repo(s) from the ticket and code, stamp `repo:<name>` through the vendor access layer, and re-apply from the count.
383
+ - **Single-repo leaf for the current repo** → fall through to 3a and 3b.
384
+
377
385
  4. Continue until a claimable current-repo leaf is found (claim it; one per cycle) or the candidate set is exhausted — exit cleanly on the denominator-stated summary, naming the current repo alongside the swept lanes.
378
386
 
379
387
  #### 3a. Leaf-only claim gate (repair containers)
@@ -189,9 +189,15 @@ swept (see `automation-runbook-contract`).
189
189
  A blocker is a **claim with a timestamp, not a fact** — it goes stale the moment its condition comes
190
190
  true, and nothing re-read one before this phase. For each pre-work candidate outside `$READY`:
191
191
 
192
- 1. **Human gate first, and it is absolute.** A ticket carrying the configured human-needed label
193
- (`jira.labels.human_needed`, default `Human Needed`) or a `[lisa-human-gate]` marker in its
194
- description is **never** auto-selected, whatever any probe says.
192
+ 1. **Read release comments before applying the human gate.** Pass all item comments, labels,
193
+ body and configured `humanNeededLabel` to `classifyReadyCandidate(...)`. For a discharged hold,
194
+ call `planHumanGateRelease({ labels, body, comments, humanNeededLabel, readyLabel, lifecycleLabels, alreadyNotified })`
195
+ and retain its plan. Apply human-marker cleanup only as planned; defer any ready-role restoration
196
+ until steps 2–5 have cleared the remaining blockers (map the role to the vendor's state or label).
197
+ A still-active hold is never auto-selected, whatever any probe says. An absent or unreadable
198
+ comment history cannot discharge a hold. A release removes only the human hold: continue the
199
+ remaining blocker checks below before selecting the item.
200
+
195
201
  2. **Extract the stated discharge condition**, then **probe it**. Machine-testable conditions — a
196
202
  version on trunk, a published package, a CI run history, an advisory's patched status — rot
197
203
  fastest and are cheapest to check. A human decision is not machine-testable; leave it.
@@ -240,8 +246,9 @@ other gate's verdict — however conclusive — may promote an item a person par
240
246
  is the same repair the leaf-only gate already performs for a ready item that must not be
241
247
  dispatched.
242
248
  4. **On `claimable: true` for an item that still carries a hold, RELEASE it — do not just proceed.**
243
- The hold left durable state behind: the item is out of the queue and flagged as needing a person,
244
- and answering the question does not undo either. Call
249
+ This ready-lane candidate can retain a historical body marker and a human-needed label.
250
+ This step reconciles only candidates still in the ready lane; released holds outside it are
251
+ recovered by `lisa-repair-intake` step 2b (or Phase 2.5 when included in this cycle). Call
245
252
  `planHumanGateRelease({ labels, body, comments, humanNeededLabel, readyLabel, lifecycleLabels, alreadyNotified })`
246
253
  and apply exactly the actions it returns: remove the configured human-needed marker, add the
247
254
  configured ready role back, and post `formatHumanGateReleaseNote()` once. It is the exact inverse
@@ -274,10 +281,12 @@ A JIRA project can oversee multiple repos (`frontend` / `backend` / `infrastruct
274
281
  1. **Resolve the current repo** per `config-resolution` "Repo scoping" (`.repo` → `.github.repo` → `git remote get-url origin` basename). If unresolvable, stop and report — do not claim tickets you cannot scope.
275
282
  2. **Cheap path first.** Phase 1's query-time pre-filter has already dropped tickets explicitly stamped for a sibling repo, so the Phase 2 result set is current-repo-labeled + unlabeled tickets. Prefer candidates already carrying `repo:<current>` — a JIRA **label**, or a **component** equal to the repo name (accepted as an alias); the pre-filter is label-only, so a ticket scoped solely by a sibling-repo **component** can still appear and is skipped here. The result set still includes unlabeled tickets so they can be determined and stamped; this gate orders/filters what remains.
276
283
  3. **Per candidate, apply the repo-scope decision (`repo-scope-split`):**
277
- - Carries `repo:<other>` (label or component) → **skip** (leave it `ready` for that repo's own intake); next candidate.
278
- - **Unlabeled** → determine the target repo(s) from the ticket (description, AC, technical approach) confirmed against the code surfaces, then **stamp** `repo:<name>` via `lisa-atlassian-access` `operation: write-ticket` (add the label / set the component) so later cycles filter cheaply; re-apply with the now-known repo.
279
- - **Multi-repo leaf → split, never claim.** Run the `repo-scope-split` work-time procedure to break it into single-repo siblings, each created **build-ready** (`build_ready: true`) and stamped with its own `repo:<name>`; the current repo's sibling becomes a normal candidate.
280
- - **Single-repo leaf for the current repo** → fall through to 3a (leaf-only gate) and 3b (claim).
284
+ - **Count distinct repository markers first**: collect all `repo:<name>` labels and, on JIRA, recognized repository components; deduplicate by repository. A container may carry multiple `repo:<name>` labels. Do not split or claim it here; send it to the leaf-only gate.
285
+ - **Multi-repo leaf → split, never claim.** More than one repository takes the work-time split before any wrong-repository skip. Each sibling is **build-ready** (`build_ready: true`) and stamped with its own `repo:<name>`; the current repo's sibling becomes a normal candidate.
286
+ - **Exactly one other repository** (`repo:<other>`) → **skip**, leaving the item ready for that repo's intake.
287
+ - **No repository marker** → determine target repo(s) from the ticket and code, stamp `repo:<name>` through the vendor access layer, and re-apply from the count.
288
+ - **Single-repo leaf for the current repo** → fall through to 3a and 3b.
289
+
281
290
  4. Continue until a claimable current-repo leaf is found (claim it; one per cycle) or the candidate set is exhausted — exit cleanly on the denominator-stated summary, naming the current repo alongside the swept lanes.
282
291
 
283
292
  #### 3a. Leaf-only claim gate (skip / safe-block containers)