@codyswann/lisa 3.2.0 → 3.3.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/cli/doctor-lisa-owned-artifacts.d.ts.map +1 -1
- package/dist/cli/doctor-lisa-owned-artifacts.js +41 -2
- package/dist/cli/doctor-lisa-owned-artifacts.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +65 -11
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/expo/create-only/.github/workflows/nightly-e2e-health.yml +21 -2
- 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/rules/eager/do-it-now.md +11 -0
- package/plugins/lisa/rules/eager/empirical-inquiry.md +1 -0
- package/plugins/lisa/rules/eager/falsifiable-checks.md +2 -0
- package/plugins/lisa/rules/eager/integration-access-layer.md +5 -0
- package/plugins/lisa/rules/eager/learnings-ladder.md +18 -0
- package/plugins/lisa/rules/eager/local-ci-first.md +15 -0
- package/plugins/lisa/rules/eager/not-blocked-just-waiting.md +13 -0
- package/plugins/lisa/rules/eager/session-status-updates.md +19 -0
- package/plugins/lisa/rules/eager/wiki-knowledge-source.md +6 -11
- package/plugins/lisa/rules/reference/do-it-now.md +37 -0
- package/plugins/lisa/rules/reference/empirical-inquiry.md +1 -0
- package/plugins/lisa/rules/reference/falsifiable-checks.md +24 -2
- package/plugins/lisa/rules/reference/integration-access-layer.md +8 -0
- package/plugins/lisa/rules/reference/learnings-ladder.md +41 -0
- package/plugins/lisa/rules/reference/local-ci-first.md +34 -0
- package/plugins/lisa/rules/reference/not-blocked-just-waiting.md +41 -0
- package/plugins/lisa/rules/reference/session-status-updates.md +60 -0
- package/plugins/lisa/rules/reference/wiki-knowledge-source.md +21 -5
- package/plugins/lisa-agy/plugin.json +1 -1
- 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/do-it-now.md +11 -0
- package/plugins/lisa-copilot/rules/eager/empirical-inquiry.md +1 -0
- package/plugins/lisa-copilot/rules/eager/falsifiable-checks.md +2 -0
- package/plugins/lisa-copilot/rules/eager/integration-access-layer.md +5 -0
- package/plugins/lisa-copilot/rules/eager/learnings-ladder.md +18 -0
- package/plugins/lisa-copilot/rules/eager/local-ci-first.md +15 -0
- package/plugins/lisa-copilot/rules/eager/not-blocked-just-waiting.md +13 -0
- package/plugins/lisa-copilot/rules/eager/session-status-updates.md +19 -0
- package/plugins/lisa-copilot/rules/eager/wiki-knowledge-source.md +6 -11
- package/plugins/lisa-copilot/rules/reference/do-it-now.md +37 -0
- package/plugins/lisa-copilot/rules/reference/empirical-inquiry.md +1 -0
- package/plugins/lisa-copilot/rules/reference/falsifiable-checks.md +24 -2
- package/plugins/lisa-copilot/rules/reference/integration-access-layer.md +8 -0
- package/plugins/lisa-copilot/rules/reference/learnings-ladder.md +41 -0
- package/plugins/lisa-copilot/rules/reference/local-ci-first.md +34 -0
- package/plugins/lisa-copilot/rules/reference/not-blocked-just-waiting.md +41 -0
- package/plugins/lisa-copilot/rules/reference/session-status-updates.md +60 -0
- package/plugins/lisa-copilot/rules/reference/wiki-knowledge-source.md +21 -5
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/do-it-now-reference.mdc +42 -0
- package/plugins/lisa-cursor/rules/do-it-now.mdc +16 -0
- package/plugins/lisa-cursor/rules/empirical-inquiry-reference.mdc +1 -0
- package/plugins/lisa-cursor/rules/empirical-inquiry.mdc +1 -0
- package/plugins/lisa-cursor/rules/falsifiable-checks-reference.mdc +24 -2
- package/plugins/lisa-cursor/rules/falsifiable-checks.mdc +2 -0
- package/plugins/lisa-cursor/rules/integration-access-layer-reference.mdc +8 -0
- package/plugins/lisa-cursor/rules/integration-access-layer.mdc +5 -0
- package/plugins/lisa-cursor/rules/learnings-ladder-reference.mdc +46 -0
- package/plugins/lisa-cursor/rules/learnings-ladder.mdc +23 -0
- package/plugins/lisa-cursor/rules/local-ci-first-reference.mdc +39 -0
- package/plugins/lisa-cursor/rules/local-ci-first.mdc +20 -0
- package/plugins/lisa-cursor/rules/not-blocked-just-waiting-reference.mdc +46 -0
- package/plugins/lisa-cursor/rules/not-blocked-just-waiting.mdc +18 -0
- package/plugins/lisa-cursor/rules/session-status-updates-reference.mdc +65 -0
- package/plugins/lisa-cursor/rules/session-status-updates.mdc +24 -0
- package/plugins/lisa-cursor/rules/wiki-knowledge-source-reference.mdc +21 -5
- package/plugins/lisa-cursor/rules/wiki-knowledge-source.mdc +7 -12
- 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/do-it-now.md +11 -0
- package/plugins/src/base/rules/eager/empirical-inquiry.md +1 -0
- package/plugins/src/base/rules/eager/falsifiable-checks.md +2 -0
- package/plugins/src/base/rules/eager/integration-access-layer.md +5 -0
- package/plugins/src/base/rules/eager/learnings-ladder.md +18 -0
- package/plugins/src/base/rules/eager/local-ci-first.md +15 -0
- package/plugins/src/base/rules/eager/not-blocked-just-waiting.md +13 -0
- package/plugins/src/base/rules/eager/session-status-updates.md +19 -0
- package/plugins/src/base/rules/eager/wiki-knowledge-source.md +6 -11
- package/plugins/src/base/rules/reference/do-it-now.md +37 -0
- package/plugins/src/base/rules/reference/empirical-inquiry.md +1 -0
- package/plugins/src/base/rules/reference/falsifiable-checks.md +24 -2
- package/plugins/src/base/rules/reference/integration-access-layer.md +8 -0
- package/plugins/src/base/rules/reference/learnings-ladder.md +41 -0
- package/plugins/src/base/rules/reference/local-ci-first.md +34 -0
- package/plugins/src/base/rules/reference/not-blocked-just-waiting.md +41 -0
- package/plugins/src/base/rules/reference/session-status-updates.md +60 -0
- package/plugins/src/base/rules/reference/wiki-knowledge-source.md +21 -5
- package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +173 -8
- package/typescript/copy-overwrite/scripts/nightly-e2e-suites.schema.json +12 -0
|
@@ -67,11 +67,33 @@ A clean result is a statement about what the check can perceive, not about the c
|
|
|
67
67
|
## How to apply
|
|
68
68
|
|
|
69
69
|
1. Author the check.
|
|
70
|
-
2. Deliberately break the guarded property.
|
|
71
|
-
3. Confirm the check **fails
|
|
70
|
+
2. Deliberately break the guarded property — specifically, introduce **the exact regression the guard exists to prevent**, not a nearby or convenient break.
|
|
71
|
+
3. Confirm the check **fails, names the right file/line, and that exactly one test fails**. A failure that does not localize is weak evidence the check is measuring the right thing.
|
|
72
72
|
4. Restore, and confirm green again.
|
|
73
73
|
5. Report the falsification alongside the result.
|
|
74
74
|
|
|
75
|
+
### The failure count is part of the evidence
|
|
76
|
+
|
|
77
|
+
Step 3's cardinality is not pedantry; each deviation names a distinct defect.
|
|
78
|
+
|
|
79
|
+
- **Zero failures** — the guard is inert. It was authored, it is green, and it asserts nothing about the property it names. The originating incident: a guard pinned one field of a structure and the regression it was written to stop walked straight through it with all fifty tests green, because nothing in the suite touched the field that actually moved.
|
|
80
|
+
- **More than one failure** — the break is too coarse, the guard is over-broad, or unrelated tests share the fixture. Any of the three means the guard's next real failure will not tell the reader what broke, which is most of a guard's value.
|
|
81
|
+
- **Exactly one failure** — the guard localizes. That is the evidence, and it is what gets reported.
|
|
82
|
+
|
|
83
|
+
### Never narrate a red state you did not run
|
|
84
|
+
|
|
85
|
+
A guard's red leg, a "before" state, a reproduction of a fixed defect: each is an **observation**, and an observation you did not make is a fabrication however sound the reasoning behind it. The originating incident here was an evidence file asserting "working tree clean" while listing two untracked scripts a few lines further down — internally contradictory, because the clean-tree line was reasoned rather than run.
|
|
86
|
+
|
|
87
|
+
When the red state no longer exists in your working tree — it was fixed, or it lives at an earlier commit — **reconstruct it in a throwaway detached-HEAD worktree** and run it there:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
git worktree add --detach <scratch-path> <sha>
|
|
91
|
+
# run the check in <scratch-path>, capture the real output
|
|
92
|
+
git worktree remove <scratch-path>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
This costs seconds, leaves your working tree untouched, and produces genuine output. There is no situation in which writing down what the command *would* have printed is preferable to running it.
|
|
96
|
+
|
|
75
97
|
For generated or validated inputs, replace steps 2–4 with a direct unit test of the checker against synthetic bad input.
|
|
76
98
|
|
|
77
99
|
**A check whose failure has never been observed is reported as `unvalidated`, not as passing.** "Mentally reverting" does not satisfy step 3 — the author of a guard already believes it is load-bearing, so reasoning about the failure reproduces the belief rather than testing it. `unvalidated` is a legitimate state to report and land; silently presenting an unfalsified gate as a passing one is not.
|
|
@@ -23,6 +23,8 @@ Each has been observed in real runs; each reported success while asserting nothi
|
|
|
23
23
|
## Mandatory
|
|
24
24
|
|
|
25
25
|
- **Falsify before reporting.** No clean result is reportable until the check has been shown to fail on a deliberate break. **"Mentally reverting" does not count** — reasoning that the assertion *would* fail is precisely the step that lets a non-functional guard ship, because the author already believes it is load-bearing. Run the break.
|
|
26
|
+
- **Count the failures: introduce the exact regression the guard exists to prevent, and confirm **exactly one** test fails, then revert.** Zero means the guard is inert; many means it is over-broad and its next failure will not name the cause. A guard that pinned one field of a structure shipped with all 50 tests green while the regression walked straight through.
|
|
27
|
+
- **Reconstruct a red state; never narrate one you did not run.** Evidence describing a failing or dirty state must come from a run you actually observed — an evidence file once claimed "working tree clean" while listing two untracked scripts in the same file. To observe a state that no longer exists, check that commit out in a **throwaway detached-HEAD worktree** and run it there. Writing down what the output would have said is fabrication, however confident the reasoning.
|
|
26
28
|
- **Say how it was falsified.** "0 findings" alone is not a result; state what you broke and that the check caught it. A gate whose falsification is untested must be reported as *unvalidated*, not as passing.
|
|
27
29
|
- **Prefer structural over textual checks.** Parse the AST/structure instead of matching source text: text matching cannot distinguish a field from a comment, an alias, or a nested occurrence, and it produces false positives that mask the real ones.
|
|
28
30
|
- **A negative result is scoped to what the check can see.** State the blind spot. A presence check cannot see a wrong value; a per-file check cannot see a cross-file interaction; fixing one instance of a class is not fixing the class — sweep the class.
|
|
@@ -5,6 +5,14 @@ alwaysApply: false
|
|
|
5
5
|
|
|
6
6
|
# Integration Access Layer
|
|
7
7
|
|
|
8
|
+
## Secrets resolve through `lisa-secrets-access`
|
|
9
|
+
|
|
10
|
+
Credentials follow the same chokepoint discipline as vendor integrations: every secret a session needs resolves through the `lisa-secrets-access` skill, which owns the supported provider list (Bitwarden, 1Password, AWS, Doppler, Vault, env), the note format attached to each secret, the `tool:` declaration of which CLIs a credential drives, and the resolution and verification order.
|
|
11
|
+
|
|
12
|
+
That contract is deliberately **not restated here or anywhere else.** A second copy of the note format is a copy that drifts, and a drifted copy of a credential contract is worse than no copy, because it is followed. Read the skill.
|
|
13
|
+
|
|
14
|
+
The one operational consequence worth stating in an always-loaded rule: **do not ask a human to paste a value the configured provider can supply**, and do not read keychains, `.env` files, or provider CLIs directly to work around the skill. If resolution fails, the failure is a bug in the provider bootstrap and gets reported as one.
|
|
15
|
+
|
|
8
16
|
Every Lisa skill or rule that consumes an external integration MUST route through
|
|
9
17
|
the integration's `*-access` skill instead of calling that vendor's MCP tools or
|
|
10
18
|
REST API directly.
|
|
@@ -9,6 +9,11 @@ Skills and rules that use external integrations route through the matching
|
|
|
9
9
|
`*-access` skill. Do not call vendor MCP tools or REST APIs directly from a
|
|
10
10
|
consumer skill.
|
|
11
11
|
|
|
12
|
+
Secrets are the same shape: every credential resolves through
|
|
13
|
+
`lisa-secrets-access`, which owns the provider list, the note format, and the
|
|
14
|
+
resolution order. Read it rather than restating it — and never ask a human to
|
|
15
|
+
paste a value the provider can supply.
|
|
16
|
+
|
|
12
17
|
Resolution order is the configured-provider token/CLI substrate first when its
|
|
13
18
|
bootstrap credential is present and identity-matched, then the interactive MCP as
|
|
14
19
|
fallback, then a loud error naming the exact credential to set. Identity-match is
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Learnings Ladder — Where Does This Go?"
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Learnings Ladder — Where Does This Go?
|
|
7
|
+
|
|
8
|
+
## The problem this solves
|
|
9
|
+
|
|
10
|
+
The taxonomy was never missing. Lisa has had the six-rung ladder since the `skill-evaluator` agent shipped, and the gardener has always routed by it. What was missing is that the taxonomy lived inside an agent definition most sessions never open, so the practical answer to "where does this learning go?" was whichever knowledge file the agent happened to have in context — which is how a single project rules file accretes lint rules, product specs, and incident notes into one undifferentiated blob that every session pays for.
|
|
11
|
+
|
|
12
|
+
This rule is a pointer, not a second taxonomy. It exists so the routing question is answerable without opening anything.
|
|
13
|
+
|
|
14
|
+
## The rungs, ordered by what they cost to carry
|
|
15
|
+
|
|
16
|
+
| Rung | Destination | Enters context | Admission |
|
|
17
|
+
| --- | --- | --- | --- |
|
|
18
|
+
| EXECUTABLE-CONTROL | Lint / ast-grep / type / test / hook / `package.lisa.json` force | Never — the diagnostic fires on violation | Mechanically decidable, stable, and it has recurred |
|
|
19
|
+
| EAGER-RULE | The host rules directory `.agents/rules/`; Lisa's own shipped rules originate in the plugin rules tree | Unconditionally, every session | Earned by failure evidence — repeated misses despite the knowledge being reachable |
|
|
20
|
+
| SKILL | A `SKILL.md` procedure | Description eager; body on invoke | Procedural, multi-step, with a recognizable trigger |
|
|
21
|
+
| WIKI | Wiki page plus an index entry | Only when queried | Durable declarative reference knowledge |
|
|
22
|
+
| KEEP-IN-LEDGER | The learnings ledger (`.lisa/PROJECT_LEARNINGS.md`, or the configured `learnings.file`) | Bounded contract projection only | The default landing zone; probationary and expiring |
|
|
23
|
+
| RETIRE | Nowhere — the prose is deleted | Never | Redundant with a mechanical owner, stale, or superseded |
|
|
24
|
+
|
|
25
|
+
Each rung also carries an orthogonal **scope**: `project` (apply here) or `upstream` (raise to `CodySwannGT/lisa`). Scope changes where the promotion work is filed; it never changes the rung.
|
|
26
|
+
|
|
27
|
+
## How to choose
|
|
28
|
+
|
|
29
|
+
Work down the list and stop at the first honest yes:
|
|
30
|
+
|
|
31
|
+
1. **Can a machine decide it?** Then it is EXECUTABLE-CONTROL, and prose describing it is redundant. This is the strongest rung and the cheapest to carry: it costs nothing until someone violates it, and then it says exactly what is wrong.
|
|
32
|
+
2. **Is it a procedure with a trigger?** SKILL. The description is what gets loaded eagerly; the body arrives only when invoked.
|
|
33
|
+
3. **Is it reference knowledge someone would go and look up?** WIKI. Deep project knowledge belongs on a rung that is paid for only when routed to — which is why `wiki-knowledge-source` is query-on-demand rather than load-at-startup.
|
|
34
|
+
4. **Otherwise, KEEP-IN-LEDGER.** This is the default and it is not a failure state. Most learnings are provisional, and the ledger is where a candidate proves whether it recurs.
|
|
35
|
+
|
|
36
|
+
**EAGER-RULE is not on that list on purpose.** It is not something you choose; it is something a candidate earns, on cited evidence that agents repeatedly missed the knowledge even though it was already reachable. The eager tier charges every session on every agent, so admission is demotion-biased and the gardener re-audits the tier on every run — including Lisa's own shipped eager rules. A candidate with no recurrence evidence can reach WIKI, KEEP-IN-LEDGER, or RETIRE, and can never reach EAGER-RULE.
|
|
37
|
+
|
|
38
|
+
## Capture is yours; promotion is not
|
|
39
|
+
|
|
40
|
+
The division is deliberate and it is what keeps knowledge surfaces from silently growing:
|
|
41
|
+
|
|
42
|
+
- **You capture.** Record the learning through `lisa-persist-learning`, with its provenance and evidence. That is the whole of a session's authority here.
|
|
43
|
+
- **The gardener promotes.** `/lisa:learnings:audit` — available as an opt-in weekly automation via `lisa-setup-automations` — audits the ledger, rules trees, skills, and wiki, routes candidates through the `skill-evaluator`, and files **human-gated tracker tickets** for promotions, demotions, and retirements. A human approves each one.
|
|
44
|
+
- **Nothing hand-appends.** Never write a learning directly into `AGENTS.md`, a host rules file, or the human decree surface. Those are human-authored, and an automated append to them is exactly the accretion this ladder exists to stop.
|
|
45
|
+
|
|
46
|
+
Promotion tickets are themselves governed: `promotion-contract` requires an EXECUTABLE-CONTROL promotion to be atomic — enable the control, fix the existing violation population, ship a remediation-teaching diagnostic, and delete the superseded prose, all in one PR. Promote-without-remove double-pays forever.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Learnings Ladder — Where Does This Go? (load-bearing)"
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Learnings Ladder — Where Does This Go? (load-bearing)
|
|
7
|
+
|
|
8
|
+
When you learn something durable, route it by **what it costs to carry**, not by whichever file you happen to have open. Six rungs, strongest enforcement first:
|
|
9
|
+
|
|
10
|
+
| Rung | Destination | Enters context |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| EXECUTABLE-CONTROL | Lint / ast-grep / type / test / hook / `package.lisa.json` force | Never — the diagnostic fires on violation |
|
|
13
|
+
| EAGER-RULE | The host rules directory `.agents/rules/` (Lisa's own shipped rules live in the plugin rules tree) | Unconditionally, every session |
|
|
14
|
+
| SKILL | A `SKILL.md` procedure | Description only; body on invoke |
|
|
15
|
+
| WIKI | Wiki page plus an index entry | Only when queried |
|
|
16
|
+
| KEEP-IN-LEDGER | The learnings ledger (`.lisa/PROJECT_LEARNINGS.md`) | Bounded projection only |
|
|
17
|
+
| RETIRE | Nowhere — delete the prose | Never |
|
|
18
|
+
|
|
19
|
+
**Take the cheapest rung that actually works.** Anything a machine can decide is EXECUTABLE-CONTROL. KEEP-IN-LEDGER is the default landing zone. EAGER-RULE is earned only by evidence of repeated misses despite the knowledge already being reachable, and the tier is demotion-biased — every session pays for it.
|
|
20
|
+
|
|
21
|
+
**You capture; you do not promote.** Record the learning through `lisa-persist-learning`. The gardener (`/lisa:learnings:audit`, an opt-in weekly automation) routes candidates through the `skill-evaluator` and files human-gated promotion tickets. Never hand-append a learning to `AGENTS.md` or a host rules file.
|
|
22
|
+
|
|
23
|
+
Full prose: [reference/learnings-ladder.md](learnings-ladder-reference.mdc).
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Local CI First — CI Is Not a Debugger"
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Local CI First — CI Is Not a Debugger
|
|
7
|
+
|
|
8
|
+
End-to-end suites — Playwright, Maestro, Cypress, and anything else that only runs in a workflow on a normal day — fail differently from unit tests. The failure is usually environmental (a selector that moved, a fixture that did not seed, a simulator that booted slowly), and the instinct is to guess, push, and read the next CI run.
|
|
9
|
+
|
|
10
|
+
That instinct is what this rule exists to break. A CI round trip is five to twenty minutes, produces one bit of information per attempt, gives no interactive access to the failing state, and occupies a runner that other work is queued behind. Three speculative pushes cost the better part of an hour and still leave you without a reproduction. The same three attempts run locally take minutes and hand you the actual DOM, the actual screenshot, and the actual stack.
|
|
11
|
+
|
|
12
|
+
## Reconstruct the invocation, do not approximate it
|
|
13
|
+
|
|
14
|
+
The workflow file is the specification of what CI ran. Read it and mirror it:
|
|
15
|
+
|
|
16
|
+
- The **exact command**, including the config file, project/suite selector, and tag filters (`--project=chromium`, `--grep`, `include_tags`).
|
|
17
|
+
- The **environment**: env vars the job sets, the base URL it points at, whether it runs headless, and which secrets it injects. Anything you cannot supply locally is a known difference — write it down rather than assuming it is irrelevant.
|
|
18
|
+
- The **target**: browser version, device or simulator model, OS. Mobile e2e is especially sensitive here; a Maestro flow that passes on one iOS version fails on the next over accessibility-label matching alone.
|
|
19
|
+
- The **fixture and data state**: seed scripts, migrations, and whether the job runs against a fresh database or a shared environment.
|
|
20
|
+
|
|
21
|
+
Setting all of that up — installing the browser, booting the simulator, seeding the database — is part of doing the work. "Local setup would take a while" is not a reason to use the shared CI queue as a REPL.
|
|
22
|
+
|
|
23
|
+
## When it genuinely will not reproduce
|
|
24
|
+
|
|
25
|
+
Some failures are real and local-only-invisible: a race that appears only on a slower runner, a secret that exists only in CI, an artifact that only the CI build produces. That case is legitimate, and the rule's requirement is honesty about it, not denial:
|
|
26
|
+
|
|
27
|
+
1. **Say so explicitly**, and name what differs — runner OS, CPU count, headless mode, network latency, a device you do not have, a secret you cannot read.
|
|
28
|
+
2. **Change one thing per push, and state what that push is testing.** A push that alters four things and goes green teaches you nothing about which one mattered.
|
|
29
|
+
3. **Add the observability you are missing** — a trace, a video, a screenshot on failure, a verbose log — in the same push, so the next run answers the question rather than repeating it.
|
|
30
|
+
|
|
31
|
+
## Forbidden
|
|
32
|
+
|
|
33
|
+
- Pushing a speculative fix "to see if it helps" when the suite has never been run locally.
|
|
34
|
+
- Re-running a failed CI job unchanged in the hope of a different outcome, without labelling the failure as suspected-flake and investigating it as one.
|
|
35
|
+
- Reporting a fix as verified on the strength of a green CI run that followed several red ones, without knowing which change was responsible.
|
|
36
|
+
|
|
37
|
+
## Relationship to other rules
|
|
38
|
+
|
|
39
|
+
`empirical-inquiry` says to run the cheapest probe that settles a question; local reproduction *is* that probe for an e2e failure. `verification` requires proof by using the software — a local run of the same suite produces that proof directly, and produces it faster.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Local CI First — CI Is Not a Debugger (load-bearing)"
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Local CI First — CI Is Not a Debugger (load-bearing)
|
|
7
|
+
|
|
8
|
+
When an end-to-end suite fails in CI — Playwright, Maestro, Cypress, or any runner you normally only see in a workflow — **reproduce it locally with the same configuration before pushing another commit.**
|
|
9
|
+
|
|
10
|
+
Push-and-watch is a ten-minute debugger with no breakpoints, and every red run costs the shared queue as well as your session.
|
|
11
|
+
|
|
12
|
+
## Mandatory
|
|
13
|
+
|
|
14
|
+
1. **Reconstruct the invocation from the workflow file**, not from memory: the same command, env vars, config file, browser/device target, and tags CI uses.
|
|
15
|
+
2. **Fix it locally, confirm it green locally, then push once.** Never push a speculative fix "to see if it helps."
|
|
16
|
+
3. **If it genuinely will not reproduce locally, say so explicitly** and name what differs — runner OS, secrets, headless mode, timing, a device CI has and you do not — before you use CI to bisect. Then change one thing per push and say what you are testing.
|
|
17
|
+
|
|
18
|
+
Setting up the local runner (installing the browser, booting the simulator, seeding the fixture) is part of the work, not a reason to skip this.
|
|
19
|
+
|
|
20
|
+
Full prose: [reference/local-ci-first.md](local-ci-first-reference.mdc).
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Waiting Is Not Blocked"
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Waiting Is Not Blocked
|
|
7
|
+
|
|
8
|
+
Three failure modes share one root: a session that stops producing while still consuming the human's clock and attention. Each was observed directly.
|
|
9
|
+
|
|
10
|
+
## 1. Poll; do not wait for a message
|
|
11
|
+
|
|
12
|
+
An agent dispatches a subagent, a CI run, a deploy, or a long build — and then waits for a notification that never arrives, or arrives long after it mattered. Callbacks are best-effort. Notification channels drop. A background process can exit without anything telling you.
|
|
13
|
+
|
|
14
|
+
**While the session is active, go and check.** Roughly every five minutes, run the command that answers the question: `gh run list`, `gh pr checks`, a status query, a log tail, a file existence check. Polling is cheap; an idle session is not.
|
|
15
|
+
|
|
16
|
+
This is not an instruction to busy-wait. It is the opposite: between polls you should be doing other work (see rule 3). The poll is a periodic check, not an occupation.
|
|
17
|
+
|
|
18
|
+
Two corollaries:
|
|
19
|
+
|
|
20
|
+
- **An absent result is information.** If a subagent has produced nothing after several polls, investigate whether it is running at all rather than assuming it needs more time.
|
|
21
|
+
- **Never claim an outcome you have not observed.** "The tests are probably green by now" is a fabrication; go look. See `falsifiable-checks` and `claim-evidence-mapping`.
|
|
22
|
+
|
|
23
|
+
## 2. Blocked means you physically cannot proceed
|
|
24
|
+
|
|
25
|
+
The word is load-bearing and it gets diluted. **Blocked** means there is no action available to you: a credential you cannot obtain, an API that rejects you, a decision whose answer changes what you would build, a dependency that does not exist yet.
|
|
26
|
+
|
|
27
|
+
These are **not** blocked:
|
|
28
|
+
|
|
29
|
+
- Waiting for a review, a CI run, a deploy, or a build.
|
|
30
|
+
- Waiting for a human to confirm something you could reasonably proceed on and correct later.
|
|
31
|
+
- Waiting for a subagent you dispatched.
|
|
32
|
+
- Not yet having done the work.
|
|
33
|
+
|
|
34
|
+
Report those as **waiting**, and say what you are doing in the meantime. Reporting them as blocked misinforms the human twice: it suggests they must act when they need not, and it devalues the word for the times you genuinely cannot proceed.
|
|
35
|
+
|
|
36
|
+
## 3. Plan phases are parallel unless stated otherwise
|
|
37
|
+
|
|
38
|
+
A numbered plan is a decomposition, not a dependency graph. Unless a phase's input is another phase's output — or the user said the order matters — the phases run concurrently. An agent that serializes a plan because it is written as a list turns a parallel workload into a queue and multiplies the wall-clock cost by the number of steps.
|
|
39
|
+
|
|
40
|
+
Practically: when you would otherwise idle waiting on rule 1, start the next independent phase. When you dispatch subagents, dispatch every independent one in the same breath rather than one at a time.
|
|
41
|
+
|
|
42
|
+
Where a real dependency exists, name it — "phase 3 needs the schema from phase 2" — so the human can see why the order is what it is.
|
|
43
|
+
|
|
44
|
+
## Scope: sessions, not the tracker
|
|
45
|
+
|
|
46
|
+
This rule governs **session** stuckness. It does not touch the factory's tracker lifecycle vocabulary — the `blocked` role and the `human_needed` outcome used by `lisa-implement`, `lisa-repair-intake`, and the intake flows. That vocabulary is stricter and deliberately so: an item marked `human_needed` is one an adversarial gate decided a person must resolve, and nothing in this rule permits a session to re-classify it. If you are unsure which vocabulary you are in, ask whether you are describing your own next five minutes (this rule) or the state of a tracked work item (the factory contract).
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Waiting Is Not Blocked (load-bearing)"
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Waiting Is Not Blocked (load-bearing)
|
|
7
|
+
|
|
8
|
+
Three rules that keep an active session from stalling:
|
|
9
|
+
|
|
10
|
+
1. **Poll, don't wait.** While the session is active, go check status yourself — roughly every 5 minutes. Never sit idle waiting for a subagent callback, a CI notification, or any automated message to arrive. If a result matters, go look for it.
|
|
11
|
+
2. **Blocked means you physically cannot proceed.** Waiting on a confirmation, a review, a running job, or someone's opinion is *waiting*, not blocked. Report it as waiting — and keep working on everything that does not depend on it.
|
|
12
|
+
3. **Plan phases are not sequential unless the user said so.** Absent a stated dependency, run them in parallel.
|
|
13
|
+
|
|
14
|
+
Idling is the expensive failure here: a session that waits produces nothing while still costing the human their attention and their clock.
|
|
15
|
+
|
|
16
|
+
This governs **session** stuckness only. The factory's tracker vocabulary — `human_needed` and the `blocked` lifecycle role used by `lisa-implement` and `lisa-repair-intake` — is stricter, unchanged, and not reclassified by this rule.
|
|
17
|
+
|
|
18
|
+
Full prose: [reference/not-blocked-just-waiting.md](not-blocked-just-waiting-reference.mdc).
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Session Status Updates — Plain Language, and Always Say If It's Safe to Close"
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Session Status Updates — Plain Language, and Always Say If It's Safe to Close
|
|
7
|
+
|
|
8
|
+
## Why this is a rule and not a style preference
|
|
9
|
+
|
|
10
|
+
Lisa's premise is that a non-technical person can direct software work by describing outcomes. That premise already binds everything crossing a gate outward — intake rejections, clarifying questions, ticket descriptions, verification reports — because a non-technical operator is standing at the gate.
|
|
11
|
+
|
|
12
|
+
In-session conversation was never held to the same bar, and the result was a split personality: careful, plain-language ticket prose and simultaneously a stream of chat messages full of file paths, rule slugs, and reasoning narrative. The human reading both is the same human. This rule closes the split.
|
|
13
|
+
|
|
14
|
+
## The three-part shape
|
|
15
|
+
|
|
16
|
+
Every update answers, in this order:
|
|
17
|
+
|
|
18
|
+
1. **What changed** — what is different in the world now that was not before. Shipped, fixed, filed, deployed.
|
|
19
|
+
2. **What's blocked** — using the strict meaning from `not-blocked-just-waiting`. If nothing is blocked, say so; "waiting on the CI run" belongs here labelled as waiting.
|
|
20
|
+
3. **What needs a decision** — see below.
|
|
21
|
+
|
|
22
|
+
What is deliberately excluded: how you found it. The files you read, the searches you ran, the hypotheses you discarded, the dead ends. That is your working memory, not their update. If they want it they will ask, and the offer to elaborate costs one clause.
|
|
23
|
+
|
|
24
|
+
## Voice
|
|
25
|
+
|
|
26
|
+
Write the way you would speak to a competent colleague who does not work on this system.
|
|
27
|
+
|
|
28
|
+
- Prefer the user-visible name of a thing over its implementation name. "The login page broke" beats "the auth guard regressed at the controller boundary."
|
|
29
|
+
- Do not use Lisa vocabulary (rung, gate, leaf, intake, ratchet) with someone who has not asked for it.
|
|
30
|
+
- Do not use a file path where a description works. Paths are for when the human will open the file.
|
|
31
|
+
- Short sentences. No preamble about what you are about to say.
|
|
32
|
+
|
|
33
|
+
Two lines the user themselves offered as the target: *"just tell me what's going on and what my options are"* and *"give me the summary, I'll ask for detail if I want it."*
|
|
34
|
+
|
|
35
|
+
## Decisions
|
|
36
|
+
|
|
37
|
+
A decision presented as a paragraph of context is a decision the human has to excavate. State it as a decision:
|
|
38
|
+
|
|
39
|
+
- **The decision** — one sentence naming the choice to be made.
|
|
40
|
+
- **Your recommendation** — you have more context than they do; do not withhold it. Recommending is not deciding.
|
|
41
|
+
- **The ramifications of each option** — one line apiece, in terms of consequences they care about (time, cost, risk, what breaks, what it forecloses), not in terms of implementation.
|
|
42
|
+
|
|
43
|
+
An option you consider unacceptable is still listed, with the reason it is unacceptable. Presenting one option as if it were the only one is a decision you made on their behalf without saying so.
|
|
44
|
+
|
|
45
|
+
## The close line
|
|
46
|
+
|
|
47
|
+
Every update ends with exactly:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
Safe to close: yes/no — <reason>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`yes` means killing the session right now loses nothing: work is committed and pushed, tickets are in the state they should be in, nothing is running that will not finish on its own.
|
|
54
|
+
|
|
55
|
+
`no` names the specific in-flight thing that would be lost. Real examples: a local dev server or test run still going; a ticket filed but not yet flipped to ready, so nothing will pick it up; a commit that exists only in the working tree; a PR whose checks nobody is watching; a deploy mid-flight.
|
|
56
|
+
|
|
57
|
+
The line exists because the human's most common question — asked or unasked — is "can I close this?" Making them ask it costs a round trip; making them guess costs them work.
|
|
58
|
+
|
|
59
|
+
## Relationship to the other communication rules
|
|
60
|
+
|
|
61
|
+
- `report-actionability` governs **completeness**: the denominator, every item accounted for, who acts on each. It is about what a report must contain.
|
|
62
|
+
- `automation-runbook-contract` governs the **outcome line** a terminating flow opens with.
|
|
63
|
+
- This rule governs the **voice** of a session update, its three-part shape, and the close line.
|
|
64
|
+
|
|
65
|
+
None of the three is relaxed by the others. An update can satisfy all three at once and usually should: outcome line first, denominator stated, plain language throughout, close line last.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Session Status Updates — Plain Language, and Always Say If It's Safe to Close (load-bearing)"
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Session Status Updates — Plain Language, and Always Say If It's Safe to Close (load-bearing)
|
|
7
|
+
|
|
8
|
+
Every update you give a human answers three things: **what changed, what's blocked, and what needs a decision.** Not how you found it, not what you searched, not the story of your reasoning. They will ask for detail if they want it.
|
|
9
|
+
|
|
10
|
+
Assume the reader is **non-technical** — the same obligation Lisa already places on everything crossing a gate outward (intake rejections, ticket descriptions, verification reports). Session chat is held to that bar, so factory output and conversation sound alike.
|
|
11
|
+
|
|
12
|
+
## Mandatory
|
|
13
|
+
|
|
14
|
+
- **Plain, conversational language.** No jargon, no Lisa vocabulary, no tool or file names the reader has no use for. Say "the login page broke", not "the auth guard regressed at the controller boundary".
|
|
15
|
+
- **A decision is presented as a decision** — never buried in a status paragraph the reader has to mine. State the choice, give **your recommendation**, and name the **ramifications** of each option in one line apiece.
|
|
16
|
+
- **End every update with a close line**, exactly this shape:
|
|
17
|
+
|
|
18
|
+
`Safe to close: yes/no — <reason>`
|
|
19
|
+
|
|
20
|
+
`no` names the in-flight thing that would be lost: a local process still running, a ticket not yet flipped to ready, an unpushed commit, a PR nobody is watching. A human must be able to glance at your last message and know whether killing the session costs them work.
|
|
21
|
+
|
|
22
|
+
This is the *voice* rule. `report-actionability` governs what a report must account for, and `automation-runbook-contract` governs the outcome line a terminating flow opens with; neither is relaxed here.
|
|
23
|
+
|
|
24
|
+
Full prose: [reference/session-status-updates.md](session-status-updates-reference.mdc).
|
|
@@ -14,13 +14,29 @@ A project has a wiki in one of two shapes:
|
|
|
14
14
|
|
|
15
15
|
Either way, freshness is not your concern. The query and ingest skills run `scripts/ensure-wiki.mjs` as their own first step, which resolves the wiki root and — for a remote wiki — clones the mirror if missing and fast-forwards it when stale (subject to a short TTL, and tolerant of being offline: it proceeds with the existing mirror and warns rather than blocking). The freshness guarantee lives in the tool, not in the caller's discipline. Do **not** add a separate "make sure the wiki is current" step to your own workflow — calling the skill already does it.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
## Load posture: on demand, not at session start
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
The wiki is **not** read during session bootstrap, and no flow may add a "load the wiki" step to its startup. This is a deliberate reversal of the rule's earlier "consult the wiki first" posture, recorded in `wiki/decisions/2026-08-12-agent-neutral-host-rules-path.md` section 6 (decision D3). The reasoning is context budget: the wiki is deep declarative knowledge, which is the WIKI rung of the learnings ladder precisely *because* it should be paid for only when routed to. Loading it unconditionally converts an on-demand rung into an eager one and charges every session — including the large majority that never ask a knowledge question — for knowledge they do not use.
|
|
20
|
+
|
|
21
|
+
What survives the softening is discoverability. An agent must **know the wiki exists and know how to query it**, so that a question needing depth goes to the curated answer instead of a fresh scrape of the codebase. What is dropped is the obligation to consult it before every piece of research, and the framing of the wiki as the authority that outranks primary sources.
|
|
22
|
+
|
|
23
|
+
When you do need project depth:
|
|
24
|
+
|
|
25
|
+
1. Call the wiki query skill (`/lisa-wiki-query`, or the runtime's equivalent), which resolves the wiki root for you. For a local wiki you may also start from `wiki/index.md` and follow links.
|
|
26
|
+
2. Prefer what the wiki says over re-deriving the same answer from raw sources — that is what it is curated for.
|
|
27
|
+
3. Fall back to primary sources (code, tickets, commit history, external docs) when the wiki is silent, ambiguous, or contradicted by what you observe in the code.
|
|
22
28
|
4. If you find the wiki is wrong, stale, or missing knowledge that belongs there, surface the gap — and where the project's workflow supports it, capture the correction back into the wiki via its ingestion path (`/lisa-wiki-ingest` or equivalent) rather than leaving the knowledge only in this session.
|
|
23
29
|
|
|
24
30
|
The wiki documents knowledge; it does not override executable behavior. When the wiki and the running code disagree about what the system actually does, trust the code and treat the wiki as out of date. See the `documentation-source-paths` rule for how source-material directories relate to the wiki.
|
|
25
31
|
|
|
26
|
-
|
|
32
|
+
## Applicability is the plugin gate, not just the wiki content
|
|
33
|
+
|
|
34
|
+
This rule ships in the **base** plugin, but the skill it directs you to (`lisa-wiki-query`) ships in the **wiki** plugin. Those are gated differently, and for a period a base-only project received this rule pointing at a skill it did not have — a rule with a dangling instruction, which teaches an agent to distrust its rules.
|
|
35
|
+
|
|
36
|
+
The applicability condition is therefore stated as the *installation* gate rather than as "does a `wiki/` folder exist". The `lisa-wiki` plugin is selected when `wiki/lisa-wiki.config.json` exists **or** `.lisa.config.json` declares a top-level `wiki` key (`src/core/lisa-plugin-selection.ts`); on Claude Code it is additionally gated by `enabledPlugins["lisa-wiki@lisa"]` in `.claude/settings.json`. When that gate is not satisfied:
|
|
37
|
+
|
|
38
|
+
- This rule does not apply. There is no wiki to query and no query skill to call.
|
|
39
|
+
- The recovery path is `/lisa-wiki-install`, the bootstrap skill that **base** ships precisely so a project that never enabled the wiki plugin can still discover it. Naming a base-shipped skill is what keeps the instruction reachable in every install.
|
|
40
|
+
- **Never block on the absent skill.** Degrade to primary sources and continue, per the same degrade-never-block posture `readiness-rubric` and `rejection-detection` use for surfaces that may not be installed.
|
|
41
|
+
|
|
42
|
+
A remote-only wiki declared through `wiki.source` is covered by the `wiki` config key, so the pointer form satisfies the same gate.
|
|
@@ -1,23 +1,18 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Wiki as Knowledge Source (load-bearing)"
|
|
2
|
+
description: "Wiki as Knowledge Source — Query It on Demand (load-bearing)"
|
|
3
3
|
alwaysApply: true
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Wiki as Knowledge Source (load-bearing)
|
|
6
|
+
# Wiki as Knowledge Source — Query It on Demand (load-bearing)
|
|
7
7
|
|
|
8
|
-
If the project has an LLM Wiki,
|
|
8
|
+
If the project has an LLM Wiki, it is the curated store of durable project knowledge: background, conventions, ownership, architecture, glossary, "how and why does X work here". Documentation rolls UP into that wiki; individual repos are not expected to carry their own prose docs beyond inline code comments.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
**Do not load the wiki at session start.** It is deep knowledge, and paying for it on every session is exactly the cost the on-demand rungs of the `learnings-ladder` exist to avoid. Know it is there; go get it when you actually need depth.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
When you do need it, call `/lisa-wiki-query`. You never have to fetch or freshness-check the wiki yourself — the query and ingest skills resolve the wiki root and guarantee it is current (`scripts/ensure-wiki.mjs`) as their own first step: a local wiki resolves instantly, a remote wiki is mirrored and refreshed transparently. Prefer what the wiki says over re-deriving it from raw sources, and fall back to code, tickets, and history when it is silent, ambiguous, or contradicted by what you observe.
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
2. **Use what the wiki says** as the authoritative answer when it covers the question — do not re-derive it from raw sources.
|
|
16
|
-
3. **Fall back to primary sources** (code, tickets, commit history, external docs) only when the wiki is silent, ambiguous, or contradicted by what you observe.
|
|
17
|
-
4. **Surface gaps.** If the wiki is wrong, stale, or missing knowledge that belongs there, flag it — and where the workflow supports it, capture the correction via `/lisa-wiki-ingest`.
|
|
14
|
+
If the wiki is wrong, stale, or missing knowledge that belongs there, capture the correction via `/lisa-wiki-ingest` rather than leaving it in this session. The wiki documents knowledge; it does NOT override executable behavior — when wiki and running code disagree about what the system does, trust the code.
|
|
18
15
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
If the project has neither a local `wiki/` nor a `wiki.source` pointer, this rule does not apply.
|
|
16
|
+
**Applicability.** This rule applies only when the `lisa-wiki` plugin is installed, which is gated on `wiki/lisa-wiki.config.json` existing or `.lisa.config.json` declaring a `wiki` key. Without that, the query skill is not present and this rule does not apply — run `/lisa-wiki-install` (shipped in base) to enable the wiki. Never treat the absent skill as a blocker.
|
|
22
17
|
|
|
23
18
|
Full prose: [reference/wiki-knowledge-source.md](wiki-knowledge-source-reference.mdc).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|