@codyswann/lisa 2.239.1 → 2.241.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/learnings-entry.d.ts +9 -0
- package/dist/core/learnings-entry.d.ts.map +1 -1
- package/dist/core/learnings-entry.js +4 -2
- package/dist/core/learnings-entry.js.map +1 -1
- package/dist/core/learnings-writer.d.ts +33 -0
- package/dist/core/learnings-writer.d.ts.map +1 -1
- package/dist/core/learnings-writer.js +75 -1
- package/dist/core/learnings-writer.js.map +1 -1
- package/dist/sync/registry.d.ts.map +1 -1
- package/dist/sync/registry.js +7 -0
- package/dist/sync/registry.js.map +1 -1
- 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-attribute-failure/SKILL.md +142 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-attribute-failure/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +28 -77
- package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/SKILL.md +18 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/SKILL.md +18 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +18 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-persist-learning/SKILL.md +61 -8
- package/plugins/lisa/commands/attribute-failure.md +6 -0
- package/plugins/lisa/commands/persist-learning.md +1 -1
- package/plugins/lisa/rules/eager/claim-archaeology.md +37 -0
- package/plugins/lisa/rules/reference/claim-archaeology.md +142 -0
- package/plugins/lisa/rules/reference/project-learnings.md +18 -0
- package/plugins/lisa/skills/lisa-attribute-failure/SKILL.md +142 -0
- package/plugins/lisa/skills/lisa-attribute-failure/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/lisa-doctor/SKILL.md +28 -77
- package/plugins/lisa/skills/lisa-github-build-intake/SKILL.md +18 -0
- package/plugins/lisa/skills/lisa-jira-build-intake/SKILL.md +18 -0
- package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +18 -0
- package/plugins/lisa/skills/lisa-persist-learning/SKILL.md +62 -9
- package/plugins/lisa-agy/commands/lisa/attribute-failure.md +6 -0
- package/plugins/lisa-agy/commands/lisa/persist-learning.md +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-attribute-failure/SKILL.md +142 -0
- package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +28 -77
- package/plugins/lisa-agy/skills/lisa-github-build-intake/SKILL.md +18 -0
- package/plugins/lisa-agy/skills/lisa-jira-build-intake/SKILL.md +18 -0
- package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +18 -0
- package/plugins/lisa-agy/skills/lisa-persist-learning/SKILL.md +62 -9
- 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/commands/lisa/attribute-failure.md +6 -0
- package/plugins/lisa-copilot/commands/lisa/persist-learning.md +1 -1
- package/plugins/lisa-copilot/rules/eager/claim-archaeology.md +37 -0
- package/plugins/lisa-copilot/rules/reference/claim-archaeology.md +142 -0
- package/plugins/lisa-copilot/rules/reference/project-learnings.md +18 -0
- package/plugins/lisa-copilot/skills/lisa-attribute-failure/SKILL.md +142 -0
- package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +28 -77
- package/plugins/lisa-copilot/skills/lisa-github-build-intake/SKILL.md +18 -0
- package/plugins/lisa-copilot/skills/lisa-jira-build-intake/SKILL.md +18 -0
- package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +18 -0
- package/plugins/lisa-copilot/skills/lisa-persist-learning/SKILL.md +62 -9
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/commands/lisa/attribute-failure.md +6 -0
- package/plugins/lisa-cursor/commands/lisa/persist-learning.md +1 -1
- package/plugins/lisa-cursor/rules/claim-archaeology-reference.mdc +147 -0
- package/plugins/lisa-cursor/rules/claim-archaeology.mdc +42 -0
- package/plugins/lisa-cursor/rules/project-learnings-reference.mdc +18 -0
- package/plugins/lisa-cursor/skills/lisa-attribute-failure/SKILL.md +142 -0
- package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +28 -77
- package/plugins/lisa-cursor/skills/lisa-github-build-intake/SKILL.md +18 -0
- package/plugins/lisa-cursor/skills/lisa-jira-build-intake/SKILL.md +18 -0
- package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +18 -0
- package/plugins/lisa-cursor/skills/lisa-persist-learning/SKILL.md +62 -9
- 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/commands/attribute-failure.md +6 -0
- package/plugins/src/base/commands/persist-learning.md +1 -1
- package/plugins/src/base/rules/eager/claim-archaeology.md +37 -0
- package/plugins/src/base/rules/reference/claim-archaeology.md +142 -0
- package/plugins/src/base/rules/reference/project-learnings.md +18 -0
- package/plugins/src/base/skills/lisa-attribute-failure/SKILL.md +142 -0
- package/plugins/src/base/skills/lisa-doctor/SKILL.md +28 -77
- package/plugins/src/base/skills/lisa-github-build-intake/SKILL.md +18 -0
- package/plugins/src/base/skills/lisa-jira-build-intake/SKILL.md +18 -0
- package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +18 -0
- package/plugins/src/base/skills/lisa-persist-learning/SKILL.md +62 -9
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: lisa-persist-learning
|
|
3
|
-
description: This skill should be used when a candidate learning (from a failure signal, rejection, or debrief) needs to be judged and routed. It computes a stable fingerprint, runs the candidate through the hostile-default learning-judge gate, and performs exactly the verdict's side effects — a dropped-with-reason note on the triggering issue (drop), an upstream
|
|
3
|
+
description: This skill should be used when a candidate learning (from a failure signal, rejection, or debrief) needs to be judged and routed. It computes a stable fingerprint, runs the candidate through the hostile-default learning-judge gate, and performs exactly the verdict's side effects — a dropped-with-reason note on the triggering issue (drop), an automatically filed upstream Lisa ticket with marker dedupe, evidence, and a per-run cap (lisa-upstream), or a confidence-routed pull request that touches only the learnings surface (durable-learning). Idempotent via marker dedupe; headless-safe; never blocks the primary build flow.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Persist Learning
|
|
@@ -62,20 +62,73 @@ The note is one line naming the classification (with its fixed plain-language gl
|
|
|
62
62
|
|----------------|-------|
|
|
63
63
|
| `one-off` | a one-time fluke, not a recurring pattern |
|
|
64
64
|
| `misunderstanding/spec-gap` | traced to an unclear requirement, not a durable lesson |
|
|
65
|
-
| `lisa-upstream` | root cause
|
|
65
|
+
| `lisa-upstream` | root cause suspected in Lisa; routed for upstream attribution |
|
|
66
66
|
|
|
67
|
-
(
|
|
67
|
+
(A `lisa-upstream` classification never produces a drop note — it routes through the `handoff-upstream` flow below, whose step-1 note uses this pre-attribution wording because filing only happens after attribution confirms the Lisa surface.) Dedupe before posting: if any comment on the triggering issue already carries `[lisa-learning-drop] key=<fingerprint>`, do not post again — report the existing note.
|
|
68
68
|
|
|
69
69
|
### `handoff-upstream` (classification `lisa-upstream`)
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
This disposition completes the SLL-5 loop (#1583): on a Lisa-attributed failure the upstream Lisa ticket is filed **automatically**. Filing lives here — not in `lisa-attribute-failure` — because that skill is deliberately read-only (doctor delegates to it inside its own read-only contract), while this skill already owns exactly the verdict's side effects and the marker-dedupe discipline. Never persist a local rule for a Lisa-attributed failure; the host project's only durable trace is the brief linking note in step 6.
|
|
72
72
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
1. **Post the handoff marker** on the triggering issue (same one-comment marker dedupe; the marker key is unchanged). The visible line must not claim a filing that has not happened yet — attribution and filing come after this step:
|
|
74
|
+
|
|
75
|
+
```markdown
|
|
76
|
+
<!-- [lisa-learning-upstream-handoff] key=<fingerprint> -->
|
|
77
|
+
Candidate routed for upstream attribution (root cause suspected in Lisa): <reason>.
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
2. **Require a confirmed `lisa` verdict from `lisa-attribute-failure` — always.** Run the `lisa-attribute-failure` skill on the failure event before any filing. The judge's `cited_evidence` seeds the event (implicated files, surface in play, failure class) but never substitutes for the verdict — a path or commit reference alone is not attribution. File **only** when the skill returns a conclusive `lisa` verdict that names the Lisa surface with cited evidence. Any other outcome — `ambiguous`, `project`, or a verdict that cannot name a concrete Lisa surface — files **NOTHING** upstream: the candidate stays local and low-confidence, the run summary says attribution was inconclusive, and the step-1 note is resolved with one corrective follow-up comment on the triggering issue (marker-deduped so re-runs never repeat it; the suffix is distinct from the filing-failure marker in step 8 so one outcome never suppresses the other):
|
|
81
|
+
|
|
82
|
+
```markdown
|
|
83
|
+
<!-- [lisa-learning-upstream-handoff] key=<fingerprint>-inconclusive -->
|
|
84
|
+
Attribution was inconclusive — nothing was filed upstream and nothing was persisted locally.
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
3. **Derive the root-cause key from the LISA SURFACE, never the host project or the local issue.** Two projects hitting the same Lisa bug MUST collide on the same key — that collision is the design (update, not duplicate):
|
|
88
|
+
|
|
89
|
+
```text
|
|
90
|
+
root-cause-key = <lisa-surface>#<failure-class>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- `<lisa-surface>` — the Lisa-relative path of the surface at fault (e.g. `plugins/src/base/skills/lisa-doctor/SKILL.md`, `typescript/copy-overwrite/.github/workflows/quality.yml`), or the canonical rule/skill/hook name when no single file applies (e.g. `lisa-doctor`, `block-no-verify`).
|
|
94
|
+
- `<failure-class>` — a short lowercase hyphen-slug for the class of failure (e.g. `pagination-truncation`, `stale-artifact-overwrite`).
|
|
95
|
+
- Normalize: lowercase, trim, collapse every whitespace run to a single `-`. The key must contain no host-project name, no local issue number, and no fingerprint — those vary per project and would defeat fleet-wide dedupe.
|
|
96
|
+
|
|
97
|
+
4. **Enforce the per-run cap.** Resolve `hardening.maxUpstreamFilingsPerRun` from `.lisa.config.json` (default `5` — a conservative bound modeled on `lisa-repair-intake`'s `max_candidates` precedent). Count every upstream create **and** update this run performs; once the cap is reached, drop the remaining candidates and **note each dropped candidate visibly** (in the run summary, naming its root-cause key) — never queue a spam burst and never drop silently. A later run picks the dropped candidates up idempotently.
|
|
98
|
+
|
|
99
|
+
5. **Evidence redaction (binding).** The upstream repo is PUBLIC by default (`hardening.upstreamRepo` → `CodySwannGT/lisa`) and this filing runs headless on crons — treat every drafted upstream body and comment as world-readable:
|
|
77
100
|
|
|
78
|
-
|
|
101
|
+
- Quote ONLY Lisa-owned surface text: template/rule/skill/hook excerpts and upstream commit references. The reproduction must be REDACTED — generic placeholders, never the host project's real values.
|
|
102
|
+
- Never paste host environment values, tokens/credentials, connection strings, API keys, PII (names, emails, customer data), or proprietary host code/payloads.
|
|
103
|
+
- The evidence chain names the Lisa surface and the failure class — never project payloads. When host context is essential to understand the failure, LINK the host-project issue instead of quoting it.
|
|
104
|
+
- Before filing or commenting, scan the drafted body for common secret shapes — `key=value` pairs with high-entropy values, token prefixes (`AKIA`, `ghp_`, `xox`), email addresses — and strip on match. When in doubt, leave it out: a thinner upstream ticket is recoverable; a leaked secret is not.
|
|
105
|
+
|
|
106
|
+
6. **Dedupe by marker, then file or update.** The upstream marker is:
|
|
107
|
+
|
|
108
|
+
```markdown
|
|
109
|
+
<!-- [lisa-upstream-attribution] key=<root-cause-key> -->
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Resolve the upstream repo from `.lisa.config.json` `hardening.upstreamRepo` (default `CodySwannGT/lisa`). Search **all issue states** for an existing issue carrying the marker — a closed marker-bearing ticket still owns this root cause, and searching only open issues would mint a duplicate the moment the original closes. Match on the **MARKER, never the title** — with the same eventual-consistency guard as above (`gh issue list -R <upstream> --state all --search '"<marker>" in:body' --json number,state,url`, and when the search index returns nothing, also `gh issue list -R <upstream> --state all --json number,state,body` and grep the bodies for the marker before concluding no ticket exists).
|
|
113
|
+
|
|
114
|
+
- **No existing ticket** → file via `lisa-github-write-issue` targeting the upstream repo, following the `lisa-rework-triage` "Filing upstream" discipline: a three-audience description (what failed for the operator, what the harness did wrong, what to change), the redacted evidence chain (Lisa-owned text only, per step 5: defect → Lisa surface → attribution evidence → redacted reproduction), the affected project named, and the `self-hardening` label. The body carries **exactly one** dedupe marker; **never write a markerless body** — it permanently breaks all future dedupe.
|
|
115
|
+
- **Existing ticket (open or closed)** → this is a repeat encounter: comment the new occurrence on the existing issue with this project's evidence, marker-deduped per occurrence via `<!-- [lisa-upstream-attribution-occurrence] key=<fingerprint> -->` so re-runs never duplicate the occurrence comment. Never open a second issue, and never match on the title — evidence compounds on one ticket. When the match is **CLOSED**, still comment the occurrence there and reference it in the local trace instead of filing a duplicate; do not reopen it yourself — recurrence evidence on a closed ticket signals the shipped fix may not cover this case, and reopening is the upstream maintainer's call.
|
|
116
|
+
|
|
117
|
+
7. **Leave the local trace — a note, never a rule.** Post one follow-up comment on the triggering issue linking the upstream ticket:
|
|
118
|
+
|
|
119
|
+
```markdown
|
|
120
|
+
<!-- [lisa-upstream-filed] key=<fingerprint> -->
|
|
121
|
+
Upstream ticket: <url> (root-cause key `<root-cause-key>`). No local rule persisted — the fix ships fleet-wide through Lisa.
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
The learnings surface gains **no durable local rule** for a Lisa-attributed failure. Agents avoid the trap via the upstream ticket link until the fix ships.
|
|
125
|
+
|
|
126
|
+
8. **Degrade gracefully.** If filing fails (auth, rate limit, network), report the failure in the run summary and continue shipping the host issue — a later run retries idempotently. Never block the primary build flow. So the step-1 note is not left dangling, post a marker-deduped corrective follow-up on the triggering issue — with its own suffix, distinct from step 2's `-inconclusive`, so an earlier inconclusive note can never suppress a filing-failure note (or vice versa):
|
|
127
|
+
|
|
128
|
+
```markdown
|
|
129
|
+
<!-- [lisa-learning-upstream-handoff] key=<fingerprint>-filing-failed -->
|
|
130
|
+
Upstream filing did not complete — nothing was filed upstream and nothing was persisted locally; a later run retries.
|
|
131
|
+
```
|
|
79
132
|
|
|
80
133
|
### `persist` (classification `durable-learning`)
|
|
81
134
|
|