@codyswann/lisa 2.263.0 → 2.265.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +13 -10
- 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/.codex-plugin/skills/lisa-github-evidence/SKILL.md +10 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-evidence/SKILL.md +10 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-evidence/SKILL.md +10 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-security-review/SKILL.md +69 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-security-zap-scan/SKILL.md +22 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-evidence/SKILL.md +10 -3
- package/plugins/lisa/agents/security-specialist.md +19 -2
- package/plugins/lisa/rules/eager/claim-evidence-mapping.md +30 -3
- package/plugins/lisa/rules/reference/claim-evidence-mapping.md +155 -8
- package/plugins/lisa/rules/reference/verification.md +26 -0
- package/plugins/lisa/skills/lisa-github-evidence/SKILL.md +10 -0
- package/plugins/lisa/skills/lisa-jira-evidence/SKILL.md +10 -0
- package/plugins/lisa/skills/lisa-linear-evidence/SKILL.md +10 -0
- package/plugins/lisa/skills/lisa-security-review/SKILL.md +69 -2
- package/plugins/lisa/skills/lisa-security-zap-scan/SKILL.md +22 -2
- package/plugins/lisa/skills/lisa-tracker-evidence/SKILL.md +10 -3
- package/plugins/lisa-agy/agents/security-specialist.md +19 -2
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-github-evidence/SKILL.md +10 -0
- package/plugins/lisa-agy/skills/lisa-jira-evidence/SKILL.md +10 -0
- package/plugins/lisa-agy/skills/lisa-linear-evidence/SKILL.md +10 -0
- package/plugins/lisa-agy/skills/lisa-security-review/SKILL.md +69 -2
- package/plugins/lisa-agy/skills/lisa-security-zap-scan/SKILL.md +22 -2
- package/plugins/lisa-agy/skills/lisa-tracker-evidence/SKILL.md +10 -3
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/agents/security-specialist.agent.md +19 -2
- package/plugins/lisa-copilot/rules/eager/claim-evidence-mapping.md +30 -3
- package/plugins/lisa-copilot/rules/reference/claim-evidence-mapping.md +155 -8
- package/plugins/lisa-copilot/rules/reference/verification.md +26 -0
- package/plugins/lisa-copilot/skills/lisa-github-evidence/SKILL.md +10 -0
- package/plugins/lisa-copilot/skills/lisa-jira-evidence/SKILL.md +10 -0
- package/plugins/lisa-copilot/skills/lisa-linear-evidence/SKILL.md +10 -0
- package/plugins/lisa-copilot/skills/lisa-security-review/SKILL.md +69 -2
- package/plugins/lisa-copilot/skills/lisa-security-zap-scan/SKILL.md +22 -2
- package/plugins/lisa-copilot/skills/lisa-tracker-evidence/SKILL.md +10 -3
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/agents/security-specialist.md +19 -2
- package/plugins/lisa-cursor/rules/claim-evidence-mapping-reference.mdc +155 -8
- package/plugins/lisa-cursor/rules/claim-evidence-mapping.mdc +30 -3
- package/plugins/lisa-cursor/rules/verification-reference.mdc +26 -0
- package/plugins/lisa-cursor/skills/lisa-github-evidence/SKILL.md +10 -0
- package/plugins/lisa-cursor/skills/lisa-jira-evidence/SKILL.md +10 -0
- package/plugins/lisa-cursor/skills/lisa-linear-evidence/SKILL.md +10 -0
- package/plugins/lisa-cursor/skills/lisa-security-review/SKILL.md +69 -2
- package/plugins/lisa-cursor/skills/lisa-security-zap-scan/SKILL.md +22 -2
- package/plugins/lisa-cursor/skills/lisa-tracker-evidence/SKILL.md +10 -3
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/security-specialist.md +19 -2
- package/plugins/src/base/rules/eager/claim-evidence-mapping.md +30 -3
- package/plugins/src/base/rules/reference/claim-evidence-mapping.md +155 -8
- package/plugins/src/base/rules/reference/verification.md +26 -0
- package/plugins/src/base/skills/lisa-github-evidence/SKILL.md +10 -0
- package/plugins/src/base/skills/lisa-jira-evidence/SKILL.md +10 -0
- package/plugins/src/base/skills/lisa-linear-evidence/SKILL.md +10 -0
- package/plugins/src/base/skills/lisa-security-review/SKILL.md +69 -2
- package/plugins/src/base/skills/lisa-security-zap-scan/SKILL.md +22 -2
- package/plugins/src/base/skills/lisa-tracker-evidence/SKILL.md +10 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.265.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": "2.
|
|
3
|
+
"version": "2.265.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": "2.
|
|
3
|
+
"version": "2.265.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": "2.
|
|
3
|
+
"version": "2.265.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": "2.
|
|
3
|
+
"version": "2.265.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"
|
|
@@ -35,13 +35,30 @@ Structure your findings as:
|
|
|
35
35
|
- [ ] No XSS vectors in user-facing output
|
|
36
36
|
- [ ] Dependencies free of known CVEs
|
|
37
37
|
|
|
38
|
-
###
|
|
39
|
-
- [
|
|
38
|
+
### Security (proven)
|
|
39
|
+
- [finding] -- where in the code, how to prevent
|
|
40
|
+
- reproducer: [evidence ref]
|
|
41
|
+
- impact: [who can do what, to what data, under what preconditions]
|
|
42
|
+
- reason: reproducer + bounded impact
|
|
43
|
+
|
|
44
|
+
### Security (unproven)
|
|
45
|
+
- [finding] -- where in the code, how to prevent
|
|
46
|
+
- reproducer: [evidence ref if one exists, else `none`]
|
|
47
|
+
- impact: [bounded statement if one exists, else `unproven`]
|
|
48
|
+
- reason: [which half is missing -- e.g. "impact bounded, but never reproduced"]
|
|
49
|
+
-- kept in the security section, not demoted
|
|
40
50
|
|
|
41
51
|
### Recommendations
|
|
42
52
|
- [recommendation] -- priority (critical/warning/suggestion)
|
|
43
53
|
```
|
|
44
54
|
|
|
55
|
+
A finding is **proven** only with both a reproducer evidence ref and a bounded impact statement;
|
|
56
|
+
missing either, it stays **unproven** inside the security section. Record the two halves
|
|
57
|
+
independently -- keep whichever one you have and let the `reason` name the missing half; never
|
|
58
|
+
overwrite a real value with a placeholder. The full bar, the per-finding fields, and the
|
|
59
|
+
`security.review.unprovenBucket` policy point live in the `security-review` skill -- follow it, do
|
|
60
|
+
not restate it.
|
|
61
|
+
|
|
45
62
|
## Rules
|
|
46
63
|
|
|
47
64
|
- Focus on the specific changes proposed, not a full security audit of the entire codebase
|
|
@@ -37,9 +37,36 @@ rule 5).
|
|
|
37
37
|
A claim carries three fields — `claim_id`, `boundary`, and `required_evidence_kinds` — named here so
|
|
38
38
|
every downstream surface uses one spelling. This ticket only writes the contract down; the schema and
|
|
39
39
|
gate that make these fields executable ship with **BCE-2 (#1836)** — do not assume that surface is
|
|
40
|
-
present in this branch.
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
present in this branch.
|
|
41
|
+
|
|
42
|
+
## Security buckets (conservative by default)
|
|
43
|
+
|
|
44
|
+
A security finding is **proven** only with both a reproducer of a reaching kind and a bounded
|
|
45
|
+
impact/exploitability statement; missing either, it renders **unproven** with its reason and **stays
|
|
46
|
+
in the security section** — never auto-demoted to maintenance. The label is one policy point,
|
|
47
|
+
`security.review.unprovenBucket` (default `security-unproven`); the procedure lives in the
|
|
48
|
+
`lisa-security-review` skill.
|
|
49
|
+
|
|
50
|
+
## Artifact identity (pinned, never assumed)
|
|
51
|
+
|
|
52
|
+
A claim applies only to the artifact its evidence was collected against. Every verdict pins
|
|
53
|
+
`artifact.head_sha` — the commit the run observed — and every evidence entry pins the
|
|
54
|
+
`artifact_head_sha` in force when it was captured, its `sha256` content digest, and `captured_at`.
|
|
55
|
+
Evidence collected on a pre-merge head is valid for the merge commit **only** when that head is a
|
|
56
|
+
parent of the merge, per the ancestry + deploy-run definition of "what shipped" that
|
|
57
|
+
`lisa-drive-pr-to-merge` already owns — cite it, never write a second one. A mismatched SHA or a
|
|
58
|
+
recomputed digest that disagrees fails loudly, naming both SHAs / the evidence id, and verification
|
|
59
|
+
re-runs against the merged head before completion is declared. Full definition: the reference body.
|
|
60
|
+
|
|
61
|
+
## Not established (required, never omitted)
|
|
62
|
+
|
|
63
|
+
A claim with no reaching evidence is **Not established**, and every report says so out loud. Each
|
|
64
|
+
evidence comment and verdict carries a `Not established` section listing what was *not* proved —
|
|
65
|
+
boundaries not exercised, environments not tested, behavior consciously out of scope. It is never
|
|
66
|
+
omitted and never blank: with nothing outstanding it still renders `None outstanding — reviewed`, and
|
|
67
|
+
`not_established_reviewed` attests the list was reviewed even when the list itself is empty. This
|
|
68
|
+
generalizes the required, never-empty `Known limits` field of `lisa-improve-harness`. Full definition
|
|
69
|
+
and operator-voice exemplars: the reference body.
|
|
43
70
|
|
|
44
71
|
## No behavior change; degrade, never block
|
|
45
72
|
|
|
@@ -80,12 +80,11 @@ defines the names; it stores nothing:
|
|
|
80
80
|
| `required_evidence_kinds` | the evidence kind(s) that reach that boundary, from the `verification` artifact-type set |
|
|
81
81
|
|
|
82
82
|
A claim whose `required_evidence_kinds` has no captured, reaching artifact is **Not established** —
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
assume its section is present in this branch.
|
|
83
|
+
defined in full, with its evidence templates, in the section below. Artifact identity — what makes
|
|
84
|
+
two captured artifacts the same or different — is defined in the *Artifact identity* section below
|
|
85
|
+
(shipped by BCE-4, #1838). The bucket a security-sensitive claim lands in is defined in the *Security
|
|
86
|
+
buckets* section below (shipped by BCE-5, #1839). Where such a sibling surface is not installed in a
|
|
87
|
+
given branch, name what you can and continue.
|
|
89
88
|
|
|
90
89
|
### Worked example
|
|
91
90
|
|
|
@@ -114,13 +113,161 @@ Claim: "The service is deployed and healthy."
|
|
|
114
113
|
response from the target environment.
|
|
115
114
|
```
|
|
116
115
|
|
|
116
|
+
## Artifact identity — what the evidence was collected against
|
|
117
|
+
|
|
118
|
+
A claim reaches only as far as its evidence's *kind*; it applies only to the *artifact* that evidence
|
|
119
|
+
was collected against. **Artifact identity is what makes two captured artifacts the same or
|
|
120
|
+
different**: one repository, at one commit, in one environment, at one moment. Evidence that does not
|
|
121
|
+
say which artifact it observed is not evidence about anything in particular — it silently transfers
|
|
122
|
+
to whatever ships next, which is exactly how an auto-merge race ships code no verification ever
|
|
123
|
+
touched.
|
|
124
|
+
|
|
125
|
+
Identity is carried in two places, and they must agree:
|
|
126
|
+
|
|
127
|
+
| Where | Field | What it pins |
|
|
128
|
+
|---|---|---|
|
|
129
|
+
| `artifact` (once per verdict) | `repository` | the `owner/repo` the run observed |
|
|
130
|
+
| | `base_sha` | the base the change was measured against |
|
|
131
|
+
| | `head_sha` | **the commit the verification actually observed** — required for a v2 pass |
|
|
132
|
+
| | `build_id` | the build/run the evidence came from, where one exists |
|
|
133
|
+
| | `environment` | where it ran (local, preview, staging, production) |
|
|
134
|
+
| | `observed_at` | when the run observed it (ISO-8601 UTC) |
|
|
135
|
+
| `evidence[]` (per artifact) | `artifact_head_sha` | the `head_sha` in force **when that artifact was captured** |
|
|
136
|
+
| | `sha256` | content digest of the committed evidence file |
|
|
137
|
+
| | `captured_at` | when that artifact was captured (ISO-8601 UTC) |
|
|
138
|
+
|
|
139
|
+
`head_sha` pins the *build*; `sha256` pins the *bytes*. Together they answer both identity questions:
|
|
140
|
+
"which artifact was this collected against" and "is this still the artifact that was collected". The
|
|
141
|
+
`sha256` + commit-ref discipline is the same one Lisa's upstream-evidence manifest already uses — it
|
|
142
|
+
is cited as prior art here, not reinvented.
|
|
143
|
+
|
|
144
|
+
### Two identity failures, both loud
|
|
145
|
+
|
|
146
|
+
- **`artifact_mismatch`** — an `evidence[]` entry whose `artifact_head_sha` differs from the verdict's
|
|
147
|
+
`artifact.head_sha`. The evidence describes a different build than the one the verdict claims. The
|
|
148
|
+
identity check fails **loudly, naming both SHAs** (the evidence's and the verdict's) so an operator
|
|
149
|
+
can see which build each half is talking about.
|
|
150
|
+
- **`evidence_digest_mismatch`** — on read, recompute the `sha256` of each committed evidence file. If
|
|
151
|
+
the bytes no longer match the recorded digest, the artifact has changed since it was recorded: the
|
|
152
|
+
check fails, it names the evidence id, and blocks completion. A digest that cannot be recomputed
|
|
153
|
+
(file absent) is the same failure.
|
|
154
|
+
|
|
155
|
+
Neither failure is ever summarized as "verification failed". Name the field, the ids, and both SHAs —
|
|
156
|
+
a person who does not code reads this at the gate (`factory-model` rule 5). Both checks are
|
|
157
|
+
**advisory-first**: reported to the operator but non-blocking until
|
|
158
|
+
`verification.gate.enforceBoundaries` is `true` in `.lisa.config.json` — the same ratchet flag the
|
|
159
|
+
boundary checks and the Stop-hook gate ride.
|
|
160
|
+
|
|
161
|
+
### The merge race — one definition, two guards
|
|
162
|
+
|
|
163
|
+
"The artifact that shipped" is already defined once, in `lisa-drive-pr-to-merge`: the **ancestry**
|
|
164
|
+
check (is the verified commit an ancestor of the merged base branch, and is the merge commit's parent
|
|
165
|
+
that verified head rather than a stale one) **plus** the **deploy-run** check (a deploy/release run
|
|
166
|
+
actually fired for the merge SHA or an including descendant). Cite that definition; never write a
|
|
167
|
+
second one. Identity reconciliation is the same definition read from the evidence side:
|
|
168
|
+
|
|
169
|
+
- Evidence collected on a **pre-merge head** is valid for the merge commit **only when that head is a
|
|
170
|
+
parent of the merge** — i.e. it satisfies that skill's ancestry check against the merged head. If a
|
|
171
|
+
late commit raced past the merge, the merged head is not the verified one and the evidence does not
|
|
172
|
+
transfer.
|
|
173
|
+
- Ancestry alone is never enough. That skill's rule stands unchanged here: **never report shipped on
|
|
174
|
+
ancestry alone** — the deploy-run check must also pass before completion is declared.
|
|
175
|
+
- On mismatch (`artifact.head_sha` ≠ the reconciled merge SHA), completion is not declared. Flag the
|
|
176
|
+
mismatch naming both SHAs and **re-run verification against the merged head**; the re-run's verdict
|
|
177
|
+
is what may declare completion.
|
|
178
|
+
|
|
179
|
+
Two guards, one definition — so they cannot disagree about what shipped.
|
|
180
|
+
|
|
181
|
+
## Security buckets — the impact-or-exploitability bar
|
|
182
|
+
|
|
183
|
+
A security-shaped claim is a claim like any other: it reaches only as far as its evidence. Applied to
|
|
184
|
+
security findings (shipped by BCE-5, #1839), that yields two buckets and one bar:
|
|
185
|
+
|
|
186
|
+
- **Security (proven)** — the finding carries **both** a `reproducer` (an evidence ref of a kind that
|
|
187
|
+
reaches the claim's boundary, per the taxonomy above — e.g. an `http-transcript` for an injection
|
|
188
|
+
claim at `http-api`) **and** a bounded `impact`/exploitability statement.
|
|
189
|
+
- **Security (unproven)** — **missing either**. It keeps a one-line `reason` and **stays in the
|
|
190
|
+
security section**: a reproducer-less finding is **never auto-demoted** to a `maintenance` bucket,
|
|
191
|
+
because under-reporting a real vulnerability is the worse failure.
|
|
192
|
+
|
|
193
|
+
The unproven bucket's label is the single configurable policy point —
|
|
194
|
+
`security.review.unprovenBucket` in `.lisa.config.json`, default `security-unproven`. An owner who
|
|
195
|
+
prefers true demotion flips that one value; no other classification logic changes. Like the boundary
|
|
196
|
+
checks, bucketing is **advisory** — it shapes the report, not the merge — until
|
|
197
|
+
`verification.gate.enforceBoundaries` is `true`.
|
|
198
|
+
|
|
199
|
+
The full procedure — per-finding fields, report shape, ZAP alignment — lives in the
|
|
200
|
+
`lisa-security-review` skill (with `lisa-security-zap-scan` citing it); dependency-CVE remediation
|
|
201
|
+
keeps its separate ladder in `security-audit-handling`. Cite those slugs; do not restate them here.
|
|
202
|
+
|
|
203
|
+
## The "Not established" section — required, never omitted
|
|
204
|
+
|
|
205
|
+
Every report that asserts something was verified also states, in the same breath, **what it did not
|
|
206
|
+
establish**. This is one section, it is **required**, and it is **never omitted and never blank** —
|
|
207
|
+
on the evidence comment, in the committed `evidence/<ticket>/verdict.json`, and in the
|
|
208
|
+
`verification-status.json` verdict BCE-2's gate reads.
|
|
209
|
+
|
|
210
|
+
**Where it appears and what it says**
|
|
211
|
+
|
|
212
|
+
| Surface | Shape |
|
|
213
|
+
|---|---|
|
|
214
|
+
| Evidence comment (tracker + PR `## Evidence` section) | a `## Not established` heading, one plain-language bullet per item |
|
|
215
|
+
| `evidence/<ticket>/verdict.json` | `not_established: []` plus `not_established_reviewed: true` |
|
|
216
|
+
| `.lisa/verification-status.json` (schema v2) | per-claim `not_established[]` plus the top-level `not_established_reviewed` flag |
|
|
217
|
+
|
|
218
|
+
**The empty case is not the omitted case.** A verification that genuinely left nothing unproved still
|
|
219
|
+
renders the heading, with the single line:
|
|
220
|
+
|
|
221
|
+
```text
|
|
222
|
+
## Not established
|
|
223
|
+
|
|
224
|
+
None outstanding — reviewed
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
An absent heading, or a heading with nothing under it, is a defect — it is indistinguishable from
|
|
228
|
+
never having asked the question. The list may be empty; the section may not be blank.
|
|
229
|
+
|
|
230
|
+
**Machine-readable semantics (as shipped by BCE-2, #1836).** `not_established` is the list — it may
|
|
231
|
+
be empty. `not_established_reviewed` is the boolean attestation that the list was actually
|
|
232
|
+
reviewed — **the flag may never be omitted**. That asymmetry is the whole mechanism: an empty list
|
|
233
|
+
plus a present flag means "we looked and found nothing outstanding"; an absent flag means nobody
|
|
234
|
+
looked. The Stop-hook gate treats an absent flag as a v2 contract violation, reported to stderr and
|
|
235
|
+
**advisory** until `verification.gate.enforceBoundaries` is `true` in `.lisa.config.json` (the same
|
|
236
|
+
ratchet flag the boundary checks ride); evidence surfaces refuse the post on the same terms.
|
|
237
|
+
|
|
238
|
+
**What belongs under the heading** — written in operator voice (`factory-model` rule 5: a person who
|
|
239
|
+
does not code reads this at the gate), not in engineering shorthand:
|
|
240
|
+
|
|
241
|
+
- **Boundaries not exercised** — a claim's boundary that no captured artifact reached. *"The checkout
|
|
242
|
+
button was proved in the browser; the order's persisted row was never queried, so the `data`
|
|
243
|
+
boundary is not established."*
|
|
244
|
+
- **Environments not tested** — where it was and was not run. *"Checked on production Chrome at
|
|
245
|
+
1440×900 only. Not checked on mobile Safari, and not checked against the staging database."*
|
|
246
|
+
- **Claims consciously out of scope** — deliberately excluded behavior, named so nobody infers it.
|
|
247
|
+
*"Refunds were not touched or tested; this change covers new orders only."*
|
|
248
|
+
- **Anything a green quality check might be mistaken for proving.** *"Unit tests pass for the submit
|
|
249
|
+
handler. That establishes the code-unit boundary only — it is not evidence the button works."*
|
|
250
|
+
|
|
251
|
+
Each item names the thing, not a category: "not tested on mobile Safari" is usable at a gate; "some
|
|
252
|
+
environments untested" is not.
|
|
253
|
+
|
|
254
|
+
### Philosophical precedent for this section
|
|
255
|
+
|
|
256
|
+
This generalizes `lisa-improve-harness`'s **`Known limits`** field — a required, never-empty line on
|
|
257
|
+
every result record. That skill says it plainly:
|
|
258
|
+
*"A record with nothing in it is invalid on its face"* — because a single-trajectory loop always has
|
|
259
|
+
limits. The same is true of any verification:
|
|
260
|
+
it ran somewhere, on something, once. `Known limits` (one record) and `not_established` (every claim
|
|
261
|
+
in the factory) are the same discipline with the same never-empty rule; read either and you should
|
|
262
|
+
recognize the other.
|
|
263
|
+
|
|
117
264
|
## Philosophical precedent
|
|
118
265
|
|
|
119
266
|
This generalizes the **bounded-claim discipline** of `lisa-improve-harness`: one trajectory supports
|
|
120
267
|
one trajectory's claim, and a result record may claim only what its cited evidence reaches. Here the
|
|
121
268
|
same discipline is applied to every claim in the factory — a claim reaches exactly as far as the
|
|
122
|
-
*kind* of evidence behind it, and no further.
|
|
123
|
-
|
|
269
|
+
*kind* of evidence behind it, and no further. The *Not established* half of that discipline is a
|
|
270
|
+
first-class report state — see the required, never-omitted section above.
|
|
124
271
|
|
|
125
272
|
## No behavior change; degrade, never block
|
|
126
273
|
|
|
@@ -151,6 +151,32 @@ Do not invent types inline; if none fits, propose extending this table. The lega
|
|
|
151
151
|
|
|
152
152
|
The manifest is the single source of truth for "what evidence is required": authored once in the Validation Journey, enforced at write time, replayed during `tracker-journey` (which captures each artifact **in its declared type**), and checked again before the ticket closes. There is no second list to keep in sync.
|
|
153
153
|
|
|
154
|
+
### Every evidence surface names what it did NOT establish
|
|
155
|
+
|
|
156
|
+
An evidence comment that lists only what passed is unreadable at a gate: a journey that skipped an edge state looks exactly like one that covered it. So every evidence comment — and the committed `evidence/<ticket>/verdict.json` — carries two extra sections, defined in full by the `claim-evidence-mapping` rule:
|
|
157
|
+
|
|
158
|
+
- **Artifact identity** — what the evidence was collected against, as values rather than placeholders: the `repository`, the `head_sha` the run observed, the `environment`, and per artifact its `sha256` digest and `captured_at`. Defined in full by the `claim-evidence-mapping` rule.
|
|
159
|
+
- **Not established** — a **required, never-omitted** heading listing what the verification did *not* prove: boundaries not exercised, environments not tested, behavior consciously out of scope. When nothing is outstanding it still renders, reading `None outstanding — reviewed`. It is never blank.
|
|
160
|
+
|
|
161
|
+
The committed verdict carries the machine-readable half:
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
evidence/<ticket>/verdict.json
|
|
165
|
+
not_established: [] # what was NOT proved; may be empty
|
|
166
|
+
not_established_reviewed: true # attests the list was reviewed; may NEVER be omitted
|
|
167
|
+
artifact: { repository, base_sha, head_sha, build_id, environment, observed_at }
|
|
168
|
+
evidence: [ { evidence_id, kind, locator,
|
|
169
|
+
artifact_head_sha, # the head_sha in force when THIS artifact was captured
|
|
170
|
+
sha256, # content digest of the committed evidence file
|
|
171
|
+
captured_at } ]
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
`artifact.head_sha` pins the build the verification observed; each entry's `sha256` pins the bytes. An entry whose `artifact_head_sha` differs from `artifact.head_sha` is an `artifact_mismatch` and a recomputed digest that disagrees is an `evidence_digest_mismatch` — each fails loudly, naming both SHAs or the evidence id, and blocks completion. At completion the pinned `head_sha` is reconciled against **the merged head** using the ancestry + deploy-run definition of "what shipped" that `lisa-drive-pr-to-merge` already owns (cite it; there is no second definition): pre-merge evidence counts only when its head is a parent of the merge, and on a merge-race mismatch verification re-runs against the merged head before completion is declared.
|
|
175
|
+
|
|
176
|
+
The list may be empty; the flag may not be missing. An absent `not_established_reviewed` is indistinguishable from nobody having asked the question, so the evidence-posting gate in `tracker-evidence` refuses the post, and the Stop-hook gate reports it as a v2 contract violation (advisory until `verification.gate.enforceBoundaries` is ratcheted on). This generalizes the required, never-empty `Known limits` field of `lisa-improve-harness` to every evidence surface.
|
|
177
|
+
|
|
178
|
+
The boundary each artifact type reaches — and therefore which claim a captured artifact can discharge — is the `claim-evidence-mapping` rule's taxonomy; the type table above is its evidence-kind source.
|
|
179
|
+
|
|
154
180
|
### Cross-work-item evidence references are non-claiming
|
|
155
181
|
|
|
156
182
|
When prose needs to point at evidence declared by another work item, use the dedicated reference form:
|
|
@@ -24,6 +24,16 @@ Upload captured evidence and generated templates to the GitHub PR description an
|
|
|
24
24
|
- `comment.md` — GitHub markdown body for both the issue comment and the PR description's `## Evidence` section.
|
|
25
25
|
- (Optional) `comment.txt` — kept for parity with the JIRA path; not used here.
|
|
26
26
|
|
|
27
|
+
## Comment-body preflight (required)
|
|
28
|
+
|
|
29
|
+
Before posting or updating anything, check the evidence body (`comment.md`, and `comment.txt` where this skill uses it):
|
|
30
|
+
|
|
31
|
+
- It contains a `## Not established` heading. That heading is **never omitted and never blank** — when nothing is outstanding it still renders `None outstanding — reviewed`; otherwise it names, in plain operator language, what the verification did not prove.
|
|
32
|
+
- The accompanying verdict carries `not_established_reviewed: true` (the list may be empty; the flag may never be omitted).
|
|
33
|
+
- It contains a `## Artifact identity` heading carrying **values, not placeholders** — the repository, the `head_sha` the verification observed, the `environment`, and per artifact its `sha256` digest and `captured_at`. **Refuse to post** a body whose identity heading is absent or unpopulated, or whose recorded `artifact_head_sha` disagrees with the verdict's `artifact.head_sha` — report the evidence id and **both SHAs**. Definition: the `claim-evidence-mapping` rule.
|
|
34
|
+
|
|
35
|
+
If either is missing, **refuse to post**: stop and report the missing Not-established review to the caller instead of publishing. Composing the body is `lisa-tracker-evidence`'s job (see its UI Evidence Checklist); this skill only refuses to publish one that omits the section. The section is defined by the `claim-evidence-mapping` rule and generalizes `lisa-improve-harness`'s required, never-empty `Known limits` field.
|
|
36
|
+
|
|
27
37
|
## Workflow
|
|
28
38
|
|
|
29
39
|
1. **Resolve refs**
|
|
@@ -42,6 +42,16 @@ Upload captured evidence and generated templates to GitHub PR description and JI
|
|
|
42
42
|
- `comment.txt` — JIRA wiki markup (generated by `generate-templates.py`)
|
|
43
43
|
- `comment.md` — GitHub markdown (generated by `generate-templates.py`)
|
|
44
44
|
|
|
45
|
+
## Comment-body preflight (required)
|
|
46
|
+
|
|
47
|
+
Before posting or updating anything, check the evidence body (`comment.md`, and `comment.txt` where this skill uses it):
|
|
48
|
+
|
|
49
|
+
- It contains a `## Not established` heading. That heading is **never omitted and never blank** — when nothing is outstanding it still renders `None outstanding — reviewed`; otherwise it names, in plain operator language, what the verification did not prove.
|
|
50
|
+
- The accompanying verdict carries `not_established_reviewed: true` (the list may be empty; the flag may never be omitted).
|
|
51
|
+
- It contains a `## Artifact identity` heading carrying **values, not placeholders** — the repository, the `head_sha` the verification observed, the `environment`, and per artifact its `sha256` digest and `captured_at`. **Refuse to post** a body whose identity heading is absent or unpopulated, or whose recorded `artifact_head_sha` disagrees with the verdict's `artifact.head_sha` — report the evidence id and **both SHAs**. Definition: the `claim-evidence-mapping` rule.
|
|
52
|
+
|
|
53
|
+
If either is missing, **refuse to post**: stop and report the missing Not-established review to the caller instead of publishing. Composing the body is `lisa-tracker-evidence`'s job (see its UI Evidence Checklist); this skill only refuses to publish one that omits the section. The section is defined by the `claim-evidence-mapping` rule and generalizes `lisa-improve-harness`'s required, never-empty `Known limits` field.
|
|
54
|
+
|
|
45
55
|
## Usage
|
|
46
56
|
|
|
47
57
|
```bash
|
|
@@ -41,6 +41,16 @@ The caller must produce:
|
|
|
41
41
|
|
|
42
42
|
If any of these are missing, stop and report.
|
|
43
43
|
|
|
44
|
+
## Comment-body preflight (required)
|
|
45
|
+
|
|
46
|
+
Before posting or updating anything, check the evidence body (`comment.md`, and `comment.txt` where this skill uses it):
|
|
47
|
+
|
|
48
|
+
- It contains a `## Not established` heading. That heading is **never omitted and never blank** — when nothing is outstanding it still renders `None outstanding — reviewed`; otherwise it names, in plain operator language, what the verification did not prove.
|
|
49
|
+
- The accompanying verdict carries `not_established_reviewed: true` (the list may be empty; the flag may never be omitted).
|
|
50
|
+
- It contains a `## Artifact identity` heading carrying **values, not placeholders** — the repository, the `head_sha` the verification observed, the `environment`, and per artifact its `sha256` digest and `captured_at`. **Refuse to post** a body whose identity heading is absent or unpopulated, or whose recorded `artifact_head_sha` disagrees with the verdict's `artifact.head_sha` — report the evidence id and **both SHAs**. Definition: the `claim-evidence-mapping` rule.
|
|
51
|
+
|
|
52
|
+
If either is missing, **refuse to post**: stop and report the missing Not-established review to the caller instead of publishing. Composing the body is `lisa-tracker-evidence`'s job (see its UI Evidence Checklist); this skill only refuses to publish one that omits the section. The section is defined by the `claim-evidence-mapping` rule and generalizes `lisa-improve-harness`'s required, never-empty `Known limits` field.
|
|
53
|
+
|
|
44
54
|
## Phase 1 — Resolve Linear Issue
|
|
45
55
|
|
|
46
56
|
1. Parse the identifier from `$ARGUMENTS`.
|