@codyswann/lisa 4.37.3 → 4.38.1

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 (96) hide show
  1. package/all/copy-contents/.gitattributes +9 -0
  2. package/all/copy-overwrite/scripts/lisa-work-item.mjs +209 -8
  3. package/dist/core/learnings-merge-driver.d.ts +8 -0
  4. package/dist/core/learnings-merge-driver.d.ts.map +1 -1
  5. package/dist/core/learnings-merge-driver.js +17 -0
  6. package/dist/core/learnings-merge-driver.js.map +1 -1
  7. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  8. package/dist/core/lisa-owned-hash-ledger.js +6 -0
  9. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  10. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  11. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  12. package/dist/core/upstream-evidence-manifest.js +37 -5
  13. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  14. package/package.json +5 -4
  15. package/plugins/lisa/.claude-plugin/plugin.json +37 -1
  16. package/plugins/lisa/.codex-plugin/hooks.json +36 -0
  17. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  18. package/plugins/lisa/.codex-plugin/skills/lisa-git-submit-pr/SKILL.md +8 -3
  19. package/plugins/lisa/hooks/discharge-work-item-gates.sh +54 -0
  20. package/plugins/lisa/hooks/withdrawn-rulings.mjs +525 -0
  21. package/plugins/lisa/hooks/withdrawn-rulings.sh +24 -0
  22. package/plugins/lisa/rules/eager/withdrawn-rulings.md +69 -0
  23. package/plugins/lisa/rules/reference/withdrawn-rulings.md +114 -0
  24. package/plugins/lisa/skills/lisa-git-submit-pr/SKILL.md +8 -3
  25. package/plugins/lisa-agy/plugin.json +1 -1
  26. package/plugins/lisa-agy/skills/lisa-git-submit-pr/SKILL.md +8 -3
  27. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  29. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  30. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-copilot/.claude-plugin/plugin.json +28 -1
  33. package/plugins/lisa-copilot/hooks/discharge-work-item-gates.sh +54 -0
  34. package/plugins/lisa-copilot/hooks/withdrawn-rulings.mjs +525 -0
  35. package/plugins/lisa-copilot/hooks/withdrawn-rulings.sh +24 -0
  36. package/plugins/lisa-copilot/rules/eager/withdrawn-rulings.md +69 -0
  37. package/plugins/lisa-copilot/rules/reference/withdrawn-rulings.md +114 -0
  38. package/plugins/lisa-copilot/skills/lisa-git-submit-pr/SKILL.md +8 -3
  39. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-cursor/hooks/discharge-work-item-gates.sh +54 -0
  41. package/plugins/lisa-cursor/hooks/hooks.json +14 -0
  42. package/plugins/lisa-cursor/hooks/withdrawn-rulings.mjs +525 -0
  43. package/plugins/lisa-cursor/hooks/withdrawn-rulings.sh +24 -0
  44. package/plugins/lisa-cursor/rules/withdrawn-rulings-reference.mdc +119 -0
  45. package/plugins/lisa-cursor/rules/withdrawn-rulings.mdc +74 -0
  46. package/plugins/lisa-cursor/skills/lisa-git-submit-pr/SKILL.md +8 -3
  47. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  49. package/plugins/lisa-expo-agy/plugin.json +1 -1
  50. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  55. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  60. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  65. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  69. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  70. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  74. package/plugins/lisa-rails-agy/plugin.json +1 -1
  75. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  79. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  80. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  84. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  85. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  87. package/plugins/src/base/.claude-plugin/plugin.json +36 -0
  88. package/plugins/src/base/hooks/discharge-work-item-gates.sh +54 -0
  89. package/plugins/src/base/hooks/withdrawn-rulings.mjs +525 -0
  90. package/plugins/src/base/hooks/withdrawn-rulings.sh +24 -0
  91. package/plugins/src/base/rules/eager/withdrawn-rulings.md +69 -0
  92. package/plugins/src/base/rules/reference/withdrawn-rulings.md +114 -0
  93. package/plugins/src/base/skills/lisa-git-submit-pr/SKILL.md +8 -3
  94. package/scripts/lib/hook-registration-audit.mjs +612 -0
  95. package/scripts/lib/per-agent-hook-filter.mjs +19 -0
  96. package/typescript/copy-contents/.husky/pre-push +98 -26
@@ -0,0 +1,74 @@
1
+ ---
2
+ description: "Withdrawn Rulings — a Retraction Travels by the Same Mechanism as the Finding (load-bearing)"
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Withdrawn Rulings — a Retraction Travels by the Same Mechanism as the Finding (load-bearing)
7
+
8
+ **A session is a snapshot, and nothing reaches back into it.** Rules are injected once at session
9
+ start. The plugin version a session executes is resolved once at startup. A fix merged to the
10
+ default branch is not in effect for anything already running. So guidance that is **added** after a
11
+ session starts can at least be found on disk — `settled-decisions` sends you to re-read the
12
+ instruction file at the escalation boundary. Guidance that is **withdrawn** cannot be found at all:
13
+ deleting the source is a push, and a push reaches no existing reader.
14
+
15
+ The result is one-directional propagation. **New guidance travels; corrections do not.**
16
+
17
+ ## The test for any correction
18
+
19
+ > Through which channel did the original claim reach its audience, and has the withdrawal gone
20
+ > through that same channel?
21
+
22
+ - Written to a durable file → the retraction is written to that file.
23
+ - Posted as a work-item comment → edit the original comment, do not only append. A reader who
24
+ arrives later and forms a conclusion never scrolls to the reply.
25
+ - Relayed in a message → it reaches the same recipients, which requires knowing who they were.
26
+ You usually do not, which is why the ledger below exists.
27
+
28
+ ## Mandatory
29
+
30
+ - **Record every withdrawal in the ledger, with one command.** Retracting a claim you circulated,
31
+ wrote down, or published is not done until this has run:
32
+
33
+ ```
34
+ node "$CLAUDE_PLUGIN_ROOT/hooks/withdrawn-rulings.mjs" --withdraw <id> \
35
+ --claim "<the withdrawn claim, verbatim>" \
36
+ --because "<what disproved it>" \
37
+ [--superseded-by <id>] [--reached <channel> ...]
38
+ ```
39
+
40
+ The verbatim claim is required and the command refuses without it: **a tombstone the holder of the
41
+ claim cannot recognise reaches them without reaching them.**
42
+
43
+ - **The ledger is the retraction path, precisely because it is cheap.** Writing a finding feels
44
+ productive; writing a retraction is a chore produced mid-task, after being corrected, when
45
+ attention has moved on. A rule saying "always record retractions durably" is a discipline, and
46
+ disciplines do not reach that moment. One command does.
47
+
48
+ - **Check it at the escalation boundary**, alongside the instruction-file re-read
49
+ `settled-decisions` already requires: `node "$CLAUDE_PLUGIN_ROOT/hooks/withdrawn-rulings.mjs"
50
+ --list`. This is what harnesses with no PostToolUse hook rely on.
51
+
52
+ - **Verify before propagating.** Every retraction is a claim that was relayed before it was checked.
53
+ Relaying a finding makes you a publisher of it, and a publisher owes the correction.
54
+
55
+ ## What arrives on its own
56
+
57
+ On Claude Code the ledger is read for you: it is stamped at session start and re-checked after every
58
+ tool call, so a ruling withdrawn **while you are running** arrives attached to your next tool result
59
+ — naming the claim, why it fell, and what replaced it. Two `stat` calls when nothing changed.
60
+
61
+ It announces only what was withdrawn **since this session started**, and only once each. An
62
+ un-withdrawn ruling is never flagged; a mechanism that made you distrust everything would be worse
63
+ than the gap it closes.
64
+
65
+ ## The failure mode that makes this urgent
66
+
67
+ **A technique that never works can still look like it worked**, because the condition it was
68
+ supposed to create arrives later on its own. That is worse than intermittency: an intermittent
69
+ technique has a success rate an observer can become suspicious of; this has none, only a delayed
70
+ coincidence that reads as confirmation. Such a claim will not retract itself, and everyone holding
71
+ it believes they have seen it succeed.
72
+
73
+ Full prose, the two measured instances, and the ledger's two tiers:
74
+ [reference/withdrawn-rulings.md](withdrawn-rulings-reference.mdc).
@@ -57,6 +57,7 @@ Add provider-appropriate linkage to the PR title and/or body without changing th
57
57
  - **GitHub Issues**:
58
58
  - If `work_item_ref` is a GitHub issue URL, `org/repo#<n>`, or `#<n>`, add a dedicated issue reference line to the PR body.
59
59
  - Always use a non-closing reference such as `Refs #<n>`, so the merge cannot close the issue before the post-merge deploy, remote verification, health check, and terminal `done` label.
60
+ - **This rule is what makes the managed backlink mandatory, and neither rule says so on its own.** `Refs` creates no native development link, so gate 5 has nothing to defer to and the `[lisa-pr-link]` comment becomes the only backlink there is. Anyone following the non-closing rule alone will hit gate 5. Separately, `Refs #<n>` does **not** satisfy gate 4 either: the body needs its own `Work-Item: <ref>` line, and `Closes`/`Fixes` do not satisfy it. One `Refs` line, one `Work-Item:` line, one backlink comment — three different requirements that look like one. `discharge-pr-gates` (below) is what checks the last two together.
60
61
  - **A non-closing reference does not populate the issue's Development / linked pull requests surface, and no non-closing form does.** That surface *is* the closing-reference mechanism: a closing keyword populates the PR's `closingIssuesReferences`, while `Refs` yields only a `CrossReferencedEvent`. Measured on this repository — a `Refs`-only PR reports `closingIssuesReferences: 0`; a `Closes` PR reports 1. So the ticket-side backlink cannot be delegated to GitHub: the managed `[lisa-pr-link]` comment written by `node scripts/lisa-work-item.mjs backlink` — the one producer, which `lisa-github-sync` and the other vendor sync skills call rather than reimplement — is the **required** backlink under this rule, not a fallback for when native linkage happens to be absent. Two-way linkage (`lisa-implement` step 7a) depends on that comment, and so does the Work-Item Traceability check wherever the project declares `workItem.verify: "full"` — there, a PR carrying a correct `Refs` line still fails the check without it. Post it either way: under the default `trailer` level the check does not read the tracker, but the two-way linkage a human follows is still worth having, and a project can raise its level at any time.
61
62
  - For cross-repo issue refs, use the fully qualified non-closing form, for example `Refs CodySwannGT/lisa#614`.
62
63
  - **Linear**:
@@ -76,13 +77,17 @@ When updating an existing PR, preserve any existing linkage line unless the new
76
77
  After creating or updating the PR, always make the reverse link durable on the source work item when `work_item_ref` is available:
77
78
 
78
79
  1. Resolve the live PR URL with `gh pr view <pr-number> --json url --jq .url`.
79
- 2. Run the backlink command. It is the executable form of this requirement — it writes the managed `[lisa-pr-link]` comment on the work item, or updates the one already there, for every tracker Lisa supports:
80
+ 2. Discharge the two gates the push could not check. Gate 4 (the `Work-Item:` line in the PR BODY) and gate 5 (the backlink) are both properties of a pull request, so a push before the PR existed reported them as `UNRESOLVED` rather than checked. One command closes both out at the first moment they *are* checkable:
80
81
 
81
82
  ```bash
82
- node scripts/lisa-work-item.mjs backlink --ref <work_item_ref> --pr-url <url>
83
+ node scripts/lisa-work-item.mjs discharge-pr-gates
83
84
  ```
84
85
 
85
- It is idempotent, so run it on every push rather than deciding whether it is needed. It refuses loudly for a tracker it cannot write, and never silently no-ops. Do not hand-post the comment, and do not describe the posting procedure anywhere: the same file that writes it is the file that checks it, which is what keeps producer and consumer from drifting.
86
+ It posts (or refreshes) the managed `[lisa-pr-link]` comment on every item the range names — so gate 5 passes without anyone remembering to — and then evaluates gate 4 against the live body, failing here rather than one CI cycle later. Exit 3 means there is no pull request for this branch yet, which is not a violation; exit 1 is a real unmet requirement and the message names it.
87
+
88
+ It writes no PR body. Gate 4 is the author's declaration of what the change is for; a command that inserted the line would be answering its own question.
89
+
90
+ The narrower `node scripts/lisa-work-item.mjs backlink --ref <work_item_ref> --pr-url <url>` is what it wraps, and remains the right call when you hold a ref and a URL but no checkout of the PR's branch (a sync skill updating a backlink after the fact). Both are idempotent, refuse loudly for a tracker they cannot write, and never silently no-op. Do not hand-post the comment, and do not describe the posting procedure anywhere: the same file that writes it is the file that checks it, which is what keeps producer and consumer from drifting.
86
91
  3. Invoke `lisa-tracker-sync` with the original work item ref, milestone `pr-ready`, `pr_url=<url>`, and `tracker_provider=<provider>` when known. That is the progress-note and status side; it is not what satisfies the traceability check.
87
92
  4. When the PR later merges, invoke `lisa-tracker-sync` again with milestone `pr-merged`, the same `pr_url`, and the merge SHA when available.
88
93
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.37.3",
3
+ "version": "4.38.1",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -72,6 +72,15 @@
72
72
  }
73
73
  ]
74
74
  },
75
+ {
76
+ "matcher": "Bash",
77
+ "hooks": [
78
+ {
79
+ "type": "command",
80
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/discharge-work-item-gates.sh"
81
+ }
82
+ ]
83
+ },
75
84
  {
76
85
  "matcher": "Edit|Write|NotebookEdit|Bash",
77
86
  "hooks": [
@@ -89,6 +98,15 @@
89
98
  "command": "${CLAUDE_PLUGIN_ROOT}/hooks/enforce-team-first.sh"
90
99
  }
91
100
  ]
101
+ },
102
+ {
103
+ "matcher": "Bash|Edit|Write|Read|Task|Grep|Glob",
104
+ "hooks": [
105
+ {
106
+ "type": "command",
107
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/withdrawn-rulings.sh --hook"
108
+ }
109
+ ]
92
110
  }
93
111
  ],
94
112
  "PreToolUse": [
@@ -201,6 +219,15 @@
201
219
  }
202
220
  ]
203
221
  },
222
+ {
223
+ "matcher": "",
224
+ "hooks": [
225
+ {
226
+ "type": "command",
227
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/withdrawn-rulings.sh --session-start"
228
+ }
229
+ ]
230
+ },
204
231
  {
205
232
  "matcher": "",
206
233
  "hooks": [
@@ -248,6 +275,15 @@
248
275
  }
249
276
  ]
250
277
  },
278
+ {
279
+ "matcher": "",
280
+ "hooks": [
281
+ {
282
+ "type": "command",
283
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/withdrawn-rulings.sh --session-start"
284
+ }
285
+ ]
286
+ },
251
287
  {
252
288
  "matcher": "",
253
289
  "hooks": [
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env bash
2
+ # This file is managed by Lisa.
3
+ # Do not edit directly — changes will be overwritten on the next `lisa` run.
4
+ # =============================================================================
5
+ # Discharge Deferred Work-Item Gates Hook (PostToolUse - Bash)
6
+ # =============================================================================
7
+ # Two of the five Work-Item Traceability gates live OUTSIDE the commits: gate 4
8
+ # is the `Work-Item:` line in the pull-request BODY, and gate 5 is the managed
9
+ # `[lisa-pr-link]` backlink on the item. A push cannot check either one —
10
+ # both are properties of a pull request, and the push is what makes the pull
11
+ # request possible — so until this hook existed the next thing that looked was
12
+ # CI, one cycle later (CodySwannGT/lisa#3791).
13
+ #
14
+ # This fires the moment a pull request is created or its body edited, which is
15
+ # the FIRST moment both gates are checkable. It evaluates them, and posts the
16
+ # backlink that gate 5 needs, so neither waits for a red CI run to be revealed.
17
+ #
18
+ # Exit 2 blocks and hands the output back to the agent, which is the point: a
19
+ # non-blocking notice here would be the same defect the discharge exists to
20
+ # fix — a finding delivered somewhere nobody has to act on it.
21
+ # =============================================================================
22
+ set -uo pipefail
23
+
24
+ JSON_INPUT="$(cat)"
25
+
26
+ command -v jq >/dev/null 2>&1 || exit 0
27
+ command -v node >/dev/null 2>&1 || exit 0
28
+
29
+ COMMAND="$(printf '%s' "$JSON_INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null || true)"
30
+ [ -n "$COMMAND" ] || exit 0
31
+
32
+ # `gh pr create` opens one; `gh pr edit` is the other way a body comes to carry
33
+ # — or lose — its declaration. Both change the answer to gate 4.
34
+ case "$COMMAND" in
35
+ *"gh pr create"* | *"gh pr edit"*) ;;
36
+ *) exit 0 ;;
37
+ esac
38
+
39
+ repo_root="$(git rev-parse --show-toplevel 2>/dev/null)" || exit 0
40
+ [ -f "$repo_root/scripts/lisa-work-item.mjs" ] || exit 0
41
+
42
+ output="$(cd "$repo_root" && node scripts/lisa-work-item.mjs discharge-pr-gates 2>&1)"
43
+ status=$?
44
+
45
+ # 0 is a clean discharge. 3 is the validator's own answer for "no pull request
46
+ # to check yet", which PostToolUse reaches on every `gh pr create` that FAILED
47
+ # — the tool call still ran, so the hook still fires. Collapsing 3 into the
48
+ # blocking arm would report a work-item violation on somebody's typo.
49
+ case "$status" in
50
+ 0 | 3) exit 0 ;;
51
+ esac
52
+
53
+ printf '%s\n' "$output" >&2
54
+ exit 2