@codyswann/lisa 2.266.0 → 2.267.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 +18 -6
- 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-implement/SKILL.md +22 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-spec-conformance/SKILL.md +43 -11
- package/plugins/lisa/agents/spec-conformance-specialist.md +5 -2
- package/plugins/lisa/agents/verification-specialist.md +1 -1
- package/plugins/lisa/hooks/enforce-verification-gate.sh +83 -9
- package/plugins/lisa/rules/reference/verification.md +2 -0
- package/plugins/lisa/skills/lisa-implement/SKILL.md +22 -1
- package/plugins/lisa/skills/lisa-spec-conformance/SKILL.md +43 -11
- package/plugins/lisa-agy/agents/spec-conformance-specialist.md +5 -2
- package/plugins/lisa-agy/agents/verification-specialist.md +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +22 -1
- package/plugins/lisa-agy/skills/lisa-spec-conformance/SKILL.md +43 -11
- 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/spec-conformance-specialist.agent.md +5 -2
- package/plugins/lisa-copilot/agents/verification-specialist.agent.md +1 -1
- package/plugins/lisa-copilot/hooks/enforce-verification-gate.sh +83 -9
- package/plugins/lisa-copilot/rules/reference/verification.md +2 -0
- package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +22 -1
- package/plugins/lisa-copilot/skills/lisa-spec-conformance/SKILL.md +43 -11
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/agents/spec-conformance-specialist.md +5 -2
- package/plugins/lisa-cursor/agents/verification-specialist.md +1 -1
- package/plugins/lisa-cursor/hooks/enforce-verification-gate.sh +83 -9
- package/plugins/lisa-cursor/rules/verification-reference.mdc +2 -0
- package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +22 -1
- package/plugins/lisa-cursor/skills/lisa-spec-conformance/SKILL.md +43 -11
- 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/spec-conformance-specialist.md +5 -2
- package/plugins/src/base/agents/verification-specialist.md +1 -1
- package/plugins/src/base/hooks/enforce-verification-gate.sh +83 -9
- package/plugins/src/base/rules/reference/verification.md +2 -0
- package/plugins/src/base/skills/lisa-implement/SKILL.md +22 -1
- package/plugins/src/base/skills/lisa-spec-conformance/SKILL.md +43 -11
|
@@ -81,6 +81,20 @@
|
|
|
81
81
|
# the flag may never be omitted)
|
|
82
82
|
# - "artifact.head_sha" exists and no evidence entry declares a different
|
|
83
83
|
# "artifact_head_sha" (reconciliation with the MERGED head is BCE-4)
|
|
84
|
+
# - every evidence entry that records BOTH a "sha256" and a "locator"
|
|
85
|
+
# resolving to a file on disk still hashes to that digest
|
|
86
|
+
# ("evidence_digest_mismatch"). A locator that is not on disk at stop time
|
|
87
|
+
# is NOT judged here: the Stop hook sees only the working tree, and evidence
|
|
88
|
+
# may legitimately live outside it. The absent-artifact arm of that check
|
|
89
|
+
# belongs to the read-side review surfaces, which see the committed
|
|
90
|
+
# evidence directory.
|
|
91
|
+
# - the claim/evidence structure is EVALUABLE at all: a v2 verdict whose
|
|
92
|
+
# "claims"/"evidence"/"artifact" are not the shapes the schema defines
|
|
93
|
+
# (claims as a string, evidence as a scalar) is reported as
|
|
94
|
+
# could-not-evaluate. Could-not-evaluate is NOT the same as no-violations:
|
|
95
|
+
# a verdict the gate cannot read may never be treated as a clean one, or a
|
|
96
|
+
# structurally-wrong verdict would sail past the gate the moment
|
|
97
|
+
# enforcement is ratcheted on.
|
|
84
98
|
#
|
|
85
99
|
# ADVISORY-FIRST: those v2 checks report to stderr but do NOT block unless
|
|
86
100
|
# "verification.gate.enforceBoundaries" is true in .lisa.config.json (default
|
|
@@ -90,11 +104,15 @@
|
|
|
90
104
|
# Per-session state lives under "$STATE_DIR" as flag files keyed by session_id.
|
|
91
105
|
# Stale state (>24h) is cleaned on each invocation.
|
|
92
106
|
#
|
|
93
|
-
# Fail-open:
|
|
94
|
-
#
|
|
95
|
-
#
|
|
96
|
-
#
|
|
97
|
-
#
|
|
107
|
+
# Fail-open: a missing field degrades to the LESS strict outcome rather than
|
|
108
|
+
# inventing a new hard failure, and the MAX_BLOCKS escalation below guarantees
|
|
109
|
+
# the gate always releases eventually. A broken gate must never brick a session.
|
|
110
|
+
#
|
|
111
|
+
# That fail-open posture bounds the BLAST RADIUS of a gate failure; it is not a
|
|
112
|
+
# licence to read an unreadable verdict as a clean one. So a v2 verdict whose
|
|
113
|
+
# claim structure cannot be evaluated is reported like any other violation —
|
|
114
|
+
# advisory while the ratchet is off, blocking (still MAX_BLOCKS-bounded, so it
|
|
115
|
+
# can never hard-wedge a session) once it is on.
|
|
98
116
|
|
|
99
117
|
set -uo pipefail
|
|
100
118
|
|
|
@@ -225,9 +243,39 @@ boundary_enforcement_enabled() {
|
|
|
225
243
|
[ "$value" = "true" ]
|
|
226
244
|
}
|
|
227
245
|
|
|
246
|
+
# Prints the sha256 of a file using whichever tool this machine has. Prints
|
|
247
|
+
# nothing when neither exists — an unrecomputable digest is not a violation.
|
|
248
|
+
sha256_of() {
|
|
249
|
+
if command -v shasum >/dev/null 2>&1; then
|
|
250
|
+
shasum -a 256 "$1" 2>/dev/null | awk '{print $1}'
|
|
251
|
+
elif command -v sha256sum >/dev/null 2>&1; then
|
|
252
|
+
sha256sum "$1" 2>/dev/null | awk '{print $1}'
|
|
253
|
+
fi
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
# Emits one line per evidence entry whose bytes no longer hash to the digest the
|
|
257
|
+
# verdict recorded. Only entries recording BOTH a sha256 and a locator that
|
|
258
|
+
# resolves to a file on disk are judged; see the header for why an absent
|
|
259
|
+
# locator is out of this hook's scope.
|
|
260
|
+
v2_digest_violations() {
|
|
261
|
+
jq -r '
|
|
262
|
+
(.evidence // [])[]
|
|
263
|
+
| select(((.sha256 // "") | length) > 0)
|
|
264
|
+
| select(((.locator // "") | length) > 0)
|
|
265
|
+
| "\(.evidence_id // "?")\t\(.locator)\t\(.sha256)"
|
|
266
|
+
' "$VERDICT_FILE" 2>/dev/null | while IFS=$'\t' read -r eid locator recorded; do
|
|
267
|
+
evidence_path="${PROJECT_DIR}/${locator}"
|
|
268
|
+
[ -f "$evidence_path" ] || continue
|
|
269
|
+
actual=$(sha256_of "$evidence_path")
|
|
270
|
+
[ -n "$actual" ] || continue
|
|
271
|
+
[ "$actual" = "$recorded" ] && continue
|
|
272
|
+
echo "evidence ${eid} (${locator}) no longer matches its recorded digest: recorded ${recorded}, bytes now hash to ${actual}"
|
|
273
|
+
done
|
|
274
|
+
}
|
|
275
|
+
|
|
228
276
|
# Emits one line per v2 claim->evidence contract violation. Empty output means
|
|
229
|
-
# the verdict satisfies the contract
|
|
230
|
-
#
|
|
277
|
+
# the verdict satisfies the contract. A jq evaluation failure is NOT empty
|
|
278
|
+
# output — see v2_evaluate_contract, which turns it into its own violation.
|
|
231
279
|
v2_contract_violations() {
|
|
232
280
|
jq -r '
|
|
233
281
|
. as $v
|
|
@@ -263,7 +311,32 @@ v2_contract_violations() {
|
|
|
263
311
|
)
|
|
264
312
|
]
|
|
265
313
|
| .[]
|
|
266
|
-
' "$VERDICT_FILE" 2>/dev/null
|
|
314
|
+
' "$VERDICT_FILE" 2>/dev/null
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
# Set by v2_evaluate_contract: every violation line, or empty when the verdict
|
|
318
|
+
# satisfies the contract. A global rather than a return value because a command
|
|
319
|
+
# substitution would swallow the could-not-evaluate signal along with it.
|
|
320
|
+
V2_VIOLATIONS=""
|
|
321
|
+
|
|
322
|
+
# Evaluates the full v2 contract into V2_VIOLATIONS.
|
|
323
|
+
#
|
|
324
|
+
# The load-bearing distinction: jq returns NOTHING on an evaluation error, which
|
|
325
|
+
# is byte-identical to "this verdict is clean". A parseable v2 verdict whose
|
|
326
|
+
# claims/evidence are the wrong SHAPE (claims as a string, evidence as a scalar)
|
|
327
|
+
# therefore used to read as violation-free — harmless while advisory, a genuine
|
|
328
|
+
# bypass of the gate the moment enforcement is ratcheted on. So a non-zero jq
|
|
329
|
+
# exit becomes its own, named violation.
|
|
330
|
+
v2_evaluate_contract() {
|
|
331
|
+
local structural digests
|
|
332
|
+
structural=$(v2_contract_violations)
|
|
333
|
+
if [ "$?" -ne 0 ]; then
|
|
334
|
+
V2_VIOLATIONS="the v2 claim/evidence structure could not be evaluated - \"claims\" and \"evidence\" must be arrays of objects and \"artifact\" an object. A verdict the gate cannot read is not a verdict with no violations"
|
|
335
|
+
return 0
|
|
336
|
+
fi
|
|
337
|
+
|
|
338
|
+
digests=$(v2_digest_violations)
|
|
339
|
+
V2_VIOLATIONS=$(printf '%s\n%s' "$structural" "$digests" | sed '/^[[:space:]]*$/d')
|
|
267
340
|
}
|
|
268
341
|
|
|
269
342
|
# v2 = the v1 decision PLUS the claim->evidence contract, the latter advisory
|
|
@@ -277,7 +350,8 @@ verdict_is_terminal_v2() {
|
|
|
277
350
|
status=$(jq -r '.status // empty' "$VERDICT_FILE" 2>/dev/null || true)
|
|
278
351
|
[ "$status" = "pass" ] || return 0
|
|
279
352
|
|
|
280
|
-
|
|
353
|
+
v2_evaluate_contract
|
|
354
|
+
violations="$V2_VIOLATIONS"
|
|
281
355
|
[ -n "$violations" ] || return 0
|
|
282
356
|
|
|
283
357
|
if boundary_enforcement_enabled; then
|
|
@@ -182,6 +182,8 @@ The list may be empty; the flag may not be missing. An absent `not_established_r
|
|
|
182
182
|
|
|
183
183
|
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.
|
|
184
184
|
|
|
185
|
+
The verdict is read twice. The Claude-only `enforce-verification-gate.sh` Stop hook reads it to decide whether the flow may stop; `lisa-spec-conformance` (run by `spec-conformance-specialist` in the verification phase) reads it to decide whether each shipped requirement's proof actually reaches its boundary — a cited-evidence-boundary mismatch is a `BOUNDARY_MISMATCH` conformance finding there, caught alongside empirical verification rather than after it. On harnesses without a Stop hook, `lisa-implement`'s prose gate carries the same v2 expectations by convention. The whole system, operator-readable end to end, is written up as the Lisa wiki's **Bounded-Claims Evidence System** concept page (`wiki/concepts/bounded-claims-evidence-system.md` upstream).
|
|
186
|
+
|
|
185
187
|
### Cross-work-item evidence references are non-claiming
|
|
186
188
|
|
|
187
189
|
When prose needs to point at evidence declared by another work item, use the dedicated reference form:
|
|
@@ -278,7 +278,28 @@ Before shutting down the team, execute the Verify flow:
|
|
|
278
278
|
- **Actionable blocker** — an unresolved dependency or fixable technical gap that some team or repository could build (a missing or changed schema field, an unbuilt sibling work item, a required upstream fix), **including cross-repo dependencies**. Before writing the blocked verdict you MUST (1) file a build-ready fix/dependency ticket capturing the diagnosis — in the dependency's own repository/tracker when it is cross-repo (e.g. a `[<repo>] …` ticket in the shared project, or the sibling tracker) — and (2) link the current work item to it as `is blocked by`. Only then write the verdict. This is the same discipline as the regression-spec blocker and the remote-verification-fail exits above, and it is what makes the block machine-recoverable: `repair-intake` re-dispatches a blocked item once its linked `is blocked by` dependency closes, but it cannot act on a prose-only comment. Recommending the ticket "as a human follow-up" without filing and linking it is **not** a permitted exit.
|
|
279
279
|
- **Human-only blocker** — an input the agent genuinely cannot obtain or produce no matter what it does: credentials, secrets, or **tool access** it does not have (AWS/CloudWatch, Figma, Jam, Sentry, SonarCloud, a database, a protected deploy target, …), or a product/design decision only a human can make. For missing tool access, follow the `tool-access-gate` rule's break-out protocol: post the "Access Needed" comment naming the exact credential/role/env var to grant and the probe that must pass — never work around the gap by substituting weaker verification, mocking the inaccessible system, or narrowing scope. Record the blocked verdict, mark it `human_needed` (the marker `repair-intake` recognizes, so it won't churn re-dispatching it), and surface or reassign to a human; do **not** fabricate a build-ready ticket, because there is no build-ready work.
|
|
280
280
|
|
|
281
|
-
|
|
281
|
+
**Harnesses that do not fire a Stop hook enforce the same discipline by convention.** The
|
|
282
|
+
`enforce-verification-gate.sh` Stop hook is a **Claude-only** surface — Codex, Cursor, Antigravity,
|
|
283
|
+
Copilot, and OpenCode carry the skills, agents, and (where the runtime has a rules surface) the
|
|
284
|
+
`claim-evidence-mapping` rule, but nothing on those runtimes can refuse to stop. That is a known
|
|
285
|
+
**representation gap**, documented here rather than dropped: on those harnesses this prose gate
|
|
286
|
+
*is* the gate, and the flow may not declare completion until it has written the same v2 verdict
|
|
287
|
+
and self-checked it against the same expectations the hook would have applied:
|
|
288
|
+
|
|
289
|
+
- `schema_version: 2` is written, with `plan`, `status`, and `updated_at` terminal and fresh.
|
|
290
|
+
- Every claim carries a `claim_id`, a `boundary` from the closed set, and the
|
|
291
|
+
`required_evidence_kinds` that reach that boundary — and its `evidence_refs` resolve to evidence
|
|
292
|
+
whose `kind` is one of them. A unit `test-run-log` cited for a `browser`, `http-api`, or
|
|
293
|
+
`deploy-health` claim is the failure this check exists to catch.
|
|
294
|
+
- `artifact.head_sha` names what will ship, and every evidence entry's `artifact_head_sha` matches
|
|
295
|
+
it, with a `sha256` digest and `captured_at` recorded as values, never placeholders.
|
|
296
|
+
- The `not_established` list is present on every claim and `not_established_reviewed` is `true` —
|
|
297
|
+
an empty list is fine, an omitted flag is not.
|
|
298
|
+
|
|
299
|
+
Record the self-check in the completion summary the way the hook would have reported it: name the
|
|
300
|
+
boundary each claim reached, or name the violation. Where the runtime lacks the rules surface (the
|
|
301
|
+
agy artifacts carry no rules tree), the obligation still travels in this skill — cite the
|
|
302
|
+
`claim-evidence-mapping` contract by slug and continue; never block on the absent surface.
|
|
282
303
|
3. Write the highest-practical-observation regression test encoding the verification. For user-visible bugs or user-visible Build changes with an available browser/device/e2e harness, this means a deterministic spec on the reported surface — and for frontend work, once the validation journey is verified, codification into **every supported UI runner**: a Playwright spec in the Playwright runner AND a Maestro flow when the project supports Maestro, per `codify-verification`. Prove the new spec actually executed and passed in PR CI by recording a named spec log/reporter line or equivalent execution record; green CI without that named evidence does not satisfy this step.
|
|
283
304
|
4. Record Implement usage on the originating work artifact via `lisa-usage-accounting` so the work item (or other implementation-owned artifact) gains a direct `lisa-implement` usage entry in the canonical `## Lisa Usage` section. If the parent / child graph is already known, prefer `record_and_rollup` so ancestor totals refresh in the same write; otherwise still write the direct entry, and if runtime usage is unavailable, use `source: unavailable` with nullable token/cost fields instead of skipping the row.
|
|
284
305
|
5. Commit ALL outstanding changes in logical batches on the branch (minus sensitive data/information) — not just changes made by the agent team. This includes pre-existing uncommitted changes that were on the branch before the plan started. Do NOT filter commits to only "task-related" files. If it shows up in git status, it gets committed (unless it contains secrets).
|
|
@@ -67,11 +67,28 @@ Gather evidence of what was actually shipped:
|
|
|
67
67
|
git diff "${BASE_BRANCH}"...HEAD -- '**/*.test.*' '**/*.spec.*'
|
|
68
68
|
```
|
|
69
69
|
4. **Empirical evidence** — output of `verification-specialist` if available (proof artifacts, API captures, UI screenshots, DB queries). If that report isn't in context, ask the caller for it before proceeding — do not substitute reading code for running the system.
|
|
70
|
+
4a. **The machine-readable verdict** — `Read` `${CLAUDE_PROJECT_DIR:-.}/.lisa/verification-status.json`. Under **schema v2** it is the structured form of the evidence above, and it is what lets you check a claim's *reach* instead of taking "verified" at its word. Load `artifact` (`repository`, `head_sha`, `environment`), `claims[]` (`claim_id`, `statement`, `boundary`, `required_evidence_kinds`, `status`, `evidence_refs`, `not_established`), `evidence[]` (`evidence_id`, `kind`, `locator`, `sha256`, `captured_at`, `artifact_head_sha`), and the `not_established_reviewed` flag.
|
|
70
71
|
5. **PR description** — `gh pr view --json title,body,files` if a PR exists.
|
|
71
72
|
6. **Deployed state** — if the verification phase already hit a deployed environment, use those captures.
|
|
72
73
|
|
|
73
74
|
Do NOT run the system yourself — that's the verification-specialist's job. Your job is to map their evidence to the spec.
|
|
74
75
|
|
|
76
|
+
## Phase 3b — Cross-Check Claims Against Their Boundaries
|
|
77
|
+
|
|
78
|
+
The `claim-evidence-mapping` rule is the contract: **every claim declares a boundary, and a claim is established only by evidence of a kind that reaches that boundary.** Conformance is not just "was it built" — it is also "does the proof offered actually reach the thing the requirement asserts." A unit `test-run-log` cited for a requirement about browser-visible behavior is a conformance defect even when the code is perfect.
|
|
79
|
+
|
|
80
|
+
For every v2 claim loaded in Phase 3 step 4a, run three checks:
|
|
81
|
+
|
|
82
|
+
| Check | Rule | Failure |
|
|
83
|
+
|-------|------|---------|
|
|
84
|
+
| **Boundary reach** | Each `evidence_refs` entry resolves to an `evidence[]` row whose `kind` appears in that claim's `required_evidence_kinds` — and those kinds are the ones the `claim-evidence-mapping` taxonomy binds to the claim's `boundary` | `BOUNDARY_MISMATCH` |
|
|
85
|
+
| **Artifact identity** | Every cited evidence row's `artifact_head_sha` equals `artifact.head_sha` — the claim applies only to the artifact the evidence was collected against | `BOUNDARY_MISMATCH`, noting both SHAs |
|
|
86
|
+
| **Not established** | `not_established_reviewed` is present and `true`, and every claim carries a `not_established` list (possibly empty) | `BOUNDARY_MISMATCH` on the verdict as a whole |
|
|
87
|
+
|
|
88
|
+
Then bind the verdict back to the spec: map each `claim_id` to the requirement row it discharges. A requirement whose only supporting claim fails a check is **not** `MATCH`, no matter what the verification report's prose said. A requirement with no claim at all is `MISSING`, not `PARTIAL`.
|
|
89
|
+
|
|
90
|
+
**Degrade, never block.** If `.lisa/verification-status.json` is absent, or carries **v1** (no `schema_version`, or `schema_version: 1` — only `plan` / `status` / `criteria[]` / `updated_at`), the boundary cross-check is not available. Say so explicitly in the report ("v2 verdict not present — boundary reach unverified"), fall back to the prose evidence from Phase 3, and cap the verdict at `PARTIAL` for any requirement whose boundary you cannot confirm. Do not invent a mismatch you could not check, and do not silently upgrade an unchecked claim to `MATCH`.
|
|
91
|
+
|
|
75
92
|
## Phase 4 — Build Coverage Matrix
|
|
76
93
|
|
|
77
94
|
For every requirement extracted in Phase 2, produce one row:
|
|
@@ -81,8 +98,10 @@ For every requirement extracted in Phase 2, produce one row:
|
|
|
81
98
|
| Requirement ID | Stable identifier (e.g. `AC-1`, `OOS-2`, `ASSERT-3`) |
|
|
82
99
|
| Classification | `acceptance` / `excluded` / `technical` / `assertion` / `deliverable` / `task` / `blocker` |
|
|
83
100
|
| Requirement Text | Verbatim from spec |
|
|
84
|
-
| Evidence | Specific pointer — file:line, test name, verification report section, PR file, screenshot name |
|
|
85
|
-
|
|
|
101
|
+
| Evidence | Specific pointer — file:line, test name, verification report section, PR file, screenshot name. When a v2 verdict exists, also name the `claim_id` and `evidence_id` that discharge it |
|
|
102
|
+
| Boundary | The claim's `boundary` from the v2 verdict (`code-unit` / `browser` / `http-api` / `cli` / `data` / `deploy-health` / `performance` / `standards-compat`), or `—` when no v2 claim maps to this row |
|
|
103
|
+
| Evidence kind | The `kind` of each cited evidence row, so a reader sees the reach without opening the verdict |
|
|
104
|
+
| Status | `MATCH` / `PARTIAL` / `MISSING` / `BOUNDARY_MISMATCH` / `SCOPE_CREEP_VIOLATION` |
|
|
86
105
|
| Notes | One line — why partial, what's missing, or where evidence is thin |
|
|
87
106
|
|
|
88
107
|
### Status definitions
|
|
@@ -90,6 +109,7 @@ For every requirement extracted in Phase 2, produce one row:
|
|
|
90
109
|
- **`MATCH`** — requirement is implemented AND there is empirical evidence it works (test + verification report).
|
|
91
110
|
- **`PARTIAL`** — implementation exists but evidence is incomplete (e.g. code present, no test; or test present, no run-time verification).
|
|
92
111
|
- **`MISSING`** — requirement has no corresponding implementation OR no evidence at all.
|
|
112
|
+
- **`BOUNDARY_MISMATCH`** — the requirement was implemented and evidence was cited, but the evidence does not *reach* the claim's boundary (a unit `test-run-log` offered for a `browser` claim), or its `artifact_head_sha` does not match `artifact.head_sha`, or the verdict omits the required Not-established review. This is a distinct failure from a miss: the work may be right and the proof still does not establish it. A `BOUNDARY_MISMATCH` row forces the verdict to `DIVERGES` — it can never render as `CONFORMS` or `PARTIAL`. Name the boundary, the kind cited, and the kind(s) required, citing the `claim-evidence-mapping` taxonomy.
|
|
93
113
|
- **`SCOPE_CREEP_VIOLATION`** — used for `excluded` classification only. An Out-of-Scope item appears to have been shipped anyway. This is a different failure than a miss — it means the agent exceeded the spec.
|
|
94
114
|
|
|
95
115
|
### Scope creep detection
|
|
@@ -106,9 +126,9 @@ Untraceable changes are not automatic failures. They become findings the human r
|
|
|
106
126
|
|
|
107
127
|
Produce exactly one verdict:
|
|
108
128
|
|
|
109
|
-
- **`CONFORMS`** — every requirement is `MATCH`. No `SCOPE_CREEP_VIOLATION`. Untraceable changes, if any, are clearly refactors or test support.
|
|
110
|
-
- **`PARTIAL`** — some requirements are `PARTIAL` but none are `MISSING` or `SCOPE_CREEP_VIOLATION`. Work is mostly there but evidence is thin.
|
|
111
|
-
- **`DIVERGES`** — at least one requirement is `MISSING`, OR at least one `SCOPE_CREEP_VIOLATION` exists, OR there are substantive untraceable changes that materially alter behavior.
|
|
129
|
+
- **`CONFORMS`** — every requirement is `MATCH`. No `SCOPE_CREEP_VIOLATION`, no `BOUNDARY_MISMATCH`. Untraceable changes, if any, are clearly refactors or test support.
|
|
130
|
+
- **`PARTIAL`** — some requirements are `PARTIAL` but none are `MISSING`, `BOUNDARY_MISMATCH`, or `SCOPE_CREEP_VIOLATION`. Work is mostly there but evidence is thin.
|
|
131
|
+
- **`DIVERGES`** — at least one requirement is `MISSING`, OR at least one `BOUNDARY_MISMATCH` exists, OR at least one `SCOPE_CREEP_VIOLATION` exists, OR there are substantive untraceable changes that materially alter behavior.
|
|
112
132
|
|
|
113
133
|
A verdict of `PARTIAL` or `DIVERGES` blocks task completion. The caller must resolve the gaps (implement the miss, remove the creep, add the missing evidence) before re-running.
|
|
114
134
|
|
|
@@ -121,15 +141,24 @@ Structure the report so it can be pasted into a PR comment or JIRA ticket:
|
|
|
121
141
|
|
|
122
142
|
**Spec source:** <plan file / JIRA key / Linear / GitHub issue / PRD>
|
|
123
143
|
**Shipped scope:** <N commits, M files, K tests on branch <branch> vs <default-branch>>
|
|
144
|
+
**Verdict artifact:** <.lisa/verification-status.json schema v2, artifact.head_sha <sha> — or "v2 verdict not present — boundary reach unverified">
|
|
124
145
|
|
|
125
146
|
### Coverage Matrix
|
|
126
147
|
|
|
127
|
-
| ID | Class | Requirement | Evidence | Status | Notes |
|
|
128
|
-
|
|
129
|
-
| AC-1 | acceptance | [text] | [pointer] | MATCH | |
|
|
130
|
-
| AC-2 | acceptance | [text] | — | MISSING | No corresponding code or test |
|
|
131
|
-
|
|
|
132
|
-
|
|
|
148
|
+
| ID | Class | Requirement | Evidence | Boundary | Evidence kind | Status | Notes |
|
|
149
|
+
|----|-------|-------------|----------|----------|---------------|--------|-------|
|
|
150
|
+
| AC-1 | acceptance | [text] | [pointer] (AC-1 / EV-1) | browser | screenshot | MATCH | |
|
|
151
|
+
| AC-2 | acceptance | [text] | — | — | — | MISSING | No corresponding code or test |
|
|
152
|
+
| AC-3 | acceptance | [text] | EV-4 | browser | test-run-log | BOUNDARY_MISMATCH | Unit log cannot establish a browser claim — needs screenshot or recording |
|
|
153
|
+
| OOS-1 | excluded | [text] | src/foo.ts:42 | — | — | SCOPE_CREEP_VIOLATION | Added anyway |
|
|
154
|
+
| ASSERT-1 | assertion | [text] | verification-report §2 | http-api | — | PARTIAL | Asserted in code, not run in verification |
|
|
155
|
+
|
|
156
|
+
### Not Established
|
|
157
|
+
|
|
158
|
+
Reproduce the verdict's `not_established` entries verbatim, grouped by claim, plus anything the matrix could not confirm. This section is **never omitted and never blank**: with nothing outstanding it renders `None outstanding — reviewed`. State whether `not_established_reviewed` was `true`.
|
|
159
|
+
|
|
160
|
+
- AC-1 — not exercised on mobile viewports; Safari not tested
|
|
161
|
+
- AC-4 — offline behavior consciously out of scope for this ticket
|
|
133
162
|
|
|
134
163
|
### Untraceable Changes
|
|
135
164
|
- src/utils/helpers.ts — extracted shared regex constant (refactor, no behavior change)
|
|
@@ -140,6 +169,7 @@ Structure the report so it can be pasted into a PR comment or JIRA ticket:
|
|
|
140
169
|
**Matches:** N/Total
|
|
141
170
|
**Partial:** N
|
|
142
171
|
**Missing:** N
|
|
172
|
+
**Boundary mismatches:** N
|
|
143
173
|
**Scope creep violations:** N
|
|
144
174
|
**Untraceable changes flagged for review:** N
|
|
145
175
|
|
|
@@ -152,6 +182,8 @@ Structure the report so it can be pasted into a PR comment or JIRA ticket:
|
|
|
152
182
|
|
|
153
183
|
- Never substitute "I read the code and it looks right" for empirical evidence. If verification-specialist hasn't run yet, request its report before producing a verdict.
|
|
154
184
|
- Never mark a requirement `MATCH` based on the presence of code alone — evidence means test + runtime observation.
|
|
185
|
+
- Never mark a requirement `MATCH` on evidence that does not **reach** its claim's boundary. Per the `claim-evidence-mapping` contract, a unit `test-run-log` establishes only `code-unit` behavior; cited for a `browser`, `http-api`, `deploy-health`, or `standards-compat` claim it is a `BOUNDARY_MISMATCH`, not a match.
|
|
186
|
+
- Always report the Not-established section, even when empty. A report that lists only what passed is unreadable at a gate.
|
|
155
187
|
- Always surface scope creep separately from misses. They are distinct failures.
|
|
156
188
|
- Always surface untraceable changes — even benign refactors — so the human can confirm intent.
|
|
157
189
|
- The Out of Scope section is load-bearing. If the spec has one, every item must appear in the matrix as `excluded`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.267.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.267.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.267.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.267.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.267.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"
|