@codyswann/lisa 2.214.0 → 2.216.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +54 -1
  5. package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +54 -1
  6. package/plugins/lisa-agy/plugin.json +1 -1
  7. package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +54 -1
  8. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  9. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  10. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  11. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  12. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  14. package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +54 -1
  15. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +54 -1
  17. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  19. package/plugins/lisa-expo-agy/plugin.json +1 -1
  20. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  24. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  25. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  29. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  30. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  34. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  35. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  39. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  40. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-rails-agy/plugin.json +1 -1
  45. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  49. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  50. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  55. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +54 -1
  58. package/typescript/copy-overwrite/.github/GITHUB_ACTIONS.md +7 -3
  59. package/typescript/create-only/.github/workflows/claude-ci-auto-fix.yml +6 -2
  60. package/typescript/create-only/.github/workflows/claude-deploy-auto-fix.yml +4 -2
package/package.json CHANGED
@@ -95,7 +95,7 @@
95
95
  "ws": ">=8.20.1"
96
96
  },
97
97
  "name": "@codyswann/lisa",
98
- "version": "2.214.0",
98
+ "version": "2.216.0",
99
99
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
100
100
  "main": "dist/index.js",
101
101
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.214.0",
3
+ "version": "2.216.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.214.0",
3
+ "version": "2.216.0",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -36,6 +36,43 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
36
36
  Resolve `<owner>/<repo>` from `gh repo view --json nameWithOwner` (or the PR URL).
37
37
  Use plain `gh` + `git` so Claude and Codex execute identically.
38
38
 
39
+ ## 0. Take the babysitter lease
40
+
41
+ This skill is the branch's owner while it runs. Declare that ownership so the
42
+ CI auto-fix workflow (`reusable-claude-ci-auto-fix.yml`) stands down instead of
43
+ pushing competing fixes to the same branch (the single-writer rule):
44
+
45
+ ```bash
46
+ gh label create "lisa:babysitter-on-duty" \
47
+ --description "A drive-pr-to-merge session is actively driving this PR; CI auto-fix must stand down" \
48
+ --color FBCA04 || true # tolerate only already-exists; check the next step
49
+ gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
50
+ gh pr view <pr> --json labels \
51
+ --jq '[.labels[].name] | contains(["lisa:babysitter-on-duty"])'
52
+ ```
53
+
54
+ Verify the final command prints `true` before driving. If the label could not
55
+ be attached (for example, no label-write permission), retry once; if it still
56
+ fails, surface a warning that the branch is unleased — the CI auto-fix
57
+ workflow may engage in parallel — and watch for its `claude-auto-fix-*` PR
58
+ per section 2f while driving.
59
+
60
+ The auto-fix workflow reads freshness from the label's most recent `labeled`
61
+ timeline event and treats stamps older than its TTL (default 90 minutes) as
62
+ stale. **Refresh the lease** whenever more than ~30 minutes have passed since
63
+ the last stamp while the watch loop is still running — a refresh is a
64
+ remove + re-add (re-adding an existing label does not create a new timeline
65
+ event):
66
+
67
+ ```bash
68
+ gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"
69
+ gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
70
+ ```
71
+
72
+ **Release the lease** (remove the label) at every terminal state — merged,
73
+ closed, or a hard block handed to a human. A crashed session that never
74
+ releases is why the TTL exists; do not rely on it as the normal release path.
75
+
39
76
  ## 1. Enable auto-merge
40
77
 
41
78
  Before enabling auto-merge, capture the live PR head and compare it to
@@ -74,7 +111,8 @@ gh pr view <pr> --json state,mergeStateStatus,mergeable,reviewDecision,statusChe
74
111
  ```
75
112
 
76
113
  Handle every blocker class; after any fix, re-poll and continue. Do not stop while
77
- the PR is still open and progress is possible.
114
+ the PR is still open and progress is possible. On each iteration, refresh the
115
+ babysitter lease if its last stamp is older than ~30 minutes (section 0).
78
116
 
79
117
  In **`on_blocker=report`** mode, only the mechanical step (a) and auto-merge enabling
80
118
  apply; for any of (b)–(e) do not act — classify the blocker and return per the input
@@ -150,6 +188,16 @@ Some org rulesets allow 0 approvals yet a bot `CHANGES_REQUESTED` still blocks
150
188
  auto-merge — dismissing the stale review after resolving all threads is what
151
189
  unblocks it.
152
190
 
191
+ ### f. Pending auto-fix PR into this branch
192
+ If an open PR from `claude-auto-fix-<headRefName>` targets this PR's head
193
+ branch (the CI auto-fix workflow engaged before this session took the lease),
194
+ adjudicate it: merge it into the head branch if the fix is correct and still
195
+ needed, otherwise close it and delete the side branch. Never leave it dangling
196
+ — it represents a competing writer's pending work. Merging it mutates the
197
+ driven branch, so treat it like any other push: disarm auto-merge first,
198
+ re-read `headRefOid`, reset `verify_commit` to the merged head, wait for that
199
+ head's checks to start, then re-enable auto-merge (section 1).
200
+
153
201
  ## 3. Merge and verify it actually shipped (ancestry check)
154
202
 
155
203
  Enabling auto-merge + green checks + resolved threads is **not** proof the merge
@@ -177,3 +225,8 @@ Loop until one of:
177
225
  needs design input, or genuine unresolved human objection (not a bot gate). Stop
178
226
  and report exactly what is blocking and what was already tried — never force the
179
227
  merge or weaken a gate to get past it.
228
+
229
+ At every terminal state, release the babysitter lease
230
+ (`gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"`) so the CI
231
+ auto-fix workflow can take over as fixer of last resort if the branch goes
232
+ red later with nobody driving it.
@@ -36,6 +36,43 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
36
36
  Resolve `<owner>/<repo>` from `gh repo view --json nameWithOwner` (or the PR URL).
37
37
  Use plain `gh` + `git` so Claude and Codex execute identically.
38
38
 
39
+ ## 0. Take the babysitter lease
40
+
41
+ This skill is the branch's owner while it runs. Declare that ownership so the
42
+ CI auto-fix workflow (`reusable-claude-ci-auto-fix.yml`) stands down instead of
43
+ pushing competing fixes to the same branch (the single-writer rule):
44
+
45
+ ```bash
46
+ gh label create "lisa:babysitter-on-duty" \
47
+ --description "A drive-pr-to-merge session is actively driving this PR; CI auto-fix must stand down" \
48
+ --color FBCA04 || true # tolerate only already-exists; check the next step
49
+ gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
50
+ gh pr view <pr> --json labels \
51
+ --jq '[.labels[].name] | contains(["lisa:babysitter-on-duty"])'
52
+ ```
53
+
54
+ Verify the final command prints `true` before driving. If the label could not
55
+ be attached (for example, no label-write permission), retry once; if it still
56
+ fails, surface a warning that the branch is unleased — the CI auto-fix
57
+ workflow may engage in parallel — and watch for its `claude-auto-fix-*` PR
58
+ per section 2f while driving.
59
+
60
+ The auto-fix workflow reads freshness from the label's most recent `labeled`
61
+ timeline event and treats stamps older than its TTL (default 90 minutes) as
62
+ stale. **Refresh the lease** whenever more than ~30 minutes have passed since
63
+ the last stamp while the watch loop is still running — a refresh is a
64
+ remove + re-add (re-adding an existing label does not create a new timeline
65
+ event):
66
+
67
+ ```bash
68
+ gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"
69
+ gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
70
+ ```
71
+
72
+ **Release the lease** (remove the label) at every terminal state — merged,
73
+ closed, or a hard block handed to a human. A crashed session that never
74
+ releases is why the TTL exists; do not rely on it as the normal release path.
75
+
39
76
  ## 1. Enable auto-merge
40
77
 
41
78
  Before enabling auto-merge, capture the live PR head and compare it to
@@ -74,7 +111,8 @@ gh pr view <pr> --json state,mergeStateStatus,mergeable,reviewDecision,statusChe
74
111
  ```
75
112
 
76
113
  Handle every blocker class; after any fix, re-poll and continue. Do not stop while
77
- the PR is still open and progress is possible.
114
+ the PR is still open and progress is possible. On each iteration, refresh the
115
+ babysitter lease if its last stamp is older than ~30 minutes (section 0).
78
116
 
79
117
  In **`on_blocker=report`** mode, only the mechanical step (a) and auto-merge enabling
80
118
  apply; for any of (b)–(e) do not act — classify the blocker and return per the input
@@ -150,6 +188,16 @@ Some org rulesets allow 0 approvals yet a bot `CHANGES_REQUESTED` still blocks
150
188
  auto-merge — dismissing the stale review after resolving all threads is what
151
189
  unblocks it.
152
190
 
191
+ ### f. Pending auto-fix PR into this branch
192
+ If an open PR from `claude-auto-fix-<headRefName>` targets this PR's head
193
+ branch (the CI auto-fix workflow engaged before this session took the lease),
194
+ adjudicate it: merge it into the head branch if the fix is correct and still
195
+ needed, otherwise close it and delete the side branch. Never leave it dangling
196
+ — it represents a competing writer's pending work. Merging it mutates the
197
+ driven branch, so treat it like any other push: disarm auto-merge first,
198
+ re-read `headRefOid`, reset `verify_commit` to the merged head, wait for that
199
+ head's checks to start, then re-enable auto-merge (section 1).
200
+
153
201
  ## 3. Merge and verify it actually shipped (ancestry check)
154
202
 
155
203
  Enabling auto-merge + green checks + resolved threads is **not** proof the merge
@@ -177,3 +225,8 @@ Loop until one of:
177
225
  needs design input, or genuine unresolved human objection (not a bot gate). Stop
178
226
  and report exactly what is blocking and what was already tried — never force the
179
227
  merge or weaken a gate to get past it.
228
+
229
+ At every terminal state, release the babysitter lease
230
+ (`gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"`) so the CI
231
+ auto-fix workflow can take over as fixer of last resort if the branch goes
232
+ red later with nobody driving it.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.214.0",
3
+ "version": "2.216.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -36,6 +36,43 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
36
36
  Resolve `<owner>/<repo>` from `gh repo view --json nameWithOwner` (or the PR URL).
37
37
  Use plain `gh` + `git` so Claude and Codex execute identically.
38
38
 
39
+ ## 0. Take the babysitter lease
40
+
41
+ This skill is the branch's owner while it runs. Declare that ownership so the
42
+ CI auto-fix workflow (`reusable-claude-ci-auto-fix.yml`) stands down instead of
43
+ pushing competing fixes to the same branch (the single-writer rule):
44
+
45
+ ```bash
46
+ gh label create "lisa:babysitter-on-duty" \
47
+ --description "A drive-pr-to-merge session is actively driving this PR; CI auto-fix must stand down" \
48
+ --color FBCA04 || true # tolerate only already-exists; check the next step
49
+ gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
50
+ gh pr view <pr> --json labels \
51
+ --jq '[.labels[].name] | contains(["lisa:babysitter-on-duty"])'
52
+ ```
53
+
54
+ Verify the final command prints `true` before driving. If the label could not
55
+ be attached (for example, no label-write permission), retry once; if it still
56
+ fails, surface a warning that the branch is unleased — the CI auto-fix
57
+ workflow may engage in parallel — and watch for its `claude-auto-fix-*` PR
58
+ per section 2f while driving.
59
+
60
+ The auto-fix workflow reads freshness from the label's most recent `labeled`
61
+ timeline event and treats stamps older than its TTL (default 90 minutes) as
62
+ stale. **Refresh the lease** whenever more than ~30 minutes have passed since
63
+ the last stamp while the watch loop is still running — a refresh is a
64
+ remove + re-add (re-adding an existing label does not create a new timeline
65
+ event):
66
+
67
+ ```bash
68
+ gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"
69
+ gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
70
+ ```
71
+
72
+ **Release the lease** (remove the label) at every terminal state — merged,
73
+ closed, or a hard block handed to a human. A crashed session that never
74
+ releases is why the TTL exists; do not rely on it as the normal release path.
75
+
39
76
  ## 1. Enable auto-merge
40
77
 
41
78
  Before enabling auto-merge, capture the live PR head and compare it to
@@ -74,7 +111,8 @@ gh pr view <pr> --json state,mergeStateStatus,mergeable,reviewDecision,statusChe
74
111
  ```
75
112
 
76
113
  Handle every blocker class; after any fix, re-poll and continue. Do not stop while
77
- the PR is still open and progress is possible.
114
+ the PR is still open and progress is possible. On each iteration, refresh the
115
+ babysitter lease if its last stamp is older than ~30 minutes (section 0).
78
116
 
79
117
  In **`on_blocker=report`** mode, only the mechanical step (a) and auto-merge enabling
80
118
  apply; for any of (b)–(e) do not act — classify the blocker and return per the input
@@ -150,6 +188,16 @@ Some org rulesets allow 0 approvals yet a bot `CHANGES_REQUESTED` still blocks
150
188
  auto-merge — dismissing the stale review after resolving all threads is what
151
189
  unblocks it.
152
190
 
191
+ ### f. Pending auto-fix PR into this branch
192
+ If an open PR from `claude-auto-fix-<headRefName>` targets this PR's head
193
+ branch (the CI auto-fix workflow engaged before this session took the lease),
194
+ adjudicate it: merge it into the head branch if the fix is correct and still
195
+ needed, otherwise close it and delete the side branch. Never leave it dangling
196
+ — it represents a competing writer's pending work. Merging it mutates the
197
+ driven branch, so treat it like any other push: disarm auto-merge first,
198
+ re-read `headRefOid`, reset `verify_commit` to the merged head, wait for that
199
+ head's checks to start, then re-enable auto-merge (section 1).
200
+
153
201
  ## 3. Merge and verify it actually shipped (ancestry check)
154
202
 
155
203
  Enabling auto-merge + green checks + resolved threads is **not** proof the merge
@@ -177,3 +225,8 @@ Loop until one of:
177
225
  needs design input, or genuine unresolved human objection (not a bot gate). Stop
178
226
  and report exactly what is blocking and what was already tried — never force the
179
227
  merge or weaken a gate to get past it.
228
+
229
+ At every terminal state, release the babysitter lease
230
+ (`gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"`) so the CI
231
+ auto-fix workflow can take over as fixer of last resort if the branch goes
232
+ red later with nobody driving it.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.214.0",
3
+ "version": "2.216.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.214.0",
3
+ "version": "2.216.0",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.214.0",
3
+ "version": "2.216.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.214.0",
3
+ "version": "2.216.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.214.0",
3
+ "version": "2.216.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.214.0",
3
+ "version": "2.216.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -36,6 +36,43 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
36
36
  Resolve `<owner>/<repo>` from `gh repo view --json nameWithOwner` (or the PR URL).
37
37
  Use plain `gh` + `git` so Claude and Codex execute identically.
38
38
 
39
+ ## 0. Take the babysitter lease
40
+
41
+ This skill is the branch's owner while it runs. Declare that ownership so the
42
+ CI auto-fix workflow (`reusable-claude-ci-auto-fix.yml`) stands down instead of
43
+ pushing competing fixes to the same branch (the single-writer rule):
44
+
45
+ ```bash
46
+ gh label create "lisa:babysitter-on-duty" \
47
+ --description "A drive-pr-to-merge session is actively driving this PR; CI auto-fix must stand down" \
48
+ --color FBCA04 || true # tolerate only already-exists; check the next step
49
+ gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
50
+ gh pr view <pr> --json labels \
51
+ --jq '[.labels[].name] | contains(["lisa:babysitter-on-duty"])'
52
+ ```
53
+
54
+ Verify the final command prints `true` before driving. If the label could not
55
+ be attached (for example, no label-write permission), retry once; if it still
56
+ fails, surface a warning that the branch is unleased — the CI auto-fix
57
+ workflow may engage in parallel — and watch for its `claude-auto-fix-*` PR
58
+ per section 2f while driving.
59
+
60
+ The auto-fix workflow reads freshness from the label's most recent `labeled`
61
+ timeline event and treats stamps older than its TTL (default 90 minutes) as
62
+ stale. **Refresh the lease** whenever more than ~30 minutes have passed since
63
+ the last stamp while the watch loop is still running — a refresh is a
64
+ remove + re-add (re-adding an existing label does not create a new timeline
65
+ event):
66
+
67
+ ```bash
68
+ gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"
69
+ gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
70
+ ```
71
+
72
+ **Release the lease** (remove the label) at every terminal state — merged,
73
+ closed, or a hard block handed to a human. A crashed session that never
74
+ releases is why the TTL exists; do not rely on it as the normal release path.
75
+
39
76
  ## 1. Enable auto-merge
40
77
 
41
78
  Before enabling auto-merge, capture the live PR head and compare it to
@@ -74,7 +111,8 @@ gh pr view <pr> --json state,mergeStateStatus,mergeable,reviewDecision,statusChe
74
111
  ```
75
112
 
76
113
  Handle every blocker class; after any fix, re-poll and continue. Do not stop while
77
- the PR is still open and progress is possible.
114
+ the PR is still open and progress is possible. On each iteration, refresh the
115
+ babysitter lease if its last stamp is older than ~30 minutes (section 0).
78
116
 
79
117
  In **`on_blocker=report`** mode, only the mechanical step (a) and auto-merge enabling
80
118
  apply; for any of (b)–(e) do not act — classify the blocker and return per the input
@@ -150,6 +188,16 @@ Some org rulesets allow 0 approvals yet a bot `CHANGES_REQUESTED` still blocks
150
188
  auto-merge — dismissing the stale review after resolving all threads is what
151
189
  unblocks it.
152
190
 
191
+ ### f. Pending auto-fix PR into this branch
192
+ If an open PR from `claude-auto-fix-<headRefName>` targets this PR's head
193
+ branch (the CI auto-fix workflow engaged before this session took the lease),
194
+ adjudicate it: merge it into the head branch if the fix is correct and still
195
+ needed, otherwise close it and delete the side branch. Never leave it dangling
196
+ — it represents a competing writer's pending work. Merging it mutates the
197
+ driven branch, so treat it like any other push: disarm auto-merge first,
198
+ re-read `headRefOid`, reset `verify_commit` to the merged head, wait for that
199
+ head's checks to start, then re-enable auto-merge (section 1).
200
+
153
201
  ## 3. Merge and verify it actually shipped (ancestry check)
154
202
 
155
203
  Enabling auto-merge + green checks + resolved threads is **not** proof the merge
@@ -177,3 +225,8 @@ Loop until one of:
177
225
  needs design input, or genuine unresolved human objection (not a bot gate). Stop
178
226
  and report exactly what is blocking and what was already tried — never force the
179
227
  merge or weaken a gate to get past it.
228
+
229
+ At every terminal state, release the babysitter lease
230
+ (`gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"`) so the CI
231
+ auto-fix workflow can take over as fixer of last resort if the branch goes
232
+ red later with nobody driving it.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.214.0",
3
+ "version": "2.216.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -36,6 +36,43 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
36
36
  Resolve `<owner>/<repo>` from `gh repo view --json nameWithOwner` (or the PR URL).
37
37
  Use plain `gh` + `git` so Claude and Codex execute identically.
38
38
 
39
+ ## 0. Take the babysitter lease
40
+
41
+ This skill is the branch's owner while it runs. Declare that ownership so the
42
+ CI auto-fix workflow (`reusable-claude-ci-auto-fix.yml`) stands down instead of
43
+ pushing competing fixes to the same branch (the single-writer rule):
44
+
45
+ ```bash
46
+ gh label create "lisa:babysitter-on-duty" \
47
+ --description "A drive-pr-to-merge session is actively driving this PR; CI auto-fix must stand down" \
48
+ --color FBCA04 || true # tolerate only already-exists; check the next step
49
+ gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
50
+ gh pr view <pr> --json labels \
51
+ --jq '[.labels[].name] | contains(["lisa:babysitter-on-duty"])'
52
+ ```
53
+
54
+ Verify the final command prints `true` before driving. If the label could not
55
+ be attached (for example, no label-write permission), retry once; if it still
56
+ fails, surface a warning that the branch is unleased — the CI auto-fix
57
+ workflow may engage in parallel — and watch for its `claude-auto-fix-*` PR
58
+ per section 2f while driving.
59
+
60
+ The auto-fix workflow reads freshness from the label's most recent `labeled`
61
+ timeline event and treats stamps older than its TTL (default 90 minutes) as
62
+ stale. **Refresh the lease** whenever more than ~30 minutes have passed since
63
+ the last stamp while the watch loop is still running — a refresh is a
64
+ remove + re-add (re-adding an existing label does not create a new timeline
65
+ event):
66
+
67
+ ```bash
68
+ gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"
69
+ gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
70
+ ```
71
+
72
+ **Release the lease** (remove the label) at every terminal state — merged,
73
+ closed, or a hard block handed to a human. A crashed session that never
74
+ releases is why the TTL exists; do not rely on it as the normal release path.
75
+
39
76
  ## 1. Enable auto-merge
40
77
 
41
78
  Before enabling auto-merge, capture the live PR head and compare it to
@@ -74,7 +111,8 @@ gh pr view <pr> --json state,mergeStateStatus,mergeable,reviewDecision,statusChe
74
111
  ```
75
112
 
76
113
  Handle every blocker class; after any fix, re-poll and continue. Do not stop while
77
- the PR is still open and progress is possible.
114
+ the PR is still open and progress is possible. On each iteration, refresh the
115
+ babysitter lease if its last stamp is older than ~30 minutes (section 0).
78
116
 
79
117
  In **`on_blocker=report`** mode, only the mechanical step (a) and auto-merge enabling
80
118
  apply; for any of (b)–(e) do not act — classify the blocker and return per the input
@@ -150,6 +188,16 @@ Some org rulesets allow 0 approvals yet a bot `CHANGES_REQUESTED` still blocks
150
188
  auto-merge — dismissing the stale review after resolving all threads is what
151
189
  unblocks it.
152
190
 
191
+ ### f. Pending auto-fix PR into this branch
192
+ If an open PR from `claude-auto-fix-<headRefName>` targets this PR's head
193
+ branch (the CI auto-fix workflow engaged before this session took the lease),
194
+ adjudicate it: merge it into the head branch if the fix is correct and still
195
+ needed, otherwise close it and delete the side branch. Never leave it dangling
196
+ — it represents a competing writer's pending work. Merging it mutates the
197
+ driven branch, so treat it like any other push: disarm auto-merge first,
198
+ re-read `headRefOid`, reset `verify_commit` to the merged head, wait for that
199
+ head's checks to start, then re-enable auto-merge (section 1).
200
+
153
201
  ## 3. Merge and verify it actually shipped (ancestry check)
154
202
 
155
203
  Enabling auto-merge + green checks + resolved threads is **not** proof the merge
@@ -177,3 +225,8 @@ Loop until one of:
177
225
  needs design input, or genuine unresolved human objection (not a bot gate). Stop
178
226
  and report exactly what is blocking and what was already tried — never force the
179
227
  merge or weaken a gate to get past it.
228
+
229
+ At every terminal state, release the babysitter lease
230
+ (`gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"`) so the CI
231
+ auto-fix workflow can take over as fixer of last resort if the branch goes
232
+ red later with nobody driving it.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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": "2.214.0",
3
+ "version": "2.216.0",
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"
@@ -36,6 +36,43 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
36
36
  Resolve `<owner>/<repo>` from `gh repo view --json nameWithOwner` (or the PR URL).
37
37
  Use plain `gh` + `git` so Claude and Codex execute identically.
38
38
 
39
+ ## 0. Take the babysitter lease
40
+
41
+ This skill is the branch's owner while it runs. Declare that ownership so the
42
+ CI auto-fix workflow (`reusable-claude-ci-auto-fix.yml`) stands down instead of
43
+ pushing competing fixes to the same branch (the single-writer rule):
44
+
45
+ ```bash
46
+ gh label create "lisa:babysitter-on-duty" \
47
+ --description "A drive-pr-to-merge session is actively driving this PR; CI auto-fix must stand down" \
48
+ --color FBCA04 || true # tolerate only already-exists; check the next step
49
+ gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
50
+ gh pr view <pr> --json labels \
51
+ --jq '[.labels[].name] | contains(["lisa:babysitter-on-duty"])'
52
+ ```
53
+
54
+ Verify the final command prints `true` before driving. If the label could not
55
+ be attached (for example, no label-write permission), retry once; if it still
56
+ fails, surface a warning that the branch is unleased — the CI auto-fix
57
+ workflow may engage in parallel — and watch for its `claude-auto-fix-*` PR
58
+ per section 2f while driving.
59
+
60
+ The auto-fix workflow reads freshness from the label's most recent `labeled`
61
+ timeline event and treats stamps older than its TTL (default 90 minutes) as
62
+ stale. **Refresh the lease** whenever more than ~30 minutes have passed since
63
+ the last stamp while the watch loop is still running — a refresh is a
64
+ remove + re-add (re-adding an existing label does not create a new timeline
65
+ event):
66
+
67
+ ```bash
68
+ gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"
69
+ gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
70
+ ```
71
+
72
+ **Release the lease** (remove the label) at every terminal state — merged,
73
+ closed, or a hard block handed to a human. A crashed session that never
74
+ releases is why the TTL exists; do not rely on it as the normal release path.
75
+
39
76
  ## 1. Enable auto-merge
40
77
 
41
78
  Before enabling auto-merge, capture the live PR head and compare it to
@@ -74,7 +111,8 @@ gh pr view <pr> --json state,mergeStateStatus,mergeable,reviewDecision,statusChe
74
111
  ```
75
112
 
76
113
  Handle every blocker class; after any fix, re-poll and continue. Do not stop while
77
- the PR is still open and progress is possible.
114
+ the PR is still open and progress is possible. On each iteration, refresh the
115
+ babysitter lease if its last stamp is older than ~30 minutes (section 0).
78
116
 
79
117
  In **`on_blocker=report`** mode, only the mechanical step (a) and auto-merge enabling
80
118
  apply; for any of (b)–(e) do not act — classify the blocker and return per the input
@@ -150,6 +188,16 @@ Some org rulesets allow 0 approvals yet a bot `CHANGES_REQUESTED` still blocks
150
188
  auto-merge — dismissing the stale review after resolving all threads is what
151
189
  unblocks it.
152
190
 
191
+ ### f. Pending auto-fix PR into this branch
192
+ If an open PR from `claude-auto-fix-<headRefName>` targets this PR's head
193
+ branch (the CI auto-fix workflow engaged before this session took the lease),
194
+ adjudicate it: merge it into the head branch if the fix is correct and still
195
+ needed, otherwise close it and delete the side branch. Never leave it dangling
196
+ — it represents a competing writer's pending work. Merging it mutates the
197
+ driven branch, so treat it like any other push: disarm auto-merge first,
198
+ re-read `headRefOid`, reset `verify_commit` to the merged head, wait for that
199
+ head's checks to start, then re-enable auto-merge (section 1).
200
+
153
201
  ## 3. Merge and verify it actually shipped (ancestry check)
154
202
 
155
203
  Enabling auto-merge + green checks + resolved threads is **not** proof the merge
@@ -177,3 +225,8 @@ Loop until one of:
177
225
  needs design input, or genuine unresolved human objection (not a bot gate). Stop
178
226
  and report exactly what is blocking and what was already tried — never force the
179
227
  merge or weaken a gate to get past it.
228
+
229
+ At every terminal state, release the babysitter lease
230
+ (`gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"`) so the CI
231
+ auto-fix workflow can take over as fixer of last resort if the branch goes
232
+ red later with nobody driving it.
@@ -174,12 +174,16 @@ AI-powered code assistance that can:
174
174
 
175
175
  **Triggers**: CI Quality Checks workflow failure (non-environment branches)
176
176
 
177
- Automatically fixes CI failures by having Claude analyze error logs and push fixes. Replaces the previous `create-issue-on-failure` workflow.
177
+ Fixer of last resort for red CI on unattended branches: Claude analyzes error logs and prepares a fix as a pull request into the failing branch.
178
178
 
179
+ - Stands down when the branch has an active owner: a fresh `lisa:babysitter-on-duty` lease label on the branch's open PR (stamped by drive-pr-to-merge sessions), or any push during a quiet-period wait (default 20 minutes)
179
180
  - Fetches failed job names and error logs from the CI run
180
181
  - Runs Claude with full context to diagnose and fix the root cause
181
- - Commits and pushes the fix to the failing branch
182
- - Skips environment branches (`main`, `staging`, `dev`) and auto-fix branches (prevents infinite loops)
182
+ - Never pushes to the failing branch — commits land on a `claude-auto-fix-<branch>` side branch and a PR is opened into the failing branch
183
+ - Falls back to a non-frozen dependency install when the lockfile itself is broken, so Claude can repair and commit the lockfile
184
+ - When no fix can be produced, files a deduplicated ticket in the tracker declared in `.lisa.config.json` (`tracker`: jira | github | linear) with a title that says whether Claude ran at all
185
+ - Skips environment branches (`main`, `staging`, `dev`) and auto-fix branches (prevents infinite loops); failing checks on an auto-fix PR escalate to a ticket instead of re-entering
186
+ - Requires `secrets: inherit` in the caller so tracker credentials (`JIRA_API_TOKEN` / `LINEAR_API_KEY`) reach the issue dispatcher
183
187
 
184
188
  ### Claude Code Review Response (`claude-code-review-response.yml`)
185
189
 
@@ -25,5 +25,9 @@ jobs:
25
25
  head_branch: ${{ github.event.workflow_run.head_branch }}
26
26
  run_id: ${{ github.event.workflow_run.id }}
27
27
  package_manager: 'bun'
28
- secrets:
29
- CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
28
+ # `secrets: inherit` (not an explicit mapping) is load-bearing: the
29
+ # reusable workflow forwards secrets to the issue dispatcher, which needs
30
+ # JIRA_API_TOKEN / LINEAR_API_KEY to file failure tickets in the tracker
31
+ # declared in .lisa.config.json. An explicit CLAUDE_CODE_OAUTH_TOKEN-only
32
+ # mapping silently strands those tickets in GitHub Issues.
33
+ secrets: inherit
@@ -25,5 +25,7 @@ jobs:
25
25
  head_branch: ${{ github.event.workflow_run.head_branch }}
26
26
  run_id: ${{ github.event.workflow_run.id }}
27
27
  package_manager: 'bun'
28
- secrets:
29
- CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
28
+ # `secrets: inherit` (not an explicit mapping) is load-bearing: the
29
+ # reusable workflow needs tracker credentials (JIRA_API_TOKEN /
30
+ # LINEAR_API_KEY) to reach the tracker declared in .lisa.config.json.
31
+ secrets: inherit