@codyswann/lisa 2.257.2 → 2.258.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 (109) 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-exploratory-qa/SKILL.md +41 -0
  5. package/plugins/lisa/.codex-plugin/skills/lisa-intake/SKILL.md +8 -0
  6. package/plugins/lisa/.codex-plugin/skills/lisa-learnings-audit/SKILL.md +44 -7
  7. package/plugins/lisa/.codex-plugin/skills/lisa-monitor/SKILL.md +41 -0
  8. package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/SKILL.md +45 -2
  9. package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +8 -0
  10. package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/SKILL.md +25 -7
  11. package/plugins/lisa/.codex-plugin/skills/lisa-tear-down-automations/SKILL.md +34 -3
  12. package/plugins/lisa/.codex-plugin/skills/lisa-tear-down-automations/agents/openai.yaml +2 -2
  13. package/plugins/lisa/rules/eager/automation-runbook-contract.md +2 -1
  14. package/plugins/lisa/rules/reference/automation-runbook-contract.md +9 -2
  15. package/plugins/lisa/skills/lisa-exploratory-qa/SKILL.md +41 -0
  16. package/plugins/lisa/skills/lisa-intake/SKILL.md +8 -0
  17. package/plugins/lisa/skills/lisa-learnings-audit/SKILL.md +44 -7
  18. package/plugins/lisa/skills/lisa-monitor/SKILL.md +41 -0
  19. package/plugins/lisa/skills/lisa-project-ideation/SKILL.md +45 -2
  20. package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +8 -0
  21. package/plugins/lisa/skills/lisa-setup-automations/SKILL.md +25 -7
  22. package/plugins/lisa/skills/lisa-tear-down-automations/SKILL.md +34 -3
  23. package/plugins/lisa/skills/lisa-tear-down-automations/agents/openai.yaml +2 -2
  24. package/plugins/lisa-agy/plugin.json +1 -1
  25. package/plugins/lisa-agy/skills/lisa-exploratory-qa/SKILL.md +41 -0
  26. package/plugins/lisa-agy/skills/lisa-intake/SKILL.md +8 -0
  27. package/plugins/lisa-agy/skills/lisa-learnings-audit/SKILL.md +44 -7
  28. package/plugins/lisa-agy/skills/lisa-monitor/SKILL.md +41 -0
  29. package/plugins/lisa-agy/skills/lisa-project-ideation/SKILL.md +45 -2
  30. package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +8 -0
  31. package/plugins/lisa-agy/skills/lisa-setup-automations/SKILL.md +25 -7
  32. package/plugins/lisa-agy/skills/lisa-tear-down-automations/SKILL.md +34 -3
  33. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  35. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  36. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-copilot/rules/eager/automation-runbook-contract.md +2 -1
  40. package/plugins/lisa-copilot/rules/reference/automation-runbook-contract.md +9 -2
  41. package/plugins/lisa-copilot/skills/lisa-exploratory-qa/SKILL.md +41 -0
  42. package/plugins/lisa-copilot/skills/lisa-intake/SKILL.md +8 -0
  43. package/plugins/lisa-copilot/skills/lisa-learnings-audit/SKILL.md +44 -7
  44. package/plugins/lisa-copilot/skills/lisa-monitor/SKILL.md +41 -0
  45. package/plugins/lisa-copilot/skills/lisa-project-ideation/SKILL.md +45 -2
  46. package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +8 -0
  47. package/plugins/lisa-copilot/skills/lisa-setup-automations/SKILL.md +25 -7
  48. package/plugins/lisa-copilot/skills/lisa-tear-down-automations/SKILL.md +34 -3
  49. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-cursor/rules/automation-runbook-contract-reference.mdc +9 -2
  51. package/plugins/lisa-cursor/rules/automation-runbook-contract.mdc +2 -1
  52. package/plugins/lisa-cursor/skills/lisa-exploratory-qa/SKILL.md +41 -0
  53. package/plugins/lisa-cursor/skills/lisa-intake/SKILL.md +8 -0
  54. package/plugins/lisa-cursor/skills/lisa-learnings-audit/SKILL.md +44 -7
  55. package/plugins/lisa-cursor/skills/lisa-monitor/SKILL.md +41 -0
  56. package/plugins/lisa-cursor/skills/lisa-project-ideation/SKILL.md +45 -2
  57. package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +8 -0
  58. package/plugins/lisa-cursor/skills/lisa-setup-automations/SKILL.md +25 -7
  59. package/plugins/lisa-cursor/skills/lisa-tear-down-automations/SKILL.md +34 -3
  60. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa-expo-agy/plugin.json +1 -1
  63. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  67. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  68. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  72. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  73. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  77. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  78. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  82. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  83. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  87. package/plugins/lisa-rails-agy/plugin.json +1 -1
  88. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  92. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  93. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  97. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  98. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  100. package/plugins/src/base/rules/eager/automation-runbook-contract.md +2 -1
  101. package/plugins/src/base/rules/reference/automation-runbook-contract.md +9 -2
  102. package/plugins/src/base/skills/lisa-exploratory-qa/SKILL.md +41 -0
  103. package/plugins/src/base/skills/lisa-intake/SKILL.md +8 -0
  104. package/plugins/src/base/skills/lisa-learnings-audit/SKILL.md +44 -7
  105. package/plugins/src/base/skills/lisa-monitor/SKILL.md +41 -0
  106. package/plugins/src/base/skills/lisa-project-ideation/SKILL.md +45 -2
  107. package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +8 -0
  108. package/plugins/src/base/skills/lisa-setup-automations/SKILL.md +25 -7
  109. package/plugins/src/base/skills/lisa-tear-down-automations/SKILL.md +34 -3
@@ -339,8 +339,10 @@ failure is a degradation to report, never a reason to block the loop.
339
339
 
340
340
  ## Retirement condition
341
341
 
342
- The loop retires itself by the same discipline it applies to everything else,
343
- and the condition is **stateless — derived from the tracker, never from a
342
+ The loop proposes retirement by the same discipline it applies to everything else,
343
+ conforming to the `automation-runbook-contract` rule's Retirement section
344
+ rather than restating or diverging from it. The condition is **stateless —
345
+ derived from the tracker, never from a
344
346
  counter or state file** (there is no durable home for a run counter, and a
345
347
  tracker-derived condition is headless- and concurrent-safe by construction).
346
348
  Propose retirement when BOTH hold:
@@ -352,11 +354,46 @@ Propose retirement when BOTH hold:
352
354
  2. **This run proposes nothing** — the current run's inventory yields zero
353
355
  candidates (it is terminating `nothing-needed`).
354
356
 
355
- When both hold, the gardener files ONE (marker-deduped) ticket proposing to
356
- lengthen its cadence or tear down its automation (`/tear-down-automations`),
357
- with the date-filtered search result and this run's summary as evidence. It
358
- keeps running until a human flips that ticket — retirement is a
359
- recommendation like any other, never a self-executed exit.
357
+ When both hold, the gardener records `policy-obsolete` and files **exactly ONE**
358
+ marker-deduped ticket proposing to lengthen its cadence or tear down its
359
+ automation, through `lisa-tracker-write` (per `tracked-work` +
360
+ `integration-access-layer`):
361
+
362
+ - **Marker** `<!-- [lisa-automation-retire] key=learnings-audit -->` plus a
363
+ visible prose line; matched on the marker, never the title; searched **open
364
+ AND closed** per `rejection-detection`'s **Proposal rejection memory**. Treat
365
+ matches by close state: **open** suppresses another proposal; **Not planned**
366
+ suppresses another proposal unless new evidence postdates the rejection;
367
+ **Completed** means the prior approved action happened, so a later recurrence
368
+ may be re-filed. The `[lisa-gardener]` search above stays what it is — the
369
+ candidate evidence, not the dedupe key. When an existing proposal suppresses
370
+ filing, **the run still records `policy-obsolete` and files nothing** — the
371
+ outcome describes this run, while the ticket is filed exactly once.
372
+ - **Labels** `status:blocked` + `human-needed`, carrying the contract's
373
+ decision-ready packet. The `human-needed` label marks the proposal
374
+ human-owned: `lisa-repair-intake` recognizes it and never re-dispatches it as
375
+ stalled work.
376
+ - **Evidence** the date-filtered search result, this run's summary, **the
377
+ loop's current cadence** (the baseline an operator needs to choose a longer
378
+ one), and a one-line summary of recent runs read from
379
+ `.lisa/automations/runs/learnings-audit.jsonl`. Fill the rest of the packet
380
+ the same way every time: *Work already attempted* is the searches this run
381
+ ran, and *Risk of inaction* is that the loop keeps consuming schedule slots
382
+ and tokens for nothing.
383
+ - **How to answer** names the three operator responses: **approve** — run
384
+ `/lisa:tear-down-automations learnings-audit` and only that loop registration goes away; **decline** —
385
+ close the proposal as **Not planned** (closing it as **Completed** leaves a
386
+ later re-file open) and the gardener simply continues; **re-cadence** — pick a
387
+ longer cadence off that evidence and re-register with
388
+ `/lisa:setup-automations` instead of tearing down.
389
+ - **Operator footer**, verbatim, as on every loop-filed proposal
390
+ (`rejection-detection`):
391
+ > To stop this from being raised again, close it as **Not planned**. Close it as **Completed** if it was fixed — a later recurrence may be re-filed as a regression.
392
+
393
+ The gardener **keeps running at its normal cadence** until a human flips that
394
+ ticket — retirement is a recommendation like any other, never a self-executed
395
+ exit — and it never deletes its own
396
+ registration.
360
397
 
361
398
  ## Scheduling
362
399
 
@@ -152,6 +152,7 @@ so a quiet monitoring run and a broken one never look identical.
152
152
  | Anomalies or in-scope gaps filed — one or more `Bug` / `Task` / `Improvement` leaves created or referenced | `candidate-proposed` |
153
153
  | Clean sweep — health/audit ran end to end, nothing over the bar and no in-scope gaps — **or** every finding was suppressed by a prior decline (`rejection-detection` **Proposal rejection memory**): the summary MUST name the suppression count | `nothing-needed` |
154
154
  | Provider/threshold resolution failure — threshold collection fails (a present-but-uninspectable config, an invalid configured threshold) or a signal provider is unreachable so the sweep could not run — **or** the open-and-closed rejection-memory search could not read the tracker: a memory check that could not run is a broken loop, never a silent `nothing-needed` | `recovery-required` |
155
+ | The runbook's **Retirement condition** tripped — the trailing quiet window is empty AND this sweep found nothing AND no connected observability surfaces are left — this row supersedes the `nothing-needed` row when it applies | `policy-obsolete` |
155
156
  | A degradation that still let the sweep run (an optional `ops-specialist` overlay absent, Kane unavailable) | the outcome it actually reached above, with the summary **leading with the degradation** — degradation never mints a seventh token |
156
157
 
157
158
  Only the **standalone** run records. The nested report-only modes do their own job and do not file or
@@ -159,6 +160,10 @@ record: `--report-only` (including the `lisa-verify` post-deploy call, whose sum
159
160
  the originating item) and `--dry-run` (a preview that creates nothing) are not registered-loop
160
161
  invocations.
161
162
 
163
+ Before invoking the run-record CLI, evaluate the **Retirement condition** first. If it applies,
164
+ select `policy-obsolete` as the sole outcome and do not record a prior `nothing-needed` result;
165
+ otherwise select the ordinary outcome from the table.
166
+
162
167
  Record **exactly one** outcome per standalone invocation through the run-record CLI, naming this
163
168
  loop's runbook (the `--summary` is the operator-readable one-liner in the contract's exemplar voice —
164
169
  plain, specific, actionable, e.g. `Health green; audit clean — nothing to propose.` for
@@ -177,3 +182,39 @@ If `${CLAUDE_PLUGIN_ROOT}` is unset, resolve the plugin scripts directory direct
177
182
  `plugins/src/base/scripts/automation-run-record.mjs`. If recording still fails, **degrade, never
178
183
  abort** (per `automation-runbook-contract`): note the recording failure in the run output and finish
179
184
  the cycle — a recording failure is a degradation to report, never a reason to block the loop.
185
+
186
+ **Retirement evaluation (every run).** Evaluate this loop's runbook **Retirement condition** on
187
+ every standalone run, exactly as the `automation-runbook-contract` rule's Retirement section defines
188
+ it — this skill conforms to that text and never restates or diverges from it. On top of the
189
+ contract's two conditions the runbook seeds a third **domain conjunct** — the project has no
190
+ connected observability surfaces left, so there is nothing to monitor — which only tightens the test
191
+ and never replaces it: a quiet month on a healthy project is good news, not a reason to stop
192
+ watching it. Evaluate all three. When all three hold, record `policy-obsolete` and file
193
+ **exactly ONE** marker-deduped teardown proposal through `lisa-tracker-write`
194
+ (per `tracked-work` + `integration-access-layer`):
195
+
196
+ - **Marker** `<!-- [lisa-automation-retire] key=monitor -->` plus a visible prose line; matched on
197
+ the marker, never the title; searched **open AND closed** per `rejection-detection`'s **Proposal
198
+ rejection memory**. Treat matches by close state: **open** suppresses another proposal;
199
+ **Not planned** suppresses another proposal unless new evidence postdates the rejection;
200
+ **Completed** means the prior approved action happened, so a later recurrence may be re-filed.
201
+ When an existing proposal suppresses filing, **the run still records `policy-obsolete` and files
202
+ nothing** — the outcome describes this run, while the ticket is filed exactly once.
203
+ - **Labels** `status:blocked` + `human-needed`, carrying the contract's decision-ready packet. The
204
+ `human-needed` label marks the proposal human-owned: `lisa-repair-intake` recognizes it and never
205
+ re-dispatches it as stalled work.
206
+ - **Evidence** the date-filtered search result, this run's summary, **the loop's current cadence**
207
+ (the baseline an operator needs to choose a longer one), and a one-line summary of recent runs
208
+ read from `.lisa/automations/runs/monitor.jsonl`. Fill the rest of the packet the same way every
209
+ time: *Work already attempted* is the searches this run ran, and *Risk of inaction* is that the
210
+ loop keeps consuming schedule slots and tokens for nothing.
211
+ - **How to answer** names the three operator responses: **approve** — run
212
+ `/lisa:tear-down-automations monitor` and only that loop registration goes away; **decline** — close the proposal as
213
+ **Not planned** (closing it as **Completed** leaves a later re-file open) and the loop simply
214
+ continues; **re-cadence** — pick a longer cadence off that evidence and re-register with
215
+ `/lisa:setup-automations` instead of tearing down.
216
+ - **Operator footer**, verbatim, as on every loop-filed proposal (`rejection-detection`):
217
+ > To stop this from being raised again, close it as **Not planned**. Close it as **Completed** if it was fixed — a later recurrence may be re-filed as a regression.
218
+
219
+ The loop **keeps running at its normal cadence** until a human acts, and never deletes its own
220
+ registration.
@@ -303,12 +303,17 @@ so a quiet ideation run and a broken one are never confused.
303
303
  | Nothing to ideate — no Practical Idea cleared the bar; nothing created — **or** every idea was suppressed by a prior decline (`rejection-detection` **Proposal rejection memory**): the summary MUST name the suppression count | `nothing-needed` |
304
304
  | The Step 5.5 **PRD-queue-pressure gate** blocked auto-ready creation — a human must drain the queue before another auto-ready PRD is added | `approval-requested` |
305
305
  | The loop itself could not run — the PRD source reader failed or the queue is misconfigured (a source-reader failure snapshot, not queue pressure) — **or** the open-and-closed rejection-memory marker search could not read the source: a memory check that could not run is a broken loop, never a silent `nothing-needed` | `recovery-required` |
306
+ | The runbook's **Retirement condition** tripped — the trailing quiet window is empty AND this run proposed nothing AND no unresolved PRD pressure exists while no new surface has shipped — this row supersedes the `nothing-needed` row when it applies | `policy-obsolete` |
306
307
  | A degradation that still let ideation run (optional Codex automation memory unavailable, an inspiration source unreachable) | the outcome it actually reached above, with the summary **leading with the degradation** — degradation never mints a seventh token |
307
308
 
308
309
  The pressure gate is `approval-requested`, **not** `recovery-required`: the loop ran fine and
309
310
  correctly declined to add queue pressure — it is asking a human to drain the queue, not reporting a
310
311
  broken machine. `recovery-required` is reserved for the loop failing to run at all.
311
312
 
313
+ Before invoking the run-record CLI, evaluate the **Retirement condition** first. If it applies,
314
+ select `policy-obsolete` as the sole outcome and do not record a prior `nothing-needed` result;
315
+ otherwise select the ordinary outcome from the table.
316
+
312
317
  Record **exactly one** outcome per invocation through the run-record CLI, naming this loop's runbook
313
318
  (the `--summary` is the operator-readable one-liner in the contract's exemplar voice — plain,
314
319
  specific, actionable, e.g. `Reviewed evidence; no practical idea cleared the bar — nothing to
@@ -328,6 +333,43 @@ If `${CLAUDE_PLUGIN_ROOT}` is unset, resolve the plugin scripts directory direct
328
333
  abort** (per `automation-runbook-contract`): note the recording failure in the run output and finish
329
334
  the run — a recording failure is a degradation to report, never a reason to block the loop.
330
335
 
336
+ **Retirement evaluation (every run).** Evaluate this loop's runbook **Retirement condition** on
337
+ every run, exactly as the `automation-runbook-contract` rule's Retirement section defines it — this
338
+ skill conforms to that text and never restates or diverges from it. On top of the contract's two
339
+ conditions the runbook seeds a third **domain conjunct** — no unresolved PRD pressure exists and the
340
+ project has shipped no new surface to ideate against — which only tightens the test and never
341
+ replaces it: a quiet month because the queue was full is the loop working, not the loop being
342
+ obsolete. Evaluate all three. When all three hold, record `policy-obsolete` and file **exactly ONE**
343
+ marker-deduped teardown proposal through `lisa-tracker-write` (per `tracked-work` +
344
+ `integration-access-layer`):
345
+
346
+ - **Marker** `<!-- [lisa-automation-retire] key=exploratory-prds -->` plus a visible prose line;
347
+ matched on the marker, never the title; searched **open AND closed** per `rejection-detection`'s
348
+ **Proposal rejection memory**. Treat matches by close state: **open** suppresses another proposal;
349
+ **Not planned** suppresses another proposal unless new evidence postdates the rejection;
350
+ **Completed** means the prior approved action happened, so a later recurrence may be re-filed.
351
+ When an existing proposal suppresses filing, **the run still records `policy-obsolete` and files
352
+ nothing** — the outcome describes this run, while the ticket is filed exactly once.
353
+ - **Labels** `status:blocked` + `human-needed`, carrying the contract's decision-ready packet. The
354
+ `human-needed` label marks the proposal human-owned: `lisa-repair-intake` recognizes it and never
355
+ re-dispatches it as stalled work.
356
+ - **Evidence** the date-filtered search result, this run's summary, **the loop's current cadence**
357
+ (the baseline an operator needs to choose a longer one), and a one-line summary of recent runs
358
+ read from `.lisa/automations/runs/exploratory-prds.jsonl`. Fill the rest of the packet the same
359
+ way every time: *Work already attempted* is the searches this run ran, and *Risk of inaction* is
360
+ that the loop keeps consuming schedule slots and tokens for nothing.
361
+ - **How to answer** names the three operator responses: **approve** — run
362
+ `/lisa:tear-down-automations exploratory-prds` and only that loop registration goes away;
363
+ **decline** — close the proposal as
364
+ **Not planned** (closing it as **Completed** leaves a later re-file open) and the loop simply
365
+ continues; **re-cadence** — pick a longer cadence off that evidence and re-register with
366
+ `/lisa:setup-automations` instead of tearing down.
367
+ - **Operator footer**, verbatim, as on every loop-filed proposal (`rejection-detection`):
368
+ > To stop this from being raised again, close it as **Not planned**. Close it as **Completed** if it was fixed — a later recurrence may be re-filed as a regression.
369
+
370
+ The loop **keeps running at its normal cadence** until a human acts, and never deletes its own
371
+ registration.
372
+
331
373
  ## Out of scope (hard rules)
332
374
 
333
375
  - **No fabricated personas.** No evidence citation → no persona; generic roles banned without
@@ -339,8 +381,9 @@ the run — a recording failure is a degradation to report, never a reason to bl
339
381
  - **Tests, lint, typecheck, and build are not the empirical verification plan** — they are
340
382
  prerequisites; verification must observe user-facing behavior.
341
383
  - **Do not create tracker tickets or mutate the host project's code.** PRD creation (via
342
- `lisa-research`) is the only write this skill performs; ticket planning (`lisa-plan`) and
343
- implementation (`lisa-implement`) are separate, user-invoked flows.
384
+ `lisa-research`) is the only normal write this skill performs; the only tracker-ticket exception is
385
+ the exactly-one marker-deduped `policy-obsolete` teardown proposal described above. Ticket planning
386
+ (`lisa-plan`) and implementation (`lisa-implement`) are separate, user-invoked flows.
344
387
  - **Do not write PRDs to the source directly** — always go through `lisa-research` →
345
388
  `lisa-prd-source-write` so the source stays switchable.
346
389
  - **Do not add a new verification/browser-automation framework** when one already exists — reuse it.
@@ -1000,6 +1000,7 @@ to each item* — the two never merge in the one-line summary.
1000
1000
  | Repair produced new work for a human to pick up — e.g. an unmergeable PR or failed deploy filed as a **build-ready fix ticket** and left `blocked` | `candidate-proposed` |
1001
1001
  | A repair reached an autonomy boundary needing a human (a protected-deploy approval before it can proceed) | `approval-requested` |
1002
1002
  | The loop itself could not run — the queue is unreadable, tracker credentials are revoked, or an open-and-closed rejection-memory / blocker-marker search is unreadable and therefore must not fall through to `nothing-needed` | `recovery-required` |
1003
+ | The runbook's **Retirement condition** tripped | `policy-obsolete` — **never reached by design for this loop** (see Retirement evaluation below) |
1003
1004
 
1004
1005
  Record **exactly one** outcome per invocation through the run-record CLI, naming this loop's runbook
1005
1006
  (the `--summary` is the operator-readable one-liner in the contract's exemplar voice — plain,
@@ -1019,6 +1020,13 @@ If `${CLAUDE_PLUGIN_ROOT}` is unset, resolve the plugin scripts directory direct
1019
1020
  abort** (per `automation-runbook-contract`): note the recording failure in the run output and finish
1020
1021
  the cycle — a recording failure is a degradation to report, never a reason to block the loop.
1021
1022
 
1023
+ **Retirement evaluation (every run).** The `intake-repair` loop is **structural to the
1024
+ factory — it does not retire.** Its runbook says so plainly instead of leaving the Retirement
1025
+ condition blank, so the `automation-runbook-contract` rule's two-part retirement test never fires
1026
+ here: this loop never records `policy-obsolete` and never files a teardown proposal. An operator who
1027
+ wants repair to stop runs `/lisa:tear-down-automations` themselves — the loop never removes its own
1028
+ registration.
1029
+
1022
1030
  ## Schedule examples
1023
1031
 
1024
1032
  ```text
@@ -187,13 +187,31 @@ One line each; expand them into the operator's voice, keep the meaning.
187
187
 
188
188
  | Loop | Intent | Sources of truth | Candidate selection | Scope/bounds | Retirement condition | Derive the other five from |
189
189
  |---|---|---|---|---|---|---|
190
- | **intake-repair** | Keeps the queues unstuck: work that stalled mid-flight gets diagnosed and moved again. | The PRD and build queues for this project, read through the tracker access layer. | Stuck or half-closed items — stalled in an in-progress role, terminal-labeled but still open, rollups whose children are all done — up to the `max_candidates` cap. | Only this project's configured queues; it repairs lifecycle state, never invents or closes real work. | Propose teardown when nothing has needed repair for a long quiet window AND this run found nothing. | `lisa-repair-intake/SKILL.md` |
191
- | **intake-prd** | Keeps PRDs moving: a PRD a human marked ready gets validated and decomposed into work items. | The configured PRD queue and its lifecycle roles, read through the source access layer. | The oldest PRD in the ready role, one per run. | Only this project's PRD queue; it never authors product intent, only validates and decomposes it. | Propose teardown when no PRD has entered the queue for a long quiet window AND this run proposed nothing. | `lisa-intake/SKILL.md` |
192
- | **intake-tickets** | Keeps the build queue moving: work items a human marked ready get built, reviewed, and shipped. | The configured tracker's build queue lanes plus each item's comments and linked PRs. | The oldest eligible leaf work item in the ready lane, one per run. | Only this repo's configured queue; containers with open children are repaired out, never built. | Propose teardown when no work item has entered this queue for a long quiet window AND this run proposed nothing. | `lisa-intake/SKILL.md` |
193
- | **monitor** | Keeps production honest: observability regressions become tracked work instead of silent decay. | The connected observability providers, each through its access layer, plus this project's `monitor.gapTiers` config. | The regressions and coverage gaps this cycle surfaced, capped per run. | Only this project's own services and dashboards; it files findings, it never changes production. | Propose teardown when the project has no connected observability surfaces AND this run found nothing. | `lisa-monitor/SKILL.md` |
194
- | **exploratory-prds** | Keeps the idea pipeline fed: the product's own gaps become PRDs when the PRD queue has room. | The PRD queue's pressure roles (the same ones `/lisa:queue-status` reports) and the project's own product surfaces. | One ideated PRD per run, and only when the pressure gate says the queue has capacity. | Never more than one PRD per run, and nothing at all while unresolved PRD pressure exists. | Propose teardown when the queue has been at pressure or the project has shipped no new surface across a long quiet window AND this run proposed nothing. | `lisa-project-ideation/SKILL.md` |
195
- | **exploratory-bugs** | Keeps quality visible: bugs and usability problems get found by using the product, before a customer does. | The running application through its exploratory-qa surface, plus this project's existing bug queue for dedupe. | The findings of one exploratory session, capped per run and deduped against already-filed items. | Only this project's own app; it files tickets, it never changes product code. | Propose teardown when no session has produced a finding across a long quiet window AND this run found nothing. | `lisa-exploratory-qa/SKILL.md` (the stack's own copy) |
196
- | **learnings-audit** | Keeps the project's knowledge true: stale, duplicated, or contradicted knowledge gets proposed for promotion, demotion, or retirement. | The learnings ledger, the rules trees, the skills, and the wiki — the project's knowledge surfaces. | The knowledge entries this audit judged stale, duplicated, or contradicted, capped per run. | It only proposes; every promote/demote/retire decision is a human-gated tracker ticket. | Propose teardown when the audit has proposed nothing across a long quiet window AND this run proposed nothing. | `lisa-learnings-audit/SKILL.md` |
190
+ | **intake-repair** | Keeps the queues unstuck: work that stalled mid-flight gets diagnosed and moved again. | The PRD and build queues for this project, read through the tracker access layer. | Stuck or half-closed items — stalled in an in-progress role, terminal-labeled but still open, rollups whose children are all done — up to the `max_candidates` cap. | Only this project's configured queues; it repairs lifecycle state, never invents or closes real work. | **Structural to the factory this loop does not retire.** Queues will always need unsticking, so no condition should ever stop it; say that here rather than leaving the section blank. | `lisa-repair-intake/SKILL.md` |
191
+ | **intake-prd** | Keeps PRDs moving: a PRD a human marked ready gets validated and decomposed into work items. | The configured PRD queue and its lifecycle roles, read through the source access layer. | The oldest PRD in the ready role, one per run. | Only this project's PRD queue; it never authors product intent, only validates and decomposes it. | **Structural to the factory this loop does not retire.** PRDs keep arriving for as long as the project is alive, so no condition should ever stop it; say that here rather than leaving the section blank. | `lisa-intake/SKILL.md` |
192
+ | **intake-tickets** | Keeps the build queue moving: work items a human marked ready get built, reviewed, and shipped. | The configured tracker's build queue lanes plus each item's comments and linked PRs. | The oldest eligible leaf work item in the ready lane, one per run. | Only this repo's configured queue; containers with open children are repaired out, never built. | **Structural to the factory this loop does not retire.** The build queue is how work ships, so no condition should ever stop it; say that here rather than leaving the section blank. | `lisa-intake/SKILL.md` |
193
+ | **monitor** | Keeps production honest: observability regressions become tracked work instead of silent decay. | The connected observability providers, each through its access layer, plus this project's `monitor.gapTiers` config. | The regressions and coverage gaps this cycle surfaced, capped per run. | Only this project's own services and dashboards; it files findings, it never changes production. | Propose teardown when ALL THREE hold: a date-filtered tracker search finds nothing this loop filed within the trailing 30-day window (a small multiple of its daily cadence), AND this run found nothing, AND the project has no connected observability surfaces left nothing to monitor. The third is a domain conjunct that only tightens the contract's two-part test: a quiet month on a healthy project is good news, not a reason to stop watching it. | `lisa-monitor/SKILL.md` |
194
+ | **exploratory-prds** | Keeps the idea pipeline fed: the product's own gaps become PRDs when the PRD queue has room. | The PRD queue's pressure roles (the same ones `/lisa:queue-status` reports) and the project's own product surfaces. | One ideated PRD per run, and only when the pressure gate says the queue has capacity. | Never more than one PRD per run, and nothing at all while unresolved PRD pressure exists. | Propose teardown when ALL THREE hold: a date-filtered tracker search finds no PRD this loop ideated within the trailing 30-day window (a small multiple of its daily cadence), AND this run proposed nothing, AND no unresolved PRD pressure exists while the project has shipped no new surface to ideate against. The third is a domain conjunct that only tightens the contract's two-part test: a quiet month because the queue was full is the loop working, not the loop being obsolete. | `lisa-project-ideation/SKILL.md` |
195
+ | **exploratory-bugs** | Keeps quality visible: bugs and usability problems get found by using the product, before a customer does. | The running application through its exploratory-qa surface, plus this project's existing bug queue for dedupe. | The findings of one exploratory session, capped per run and deduped against already-filed items. | Only this project's own app; it files tickets, it never changes product code. | Propose teardown when ALL THREE hold: a date-filtered tracker search finds no finding this loop filed within the trailing 30-day window (a small multiple of its daily cadence), AND this run found nothing, AND the project no longer ships an exploratory-qa command surface to explore. The third is a domain conjunct that only tightens the contract's two-part test: a quiet month on a product nobody broke is quality holding, not a reason to stop looking. | `lisa-exploratory-qa/SKILL.md` (the stack's own copy) |
196
+ | **learnings-audit** | Keeps the project's knowledge true: stale, duplicated, or contradicted knowledge gets proposed for promotion, demotion, or retirement. | The learnings ledger, the rules trees, the skills, and the wiki — the project's knowledge surfaces. | The knowledge entries this audit judged stale, duplicated, or contradicted, capped per run. | It only proposes; every promote/demote/retire decision is a human-gated tracker ticket. | Propose teardown when BOTH hold: a date-filtered tracker search finds no `[lisa-gardener]` ticket created within the trailing six-week window (six runs at the weekly cadence), AND this run proposed nothing. | `lisa-learnings-audit/SKILL.md` |
197
+
198
+ **Retirement condition is mandatory and non-empty.** Every seeded runbook states one, and a loop
199
+ that is structurally permanent says exactly that instead of leaving the section blank — an operator
200
+ reading it aloud must be able to say when this loop should stop existing, or that it never should.
201
+ A valid condition is **stateless**: derived from the tracker, or from the loop's own bounded run
202
+ history at `.lisa/automations/runs/<loop-id>.jsonl` — written by the contract's own recorder, not
203
+ private per-loop state — and **never an ad-hoc counter** or a new state file. Those two sources are
204
+ the same discipline, not a loosening of the contract's "never from a counter or a state file": the
205
+ run history is written and bounded by `automation-run-record.mjs`, is readable by any run on any
206
+ machine, and is never invented per loop. What the contract forbids is a loop minting private state
207
+ to remember itself by. Prefer the tracker; reach for the run history only when the tracker cannot
208
+ answer the question. The mechanism itself — the two-part test, the single marker-deduped teardown
209
+ proposal, and the three operator responses — is defined once in the `automation-runbook-contract`
210
+ rule; these seeds only fill in each loop's specifics. A seed may add a **domain conjunct** on top of the contract's
211
+ two-part test — an extra AND that must also hold — because an additional conjunct is strictly
212
+ tighter and never divergent. It may never drop or weaken either of the contract's two conditions.
213
+ Silence alone means obsolescence only for the gardener; for a monitoring or exploratory loop a quiet
214
+ month usually means the project is healthy, which is exactly why those seeds carry a third conjunct.
197
215
 
198
216
  A loop not in this table — one registered later — seeds all ten sections from its own SKILL.md the
199
217
  same way. The table is seed prose for first write only; it is **not** a roster and never decides
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: lisa-tear-down-automations
3
- description: "Remove every recurring Lisa automation that /setup-automations registered for this project — whatever is actually registered under the lisa-auto-<project>-* prefix, including the opt-in learnings-audit gardener — using the CURRENT runtime's native scheduler — Codex automations or, on Claude, /schedule. This skill is a declarative specification: it identifies WHICH automations to remove; it does not run teardown scripts. Carries no fixed list of loops: the registration set is the roster. Removes only this project's Lisa automations — never other projects' automations or non-Lisa ones. Leaves checked-in runbook files on disk. The inverse of /setup-automations."
3
+ description: "Remove recurring Lisa automations that /setup-automations registered for this project — either the whole lisa-auto-<project>-* fleet by default, or one named loop registration when approving a policy-obsolete proposal — using the CURRENT runtime's native scheduler — Codex automations or, on Claude, /schedule. This skill is a declarative specification: it identifies WHICH automations to remove; it does not run teardown scripts. Carries no fixed list of loops for fleet teardown: the registration set is the roster. Removes only this project's Lisa automations — never other projects' automations or non-Lisa ones. Leaves checked-in runbook files on disk. The inverse of /setup-automations."
4
4
  allowed-tools: ["Skill", "Bash", "Read"]
5
5
  ---
6
6
 
@@ -8,7 +8,9 @@ allowed-tools: ["Skill", "Bash", "Read"]
8
8
 
9
9
  This skill is a **specification, not a script.** It tells the current runtime which recurring Lisa
10
10
  automations to remove — the ones `/setup-automations` created for THIS project — and the runtime
11
- removes them with its **native** scheduling mechanism.
11
+ removes them with its **native** scheduling mechanism. With no loop argument it removes the whole
12
+ project fleet. With a loop id argument (for example `monitor` or `learnings-audit`) it removes only
13
+ that one registered loop.
12
14
 
13
15
  ## Runtime scheduler (branch on the current runtime)
14
16
 
@@ -21,11 +23,15 @@ removes them with its **native** scheduling mechanism.
21
23
 
22
24
  ## Scope (remove only what setup created)
23
25
 
24
- - Remove **every** automation `/setup-automations` registered for the current project — the whole
26
+ - By default, remove **every** automation `/setup-automations` registered for the current project — the whole
25
27
  set found under the stable `lisa-auto-<project>-` name prefix, whatever it currently contains.
26
28
  **Membership is registration, not a roster** (`automation-runbook-contract`): sweep the prefix and
27
29
  remove what is there. Do **not** work from a fixed list of loop names — a list drifts the moment a
28
30
  loop is added, which is exactly how the opt-in gardener came to be orphaned.
31
+ - When `$ARGUMENTS` names a loop id from a `policy-obsolete` teardown proposal, remove only that
32
+ loop's registration under the same prefix, e.g. `lisa-auto-<project>-monitor`. Report every other
33
+ project automation left in place. If the named loop is absent, that single-loop teardown is a clean
34
+ no-op; do not widen it into a fleet teardown.
29
35
  - This explicitly includes the opt-in **`learnings-audit`** gardener when it is registered:
30
36
  `/setup-automations learnings-audit=true` registers it under the same prefix, so teardown removes
31
37
  it with the rest. A conditionally-skipped loop (e.g. `exploratory-bugs` on a stack without
@@ -40,6 +46,31 @@ removes them with its **native** scheduling mechanism.
40
46
  loops did. Teardown removes scheduler registrations only; it never deletes, edits, or moves a
41
47
  runbook file. An operator who wants them gone removes them deliberately, in git.
42
48
 
49
+ ## Answering a `policy-obsolete` teardown proposal
50
+
51
+ Running this skill with the proposing loop id is the **approve** answer to a loop's own retirement
52
+ proposal. When a registered loop's runbook **Retirement condition** trips, that loop records the
53
+ `policy-obsolete` run outcome and files exactly one ticket recommending its own teardown
54
+ (`automation-runbook-contract`) — and then keeps running at its normal cadence, because a loop never
55
+ removes its own registration.
56
+ Teardown is **always human-invoked**: it is never
57
+ triggered by a loop, on any schedule, for any outcome. The operator has three answers, and only the
58
+ first brings you here. The proposal authorizes only that loop's registration unless the human
59
+ explicitly asks for fleet teardown.
60
+
61
+ 1. **Approve** — run this skill with the proposal's loop id, e.g.
62
+ `/lisa:tear-down-automations monitor`. When it has run, close the proposal as **Completed**: the
63
+ loop-scoped teardown it asked for actually happened, and Completed is the close reason that says
64
+ so.
65
+ 2. **Decline** — close the proposal as **Not planned** (that close reason is what stops the loop
66
+ re-raising it; **Completed** would leave a later re-file open). The loop simply continues at its
67
+ normal cadence, and nothing is removed.
68
+ 3. **Re-cadence** — you pick the longer cadence and re-register the loop with
69
+ `/lisa:setup-automations`; the loop never adjusts its own schedule. The proposal's evidence
70
+ carries the loop's **current cadence** as the baseline to choose against, plus a one-line summary
71
+ of its recent runs. Then close the proposal as **Completed** — the schedule change is the action
72
+ it asked for.
73
+
43
74
  ## Report
44
75
 
45
76
  List each automation removed by name. For "already absent", compare against the one source of truth
@@ -1,4 +1,4 @@
1
1
  display_name: "Tear Down Automations"
2
- short_description: "Remove every recurring Lisa automation that /setup-automations registered for this project — whatever is actually registered under the…"
2
+ short_description: "Remove recurring Lisa automations that /setup-automations registered for this project — either the whole lisa-auto-<project>-* fleet by…"
3
3
  default_prompt:
4
- - "Use $lisa-tear-down-automations: Remove every recurring Lisa automation that /setup-automations registered for this project — whatever is actually registered under the…."
4
+ - "Use $lisa-tear-down-automations: Remove recurring Lisa automations that /setup-automations registered for this project — either the whole lisa-auto-<project>-* fleet by…."
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.257.2",
3
+ "version": "2.258.1",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -104,8 +104,13 @@ and records it, so a quiet run and a broken run are never mistaken for each othe
104
104
  | Findings filed — one or more `Bug` / `Improvement` tickets created or referenced (§6) | `candidate-proposed` |
105
105
  | Clean pass — explored the personas and surfaces, nothing worth filing — **or** every candidate was suppressed by a prior decline (`rejection-detection` **Proposal rejection memory**): the summary MUST name the suppression count | `nothing-needed` |
106
106
  | Tracker unconfigured — the §1 stop path; findings cannot be filed — **or** the open-and-closed rejection-memory marker search could not run (tracker unreachable / credentials revoked): a memory check that could not run is a broken loop, never a silent `nothing-needed` | `recovery-required` |
107
+ | The runbook's **Retirement condition** tripped — the trailing quiet window is empty AND this pass found nothing to file AND the project no longer ships an exploratory-qa surface — this row supersedes the `nothing-needed` row when it applies | `policy-obsolete` |
107
108
  | A degradation that still let the pass explore (e.g. Kane unavailable, one persona unreachable) | the outcome it actually reached above, with the summary **leading with the degradation** — degradation never mints a seventh token |
108
109
 
110
+ Before invoking the run-record CLI, evaluate the **Retirement condition** first. If it applies,
111
+ select `policy-obsolete` as the sole outcome and do not record a prior `nothing-needed` result;
112
+ otherwise select the ordinary outcome from the table.
113
+
109
114
  Record **exactly one** outcome per invocation through the run-record CLI, naming this loop's runbook
110
115
  (the `--summary` is the operator-readable one-liner in the contract's exemplar voice — plain,
111
116
  specific, actionable, e.g. `Explored 4 personas; nothing confusing to file.` — or, when a decline suppressed the only candidates, `Explored 4 personas; 2 candidates suppressed by a prior decline — nothing new to propose.` — for `nothing-needed`; and for a `recovery-required` from an unreadable decline check, `Tracker unreachable during the decline check — restore credentials; nothing was filed this run.`):
@@ -123,6 +128,42 @@ If `${CLAUDE_PLUGIN_ROOT}` is unset, resolve the plugin scripts directory direct
123
128
  abort** (per `automation-runbook-contract`): note the recording failure in the run output and finish
124
129
  the cycle — a recording failure is a degradation to report, never a reason to block the loop.
125
130
 
131
+ **Retirement evaluation (every run).** Evaluate this loop's runbook **Retirement condition** on
132
+ every run, exactly as the `automation-runbook-contract` rule's Retirement section defines it — this
133
+ skill conforms to that text and never restates or diverges from it. On top of the contract's two
134
+ conditions the runbook seeds a third **domain conjunct** — the project no longer ships an
135
+ exploratory-qa command surface to explore — which only tightens the test and never replaces it: a
136
+ quiet month on a product nobody broke is quality holding, not a reason to stop looking. Evaluate all
137
+ three. When all three hold, record `policy-obsolete` and file **exactly ONE** marker-deduped
138
+ teardown proposal through `lisa-tracker-write` (per `tracked-work` + `integration-access-layer`):
139
+
140
+ - **Marker** `<!-- [lisa-automation-retire] key=exploratory-bugs -->` plus a visible prose line;
141
+ matched on the marker, never the title; searched **open AND closed** per `rejection-detection`'s
142
+ **Proposal rejection memory**. Treat matches by close state: **open** suppresses another proposal;
143
+ **Not planned** suppresses another proposal unless new evidence postdates the rejection;
144
+ **Completed** means the prior approved action happened, so a later recurrence may be re-filed.
145
+ When an existing proposal suppresses filing, **the run still records `policy-obsolete` and files
146
+ nothing** — the outcome describes this run, while the ticket is filed exactly once.
147
+ - **Labels** `status:blocked` + `human-needed`, carrying the contract's decision-ready packet. The
148
+ `human-needed` label marks the proposal human-owned: `lisa-repair-intake` recognizes it and never
149
+ re-dispatches it as stalled work.
150
+ - **Evidence** the date-filtered search result, this run's summary, **the loop's current cadence**
151
+ (the baseline an operator needs to choose a longer one), and a one-line summary of recent runs
152
+ read from `.lisa/automations/runs/exploratory-bugs.jsonl`. Fill the rest of the packet the same
153
+ way every time: *Work already attempted* is the searches this run ran, and *Risk of inaction* is
154
+ that the loop keeps consuming schedule slots and tokens for nothing.
155
+ - **How to answer** names the three operator responses: **approve** — run
156
+ `/lisa:tear-down-automations exploratory-bugs` and only that loop registration goes away;
157
+ **decline** — close the proposal as
158
+ **Not planned** (closing it as **Completed** leaves a later re-file open) and the loop simply
159
+ continues; **re-cadence** — pick a longer cadence off that evidence and re-register with
160
+ `/lisa:setup-automations` instead of tearing down.
161
+ - **Operator footer**, verbatim, as on every loop-filed proposal (`rejection-detection`):
162
+ > To stop this from being raised again, close it as **Not planned**. Close it as **Completed** if it was fixed — a later recurrence may be re-filed as a regression.
163
+
164
+ The loop **keeps running at its normal cadence** until a human acts, and never deletes its own
165
+ registration.
166
+
126
167
  ## Quality bar
127
168
 
128
169
  - Explore as a true first-time user — judge clarity, not whether you (who can read the code) can figure it out.
@@ -131,6 +131,7 @@ matches the mode this cycle ran in: **`intake-prd`** (PRD-side dispatch) or **`i
131
131
  | A build cycle that shipped and verified (merged PR + evidence), or a shipped PRD moved to `verified` | `change-proved` |
132
132
  | A protected deployment (or other autonomy boundary the lifecycle hits) waiting on a human approval | `approval-requested` |
133
133
  | The queue itself is misconfigured or unreadable — missing required input (step 1) or an unreachable Status/workflow (step 2/`3` misconfig) so the cycle could not run | `recovery-required` |
134
+ | The runbook's **Retirement condition** tripped | `policy-obsolete` — **never reached by design for either intake loop-id** (see Retirement evaluation below) |
134
135
 
135
136
  **Seam warning (the #1 misread in this ticket).** A run outcome describes this *cycle*; `Blocked` is
136
137
  a *work item's* lifecycle terminal state — the two never merge in the summary. When Intake correctly
@@ -156,6 +157,13 @@ If `${CLAUDE_PLUGIN_ROOT}` is unset, resolve the plugin scripts directory direct
156
157
  abort** (per `automation-runbook-contract`): note the recording failure in the run output and finish
157
158
  the cycle — a recording failure is a degradation to report, never a reason to block the loop.
158
159
 
160
+ **Retirement evaluation (every run).** Both loop-ids this skill backs are **structural to the
161
+ factory — they do not retire.** Their runbooks say so plainly instead of leaving the Retirement
162
+ condition blank, so the `automation-runbook-contract` rule's two-part retirement test never fires
163
+ here: neither `intake-prd` nor `intake-tickets` ever records `policy-obsolete`, and neither ever
164
+ files a teardown proposal. An operator who wants intake to stop runs `/lisa:tear-down-automations`
165
+ themselves — the loop never removes its own registration.
166
+
159
167
  ## Schedule examples
160
168
 
161
169
  ```text
@@ -339,8 +339,10 @@ failure is a degradation to report, never a reason to block the loop.
339
339
 
340
340
  ## Retirement condition
341
341
 
342
- The loop retires itself by the same discipline it applies to everything else,
343
- and the condition is **stateless — derived from the tracker, never from a
342
+ The loop proposes retirement by the same discipline it applies to everything else,
343
+ conforming to the `automation-runbook-contract` rule's Retirement section
344
+ rather than restating or diverging from it. The condition is **stateless —
345
+ derived from the tracker, never from a
344
346
  counter or state file** (there is no durable home for a run counter, and a
345
347
  tracker-derived condition is headless- and concurrent-safe by construction).
346
348
  Propose retirement when BOTH hold:
@@ -352,11 +354,46 @@ Propose retirement when BOTH hold:
352
354
  2. **This run proposes nothing** — the current run's inventory yields zero
353
355
  candidates (it is terminating `nothing-needed`).
354
356
 
355
- When both hold, the gardener files ONE (marker-deduped) ticket proposing to
356
- lengthen its cadence or tear down its automation (`/tear-down-automations`),
357
- with the date-filtered search result and this run's summary as evidence. It
358
- keeps running until a human flips that ticket — retirement is a
359
- recommendation like any other, never a self-executed exit.
357
+ When both hold, the gardener records `policy-obsolete` and files **exactly ONE**
358
+ marker-deduped ticket proposing to lengthen its cadence or tear down its
359
+ automation, through `lisa-tracker-write` (per `tracked-work` +
360
+ `integration-access-layer`):
361
+
362
+ - **Marker** `<!-- [lisa-automation-retire] key=learnings-audit -->` plus a
363
+ visible prose line; matched on the marker, never the title; searched **open
364
+ AND closed** per `rejection-detection`'s **Proposal rejection memory**. Treat
365
+ matches by close state: **open** suppresses another proposal; **Not planned**
366
+ suppresses another proposal unless new evidence postdates the rejection;
367
+ **Completed** means the prior approved action happened, so a later recurrence
368
+ may be re-filed. The `[lisa-gardener]` search above stays what it is — the
369
+ candidate evidence, not the dedupe key. When an existing proposal suppresses
370
+ filing, **the run still records `policy-obsolete` and files nothing** — the
371
+ outcome describes this run, while the ticket is filed exactly once.
372
+ - **Labels** `status:blocked` + `human-needed`, carrying the contract's
373
+ decision-ready packet. The `human-needed` label marks the proposal
374
+ human-owned: `lisa-repair-intake` recognizes it and never re-dispatches it as
375
+ stalled work.
376
+ - **Evidence** the date-filtered search result, this run's summary, **the
377
+ loop's current cadence** (the baseline an operator needs to choose a longer
378
+ one), and a one-line summary of recent runs read from
379
+ `.lisa/automations/runs/learnings-audit.jsonl`. Fill the rest of the packet
380
+ the same way every time: *Work already attempted* is the searches this run
381
+ ran, and *Risk of inaction* is that the loop keeps consuming schedule slots
382
+ and tokens for nothing.
383
+ - **How to answer** names the three operator responses: **approve** — run
384
+ `/lisa:tear-down-automations learnings-audit` and only that loop registration goes away; **decline** —
385
+ close the proposal as **Not planned** (closing it as **Completed** leaves a
386
+ later re-file open) and the gardener simply continues; **re-cadence** — pick a
387
+ longer cadence off that evidence and re-register with
388
+ `/lisa:setup-automations` instead of tearing down.
389
+ - **Operator footer**, verbatim, as on every loop-filed proposal
390
+ (`rejection-detection`):
391
+ > To stop this from being raised again, close it as **Not planned**. Close it as **Completed** if it was fixed — a later recurrence may be re-filed as a regression.
392
+
393
+ The gardener **keeps running at its normal cadence** until a human flips that
394
+ ticket — retirement is a recommendation like any other, never a self-executed
395
+ exit — and it never deletes its own
396
+ registration.
360
397
 
361
398
  ## Scheduling
362
399
 
@@ -152,6 +152,7 @@ so a quiet monitoring run and a broken one never look identical.
152
152
  | Anomalies or in-scope gaps filed — one or more `Bug` / `Task` / `Improvement` leaves created or referenced | `candidate-proposed` |
153
153
  | Clean sweep — health/audit ran end to end, nothing over the bar and no in-scope gaps — **or** every finding was suppressed by a prior decline (`rejection-detection` **Proposal rejection memory**): the summary MUST name the suppression count | `nothing-needed` |
154
154
  | Provider/threshold resolution failure — threshold collection fails (a present-but-uninspectable config, an invalid configured threshold) or a signal provider is unreachable so the sweep could not run — **or** the open-and-closed rejection-memory search could not read the tracker: a memory check that could not run is a broken loop, never a silent `nothing-needed` | `recovery-required` |
155
+ | The runbook's **Retirement condition** tripped — the trailing quiet window is empty AND this sweep found nothing AND no connected observability surfaces are left — this row supersedes the `nothing-needed` row when it applies | `policy-obsolete` |
155
156
  | A degradation that still let the sweep run (an optional `ops-specialist` overlay absent, Kane unavailable) | the outcome it actually reached above, with the summary **leading with the degradation** — degradation never mints a seventh token |
156
157
 
157
158
  Only the **standalone** run records. The nested report-only modes do their own job and do not file or
@@ -159,6 +160,10 @@ record: `--report-only` (including the `lisa-verify` post-deploy call, whose sum
159
160
  the originating item) and `--dry-run` (a preview that creates nothing) are not registered-loop
160
161
  invocations.
161
162
 
163
+ Before invoking the run-record CLI, evaluate the **Retirement condition** first. If it applies,
164
+ select `policy-obsolete` as the sole outcome and do not record a prior `nothing-needed` result;
165
+ otherwise select the ordinary outcome from the table.
166
+
162
167
  Record **exactly one** outcome per standalone invocation through the run-record CLI, naming this
163
168
  loop's runbook (the `--summary` is the operator-readable one-liner in the contract's exemplar voice —
164
169
  plain, specific, actionable, e.g. `Health green; audit clean — nothing to propose.` for
@@ -177,3 +182,39 @@ If `${CLAUDE_PLUGIN_ROOT}` is unset, resolve the plugin scripts directory direct
177
182
  `plugins/src/base/scripts/automation-run-record.mjs`. If recording still fails, **degrade, never
178
183
  abort** (per `automation-runbook-contract`): note the recording failure in the run output and finish
179
184
  the cycle — a recording failure is a degradation to report, never a reason to block the loop.
185
+
186
+ **Retirement evaluation (every run).** Evaluate this loop's runbook **Retirement condition** on
187
+ every standalone run, exactly as the `automation-runbook-contract` rule's Retirement section defines
188
+ it — this skill conforms to that text and never restates or diverges from it. On top of the
189
+ contract's two conditions the runbook seeds a third **domain conjunct** — the project has no
190
+ connected observability surfaces left, so there is nothing to monitor — which only tightens the test
191
+ and never replaces it: a quiet month on a healthy project is good news, not a reason to stop
192
+ watching it. Evaluate all three. When all three hold, record `policy-obsolete` and file
193
+ **exactly ONE** marker-deduped teardown proposal through `lisa-tracker-write`
194
+ (per `tracked-work` + `integration-access-layer`):
195
+
196
+ - **Marker** `<!-- [lisa-automation-retire] key=monitor -->` plus a visible prose line; matched on
197
+ the marker, never the title; searched **open AND closed** per `rejection-detection`'s **Proposal
198
+ rejection memory**. Treat matches by close state: **open** suppresses another proposal;
199
+ **Not planned** suppresses another proposal unless new evidence postdates the rejection;
200
+ **Completed** means the prior approved action happened, so a later recurrence may be re-filed.
201
+ When an existing proposal suppresses filing, **the run still records `policy-obsolete` and files
202
+ nothing** — the outcome describes this run, while the ticket is filed exactly once.
203
+ - **Labels** `status:blocked` + `human-needed`, carrying the contract's decision-ready packet. The
204
+ `human-needed` label marks the proposal human-owned: `lisa-repair-intake` recognizes it and never
205
+ re-dispatches it as stalled work.
206
+ - **Evidence** the date-filtered search result, this run's summary, **the loop's current cadence**
207
+ (the baseline an operator needs to choose a longer one), and a one-line summary of recent runs
208
+ read from `.lisa/automations/runs/monitor.jsonl`. Fill the rest of the packet the same way every
209
+ time: *Work already attempted* is the searches this run ran, and *Risk of inaction* is that the
210
+ loop keeps consuming schedule slots and tokens for nothing.
211
+ - **How to answer** names the three operator responses: **approve** — run
212
+ `/lisa:tear-down-automations monitor` and only that loop registration goes away; **decline** — close the proposal as
213
+ **Not planned** (closing it as **Completed** leaves a later re-file open) and the loop simply
214
+ continues; **re-cadence** — pick a longer cadence off that evidence and re-register with
215
+ `/lisa:setup-automations` instead of tearing down.
216
+ - **Operator footer**, verbatim, as on every loop-filed proposal (`rejection-detection`):
217
+ > To stop this from being raised again, close it as **Not planned**. Close it as **Completed** if it was fixed — a later recurrence may be re-filed as a regression.
218
+
219
+ The loop **keeps running at its normal cadence** until a human acts, and never deletes its own
220
+ registration.