@codyswann/lisa 2.180.0 → 2.181.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/all/copy-contents/gitignore +206 -0
- package/dist/strategies/copy-contents.d.ts.map +1 -1
- package/dist/strategies/copy-contents.js +27 -8
- package/dist/strategies/copy-contents.js.map +1 -1
- package/harper-fabric/copy-contents/gitignore +8 -0
- package/package.json +1 -1
- package/phaser/copy-contents/gitignore +5 -0
- package/phaser/package-lisa/package.lisa.json +8 -2
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/rules/eager/verification.md +6 -0
- package/plugins/lisa/rules/reference/verification.md +47 -0
- package/plugins/lisa/skills/codify-verification/SKILL.md +10 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/codify-verification/SKILL.md +10 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/rules/eager/verification.md +6 -0
- package/plugins/lisa-copilot/rules/reference/verification.md +47 -0
- package/plugins/lisa-copilot/skills/codify-verification/SKILL.md +10 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/verification-reference.mdc +47 -0
- package/plugins/lisa-cursor/rules/verification.mdc +6 -0
- package/plugins/lisa-cursor/skills/codify-verification/SKILL.md +10 -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/verification.md +6 -0
- package/plugins/src/base/rules/reference/verification.md +47 -0
- package/plugins/src/base/skills/codify-verification/SKILL.md +10 -0
- package/typescript/copy-overwrite/scripts/check-verification-coverage.mjs +159 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# BEGIN: AI GUARDRAILS
|
|
2
|
+
|
|
3
|
+
# Dependencies
|
|
4
|
+
node_modules/
|
|
5
|
+
node_modules
|
|
6
|
+
jspm_packages
|
|
7
|
+
|
|
8
|
+
# Build outputs
|
|
9
|
+
dist/
|
|
10
|
+
dist
|
|
11
|
+
.build/
|
|
12
|
+
.serverless/
|
|
13
|
+
.serverless
|
|
14
|
+
cdk.out/
|
|
15
|
+
cdk.out.tmp/
|
|
16
|
+
.cdk.context.json
|
|
17
|
+
.cdk.staging/
|
|
18
|
+
.esbuild
|
|
19
|
+
/.warmup/
|
|
20
|
+
|
|
21
|
+
# GraphQL generated schema (code-first approach)
|
|
22
|
+
src/schema.gql
|
|
23
|
+
src/test-schema.gql
|
|
24
|
+
|
|
25
|
+
# Expo
|
|
26
|
+
.expo/
|
|
27
|
+
web-build/
|
|
28
|
+
android
|
|
29
|
+
/android
|
|
30
|
+
ios
|
|
31
|
+
/ios
|
|
32
|
+
|
|
33
|
+
# Native
|
|
34
|
+
*.orig.*
|
|
35
|
+
*.jks
|
|
36
|
+
*.p8
|
|
37
|
+
*.p12
|
|
38
|
+
*.key
|
|
39
|
+
*.mobileprovision
|
|
40
|
+
*.ipa
|
|
41
|
+
*.apk
|
|
42
|
+
*.aab
|
|
43
|
+
|
|
44
|
+
# Metro
|
|
45
|
+
.metro-health-check*
|
|
46
|
+
|
|
47
|
+
# Logs
|
|
48
|
+
logs
|
|
49
|
+
*.log
|
|
50
|
+
npm-debug.*
|
|
51
|
+
npm-debug.log*
|
|
52
|
+
pnpm-debug.log*
|
|
53
|
+
yarn-debug.*
|
|
54
|
+
yarn-debug.log*
|
|
55
|
+
yarn-error.*
|
|
56
|
+
yarn-error.log*
|
|
57
|
+
lerna-debug.log*
|
|
58
|
+
dev-debug.log
|
|
59
|
+
|
|
60
|
+
# Environment variables
|
|
61
|
+
.env
|
|
62
|
+
.env.local
|
|
63
|
+
.env*.local
|
|
64
|
+
.env.*.local
|
|
65
|
+
.env.secrets
|
|
66
|
+
.env.lisa
|
|
67
|
+
.envrc
|
|
68
|
+
|
|
69
|
+
# Test coverage
|
|
70
|
+
coverage/
|
|
71
|
+
coverage
|
|
72
|
+
/.nyc_output
|
|
73
|
+
.nyc_output
|
|
74
|
+
|
|
75
|
+
# K6 load test results
|
|
76
|
+
k6-results/
|
|
77
|
+
|
|
78
|
+
# Lighthouse CI reports
|
|
79
|
+
.lighthouseci/
|
|
80
|
+
|
|
81
|
+
# ESLint cache
|
|
82
|
+
.eslintcache
|
|
83
|
+
|
|
84
|
+
# Playwright test artifacts
|
|
85
|
+
**/playwright-report/
|
|
86
|
+
**/test-results/
|
|
87
|
+
playwright-report/*
|
|
88
|
+
playwright/.auth/*
|
|
89
|
+
test-results/*
|
|
90
|
+
|
|
91
|
+
# Maestro test artifacts
|
|
92
|
+
.maestro-output/
|
|
93
|
+
maestro-screenshots/
|
|
94
|
+
*.maestro.log
|
|
95
|
+
|
|
96
|
+
# OWASP ZAP reports
|
|
97
|
+
zap-report.html
|
|
98
|
+
zap-report.json
|
|
99
|
+
zap-report.md
|
|
100
|
+
|
|
101
|
+
# Compiled TypeScript
|
|
102
|
+
lambdas/**/*.js
|
|
103
|
+
lambdas/**/*.js.map
|
|
104
|
+
!jest.config.js
|
|
105
|
+
!vitest.config.js
|
|
106
|
+
!commitlint.config.js
|
|
107
|
+
!scripts/*.js
|
|
108
|
+
*.tsbuildinfo
|
|
109
|
+
|
|
110
|
+
# Temporary/experimental scripts
|
|
111
|
+
scripts/test-*.ts
|
|
112
|
+
scripts/test-*.js
|
|
113
|
+
scripts/*-example.*
|
|
114
|
+
|
|
115
|
+
# IDEs and editors
|
|
116
|
+
.idea
|
|
117
|
+
/.idea
|
|
118
|
+
.vscode
|
|
119
|
+
.vscode/*
|
|
120
|
+
!.vscode/settings.json
|
|
121
|
+
!.vscode/tasks.json
|
|
122
|
+
!.vscode/launch.json
|
|
123
|
+
!.vscode/extensions.json
|
|
124
|
+
.project
|
|
125
|
+
.classpath
|
|
126
|
+
.c9/
|
|
127
|
+
*.launch
|
|
128
|
+
.settings/
|
|
129
|
+
*.sublime-workspace
|
|
130
|
+
*.suo
|
|
131
|
+
*.ntvs*
|
|
132
|
+
*.njsproj
|
|
133
|
+
*.sln
|
|
134
|
+
*.sw?
|
|
135
|
+
.cursor
|
|
136
|
+
.cursor/
|
|
137
|
+
|
|
138
|
+
# OS specific
|
|
139
|
+
.DS_Store
|
|
140
|
+
*.pem
|
|
141
|
+
|
|
142
|
+
# Python
|
|
143
|
+
__pycache__/
|
|
144
|
+
*.py[cod]
|
|
145
|
+
|
|
146
|
+
# AWS
|
|
147
|
+
aws-exports.js
|
|
148
|
+
westack-414800-632447f63133.json
|
|
149
|
+
|
|
150
|
+
# Google Services
|
|
151
|
+
google-service-account.json
|
|
152
|
+
google-service-account*.json
|
|
153
|
+
google-service*
|
|
154
|
+
google-services*.json
|
|
155
|
+
service-key.json
|
|
156
|
+
|
|
157
|
+
# Task files
|
|
158
|
+
.windsurfrules
|
|
159
|
+
.taskmasterconfig
|
|
160
|
+
!tasks/tasks.json
|
|
161
|
+
tasks.json
|
|
162
|
+
|
|
163
|
+
# AI Assistant and MCP
|
|
164
|
+
**/.claude/settings.local.json
|
|
165
|
+
**/.claude/debug/
|
|
166
|
+
**/.claude/worktrees/
|
|
167
|
+
**/.claude/scheduled_tasks.lock
|
|
168
|
+
.roo
|
|
169
|
+
.roo/
|
|
170
|
+
.roomodes
|
|
171
|
+
|
|
172
|
+
# Sentry
|
|
173
|
+
.sentry/
|
|
174
|
+
|
|
175
|
+
# Vercel
|
|
176
|
+
.vercel/*
|
|
177
|
+
|
|
178
|
+
# Onboarding marker
|
|
179
|
+
onboarded
|
|
180
|
+
|
|
181
|
+
# Example directory
|
|
182
|
+
example/
|
|
183
|
+
|
|
184
|
+
# CDK asset staging directory
|
|
185
|
+
.cdk.staging
|
|
186
|
+
cdk.out
|
|
187
|
+
|
|
188
|
+
### EASINCLUDE! ###
|
|
189
|
+
### BELOW THIS LINE WILL NOT BE IGNORED BY EAS ###
|
|
190
|
+
# aws-exports.js This should be ignored but is needed for eas update
|
|
191
|
+
# @generated expo-cli sync-2b81b286409207a5da26e14c78851eb30d8ccbdb
|
|
192
|
+
# The following patterns were generated by expo-cli
|
|
193
|
+
|
|
194
|
+
expo-env.d.ts
|
|
195
|
+
# @end expo-cli
|
|
196
|
+
|
|
197
|
+
.lisabak
|
|
198
|
+
.claude-active-project
|
|
199
|
+
|
|
200
|
+
# Plan session tracking (auto-generated)
|
|
201
|
+
.active-plan-*
|
|
202
|
+
.track-plan-debug.log
|
|
203
|
+
|
|
204
|
+
.lisa.config.local.json
|
|
205
|
+
|
|
206
|
+
# END: AI GUARDRAILS
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-contents.d.ts","sourceRoot":"","sources":["../../src/strategies/copy-contents.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"copy-contents.d.ts","sourceRoot":"","sources":["../../src/strategies/copy-contents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG9E;;;;;;GAMG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACxD,QAAQ,CAAC,IAAI,EAAG,eAAe,CAAU;IAEzC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA4B;IAChE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA0B;IAE5D;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA0BpB;;;;;;;OAOG;YACW,aAAa;IAc3B;;;;;;;OAOG;YACW,WAAW;IAkBzB;;;;;;;;;;;;OAYG;YACW,eAAe;IAkB7B;;;;;;;OAOG;IACG,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,mBAAmB,CAAC;CAkEhC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fse from "fs-extra";
|
|
2
2
|
import { readFile, copyFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import * as path from "node:path";
|
|
3
4
|
import { filesIdentical, ensureParentDir } from "../utils/file-operations.js";
|
|
4
5
|
/**
|
|
5
6
|
* Copy-contents strategy: Block-based merge for .gitignore-style files
|
|
@@ -141,15 +142,29 @@ export class CopyContentsStrategy {
|
|
|
141
142
|
* @returns Result of the copy-contents operation
|
|
142
143
|
*/
|
|
143
144
|
async apply(sourcePath, destPath, relativePath, context) {
|
|
144
|
-
|
|
145
|
+
// npm strips `.gitignore` from published tarballs, so these templates ship
|
|
146
|
+
// as `gitignore` (no leading dot). Restore the real dotfile name at the
|
|
147
|
+
// destination so downstream projects actually receive their `.gitignore`.
|
|
148
|
+
const shippedAsDotless = path.basename(destPath) === "gitignore";
|
|
149
|
+
const realDestPath = shippedAsDotless
|
|
150
|
+
? path.join(path.dirname(destPath), ".gitignore")
|
|
151
|
+
: destPath;
|
|
152
|
+
const realRelativePath = shippedAsDotless
|
|
153
|
+
? path.join(path.dirname(relativePath), ".gitignore")
|
|
154
|
+
: relativePath;
|
|
155
|
+
const destExists = await fse.pathExists(realDestPath);
|
|
145
156
|
if (!destExists) {
|
|
146
|
-
return this.handleNewFile(sourcePath,
|
|
157
|
+
return this.handleNewFile(sourcePath, realDestPath, realRelativePath, context);
|
|
147
158
|
}
|
|
148
|
-
if (await filesIdentical(sourcePath,
|
|
149
|
-
return {
|
|
159
|
+
if (await filesIdentical(sourcePath, realDestPath)) {
|
|
160
|
+
return {
|
|
161
|
+
relativePath: realRelativePath,
|
|
162
|
+
strategy: this.name,
|
|
163
|
+
action: "skipped",
|
|
164
|
+
};
|
|
150
165
|
}
|
|
151
166
|
const sourceContent = await readFile(sourcePath, "utf-8");
|
|
152
|
-
const destContent = await readFile(
|
|
167
|
+
const destContent = await readFile(realDestPath, "utf-8");
|
|
153
168
|
// A copy-contents source must itself carry a guardrails block to manage.
|
|
154
169
|
// Without a BEGIN marker there is no block to replace, and the append
|
|
155
170
|
// fallback would duplicate the whole file on every content change (the
|
|
@@ -157,13 +172,17 @@ export class CopyContentsStrategy {
|
|
|
157
172
|
// Lisa-managed and belongs in copy-overwrite — treat it as an overwrite
|
|
158
173
|
// here so a miscategorized file can never silently self-duplicate.
|
|
159
174
|
if (!sourceContent.includes(this.BEGIN_MARKER_PREFIX)) {
|
|
160
|
-
return this.handleOverwrite(
|
|
175
|
+
return this.handleOverwrite(realDestPath, realRelativePath, sourceContent, context);
|
|
161
176
|
}
|
|
162
177
|
const mergedContent = this.mergeContent(sourceContent, destContent);
|
|
163
178
|
if (mergedContent === destContent) {
|
|
164
|
-
return {
|
|
179
|
+
return {
|
|
180
|
+
relativePath: realRelativePath,
|
|
181
|
+
strategy: this.name,
|
|
182
|
+
action: "skipped",
|
|
183
|
+
};
|
|
165
184
|
}
|
|
166
|
-
return this.handleMerge(
|
|
185
|
+
return this.handleMerge(realDestPath, realRelativePath, mergedContent, context);
|
|
167
186
|
}
|
|
168
187
|
}
|
|
169
188
|
//# sourceMappingURL=copy-contents.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-contents.js","sourceRoot":"","sources":["../../src/strategies/copy-contents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"copy-contents.js","sourceRoot":"","sources":["../../src/strategies/copy-contents.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
"ws": ">=8.20.1"
|
|
94
94
|
},
|
|
95
95
|
"name": "@codyswann/lisa",
|
|
96
|
-
"version": "2.
|
|
96
|
+
"version": "2.181.0",
|
|
97
97
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
98
98
|
"main": "dist/index.js",
|
|
99
99
|
"exports": {
|
|
@@ -52,7 +52,13 @@
|
|
|
52
52
|
"node": ">= 22.21.1"
|
|
53
53
|
},
|
|
54
54
|
"packageManager": "bun@1.3.11",
|
|
55
|
-
"private": true
|
|
55
|
+
"private": true,
|
|
56
|
+
"resolutions": {
|
|
57
|
+
"vite": "$vite"
|
|
58
|
+
},
|
|
59
|
+
"overrides": {
|
|
60
|
+
"vite": "$vite"
|
|
61
|
+
}
|
|
56
62
|
},
|
|
57
63
|
"merge": {
|
|
58
64
|
"trustedDependencies": [
|
|
@@ -72,7 +78,7 @@
|
|
|
72
78
|
"phaser": "^4.2.0"
|
|
73
79
|
},
|
|
74
80
|
"devDependencies": {
|
|
75
|
-
"vite": "^8.0.
|
|
81
|
+
"vite": "^8.0.16",
|
|
76
82
|
"vite-plugin-pwa": "^1.3.0",
|
|
77
83
|
"@playwright/test": "^1.56.1",
|
|
78
84
|
"free-tex-packer-core": "^0.3.8",
|
|
@@ -4,12 +4,18 @@
|
|
|
4
4
|
|
|
5
5
|
**Verification is using the resulting software the way a user would** — interacting with the UI, calling the API, running the CLI, observing behavior. Tests pass in isolation; verification proves the system works as a whole.
|
|
6
6
|
|
|
7
|
+
**Verification IS UAT** (User Acceptance Testing) — the same single gate, not two concepts. "Use the software as a user, against the acceptance criteria" *is* UAT. Everything below makes that one process concrete: a committed evidence artifact, a codified check that re-runs in CI, and a per-change requirement.
|
|
8
|
+
|
|
7
9
|
## Mandatory
|
|
8
10
|
|
|
9
11
|
- **Never claim success without runtime evidence.** "The code looks correct" is not evidence.
|
|
10
12
|
- **If all you did was run tests, typecheck, and lint — you have NOT verified.**
|
|
11
13
|
- **Before starting implementation, state your verification plan** — how you will USE the resulting software to prove it works. A plan that only lists `test`/`typecheck`/`lint` commands is not a plan. Do not begin until confirmed.
|
|
12
14
|
- **After verifying empirically, codify it as a regression test** via the `codify-verification` skill — Playwright for UI, integration test for API/DB/auth, benchmark for performance. Codification is mandatory for every verification type except PR/Documentation/Deploy and Investigate-Only spikes.
|
|
15
|
+
- **The codified proof re-runs in CI.** Codified runtime verification lives where the project's e2e/Playwright tests live (`tests/e2e/**`) and runs as a required CI check for types with verification enforced — so the proof re-runs on every PR, not once by hand.
|
|
16
|
+
- **Commit the evidence.** Write a durable artifact to `evidence/<ticket>/` — the acceptance criteria with per-criterion pass/fail + note, the observed state, screenshots/recording, and a `verdict.json`. The transient `.lisa/verification-status.json` is the session gate; `evidence/<ticket>/` is the committed proof.
|
|
17
|
+
- **Per-change verification is mandatory.** Every `feat`/`fix` adds or extends a verification (e2e) spec mapped to its acceptance criteria. The only exception is a genuinely non-behavioral change explicitly marked with the **logged** `verification-exempt` label — never a silent skip.
|
|
18
|
+
- **Drive the playthrough with `/lisa:product-walkthrough`** (it walks the live product through a real browser); each project type plugs in its own drive mechanism (e.g. a Phaser game is driven through Playwright + an in-game verification test bridge that seeds RNG, reads state, injects input, and steps frames).
|
|
13
19
|
- **Every PR must include reviewer replay steps** — the exact human steps to use the software and confirm the change works. Not test commands. If a reviewer can't reproduce from the PR description alone, the PR is incomplete.
|
|
14
20
|
- **Exhaust credential sources before deferring runtime verification** — check project e2e / Playwright config and fixtures first, then `.lisa.config.local.json` / environment variables, then documented ticket credentials such as `Sign-in Required`.
|
|
15
21
|
- **Never mark required runtime verification done on artifact-only evidence** — if credentials are genuinely unavailable after all sources are checked, post the blocker, transition the item to the configured blocked state, apply the configured `needs-human` / `human-review` label, and label the evidence as `artifact-only / verification deferred`.
|
|
@@ -135,4 +135,51 @@ Evidence and summaries must explicitly distinguish `verified empirically` from `
|
|
|
135
135
|
|
|
136
136
|
---
|
|
137
137
|
|
|
138
|
+
## Making verification concrete (UAT)
|
|
139
|
+
|
|
140
|
+
Verification **is** UAT — one gate, not two. This section makes the single
|
|
141
|
+
verification process concrete so "an agent actually exercised the running
|
|
142
|
+
software against the acceptance criteria" is durable and re-checkable, not a
|
|
143
|
+
one-off claim. It builds on the **Per-Work-Unit Evidence Contract** above (the
|
|
144
|
+
`[EVIDENCE: name]` manifest), adding three concrete requirements:
|
|
145
|
+
|
|
146
|
+
**1. The codified proof re-runs in CI.** After local verification passes,
|
|
147
|
+
`codify-verification` encodes it where the project's e2e/Playwright tests live
|
|
148
|
+
(`tests/e2e/**`). That suite runs in CI (the existing e2e/Playwright job); for a
|
|
149
|
+
project type with verification **enforced**, it is a required check — so the proof
|
|
150
|
+
re-runs on every PR instead of being proven once by hand.
|
|
151
|
+
|
|
152
|
+
**2. Evidence is committed to the repo.** The named artifacts from the work
|
|
153
|
+
unit's evidence manifest are committed under `evidence/<ticket>/` (in addition to
|
|
154
|
+
any tracker attachment), so the proof lives with the code and is reviewable in the
|
|
155
|
+
PR:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
evidence/<ticket>/
|
|
159
|
+
verdict.json # acceptance criteria + per-criterion pass/fail + note,
|
|
160
|
+
# overall verdict, ticket, commit, lisaVersion, agent, stampedAt
|
|
161
|
+
state.json # observed runtime state asserted against
|
|
162
|
+
screenshots/*.png # downscaled, capped; key frames of the playthrough
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
`evidence/**` is ignored by lint/format/knip/coverage — it is proof, not source.
|
|
166
|
+
|
|
167
|
+
**3. Per-change verification is enforced.** Every `feat`/`fix` adds or extends a
|
|
168
|
+
verification (e2e) spec mapped to its acceptance criteria. CI's
|
|
169
|
+
`verification-coverage` check requires that delta. The sole exception is a
|
|
170
|
+
genuinely non-behavioral change carrying the **logged** `verification-exempt`
|
|
171
|
+
label — the check prints why it was exempted; it is never a silent skip.
|
|
172
|
+
|
|
173
|
+
**Playthrough driver.** `/lisa:product-walkthrough` is the shared driver (it walks
|
|
174
|
+
the live product through a real browser). Each project type supplies its own drive
|
|
175
|
+
mechanism: a Phaser game is driven through Playwright + an in-game verification
|
|
176
|
+
test bridge (seed RNG, read state, inject semantic input, step frames); API types
|
|
177
|
+
drive HTTP against a running service; etc.
|
|
178
|
+
|
|
179
|
+
**Rollout.** Enforcement is per-type and flag-gated (the `verify_enforced`
|
|
180
|
+
workflow input, default off) so a type without a drive mechanism is never wedged.
|
|
181
|
+
Phaser is the first enforced type.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
138
185
|
For the full verification lifecycle (classify, check tooling, plan, execute, loop), surfaces, escalation protocol, and proof artifact requirements, see the `verification-lifecycle` skill loaded by the `verification-specialist` agent.
|
|
@@ -88,6 +88,16 @@ For Playwright UI tests specifically:
|
|
|
88
88
|
- Capture a trace or screenshot only if the project's existing tests do; do not invent a new artifact convention
|
|
89
89
|
- Mirror the project's existing config for base URL, retries, and test isolation
|
|
90
90
|
|
|
91
|
+
**Concrete verification (UAT) contract.** Verification *is* UAT — codifying it is
|
|
92
|
+
how the playthrough becomes durable. For a runtime/behavioral `feat`/`fix`: place
|
|
93
|
+
the codified test where the project's e2e/Playwright tests live (`tests/e2e/**`)
|
|
94
|
+
so CI re-runs it, and commit the evidence artifact to `evidence/<ticket>/`
|
|
95
|
+
(`verdict.json` + state + screenshots). For a Phaser game, drive the canvas
|
|
96
|
+
through the in-game verification test bridge (seed RNG, read state, inject input,
|
|
97
|
+
step frames) with deterministic rendering. CI's `verification-coverage` check
|
|
98
|
+
requires a verification-spec delta on every behavioral change. See the
|
|
99
|
+
`reference/verification.md` "Making verification concrete (UAT)" section.
|
|
100
|
+
|
|
91
101
|
### 4. Run the test in isolation
|
|
92
102
|
|
|
93
103
|
Run only the new test, using whatever per-test invocation the project supports:
|
|
@@ -88,6 +88,16 @@ For Playwright UI tests specifically:
|
|
|
88
88
|
- Capture a trace or screenshot only if the project's existing tests do; do not invent a new artifact convention
|
|
89
89
|
- Mirror the project's existing config for base URL, retries, and test isolation
|
|
90
90
|
|
|
91
|
+
**Concrete verification (UAT) contract.** Verification *is* UAT — codifying it is
|
|
92
|
+
how the playthrough becomes durable. For a runtime/behavioral `feat`/`fix`: place
|
|
93
|
+
the codified test where the project's e2e/Playwright tests live (`tests/e2e/**`)
|
|
94
|
+
so CI re-runs it, and commit the evidence artifact to `evidence/<ticket>/`
|
|
95
|
+
(`verdict.json` + state + screenshots). For a Phaser game, drive the canvas
|
|
96
|
+
through the in-game verification test bridge (seed RNG, read state, inject input,
|
|
97
|
+
step frames) with deterministic rendering. CI's `verification-coverage` check
|
|
98
|
+
requires a verification-spec delta on every behavioral change. See the
|
|
99
|
+
`reference/verification.md` "Making verification concrete (UAT)" section.
|
|
100
|
+
|
|
91
101
|
### 4. Run the test in isolation
|
|
92
102
|
|
|
93
103
|
Run only the new test, using whatever per-test invocation the project supports:
|
|
@@ -4,12 +4,18 @@
|
|
|
4
4
|
|
|
5
5
|
**Verification is using the resulting software the way a user would** — interacting with the UI, calling the API, running the CLI, observing behavior. Tests pass in isolation; verification proves the system works as a whole.
|
|
6
6
|
|
|
7
|
+
**Verification IS UAT** (User Acceptance Testing) — the same single gate, not two concepts. "Use the software as a user, against the acceptance criteria" *is* UAT. Everything below makes that one process concrete: a committed evidence artifact, a codified check that re-runs in CI, and a per-change requirement.
|
|
8
|
+
|
|
7
9
|
## Mandatory
|
|
8
10
|
|
|
9
11
|
- **Never claim success without runtime evidence.** "The code looks correct" is not evidence.
|
|
10
12
|
- **If all you did was run tests, typecheck, and lint — you have NOT verified.**
|
|
11
13
|
- **Before starting implementation, state your verification plan** — how you will USE the resulting software to prove it works. A plan that only lists `test`/`typecheck`/`lint` commands is not a plan. Do not begin until confirmed.
|
|
12
14
|
- **After verifying empirically, codify it as a regression test** via the `codify-verification` skill — Playwright for UI, integration test for API/DB/auth, benchmark for performance. Codification is mandatory for every verification type except PR/Documentation/Deploy and Investigate-Only spikes.
|
|
15
|
+
- **The codified proof re-runs in CI.** Codified runtime verification lives where the project's e2e/Playwright tests live (`tests/e2e/**`) and runs as a required CI check for types with verification enforced — so the proof re-runs on every PR, not once by hand.
|
|
16
|
+
- **Commit the evidence.** Write a durable artifact to `evidence/<ticket>/` — the acceptance criteria with per-criterion pass/fail + note, the observed state, screenshots/recording, and a `verdict.json`. The transient `.lisa/verification-status.json` is the session gate; `evidence/<ticket>/` is the committed proof.
|
|
17
|
+
- **Per-change verification is mandatory.** Every `feat`/`fix` adds or extends a verification (e2e) spec mapped to its acceptance criteria. The only exception is a genuinely non-behavioral change explicitly marked with the **logged** `verification-exempt` label — never a silent skip.
|
|
18
|
+
- **Drive the playthrough with `/lisa:product-walkthrough`** (it walks the live product through a real browser); each project type plugs in its own drive mechanism (e.g. a Phaser game is driven through Playwright + an in-game verification test bridge that seeds RNG, reads state, injects input, and steps frames).
|
|
13
19
|
- **Every PR must include reviewer replay steps** — the exact human steps to use the software and confirm the change works. Not test commands. If a reviewer can't reproduce from the PR description alone, the PR is incomplete.
|
|
14
20
|
- **Exhaust credential sources before deferring runtime verification** — check project e2e / Playwright config and fixtures first, then `.lisa.config.local.json` / environment variables, then documented ticket credentials such as `Sign-in Required`.
|
|
15
21
|
- **Never mark required runtime verification done on artifact-only evidence** — if credentials are genuinely unavailable after all sources are checked, post the blocker, transition the item to the configured blocked state, apply the configured `needs-human` / `human-review` label, and label the evidence as `artifact-only / verification deferred`.
|
|
@@ -135,4 +135,51 @@ Evidence and summaries must explicitly distinguish `verified empirically` from `
|
|
|
135
135
|
|
|
136
136
|
---
|
|
137
137
|
|
|
138
|
+
## Making verification concrete (UAT)
|
|
139
|
+
|
|
140
|
+
Verification **is** UAT — one gate, not two. This section makes the single
|
|
141
|
+
verification process concrete so "an agent actually exercised the running
|
|
142
|
+
software against the acceptance criteria" is durable and re-checkable, not a
|
|
143
|
+
one-off claim. It builds on the **Per-Work-Unit Evidence Contract** above (the
|
|
144
|
+
`[EVIDENCE: name]` manifest), adding three concrete requirements:
|
|
145
|
+
|
|
146
|
+
**1. The codified proof re-runs in CI.** After local verification passes,
|
|
147
|
+
`codify-verification` encodes it where the project's e2e/Playwright tests live
|
|
148
|
+
(`tests/e2e/**`). That suite runs in CI (the existing e2e/Playwright job); for a
|
|
149
|
+
project type with verification **enforced**, it is a required check — so the proof
|
|
150
|
+
re-runs on every PR instead of being proven once by hand.
|
|
151
|
+
|
|
152
|
+
**2. Evidence is committed to the repo.** The named artifacts from the work
|
|
153
|
+
unit's evidence manifest are committed under `evidence/<ticket>/` (in addition to
|
|
154
|
+
any tracker attachment), so the proof lives with the code and is reviewable in the
|
|
155
|
+
PR:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
evidence/<ticket>/
|
|
159
|
+
verdict.json # acceptance criteria + per-criterion pass/fail + note,
|
|
160
|
+
# overall verdict, ticket, commit, lisaVersion, agent, stampedAt
|
|
161
|
+
state.json # observed runtime state asserted against
|
|
162
|
+
screenshots/*.png # downscaled, capped; key frames of the playthrough
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
`evidence/**` is ignored by lint/format/knip/coverage — it is proof, not source.
|
|
166
|
+
|
|
167
|
+
**3. Per-change verification is enforced.** Every `feat`/`fix` adds or extends a
|
|
168
|
+
verification (e2e) spec mapped to its acceptance criteria. CI's
|
|
169
|
+
`verification-coverage` check requires that delta. The sole exception is a
|
|
170
|
+
genuinely non-behavioral change carrying the **logged** `verification-exempt`
|
|
171
|
+
label — the check prints why it was exempted; it is never a silent skip.
|
|
172
|
+
|
|
173
|
+
**Playthrough driver.** `/lisa:product-walkthrough` is the shared driver (it walks
|
|
174
|
+
the live product through a real browser). Each project type supplies its own drive
|
|
175
|
+
mechanism: a Phaser game is driven through Playwright + an in-game verification
|
|
176
|
+
test bridge (seed RNG, read state, inject semantic input, step frames); API types
|
|
177
|
+
drive HTTP against a running service; etc.
|
|
178
|
+
|
|
179
|
+
**Rollout.** Enforcement is per-type and flag-gated (the `verify_enforced`
|
|
180
|
+
workflow input, default off) so a type without a drive mechanism is never wedged.
|
|
181
|
+
Phaser is the first enforced type.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
138
185
|
For the full verification lifecycle (classify, check tooling, plan, execute, loop), surfaces, escalation protocol, and proof artifact requirements, see the `verification-lifecycle` skill loaded by the `verification-specialist` agent.
|
|
@@ -88,6 +88,16 @@ For Playwright UI tests specifically:
|
|
|
88
88
|
- Capture a trace or screenshot only if the project's existing tests do; do not invent a new artifact convention
|
|
89
89
|
- Mirror the project's existing config for base URL, retries, and test isolation
|
|
90
90
|
|
|
91
|
+
**Concrete verification (UAT) contract.** Verification *is* UAT — codifying it is
|
|
92
|
+
how the playthrough becomes durable. For a runtime/behavioral `feat`/`fix`: place
|
|
93
|
+
the codified test where the project's e2e/Playwright tests live (`tests/e2e/**`)
|
|
94
|
+
so CI re-runs it, and commit the evidence artifact to `evidence/<ticket>/`
|
|
95
|
+
(`verdict.json` + state + screenshots). For a Phaser game, drive the canvas
|
|
96
|
+
through the in-game verification test bridge (seed RNG, read state, inject input,
|
|
97
|
+
step frames) with deterministic rendering. CI's `verification-coverage` check
|
|
98
|
+
requires a verification-spec delta on every behavioral change. See the
|
|
99
|
+
`reference/verification.md` "Making verification concrete (UAT)" section.
|
|
100
|
+
|
|
91
101
|
### 4. Run the test in isolation
|
|
92
102
|
|
|
93
103
|
Run only the new test, using whatever per-test invocation the project supports:
|