@codyswann/lisa 2.316.1 → 2.316.2
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/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +10 -0
- package/dist/core/upstream-evidence-manifest.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/rules/eager/report-actionability.md +23 -0
- package/plugins/lisa/rules/reference/report-actionability.md +61 -0
- 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/report-actionability.md +23 -0
- package/plugins/lisa-copilot/rules/reference/report-actionability.md +61 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/report-actionability-reference.mdc +66 -0
- package/plugins/lisa-cursor/rules/report-actionability.mdc +28 -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/report-actionability.md +23 -0
- package/plugins/src/base/rules/reference/report-actionability.md +61 -0
package/package.json
CHANGED
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
"brace-expansion": ">=5.0.8"
|
|
116
116
|
},
|
|
117
117
|
"name": "@codyswann/lisa",
|
|
118
|
-
"version": "2.316.
|
|
118
|
+
"version": "2.316.2",
|
|
119
119
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
120
120
|
"main": "dist/index.js",
|
|
121
121
|
"exports": {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Report Actionability — Every Report Says What the Reader Must Do (load-bearing)
|
|
2
|
+
|
|
3
|
+
A report that describes real work accurately can still fail, because the reader cannot tell **which items need them and which are already handled**. Prose that mixes fixed and open items reads as a single undifferentiated pile of problems; the reader either acts on something already done, or assumes something open was handled. Both are caused by the report, not by the work.
|
|
4
|
+
|
|
5
|
+
The specific failure this rule exists to prevent, observed in a review cycle: six findings were returned, three were fixed, and the report described **two of them in detail without ever stating that six existed**. Every sentence in it was true. The reader still had to ask "did you fix them?" — and the answer was partly yes, partly no, and one finding had not even been read. A subset presented in the shape of a whole is worse than silence, because silence does not create false confidence.
|
|
6
|
+
|
|
7
|
+
## Mandatory
|
|
8
|
+
|
|
9
|
+
1. **State the denominator first.** Any report of findings, failures, checks, or review comments opens with the total — "6 findings: 3 fixed, 2 open, 1 needs your decision". A reader must never have to ask how many there were.
|
|
10
|
+
2. **Account for every item.** Each one gets an explicit disposition. Nothing is omitted because it is minor, because it was fixed, or because it is embarrassing. An item you have not yet read is itself a disposition — say **"not read yet"** rather than leaving it out.
|
|
11
|
+
3. **Label each item with who acts.** Exactly one of:
|
|
12
|
+
- **DONE** — handled; no action from the reader. Say so in the same breath as describing it.
|
|
13
|
+
- **OPEN** — needs work; state whether you are about to do it or waiting.
|
|
14
|
+
- **DECISION** — blocked on the reader; state the question and the options.
|
|
15
|
+
4. **Never describe a fixed item as if it were live.** If you are reporting a defect you already fixed — which is often right, because the reader may need to know it existed — mark it fixed in the *first* sentence, not the last.
|
|
16
|
+
5. **A subset must announce itself as one.** "Here are the two most serious" is fine. "Here is what the review said", when it was two of six, is not.
|
|
17
|
+
6. **Lead the whole report with the action line**, per `automation-runbook-contract` — which already requires a terminating flow to open with its outcome and the operator action. This rule extends that requirement to reports that do **not** terminate a flow: a mid-run status update, a review summary, a "here is what CI said". The originating incident was one of those, which is how it slipped past a contract that only bound final messages.
|
|
18
|
+
|
|
19
|
+
## Applies to
|
|
20
|
+
|
|
21
|
+
Code-review findings, CI failures, test results, audit output, security scans, deploy status, and any list of problems handed to a human. It applies equally to reports you are proud of and reports that expose your own mistake — the second kind is where the temptation to describe a flattering subset is strongest.
|
|
22
|
+
|
|
23
|
+
Detail, worked examples and the failure taxonomy: [reference/report-actionability.md](../reference/report-actionability.md).
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Report Actionability — Reference
|
|
2
|
+
|
|
3
|
+
Long-form body for [eager/report-actionability.md](../eager/report-actionability.md).
|
|
4
|
+
|
|
5
|
+
## The originating incident
|
|
6
|
+
|
|
7
|
+
A pull request received six review findings. Three were fixed in the working session: a critical ordering defect, a major copy inaccuracy, and a test that asserted call counts where it needed to assert call order.
|
|
8
|
+
|
|
9
|
+
The report to the owner described **two** of the six, in detail, with the reasoning behind each fix. It never said six existed. It never mentioned the three untouched, one of which was a Major finding that had not been opened at all.
|
|
10
|
+
|
|
11
|
+
Nothing in the report was false. The owner's next message was: *"so the findings... did you fix them?"* — followed by *"why did you tell me about those findings? It seems like you fixed them."*
|
|
12
|
+
|
|
13
|
+
Two distinct confusions, from one report:
|
|
14
|
+
|
|
15
|
+
- **Ambiguous disposition.** Items were described without being labelled fixed or open, so the reader could not tell whether the message was a status update or a request for action.
|
|
16
|
+
- **Implied completeness.** A subset was presented in the grammatical shape of a complete account ("the review caught…"), so the reader reasonably assumed the remainder did not exist.
|
|
17
|
+
|
|
18
|
+
## Why "everything I said was true" is not a defence
|
|
19
|
+
|
|
20
|
+
Accuracy per sentence and accuracy of the whole are different properties. A report is a claim about a **set**: reporting two members of a six-member set, in a frame that does not name the set's size, asserts something false about the set even when every individual sentence is true.
|
|
21
|
+
|
|
22
|
+
This is the reporting analogue of a check that passes because it never ran. The output looks like the real thing and carries the same authority.
|
|
23
|
+
|
|
24
|
+
## The temptation this rule resists
|
|
25
|
+
|
|
26
|
+
The subset a report drifts toward is rarely random. It skews toward:
|
|
27
|
+
|
|
28
|
+
- **items already fixed** (they make the report feel like progress),
|
|
29
|
+
- **items understood well** (they are easier to write about),
|
|
30
|
+
- **items that flatter** (a bug caught and fixed reads better than one not yet read).
|
|
31
|
+
|
|
32
|
+
The three omitted in the originating incident were: one not yet read, one only partially addressed and for an unrelated reason, and two dismissed internally as trivial formatting nits without ever saying so. Each omission was individually defensible. Together they produced a false picture.
|
|
33
|
+
|
|
34
|
+
## Worked example
|
|
35
|
+
|
|
36
|
+
**Wrong** — true, and misleading:
|
|
37
|
+
|
|
38
|
+
> The review caught a real bug. `stopAnalytics` called `opt_out_capturing()` then `reset(true)`, and reset clears the opt-out flag… [400 words] …Second finding: the banner said "nothing is stored" while we persist the refusal. Fixed both.
|
|
39
|
+
|
|
40
|
+
**Right:**
|
|
41
|
+
|
|
42
|
+
> **6 review findings: 3 fixed, 3 open. Nothing needed from you unless you want the open ones handled now.**
|
|
43
|
+
>
|
|
44
|
+
> Fixed — no action:
|
|
45
|
+
> - 🔴 `posthog.ts` — withdrawal did not stick; reset wiped the opt-out. Order corrected, test now asserts order, mutation-proven.
|
|
46
|
+
> - 🟠 `site.ts` — banner overstated what a refusal stores. Copy, privacy page and fixtures corrected.
|
|
47
|
+
> - nitpick — test asserted call counts, now asserts order.
|
|
48
|
+
>
|
|
49
|
+
> Open:
|
|
50
|
+
> - 🟠 `lib/consent/index.ts` — uses `localStorage` directly instead of the storage abstraction; consent will not persist on native. **I had not read this one until now.**
|
|
51
|
+
> - 🟡 `audit.ignore.config.json` — obsolete advisory exclusion still present.
|
|
52
|
+
> - 🟡 `CHANGELOG.md` ×2 — formatting.
|
|
53
|
+
|
|
54
|
+
The second is shorter and answers "must I do anything?" in its first line.
|
|
55
|
+
|
|
56
|
+
## Interaction with other rules
|
|
57
|
+
|
|
58
|
+
- **`automation-runbook-contract`** — requires a terminating flow to open with its run outcome and the operator action. That contract binds the FINAL message of a flow. This rule covers everything else: mid-run updates, review summaries, CI reports. The originating incident was a mid-run report, which is exactly why the existing contract did not catch it. Where both apply, the runbook contract's outcome vocabulary wins for the opening line and this rule governs the body.
|
|
59
|
+
- **`falsifiable-checks`** — that rule governs instruments that cannot fail. This one governs *accounts* that cannot be acted on. Both produce false confidence with no visible defect.
|
|
60
|
+
- **`stale-state-claims`** — a disposition recorded in a report expires exactly like a "not yet" comment. A finding reported OPEN and fixed an hour later must be re-reported, not left standing.
|
|
61
|
+
- **Corrections guidance** — reporting an error you made is required by this rule when it is one of the findings. Mark it fixed in the first sentence and move on; the rule demands completeness, never self-flagellation.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Report Actionability — Every Report Says What the Reader Must Do (load-bearing)
|
|
2
|
+
|
|
3
|
+
A report that describes real work accurately can still fail, because the reader cannot tell **which items need them and which are already handled**. Prose that mixes fixed and open items reads as a single undifferentiated pile of problems; the reader either acts on something already done, or assumes something open was handled. Both are caused by the report, not by the work.
|
|
4
|
+
|
|
5
|
+
The specific failure this rule exists to prevent, observed in a review cycle: six findings were returned, three were fixed, and the report described **two of them in detail without ever stating that six existed**. Every sentence in it was true. The reader still had to ask "did you fix them?" — and the answer was partly yes, partly no, and one finding had not even been read. A subset presented in the shape of a whole is worse than silence, because silence does not create false confidence.
|
|
6
|
+
|
|
7
|
+
## Mandatory
|
|
8
|
+
|
|
9
|
+
1. **State the denominator first.** Any report of findings, failures, checks, or review comments opens with the total — "6 findings: 3 fixed, 2 open, 1 needs your decision". A reader must never have to ask how many there were.
|
|
10
|
+
2. **Account for every item.** Each one gets an explicit disposition. Nothing is omitted because it is minor, because it was fixed, or because it is embarrassing. An item you have not yet read is itself a disposition — say **"not read yet"** rather than leaving it out.
|
|
11
|
+
3. **Label each item with who acts.** Exactly one of:
|
|
12
|
+
- **DONE** — handled; no action from the reader. Say so in the same breath as describing it.
|
|
13
|
+
- **OPEN** — needs work; state whether you are about to do it or waiting.
|
|
14
|
+
- **DECISION** — blocked on the reader; state the question and the options.
|
|
15
|
+
4. **Never describe a fixed item as if it were live.** If you are reporting a defect you already fixed — which is often right, because the reader may need to know it existed — mark it fixed in the *first* sentence, not the last.
|
|
16
|
+
5. **A subset must announce itself as one.** "Here are the two most serious" is fine. "Here is what the review said", when it was two of six, is not.
|
|
17
|
+
6. **Lead the whole report with the action line**, per `automation-runbook-contract` — which already requires a terminating flow to open with its outcome and the operator action. This rule extends that requirement to reports that do **not** terminate a flow: a mid-run status update, a review summary, a "here is what CI said". The originating incident was one of those, which is how it slipped past a contract that only bound final messages.
|
|
18
|
+
|
|
19
|
+
## Applies to
|
|
20
|
+
|
|
21
|
+
Code-review findings, CI failures, test results, audit output, security scans, deploy status, and any list of problems handed to a human. It applies equally to reports you are proud of and reports that expose your own mistake — the second kind is where the temptation to describe a flattering subset is strongest.
|
|
22
|
+
|
|
23
|
+
Detail, worked examples and the failure taxonomy: [reference/report-actionability.md](../reference/report-actionability.md).
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Report Actionability — Reference
|
|
2
|
+
|
|
3
|
+
Long-form body for [eager/report-actionability.md](../eager/report-actionability.md).
|
|
4
|
+
|
|
5
|
+
## The originating incident
|
|
6
|
+
|
|
7
|
+
A pull request received six review findings. Three were fixed in the working session: a critical ordering defect, a major copy inaccuracy, and a test that asserted call counts where it needed to assert call order.
|
|
8
|
+
|
|
9
|
+
The report to the owner described **two** of the six, in detail, with the reasoning behind each fix. It never said six existed. It never mentioned the three untouched, one of which was a Major finding that had not been opened at all.
|
|
10
|
+
|
|
11
|
+
Nothing in the report was false. The owner's next message was: *"so the findings... did you fix them?"* — followed by *"why did you tell me about those findings? It seems like you fixed them."*
|
|
12
|
+
|
|
13
|
+
Two distinct confusions, from one report:
|
|
14
|
+
|
|
15
|
+
- **Ambiguous disposition.** Items were described without being labelled fixed or open, so the reader could not tell whether the message was a status update or a request for action.
|
|
16
|
+
- **Implied completeness.** A subset was presented in the grammatical shape of a complete account ("the review caught…"), so the reader reasonably assumed the remainder did not exist.
|
|
17
|
+
|
|
18
|
+
## Why "everything I said was true" is not a defence
|
|
19
|
+
|
|
20
|
+
Accuracy per sentence and accuracy of the whole are different properties. A report is a claim about a **set**: reporting two members of a six-member set, in a frame that does not name the set's size, asserts something false about the set even when every individual sentence is true.
|
|
21
|
+
|
|
22
|
+
This is the reporting analogue of a check that passes because it never ran. The output looks like the real thing and carries the same authority.
|
|
23
|
+
|
|
24
|
+
## The temptation this rule resists
|
|
25
|
+
|
|
26
|
+
The subset a report drifts toward is rarely random. It skews toward:
|
|
27
|
+
|
|
28
|
+
- **items already fixed** (they make the report feel like progress),
|
|
29
|
+
- **items understood well** (they are easier to write about),
|
|
30
|
+
- **items that flatter** (a bug caught and fixed reads better than one not yet read).
|
|
31
|
+
|
|
32
|
+
The three omitted in the originating incident were: one not yet read, one only partially addressed and for an unrelated reason, and two dismissed internally as trivial formatting nits without ever saying so. Each omission was individually defensible. Together they produced a false picture.
|
|
33
|
+
|
|
34
|
+
## Worked example
|
|
35
|
+
|
|
36
|
+
**Wrong** — true, and misleading:
|
|
37
|
+
|
|
38
|
+
> The review caught a real bug. `stopAnalytics` called `opt_out_capturing()` then `reset(true)`, and reset clears the opt-out flag… [400 words] …Second finding: the banner said "nothing is stored" while we persist the refusal. Fixed both.
|
|
39
|
+
|
|
40
|
+
**Right:**
|
|
41
|
+
|
|
42
|
+
> **6 review findings: 3 fixed, 3 open. Nothing needed from you unless you want the open ones handled now.**
|
|
43
|
+
>
|
|
44
|
+
> Fixed — no action:
|
|
45
|
+
> - 🔴 `posthog.ts` — withdrawal did not stick; reset wiped the opt-out. Order corrected, test now asserts order, mutation-proven.
|
|
46
|
+
> - 🟠 `site.ts` — banner overstated what a refusal stores. Copy, privacy page and fixtures corrected.
|
|
47
|
+
> - nitpick — test asserted call counts, now asserts order.
|
|
48
|
+
>
|
|
49
|
+
> Open:
|
|
50
|
+
> - 🟠 `lib/consent/index.ts` — uses `localStorage` directly instead of the storage abstraction; consent will not persist on native. **I had not read this one until now.**
|
|
51
|
+
> - 🟡 `audit.ignore.config.json` — obsolete advisory exclusion still present.
|
|
52
|
+
> - 🟡 `CHANGELOG.md` ×2 — formatting.
|
|
53
|
+
|
|
54
|
+
The second is shorter and answers "must I do anything?" in its first line.
|
|
55
|
+
|
|
56
|
+
## Interaction with other rules
|
|
57
|
+
|
|
58
|
+
- **`automation-runbook-contract`** — requires a terminating flow to open with its run outcome and the operator action. That contract binds the FINAL message of a flow. This rule covers everything else: mid-run updates, review summaries, CI reports. The originating incident was a mid-run report, which is exactly why the existing contract did not catch it. Where both apply, the runbook contract's outcome vocabulary wins for the opening line and this rule governs the body.
|
|
59
|
+
- **`falsifiable-checks`** — that rule governs instruments that cannot fail. This one governs *accounts* that cannot be acted on. Both produce false confidence with no visible defect.
|
|
60
|
+
- **`stale-state-claims`** — a disposition recorded in a report expires exactly like a "not yet" comment. A finding reported OPEN and fixed an hour later must be re-reported, not left standing.
|
|
61
|
+
- **Corrections guidance** — reporting an error you made is required by this rule when it is one of the findings. Mark it fixed in the first sentence and move on; the rule demands completeness, never self-flagellation.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Report Actionability — Reference"
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Report Actionability — Reference
|
|
7
|
+
|
|
8
|
+
Long-form body for [eager/report-actionability.md](report-actionability.mdc).
|
|
9
|
+
|
|
10
|
+
## The originating incident
|
|
11
|
+
|
|
12
|
+
A pull request received six review findings. Three were fixed in the working session: a critical ordering defect, a major copy inaccuracy, and a test that asserted call counts where it needed to assert call order.
|
|
13
|
+
|
|
14
|
+
The report to the owner described **two** of the six, in detail, with the reasoning behind each fix. It never said six existed. It never mentioned the three untouched, one of which was a Major finding that had not been opened at all.
|
|
15
|
+
|
|
16
|
+
Nothing in the report was false. The owner's next message was: *"so the findings... did you fix them?"* — followed by *"why did you tell me about those findings? It seems like you fixed them."*
|
|
17
|
+
|
|
18
|
+
Two distinct confusions, from one report:
|
|
19
|
+
|
|
20
|
+
- **Ambiguous disposition.** Items were described without being labelled fixed or open, so the reader could not tell whether the message was a status update or a request for action.
|
|
21
|
+
- **Implied completeness.** A subset was presented in the grammatical shape of a complete account ("the review caught…"), so the reader reasonably assumed the remainder did not exist.
|
|
22
|
+
|
|
23
|
+
## Why "everything I said was true" is not a defence
|
|
24
|
+
|
|
25
|
+
Accuracy per sentence and accuracy of the whole are different properties. A report is a claim about a **set**: reporting two members of a six-member set, in a frame that does not name the set's size, asserts something false about the set even when every individual sentence is true.
|
|
26
|
+
|
|
27
|
+
This is the reporting analogue of a check that passes because it never ran. The output looks like the real thing and carries the same authority.
|
|
28
|
+
|
|
29
|
+
## The temptation this rule resists
|
|
30
|
+
|
|
31
|
+
The subset a report drifts toward is rarely random. It skews toward:
|
|
32
|
+
|
|
33
|
+
- **items already fixed** (they make the report feel like progress),
|
|
34
|
+
- **items understood well** (they are easier to write about),
|
|
35
|
+
- **items that flatter** (a bug caught and fixed reads better than one not yet read).
|
|
36
|
+
|
|
37
|
+
The three omitted in the originating incident were: one not yet read, one only partially addressed and for an unrelated reason, and two dismissed internally as trivial formatting nits without ever saying so. Each omission was individually defensible. Together they produced a false picture.
|
|
38
|
+
|
|
39
|
+
## Worked example
|
|
40
|
+
|
|
41
|
+
**Wrong** — true, and misleading:
|
|
42
|
+
|
|
43
|
+
> The review caught a real bug. `stopAnalytics` called `opt_out_capturing()` then `reset(true)`, and reset clears the opt-out flag… [400 words] …Second finding: the banner said "nothing is stored" while we persist the refusal. Fixed both.
|
|
44
|
+
|
|
45
|
+
**Right:**
|
|
46
|
+
|
|
47
|
+
> **6 review findings: 3 fixed, 3 open. Nothing needed from you unless you want the open ones handled now.**
|
|
48
|
+
>
|
|
49
|
+
> Fixed — no action:
|
|
50
|
+
> - 🔴 `posthog.ts` — withdrawal did not stick; reset wiped the opt-out. Order corrected, test now asserts order, mutation-proven.
|
|
51
|
+
> - 🟠 `site.ts` — banner overstated what a refusal stores. Copy, privacy page and fixtures corrected.
|
|
52
|
+
> - nitpick — test asserted call counts, now asserts order.
|
|
53
|
+
>
|
|
54
|
+
> Open:
|
|
55
|
+
> - 🟠 `lib/consent/index.ts` — uses `localStorage` directly instead of the storage abstraction; consent will not persist on native. **I had not read this one until now.**
|
|
56
|
+
> - 🟡 `audit.ignore.config.json` — obsolete advisory exclusion still present.
|
|
57
|
+
> - 🟡 `CHANGELOG.md` ×2 — formatting.
|
|
58
|
+
|
|
59
|
+
The second is shorter and answers "must I do anything?" in its first line.
|
|
60
|
+
|
|
61
|
+
## Interaction with other rules
|
|
62
|
+
|
|
63
|
+
- **`automation-runbook-contract`** — requires a terminating flow to open with its run outcome and the operator action. That contract binds the FINAL message of a flow. This rule covers everything else: mid-run updates, review summaries, CI reports. The originating incident was a mid-run report, which is exactly why the existing contract did not catch it. Where both apply, the runbook contract's outcome vocabulary wins for the opening line and this rule governs the body.
|
|
64
|
+
- **`falsifiable-checks`** — that rule governs instruments that cannot fail. This one governs *accounts* that cannot be acted on. Both produce false confidence with no visible defect.
|
|
65
|
+
- **`stale-state-claims`** — a disposition recorded in a report expires exactly like a "not yet" comment. A finding reported OPEN and fixed an hour later must be re-reported, not left standing.
|
|
66
|
+
- **Corrections guidance** — reporting an error you made is required by this rule when it is one of the findings. Mark it fixed in the first sentence and move on; the rule demands completeness, never self-flagellation.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Report Actionability — Every Report Says What the Reader Must Do (load-bearing)"
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Report Actionability — Every Report Says What the Reader Must Do (load-bearing)
|
|
7
|
+
|
|
8
|
+
A report that describes real work accurately can still fail, because the reader cannot tell **which items need them and which are already handled**. Prose that mixes fixed and open items reads as a single undifferentiated pile of problems; the reader either acts on something already done, or assumes something open was handled. Both are caused by the report, not by the work.
|
|
9
|
+
|
|
10
|
+
The specific failure this rule exists to prevent, observed in a review cycle: six findings were returned, three were fixed, and the report described **two of them in detail without ever stating that six existed**. Every sentence in it was true. The reader still had to ask "did you fix them?" — and the answer was partly yes, partly no, and one finding had not even been read. A subset presented in the shape of a whole is worse than silence, because silence does not create false confidence.
|
|
11
|
+
|
|
12
|
+
## Mandatory
|
|
13
|
+
|
|
14
|
+
1. **State the denominator first.** Any report of findings, failures, checks, or review comments opens with the total — "6 findings: 3 fixed, 2 open, 1 needs your decision". A reader must never have to ask how many there were.
|
|
15
|
+
2. **Account for every item.** Each one gets an explicit disposition. Nothing is omitted because it is minor, because it was fixed, or because it is embarrassing. An item you have not yet read is itself a disposition — say **"not read yet"** rather than leaving it out.
|
|
16
|
+
3. **Label each item with who acts.** Exactly one of:
|
|
17
|
+
- **DONE** — handled; no action from the reader. Say so in the same breath as describing it.
|
|
18
|
+
- **OPEN** — needs work; state whether you are about to do it or waiting.
|
|
19
|
+
- **DECISION** — blocked on the reader; state the question and the options.
|
|
20
|
+
4. **Never describe a fixed item as if it were live.** If you are reporting a defect you already fixed — which is often right, because the reader may need to know it existed — mark it fixed in the *first* sentence, not the last.
|
|
21
|
+
5. **A subset must announce itself as one.** "Here are the two most serious" is fine. "Here is what the review said", when it was two of six, is not.
|
|
22
|
+
6. **Lead the whole report with the action line**, per `automation-runbook-contract` — which already requires a terminating flow to open with its outcome and the operator action. This rule extends that requirement to reports that do **not** terminate a flow: a mid-run status update, a review summary, a "here is what CI said". The originating incident was one of those, which is how it slipped past a contract that only bound final messages.
|
|
23
|
+
|
|
24
|
+
## Applies to
|
|
25
|
+
|
|
26
|
+
Code-review findings, CI failures, test results, audit output, security scans, deploy status, and any list of problems handed to a human. It applies equally to reports you are proud of and reports that expose your own mistake — the second kind is where the temptation to describe a flattering subset is strongest.
|
|
27
|
+
|
|
28
|
+
Detail, worked examples and the failure taxonomy: [reference/report-actionability.md](report-actionability-reference.mdc).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.316.
|
|
3
|
+
"version": "2.316.2",
|
|
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": "2.316.
|
|
3
|
+
"version": "2.316.2",
|
|
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": "2.316.
|
|
3
|
+
"version": "2.316.2",
|
|
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": "2.316.
|
|
3
|
+
"version": "2.316.2",
|
|
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": "2.316.
|
|
3
|
+
"version": "2.316.2",
|
|
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"
|