@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.
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-exploratory-qa/SKILL.md +41 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-intake/SKILL.md +8 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-learnings-audit/SKILL.md +44 -7
- package/plugins/lisa/.codex-plugin/skills/lisa-monitor/SKILL.md +41 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/SKILL.md +45 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +8 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/SKILL.md +25 -7
- package/plugins/lisa/.codex-plugin/skills/lisa-tear-down-automations/SKILL.md +34 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-tear-down-automations/agents/openai.yaml +2 -2
- package/plugins/lisa/rules/eager/automation-runbook-contract.md +2 -1
- package/plugins/lisa/rules/reference/automation-runbook-contract.md +9 -2
- package/plugins/lisa/skills/lisa-exploratory-qa/SKILL.md +41 -0
- package/plugins/lisa/skills/lisa-intake/SKILL.md +8 -0
- package/plugins/lisa/skills/lisa-learnings-audit/SKILL.md +44 -7
- package/plugins/lisa/skills/lisa-monitor/SKILL.md +41 -0
- package/plugins/lisa/skills/lisa-project-ideation/SKILL.md +45 -2
- package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +8 -0
- package/plugins/lisa/skills/lisa-setup-automations/SKILL.md +25 -7
- package/plugins/lisa/skills/lisa-tear-down-automations/SKILL.md +34 -3
- package/plugins/lisa/skills/lisa-tear-down-automations/agents/openai.yaml +2 -2
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-exploratory-qa/SKILL.md +41 -0
- package/plugins/lisa-agy/skills/lisa-intake/SKILL.md +8 -0
- package/plugins/lisa-agy/skills/lisa-learnings-audit/SKILL.md +44 -7
- package/plugins/lisa-agy/skills/lisa-monitor/SKILL.md +41 -0
- package/plugins/lisa-agy/skills/lisa-project-ideation/SKILL.md +45 -2
- package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +8 -0
- package/plugins/lisa-agy/skills/lisa-setup-automations/SKILL.md +25 -7
- package/plugins/lisa-agy/skills/lisa-tear-down-automations/SKILL.md +34 -3
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/rules/eager/automation-runbook-contract.md +2 -1
- package/plugins/lisa-copilot/rules/reference/automation-runbook-contract.md +9 -2
- package/plugins/lisa-copilot/skills/lisa-exploratory-qa/SKILL.md +41 -0
- package/plugins/lisa-copilot/skills/lisa-intake/SKILL.md +8 -0
- package/plugins/lisa-copilot/skills/lisa-learnings-audit/SKILL.md +44 -7
- package/plugins/lisa-copilot/skills/lisa-monitor/SKILL.md +41 -0
- package/plugins/lisa-copilot/skills/lisa-project-ideation/SKILL.md +45 -2
- package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +8 -0
- package/plugins/lisa-copilot/skills/lisa-setup-automations/SKILL.md +25 -7
- package/plugins/lisa-copilot/skills/lisa-tear-down-automations/SKILL.md +34 -3
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/automation-runbook-contract-reference.mdc +9 -2
- package/plugins/lisa-cursor/rules/automation-runbook-contract.mdc +2 -1
- package/plugins/lisa-cursor/skills/lisa-exploratory-qa/SKILL.md +41 -0
- package/plugins/lisa-cursor/skills/lisa-intake/SKILL.md +8 -0
- package/plugins/lisa-cursor/skills/lisa-learnings-audit/SKILL.md +44 -7
- package/plugins/lisa-cursor/skills/lisa-monitor/SKILL.md +41 -0
- package/plugins/lisa-cursor/skills/lisa-project-ideation/SKILL.md +45 -2
- package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +8 -0
- package/plugins/lisa-cursor/skills/lisa-setup-automations/SKILL.md +25 -7
- package/plugins/lisa-cursor/skills/lisa-tear-down-automations/SKILL.md +34 -3
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/rules/eager/automation-runbook-contract.md +2 -1
- package/plugins/src/base/rules/reference/automation-runbook-contract.md +9 -2
- package/plugins/src/base/skills/lisa-exploratory-qa/SKILL.md +41 -0
- package/plugins/src/base/skills/lisa-intake/SKILL.md +8 -0
- package/plugins/src/base/skills/lisa-learnings-audit/SKILL.md +44 -7
- package/plugins/src/base/skills/lisa-monitor/SKILL.md +41 -0
- package/plugins/src/base/skills/lisa-project-ideation/SKILL.md +45 -2
- package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +8 -0
- package/plugins/src/base/skills/lisa-setup-automations/SKILL.md +25 -7
- package/plugins/src/base/skills/lisa-tear-down-automations/SKILL.md +34 -3
|
@@ -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;
|
|
343
|
-
|
|
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. |
|
|
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. |
|
|
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. |
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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
|
|
@@ -34,7 +34,8 @@ Health and operator action are **orthogonal** — a healthy run can still need a
|
|
|
34
34
|
capability, then close the escalation item.
|
|
35
35
|
- `policy-obsolete` — the loop's own retirement policy (the retirement condition written in its
|
|
36
36
|
runbook) tripped, so it proposed its own teardown. **Healthy.** Operator action: approve the
|
|
37
|
-
teardown, decline it (close the proposal
|
|
37
|
+
teardown, decline it (close the proposal as **Not planned**; the loop keeps running at cadence),
|
|
38
|
+
or re-cadence it.
|
|
38
39
|
|
|
39
40
|
## A run outcome is NOT a work-item lifecycle terminal state (CRITICAL)
|
|
40
41
|
|
|
@@ -84,6 +84,11 @@ Retirement condition
|
|
|
84
84
|
cadence until someone approves, declines, or re-cadences it.
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
+
That example's 30-day retirement row is **illustration of the shape, not the shipped default**: the
|
|
88
|
+
seed `lisa-setup-automations` writes declares the three `intake-*` loops structural to the factory,
|
|
89
|
+
whose runbooks state plainly that they do not retire. The mechanism below is normative; the numbers
|
|
90
|
+
above are only a filled-in example.
|
|
91
|
+
|
|
87
92
|
## The six run outcomes
|
|
88
93
|
|
|
89
94
|
Exactly one per run. The one-line operator summary is not optional — it is what the status surface
|
|
@@ -99,7 +104,7 @@ only `recovery-required` means the machinery itself is broken.
|
|
|
99
104
|
| `change-proved` | The loop made a change and proved it with evidence. | Healthy | None — informational. | What changed and the evidence that proves it. |
|
|
100
105
|
| `approval-requested` | The loop reached its autonomous/approval boundary and asked a human. | Healthy | Answer the approval question. | What is waiting, on whom, and what happens if nobody answers. |
|
|
101
106
|
| `recovery-required` | The loop itself could not complete: access, tooling, or substrate is broken. | **Not healthy** — needs a human | Restore the named capability, then close the escalation item. | What broke, and the escalation item to act on. |
|
|
102
|
-
| `policy-obsolete` | The loop's own retirement policy — the retirement condition written in its runbook — tripped, so it proposed its own teardown. | Healthy | Decide: approve the teardown, decline it (close the proposal
|
|
107
|
+
| `policy-obsolete` | The loop's own retirement policy — the retirement condition written in its runbook — tripped, so it proposed its own teardown. | Healthy | Decide: approve the teardown, decline it (close the proposal as **Not planned**; the loop continues at cadence), or re-cadence it. | Why it looks obsolete and the teardown-proposal item. |
|
|
103
108
|
|
|
104
109
|
### Exemplar one-line summaries
|
|
105
110
|
|
|
@@ -189,7 +194,9 @@ teardown-proposal item — matched on the marker, never the title — carrying t
|
|
|
189
194
|
result and this run's summary as evidence, and proposing either a longer cadence or
|
|
190
195
|
`lisa-tear-down-automations`. The loop **keeps running at its normal cadence** until an operator
|
|
191
196
|
flips that proposal one of three ways: **approve** it (`lisa-tear-down-automations` runs and the
|
|
192
|
-
registration goes away), **decline** it (close the proposal
|
|
197
|
+
registration goes away), **decline** it (close the proposal as **Not planned** — closing it as
|
|
198
|
+
**Completed** leaves a later re-file open, per `rejection-detection`'s proposal rejection memory;
|
|
199
|
+
either way the loop simply continues), or
|
|
193
200
|
**re-cadence** it (register it at the longer cadence instead of tearing it down). Retirement is a
|
|
194
201
|
recommendation like any other, **never a self-executed exit**: a loop never deletes its own
|
|
195
202
|
registration, and a proposal nobody answers changes nothing.
|
|
@@ -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
|
|
343
|
-
|
|
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
|
|
356
|
-
lengthen its cadence or tear down its
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
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;
|
|
343
|
-
|
|
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.
|