@codyswann/lisa 3.2.0 → 3.4.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 +90 -16
- 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/.codex-plugin/skills/lisa-implement/SKILL.md +3 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-quality-review/SKILL.md +7 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-review-local/SKILL.md +27 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tdd-implementation/SKILL.md +1 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
- package/plugins/lisa/rules/eager/design-source-of-truth.md +38 -0
- 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/design-source-of-truth.md +195 -0
- 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/scripts/design-source-gate.mjs +530 -0
- package/plugins/lisa/skills/lisa-implement/SKILL.md +3 -1
- package/plugins/lisa/skills/lisa-quality-review/SKILL.md +7 -0
- package/plugins/lisa/skills/lisa-review-local/SKILL.md +27 -0
- package/plugins/lisa/skills/lisa-tdd-implementation/SKILL.md +1 -0
- package/plugins/lisa/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/scripts/design-source-gate.mjs +530 -0
- package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +3 -1
- package/plugins/lisa-agy/skills/lisa-quality-review/SKILL.md +7 -0
- package/plugins/lisa-agy/skills/lisa-review-local/SKILL.md +27 -0
- package/plugins/lisa-agy/skills/lisa-tdd-implementation/SKILL.md +1 -0
- package/plugins/lisa-agy/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
- 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/design-source-of-truth.md +38 -0
- 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/design-source-of-truth.md +195 -0
- 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-copilot/scripts/design-source-gate.mjs +530 -0
- package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +3 -1
- package/plugins/lisa-copilot/skills/lisa-quality-review/SKILL.md +7 -0
- package/plugins/lisa-copilot/skills/lisa-review-local/SKILL.md +27 -0
- package/plugins/lisa-copilot/skills/lisa-tdd-implementation/SKILL.md +1 -0
- package/plugins/lisa-copilot/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/design-source-of-truth-reference.mdc +200 -0
- package/plugins/lisa-cursor/rules/design-source-of-truth.mdc +43 -0
- 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-cursor/scripts/design-source-gate.mjs +530 -0
- package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +3 -1
- package/plugins/lisa-cursor/skills/lisa-quality-review/SKILL.md +7 -0
- package/plugins/lisa-cursor/skills/lisa-review-local/SKILL.md +27 -0
- package/plugins/lisa-cursor/skills/lisa-tdd-implementation/SKILL.md +1 -0
- package/plugins/lisa-cursor/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
- 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/design-source-of-truth.md +38 -0
- 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/design-source-of-truth.md +195 -0
- 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/plugins/src/base/scripts/design-source-gate.mjs +530 -0
- package/plugins/src/base/skills/lisa-implement/SKILL.md +3 -1
- package/plugins/src/base/skills/lisa-quality-review/SKILL.md +7 -0
- package/plugins/src/base/skills/lisa-review-local/SKILL.md +27 -0
- package/plugins/src/base/skills/lisa-tdd-implementation/SKILL.md +1 -0
- package/plugins/src/base/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
- package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +173 -8
- package/typescript/copy-overwrite/scripts/nightly-e2e-suites.schema.json +12 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.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"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.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"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.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"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.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"
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Design Source of Truth (load-bearing)
|
|
2
|
+
|
|
3
|
+
**Figma is the design source of truth, and every UI surface a change touches declares where its design came from.** A changed UI surface that neither cites a Figma node nor carries the designated marker is a contract violation — and so is a surface whose declaration the gate cannot resolve.
|
|
4
|
+
|
|
5
|
+
**One vendor-neutral contract, cited by** `lisa-implement`, `lisa-tdd-implementation`, `lisa-review-local`, `lisa-quality-review`, and `lisa-tracker-source-artifacts` (the `leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug, never divergent per-skill prose).
|
|
6
|
+
|
|
7
|
+
## Membership
|
|
8
|
+
|
|
9
|
+
Membership is **surface, not repo name or file extension**: a file is in scope the moment a change makes it render something user-observable — a screen, component, layout, style token, visual state, or markup a user reads. Barrels, pure-logic modules, tests, stories, generated output, and vendored code are out. Projects narrow or widen the default detection through `designSource.include` / `designSource.exclude` in `.lisa.config.json`; they never turn the obligation off.
|
|
10
|
+
|
|
11
|
+
## The two declarations
|
|
12
|
+
|
|
13
|
+
Exactly one of these, written as an ordinary comment in whatever syntax the file uses:
|
|
14
|
+
|
|
15
|
+
| Form | Means |
|
|
16
|
+
|---|---|
|
|
17
|
+
| `DESIGN-SOURCE: <figma-url>` | The surface is backed by a Figma node — it already existed there, or it was synced back. |
|
|
18
|
+
| `DESIGN-SOURCE: none — not in Figma` | The surface is deliberately not captured at the design source. |
|
|
19
|
+
|
|
20
|
+
The marker's spelling is fixed and load-bearing; a drifted spelling silently disarms the gate. An optional trailing ` — <reason>` records why. Only a `figma.com` URL seals a surface: a link to a screenshot, a Slack thread, or any other mock is **malformed**, not proof.
|
|
21
|
+
|
|
22
|
+
## Sync-back is the default; the marker is the exception, not the default
|
|
23
|
+
|
|
24
|
+
When the flow has proven Figma access (the `tool-access-gate` probe), reflecting the surface in Figma and citing the node is the expected outcome. Reach for the marker only when the surface genuinely does not belong in the design source — a debug affordance, a dev-only playground, a throwaway internal tool. The gate reports every marked exception so review can challenge it, and reports a reasonless exception separately when Figma access was available.
|
|
25
|
+
|
|
26
|
+
## Host design-system rules stay authoritative
|
|
27
|
+
|
|
28
|
+
Projects that carry their own design-system rules (`figma-design-system`, `design-system`, `use-the-design-library`, or an equivalent) keep them. This contract never restates component hierarchy, token vocabulary, or reuse policy, and never overrides them. It asks one orthogonal question the host rules do not: is the design source declared?
|
|
29
|
+
|
|
30
|
+
## The gate fails closed
|
|
31
|
+
|
|
32
|
+
`scripts/design-source-gate.mjs` decides the change deterministically. It fails on an undeclared surface, a malformed annotation, a file that both cites Figma and denies having a source, a changed file it could not read, and a diff it could not compute. **A design-source violation is a blocking review finding, never a warning** — it is not demoted to "optional", "if cheap", or a follow-up. A gate that passes on what it could not read proves nothing, so it never does.
|
|
33
|
+
|
|
34
|
+
## Bootstrap and degradation
|
|
35
|
+
|
|
36
|
+
Adoption never demands a retroactive backfill: the gate judges **only the surfaces this change touched**. Pre-existing unannotated UI is burndown, recorded and worked down, not this work item's blocker. If a project has no Figma at all, that is not an exemption — every changed surface carries the marker, and the resulting exception list is the honest record of how much of the product lives outside its design source. Behavior obligations for the same surfaces are unchanged and still governed by `bdd-e2e-coverage`.
|
|
37
|
+
|
|
38
|
+
Full contract (marker grammar, gate semantics, host-rule precedence, bootstrap procedure): [reference/design-source-of-truth.md](../reference/design-source-of-truth.md).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Do It Now (load-bearing)
|
|
2
|
+
|
|
3
|
+
If something needs to happen eventually and **the factory is allowed to do it**, do it in this session. File the ticket, flip it to ready, add the lint rule, fix the flaky test, update the doc that just went stale. Not in a "follow-up" sentence — now.
|
|
4
|
+
|
|
5
|
+
**"I'll get to that later" is not an acceptable close** for work that is in scope and permitted. A deferral costs a whole future session its context, and most of them are never picked up at all.
|
|
6
|
+
|
|
7
|
+
The one exception is an **exterior human gate** — a protected deploy, a held-back PRD, a low-confidence learning, a product call only a person can make. There you do the allowed part now (file it, mark the gate, flip everything you may flip) and say plainly what is waiting on a human and why.
|
|
8
|
+
|
|
9
|
+
Deferring is itself a decision. If you genuinely should not do it now, say so and say why; never leave it implied, and never leave it only in your own head.
|
|
10
|
+
|
|
11
|
+
Full prose: [reference/do-it-now.md](../reference/do-it-now.md).
|
|
@@ -16,6 +16,7 @@ Do not reason your way to a confident-sounding answer from documentation, prior
|
|
|
16
16
|
- Presenting a guess, recollection, or doc summary as established fact when it was cheap to verify and you did not.
|
|
17
17
|
- "Should work" / "probably" / "the docs say" as the basis for a load-bearing decision an experiment could have settled.
|
|
18
18
|
- Skipping the probe because the answer "seems obvious" — those are exactly the ones that quietly drift from reality.
|
|
19
|
+
- Interpreting a diff, or reporting scope, before establishing where your checkout sits: run `git rev-list --count HEAD..origin/<default>` first. A worktree 30 commits behind makes everyone else's changes read as yours, and the diff was reported as massive scope creep in reverse.
|
|
19
20
|
- Treating a recorded "not yet" / "pending" / "blocked" / "human-gated" note as current state. It is a claim about the day it was written; probe the live state before planning around it, escalating it, or reporting it as a blocker (`stale-state-claims`).
|
|
20
21
|
|
|
21
22
|
This is the inquiry counterpart to the `verification` rule (which proves completed work behaves correctly). Both reject "it looks correct" as evidence.
|
|
@@ -18,6 +18,8 @@ Each has been observed in real runs; each reported success while asserting nothi
|
|
|
18
18
|
## Mandatory
|
|
19
19
|
|
|
20
20
|
- **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.
|
|
21
|
+
- **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.
|
|
22
|
+
- **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.
|
|
21
23
|
- **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.
|
|
22
24
|
- **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.
|
|
23
25
|
- **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.
|
|
@@ -4,6 +4,11 @@ Skills and rules that use external integrations route through the matching
|
|
|
4
4
|
`*-access` skill. Do not call vendor MCP tools or REST APIs directly from a
|
|
5
5
|
consumer skill.
|
|
6
6
|
|
|
7
|
+
Secrets are the same shape: every credential resolves through
|
|
8
|
+
`lisa-secrets-access`, which owns the provider list, the note format, and the
|
|
9
|
+
resolution order. Read it rather than restating it — and never ask a human to
|
|
10
|
+
paste a value the provider can supply.
|
|
11
|
+
|
|
7
12
|
Resolution order is the configured-provider token/CLI substrate first when its
|
|
8
13
|
bootstrap credential is present and identity-matched, then the interactive MCP as
|
|
9
14
|
fallback, then a loud error naming the exact credential to set. Identity-match is
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Learnings Ladder — Where Does This Go? (load-bearing)
|
|
2
|
+
|
|
3
|
+
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:
|
|
4
|
+
|
|
5
|
+
| Rung | Destination | Enters context |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| EXECUTABLE-CONTROL | Lint / ast-grep / type / test / hook / `package.lisa.json` force | Never — the diagnostic fires on violation |
|
|
8
|
+
| EAGER-RULE | The host rules directory `.agents/rules/` (Lisa's own shipped rules live in the plugin rules tree) | Unconditionally, every session |
|
|
9
|
+
| SKILL | A `SKILL.md` procedure | Description only; body on invoke |
|
|
10
|
+
| WIKI | Wiki page plus an index entry | Only when queried |
|
|
11
|
+
| KEEP-IN-LEDGER | The learnings ledger (`.lisa/PROJECT_LEARNINGS.md`) | Bounded projection only |
|
|
12
|
+
| RETIRE | Nowhere — delete the prose | Never |
|
|
13
|
+
|
|
14
|
+
**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.
|
|
15
|
+
|
|
16
|
+
**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.
|
|
17
|
+
|
|
18
|
+
Full prose: [reference/learnings-ladder.md](../reference/learnings-ladder.md).
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Local CI First — CI Is Not a Debugger (load-bearing)
|
|
2
|
+
|
|
3
|
+
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.**
|
|
4
|
+
|
|
5
|
+
Push-and-watch is a ten-minute debugger with no breakpoints, and every red run costs the shared queue as well as your session.
|
|
6
|
+
|
|
7
|
+
## Mandatory
|
|
8
|
+
|
|
9
|
+
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.
|
|
10
|
+
2. **Fix it locally, confirm it green locally, then push once.** Never push a speculative fix "to see if it helps."
|
|
11
|
+
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.
|
|
12
|
+
|
|
13
|
+
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.
|
|
14
|
+
|
|
15
|
+
Full prose: [reference/local-ci-first.md](../reference/local-ci-first.md).
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Waiting Is Not Blocked (load-bearing)
|
|
2
|
+
|
|
3
|
+
Three rules that keep an active session from stalling:
|
|
4
|
+
|
|
5
|
+
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.
|
|
6
|
+
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.
|
|
7
|
+
3. **Plan phases are not sequential unless the user said so.** Absent a stated dependency, run them in parallel.
|
|
8
|
+
|
|
9
|
+
Idling is the expensive failure here: a session that waits produces nothing while still costing the human their attention and their clock.
|
|
10
|
+
|
|
11
|
+
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.
|
|
12
|
+
|
|
13
|
+
Full prose: [reference/not-blocked-just-waiting.md](../reference/not-blocked-just-waiting.md).
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Session Status Updates — Plain Language, and Always Say If It's Safe to Close (load-bearing)
|
|
2
|
+
|
|
3
|
+
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.
|
|
4
|
+
|
|
5
|
+
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.
|
|
6
|
+
|
|
7
|
+
## Mandatory
|
|
8
|
+
|
|
9
|
+
- **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".
|
|
10
|
+
- **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.
|
|
11
|
+
- **End every update with a close line**, exactly this shape:
|
|
12
|
+
|
|
13
|
+
`Safe to close: yes/no — <reason>`
|
|
14
|
+
|
|
15
|
+
`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.
|
|
16
|
+
|
|
17
|
+
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.
|
|
18
|
+
|
|
19
|
+
Full prose: [reference/session-status-updates.md](../reference/session-status-updates.md).
|
|
@@ -1,18 +1,13 @@
|
|
|
1
|
-
# Wiki as Knowledge Source (load-bearing)
|
|
1
|
+
# Wiki as Knowledge Source — Query It on Demand (load-bearing)
|
|
2
2
|
|
|
3
|
-
If the project has an LLM Wiki,
|
|
3
|
+
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.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**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.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
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.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
2. **Use what the wiki says** as the authoritative answer when it covers the question — do not re-derive it from raw sources.
|
|
11
|
-
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.
|
|
12
|
-
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`.
|
|
9
|
+
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.
|
|
13
10
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
If the project has neither a local `wiki/` nor a `wiki.source` pointer, this rule does not apply.
|
|
11
|
+
**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.
|
|
17
12
|
|
|
18
13
|
Full prose: [reference/wiki-knowledge-source.md](../reference/wiki-knowledge-source.md).
|