@codyswann/lisa 4.27.6 → 4.27.8

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 (127) hide show
  1. package/all/copy-overwrite/scripts/lisa-hooks/block-direct-issue-create.sh +507 -11
  2. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  3. package/dist/core/lisa-owned-hash-ledger.js +102 -0
  4. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  5. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  6. package/dist/core/project-config-nightly-e2e.d.ts +21 -0
  7. package/dist/core/project-config-nightly-e2e.d.ts.map +1 -0
  8. package/dist/core/project-config-nightly-e2e.js +43 -0
  9. package/dist/core/project-config-nightly-e2e.js.map +1 -0
  10. package/dist/core/project-config.d.ts +4 -0
  11. package/dist/core/project-config.d.ts.map +1 -1
  12. package/dist/core/project-config.js +3 -0
  13. package/dist/core/project-config.js.map +1 -1
  14. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  15. package/dist/core/upstream-evidence-manifest.js +56 -12
  16. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  17. package/dist/opencode/plugin-templates/lisa-block-direct-issue-create.ts +180 -19
  18. package/expo/create-only/.github/nightly-e2e-policy.json +16 -0
  19. package/expo/create-only/.github/workflows/nightly-e2e-health.yml +33 -8
  20. package/expo/create-only/.github/workflows/nightly-e2e-tracking.yml +30 -0
  21. package/package.json +3 -3
  22. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  24. package/plugins/lisa/.codex-plugin/skills/lisa-exploratory-qa/SKILL.md +10 -6
  25. package/plugins/lisa/.codex-plugin/skills/lisa-intake/SKILL.md +18 -13
  26. package/plugins/lisa/.codex-plugin/skills/lisa-learnings-audit/SKILL.md +13 -7
  27. package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +3 -1
  28. package/plugins/lisa/.codex-plugin/skills/lisa-monitor/SKILL.md +10 -6
  29. package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/SKILL.md +10 -6
  30. package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +10 -6
  31. package/plugins/lisa/hooks/block-direct-issue-create.sh +507 -11
  32. package/plugins/lisa/skills/lisa-exploratory-qa/SKILL.md +10 -6
  33. package/plugins/lisa/skills/lisa-intake/SKILL.md +18 -13
  34. package/plugins/lisa/skills/lisa-learnings-audit/SKILL.md +13 -7
  35. package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +3 -1
  36. package/plugins/lisa/skills/lisa-monitor/SKILL.md +10 -6
  37. package/plugins/lisa/skills/lisa-project-ideation/SKILL.md +10 -6
  38. package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +10 -6
  39. package/plugins/lisa-agy/hooks/block-direct-issue-create.sh +507 -11
  40. package/plugins/lisa-agy/plugin.json +1 -1
  41. package/plugins/lisa-agy/skills/lisa-exploratory-qa/SKILL.md +10 -6
  42. package/plugins/lisa-agy/skills/lisa-intake/SKILL.md +18 -13
  43. package/plugins/lisa-agy/skills/lisa-learnings-audit/SKILL.md +13 -7
  44. package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +3 -1
  45. package/plugins/lisa-agy/skills/lisa-monitor/SKILL.md +10 -6
  46. package/plugins/lisa-agy/skills/lisa-project-ideation/SKILL.md +10 -6
  47. package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +10 -6
  48. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  50. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  51. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-copilot/hooks/block-direct-issue-create.sh +507 -11
  55. package/plugins/lisa-copilot/skills/lisa-exploratory-qa/SKILL.md +10 -6
  56. package/plugins/lisa-copilot/skills/lisa-intake/SKILL.md +18 -13
  57. package/plugins/lisa-copilot/skills/lisa-learnings-audit/SKILL.md +13 -7
  58. package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +3 -1
  59. package/plugins/lisa-copilot/skills/lisa-monitor/SKILL.md +10 -6
  60. package/plugins/lisa-copilot/skills/lisa-project-ideation/SKILL.md +10 -6
  61. package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +10 -6
  62. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-cursor/hooks/block-direct-issue-create.sh +507 -11
  64. package/plugins/lisa-cursor/skills/lisa-exploratory-qa/SKILL.md +10 -6
  65. package/plugins/lisa-cursor/skills/lisa-intake/SKILL.md +18 -13
  66. package/plugins/lisa-cursor/skills/lisa-learnings-audit/SKILL.md +13 -7
  67. package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +3 -1
  68. package/plugins/lisa-cursor/skills/lisa-monitor/SKILL.md +10 -6
  69. package/plugins/lisa-cursor/skills/lisa-project-ideation/SKILL.md +10 -6
  70. package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +10 -6
  71. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  73. package/plugins/lisa-expo-agy/plugin.json +1 -1
  74. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  78. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  79. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  83. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  84. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  88. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  89. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  93. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  94. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  98. package/plugins/lisa-rails-agy/plugin.json +1 -1
  99. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  101. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  102. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  103. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  104. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  105. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  106. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  107. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  108. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  109. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  110. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  111. package/plugins/src/base/hooks/block-direct-issue-create.sh +507 -11
  112. package/plugins/src/base/skills/lisa-exploratory-qa/SKILL.md +10 -6
  113. package/plugins/src/base/skills/lisa-intake/SKILL.md +18 -13
  114. package/plugins/src/base/skills/lisa-learnings-audit/SKILL.md +13 -7
  115. package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +3 -1
  116. package/plugins/src/base/skills/lisa-monitor/SKILL.md +10 -6
  117. package/plugins/src/base/skills/lisa-project-ideation/SKILL.md +10 -6
  118. package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +10 -6
  119. package/scripts/two-channel-couplings.json +70 -5
  120. package/typescript/copy-overwrite/.prettierignore +7 -0
  121. package/typescript/copy-overwrite/scripts/nightly-e2e-provider-action.mjs +70 -0
  122. package/typescript/copy-overwrite/scripts/nightly-e2e-provider-github-jira.mjs +296 -0
  123. package/typescript/copy-overwrite/scripts/nightly-e2e-provider-linear-sentry.mjs +283 -0
  124. package/typescript/copy-overwrite/scripts/nightly-e2e-provider-support.mjs +55 -0
  125. package/typescript/copy-overwrite/scripts/nightly-e2e-tracking-config.mjs +149 -0
  126. package/typescript/copy-overwrite/scripts/reconcile-nightly-e2e-tracking-cli.mjs +56 -0
  127. package/typescript/copy-overwrite/scripts/reconcile-nightly-e2e-tracking.mjs +208 -0
@@ -145,33 +145,38 @@ Record **exactly one** outcome per invocation through the run-record CLI, naming
145
145
  specific, actionable, e.g. `Scanned 12 ready items; nothing to propose.` for `nothing-needed`):
146
146
 
147
147
  ```bash
148
- node "${CLAUDE_PLUGIN_ROOT}/scripts/automation-run-record.mjs" \
148
+ node "${CLAUDE_PLUGIN_ROOT:-node_modules/@codyswann/lisa/plugins/lisa}/scripts/automation-run-record.mjs" \
149
149
  --loop-id intake-tickets --outcome candidate-proposed \
150
150
  --summary "Routed PRD #1810 to Blocked with clarifying questions; the run succeeded." \
151
151
  --runbook .lisa/automations/intake-tickets.runbook.md [--ref <item-url>]...
152
152
  ```
153
153
 
154
154
  **A dry build lane must say what it looked in.** A `nothing-needed` run on `intake-tickets`
155
- additionally passes `--denominator` — the JSON from `buildIntakeDenominator()` in
156
- `scripts/intake-prework-denominator.mjs` — and the recorder **refuses the row without it**. This is
157
- not decoration: 31 consecutive cycles reported a dry lane against a queue holding 61 unswept
158
- pre-work rows, and every one of those records was honest. A missing row is noisy on inspection; a
159
- wrong denominator is silent forever and looks exactly like a healthy dry queue. Stating the swept
160
- set is what turns the silent wrong answer into an inspectable one (#2657).
155
+ additionally passes `--denominator` — the JSON from `buildIntakeDenominator()` in the plugin
156
+ scripts directory's `intake-prework-denominator.mjs`, resolved exactly like the recorder below —
157
+ and the recorder **refuses the row without it**. This is not decoration: 31 consecutive cycles
158
+ reported a dry lane against a queue holding 61 unswept pre-work rows, and every one of those
159
+ records was honest. A missing row is noisy on inspection; a wrong denominator is silent forever
160
+ and looks exactly like a healthy dry queue. Stating the swept set is what turns the silent wrong
161
+ answer into an inspectable one (#2657).
161
162
 
162
163
  ```bash
163
- node "${CLAUDE_PLUGIN_ROOT}/scripts/automation-run-record.mjs" \
164
+ node "${CLAUDE_PLUGIN_ROOT:-node_modules/@codyswann/lisa/plugins/lisa}/scripts/automation-run-record.mjs" \
164
165
  --loop-id intake-tickets --outcome nothing-needed \
165
166
  --summary "Nothing ready to build on team ENG. Looked in every lane holding work that has not started — Backlog (20), Todo (17), Ready (2), Blocked (61) — 100 items checked out of 343 still open." \
166
167
  --denominator "$DENOMINATOR_JSON" \
167
168
  --runbook .lisa/automations/intake-tickets.runbook.md
168
169
  ```
169
170
 
170
- If `${CLAUDE_PLUGIN_ROOT}` is unset, resolve the plugin scripts directory directly — the built copy
171
- `plugins/lisa/scripts/automation-run-record.mjs` or the source
172
- `plugins/src/base/scripts/automation-run-record.mjs`. If recording still fails, **degrade, never
173
- abort** (per `automation-runbook-contract`): note the recording failure in the run output and finish
174
- the cycle — a recording failure is a degradation to report, never a reason to block the loop.
171
+ The `:-` default in that command is load-bearing, not decoration. `CLAUDE_PLUGIN_ROOT` is **not
172
+ exported into an agent's Bash tool environment**, so the bare `"${CLAUDE_PLUGIN_ROOT}/scripts/…"`
173
+ form expands to an absolute `/scripts/…` and exits 1. The default names the installed package copy,
174
+ which resolves from the **consumer repository root** — which is where the recorder is actually
175
+ invoked. Never substitute a bare `plugins/lisa/scripts/…` or `plugins/src/base/scripts/…` path:
176
+ those are relative to the **Lisa package root**, not the repository you are standing in, and exit 1
177
+ from there. If recording still fails, **degrade, never abort** (per `automation-runbook-contract`):
178
+ note the recording failure in the run output and finish the cycle — a recording failure is a
179
+ degradation to report, never a reason to block the loop.
175
180
 
176
181
  **Retirement evaluation (every run).** Both loop-ids this skill backs are **structural to the
177
182
  factory — they do not retire.** Their runbooks say so plainly instead of leaving the Retirement
@@ -368,18 +368,24 @@ loop's runbook (the `--summary` is the operator-readable one-liner in the
368
368
  contract's exemplar voice — plain, specific, actionable):
369
369
 
370
370
  ```bash
371
- node "${CLAUDE_PLUGIN_ROOT}/scripts/automation-run-record.mjs" \
371
+ node "${CLAUDE_PLUGIN_ROOT:-node_modules/@codyswann/lisa/plugins/lisa}/scripts/automation-run-record.mjs" \
372
372
  --loop-id learnings-audit --outcome candidate-proposed \
373
373
  --summary "Proposed 2 promotions and 1 batch confirm; awaiting your flip to ready." \
374
374
  --runbook .lisa/automations/learnings-audit.runbook.md [--ref <ticket-url>]...
375
375
  ```
376
376
 
377
- If `${CLAUDE_PLUGIN_ROOT}` is unset, resolve the plugin scripts directory
378
- directly — the built copy `plugins/lisa/scripts/automation-run-record.mjs` or
379
- the source `plugins/src/base/scripts/automation-run-record.mjs`. If recording
380
- still fails, **degrade, never abort** (per `automation-runbook-contract`): note
381
- the recording failure in the run output and finish the run — a recording
382
- failure is a degradation to report, never a reason to block the loop.
377
+ The `:-` default in that command is load-bearing, not decoration.
378
+ `CLAUDE_PLUGIN_ROOT` is **not exported into an agent's Bash tool
379
+ environment**, so the bare `"${CLAUDE_PLUGIN_ROOT}/scripts/…"` form expands
380
+ to an absolute `/scripts/…` and exits 1. The default names the installed
381
+ package copy, which resolves from the **consumer repository root** — which
382
+ is where the recorder is actually invoked. Never substitute a bare
383
+ `plugins/lisa/scripts/…` or `plugins/src/base/scripts/…` path: those are
384
+ relative to the **Lisa package root**, not the repository you are standing
385
+ in, and exit 1 from there. If recording still fails, **degrade, never
386
+ abort** (per `automation-runbook-contract`): note the recording failure in
387
+ the run output and finish the run — a recording failure is a degradation to
388
+ report, never a reason to block the loop.
383
389
 
384
390
  ## Retirement condition
385
391
 
@@ -140,13 +140,15 @@ Build the denominator with the shared helper, which owns the type vocabulary so
140
140
 
141
141
  ```bash
142
142
  node -e '
143
- import("'"${CLAUDE_PLUGIN_ROOT:-plugins/src/base}"'/scripts/intake-prework-denominator.mjs").then(m => {
143
+ import("'"${CLAUDE_PLUGIN_ROOT:-./node_modules/@codyswann/lisa/plugins/lisa}"'/scripts/intake-prework-denominator.mjs").then(m => {
144
144
  const d = m.buildIntakeDenominator({ lanes: JSON.parse(process.argv[1]), totalOpen: Number(process.argv[2]) });
145
145
  console.log(JSON.stringify(d));
146
146
  console.log(m.summarizeDryLane(d, { queue: process.argv[3] }));
147
147
  });' "$LANES_JSON" "$TOTAL_OPEN" "team $TEAM_KEY"
148
148
  ```
149
149
 
150
+ The `./` on that default is load-bearing and is not the same as the recorder's. `import()` reads a bare `node_modules/…` as a **package specifier** named `node_modules` and fails with `ERR_MODULE_NOT_FOUND: Cannot find package 'node_modules'`; only `./`, `../`, `/` or a `file:` URL is a path. A `node <path>` command line has no such rule, which is why the run-recorder default alongside this one carries no `./`.
151
+
150
152
  `$LANES_JSON` is `[{"name":"<state>","type":"<state.type>","position":<state.position>,"count":<open rows>}, …]` for **every** state on the team, pre-work and not — the helper does the selecting.
151
153
 
152
154
  **Candidate order.** Work `$READY` first (it is the human-flipped signal), then the remaining pre-work lanes oldest-first. Every candidate outside `$READY` must clear Phase 2.5 before it is treated as a candidate at all.
@@ -171,17 +171,21 @@ plain, specific, actionable, e.g. `Health green; audit clean — nothing to prop
171
171
  unreachable during the decline check — restore credentials; nothing was filed this run.`):
172
172
 
173
173
  ```bash
174
- node "${CLAUDE_PLUGIN_ROOT}/scripts/automation-run-record.mjs" \
174
+ node "${CLAUDE_PLUGIN_ROOT:-node_modules/@codyswann/lisa/plugins/lisa}/scripts/automation-run-record.mjs" \
175
175
  --loop-id monitor --outcome candidate-proposed \
176
176
  --summary "Filed #1810 for the p99 latency spike; awaiting your flip to ready." \
177
177
  --runbook .lisa/automations/monitor.runbook.md [--ref <ticket-url>]...
178
178
  ```
179
179
 
180
- If `${CLAUDE_PLUGIN_ROOT}` is unset, resolve the plugin scripts directory directly — the built copy
181
- `plugins/lisa/scripts/automation-run-record.mjs` or the source
182
- `plugins/src/base/scripts/automation-run-record.mjs`. If recording still fails, **degrade, never
183
- abort** (per `automation-runbook-contract`): note the recording failure in the run output and finish
184
- the cycle — a recording failure is a degradation to report, never a reason to block the loop.
180
+ The `:-` default in that command is load-bearing, not decoration. `CLAUDE_PLUGIN_ROOT` is **not
181
+ exported into an agent's Bash tool environment**, so the bare `"${CLAUDE_PLUGIN_ROOT}/scripts/…"`
182
+ form expands to an absolute `/scripts/…` and exits 1. The default names the installed package copy,
183
+ which resolves from the **consumer repository root** — which is where the recorder is actually
184
+ invoked. Never substitute a bare `plugins/lisa/scripts/…` or `plugins/src/base/scripts/…` path:
185
+ those are relative to the **Lisa package root**, not the repository you are standing in, and exit 1
186
+ from there. If recording still fails, **degrade, never abort** (per `automation-runbook-contract`):
187
+ note the recording failure in the run output and finish the cycle — a recording failure is a
188
+ degradation to report, never a reason to block the loop.
185
189
 
186
190
  **Retirement evaluation (every run).** Evaluate this loop's runbook **Retirement condition** on
187
191
  every standalone run, exactly as the `automation-runbook-contract` rule's Retirement section defines
@@ -321,17 +321,21 @@ propose.` for `nothing-needed`; and for a `recovery-required` from an unreadable
321
321
  `Tracker unreachable during the decline check — restore credentials; nothing was filed this run.`):
322
322
 
323
323
  ```bash
324
- node "${CLAUDE_PLUGIN_ROOT}/scripts/automation-run-record.mjs" \
324
+ node "${CLAUDE_PLUGIN_ROOT:-node_modules/@codyswann/lisa/plugins/lisa}/scripts/automation-run-record.mjs" \
325
325
  --loop-id exploratory-prds --outcome candidate-proposed \
326
326
  --summary "Created PRD #1810 for offline export; awaiting your flip to ready." \
327
327
  --runbook .lisa/automations/exploratory-prds.runbook.md [--ref <prd-url>]...
328
328
  ```
329
329
 
330
- If `${CLAUDE_PLUGIN_ROOT}` is unset, resolve the plugin scripts directory directly — the built copy
331
- `plugins/lisa/scripts/automation-run-record.mjs` or the source
332
- `plugins/src/base/scripts/automation-run-record.mjs`. If recording still fails, **degrade, never
333
- abort** (per `automation-runbook-contract`): note the recording failure in the run output and finish
334
- the run — a recording failure is a degradation to report, never a reason to block the loop.
330
+ The `:-` default in that command is load-bearing, not decoration. `CLAUDE_PLUGIN_ROOT` is **not
331
+ exported into an agent's Bash tool environment**, so the bare `"${CLAUDE_PLUGIN_ROOT}/scripts/…"`
332
+ form expands to an absolute `/scripts/…` and exits 1. The default names the installed package copy,
333
+ which resolves from the **consumer repository root** — which is where the recorder is actually
334
+ invoked. Never substitute a bare `plugins/lisa/scripts/…` or `plugins/src/base/scripts/…` path:
335
+ those are relative to the **Lisa package root**, not the repository you are standing in, and exit 1
336
+ from there. If recording still fails, **degrade, never abort** (per `automation-runbook-contract`):
337
+ note the recording failure in the run output and finish the run — a recording failure is a
338
+ degradation to report, never a reason to block the loop.
335
339
 
336
340
  **Retirement evaluation (every run).** Evaluate this loop's runbook **Retirement condition** on
337
341
  every run, exactly as the `automation-runbook-contract` rule's Retirement section defines it — this
@@ -1218,17 +1218,21 @@ specific, actionable, e.g. `Examined 14 items; all active or in backoff — noth
1218
1218
  `nothing-needed`):
1219
1219
 
1220
1220
  ```bash
1221
- node "${CLAUDE_PLUGIN_ROOT}/scripts/automation-run-record.mjs" \
1221
+ node "${CLAUDE_PLUGIN_ROOT:-node_modules/@codyswann/lisa/plugins/lisa}/scripts/automation-run-record.mjs" \
1222
1222
  --loop-id intake-repair --outcome change-proved \
1223
1223
  --summary "Recovered 3 stalled builds and closed out 2 rollups; all confirmed." \
1224
1224
  --runbook .lisa/automations/intake-repair.runbook.md [--ref <item-url>]...
1225
1225
  ```
1226
1226
 
1227
- If `${CLAUDE_PLUGIN_ROOT}` is unset, resolve the plugin scripts directory directly — the built copy
1228
- `plugins/lisa/scripts/automation-run-record.mjs` or the source
1229
- `plugins/src/base/scripts/automation-run-record.mjs`. If recording still fails, **degrade, never
1230
- abort** (per `automation-runbook-contract`): note the recording failure in the run output and finish
1231
- the cycle — a recording failure is a degradation to report, never a reason to block the loop.
1227
+ The `:-` default in that command is load-bearing, not decoration. `CLAUDE_PLUGIN_ROOT` is **not
1228
+ exported into an agent's Bash tool environment**, so the bare `"${CLAUDE_PLUGIN_ROOT}/scripts/…"`
1229
+ form expands to an absolute `/scripts/…` and exits 1. The default names the installed package copy,
1230
+ which resolves from the **consumer repository root** — which is where the recorder is actually
1231
+ invoked. Never substitute a bare `plugins/lisa/scripts/…` or `plugins/src/base/scripts/…` path:
1232
+ those are relative to the **Lisa package root**, not the repository you are standing in, and exit 1
1233
+ from there. If recording still fails, **degrade, never abort** (per `automation-runbook-contract`):
1234
+ note the recording failure in the run output and finish the cycle — a recording failure is a
1235
+ degradation to report, never a reason to block the loop.
1232
1236
 
1233
1237
  **Retirement evaluation (every run).** The `intake-repair` loop is **structural to the
1234
1238
  factory — it does not retire.** Its runbook says so plainly instead of leaving the Retirement
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.27.6",
3
+ "version": "4.27.8",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"