memento-mori-jester 0.1.57 → 0.1.59
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/CHANGELOG.md +12 -0
- package/ROADMAP.md +3 -1
- package/docs/DEMO.md +4 -4
- package/docs/RELEASE_NOTES_v0.1.58.md +39 -0
- package/docs/RELEASE_NOTES_v0.1.59.md +49 -0
- package/examples/fixtures/README.md +2 -0
- package/examples/fixtures/preset-review-cases.json +471 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,18 @@ All notable changes to Memento Mori Jester are tracked here.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.1.59
|
|
8
|
+
|
|
9
|
+
- Added quiet-pass fixtures for remaining sparse built-in and structural rules including missing verification, confidence theater, TypeScript suppressions, large removals, wildcard file operations, destructive commands, and untested finals.
|
|
10
|
+
- Updated fixture-report regression coverage so every rule family now has quiet-pass coverage.
|
|
11
|
+
- Refreshed demo and fixture docs with the expanded 125-fixture corpus.
|
|
12
|
+
|
|
13
|
+
## 0.1.58
|
|
14
|
+
|
|
15
|
+
- Added quiet-pass fixtures for thin custom, configured sensitive-domain, and preset blocked-command rules.
|
|
16
|
+
- Updated fixture-report regression coverage so thin preset/config-derived rules cannot silently lose quiet-pass coverage.
|
|
17
|
+
- Refreshed demo and fixture docs with the expanded 112-fixture corpus.
|
|
18
|
+
|
|
7
19
|
## 0.1.57
|
|
8
20
|
|
|
9
21
|
- Added web, API, infra, and AI preset fixture coverage across the remaining plan, command, and final review-kind gaps.
|
package/ROADMAP.md
CHANGED
|
@@ -6,6 +6,8 @@ Memento Mori Jester is usable today as a CLI, MCP server, GitHub Action, and git
|
|
|
6
6
|
|
|
7
7
|
## Recently Shipped
|
|
8
8
|
|
|
9
|
+
- Quiet-pass boundaries for remaining sparse built-in and structural rules in v0.1.59 so the fixture report now has no rules without quiet-pass coverage.
|
|
10
|
+
- Quiet-pass boundaries for thin custom/preset rules in v0.1.58 so preset blocked commands, sensitive-domain checks, and custom stack rules now have safe near-miss examples.
|
|
9
11
|
- Completed preset-kind fixture coverage in v0.1.57 so `default`, `node`, `python`, `web`, `api`, `infra`, `ai`, and `security` now all have plan, command, diff, and final examples.
|
|
10
12
|
- Node, python, and security preset-kind fixture coverage in v0.1.56 so those preset slices now have plan, command, diff, and final examples.
|
|
11
13
|
- Targeted quiet-pass fixture batch in v0.1.55 for noisy high-signal rules, plus quiet-pass evidence in `jester tune` and `npm run fixtures:report`.
|
|
@@ -46,8 +48,8 @@ Memento Mori Jester is usable today as a CLI, MCP server, GitHub Action, and git
|
|
|
46
48
|
|
|
47
49
|
## Product Ideas
|
|
48
50
|
|
|
49
|
-
- Add quiet-pass boundaries for thin custom/preset rules that still only have one-sided fixture evidence.
|
|
50
51
|
- Add more framework-specific false-positive examples from real reports so tuning guidance keeps getting sharper.
|
|
52
|
+
- Add fixture report slices by rule family and preset so maintainers can spot which areas need real-world curation next.
|
|
51
53
|
|
|
52
54
|
## Quality And Safety
|
|
53
55
|
|
package/docs/DEMO.md
CHANGED
|
@@ -192,8 +192,8 @@ Project config: none loaded
|
|
|
192
192
|
Fixture tuning evidence:
|
|
193
193
|
Support: limited
|
|
194
194
|
Confidence: medium
|
|
195
|
-
Total fixtures checked:
|
|
196
|
-
Weighted fixtures checked:
|
|
195
|
+
Total fixtures checked: 125
|
|
196
|
+
Weighted fixtures checked: 236.9
|
|
197
197
|
Matching fixtures: 9
|
|
198
198
|
Weighted matches: 19
|
|
199
199
|
Expected-match weight: 16
|
|
@@ -202,7 +202,7 @@ Edge-case matches: 0
|
|
|
202
202
|
Quiet-pass fixtures: 5
|
|
203
203
|
Quiet-pass weight: 3.6
|
|
204
204
|
By kind: command 0, plan 4, diff 4, final 1
|
|
205
|
-
Fixture coverage: 9/
|
|
205
|
+
Fixture coverage: 9/125 (8.0% weighted)
|
|
206
206
|
By verdict: pass 0, caution 3, block 6
|
|
207
207
|
Matched fixture samples:
|
|
208
208
|
infra-public-ingress-block: Public ingress should block in low-risk-tolerance infra repos.
|
|
@@ -353,7 +353,7 @@ Preset packs:
|
|
|
353
353
|
|
|
354
354
|
## 13. Review Fixtures
|
|
355
355
|
|
|
356
|
-
The fixture suite in `examples/fixtures/preset-review-cases.json` captures small real-usage examples with expected `pass`, `caution`, or `block` verdicts. It also includes quiet-pass `absentRuleIds` examples that prove noisy rules stay silent for safe near-misses,
|
|
356
|
+
The fixture suite in `examples/fixtures/preset-review-cases.json` captures small real-usage examples with expected `pass`, `caution`, or `block` verdicts. It also includes quiet-pass `absentRuleIds` examples that prove noisy rules stay silent for safe near-misses, stack-specific coverage for every built-in preset, and quiet-pass boundaries across built-in, structural, custom, and preset/config-derived rules. These examples are run by `npm test`, so preset tuning changes stay visible.
|
|
357
357
|
|
|
358
358
|
Maintainers can use `docs/MAINTAINER_TRIAGE.md` to turn useful false-positive reports into redacted fixture cases.
|
|
359
359
|
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Memento Mori Jester v0.1.58
|
|
2
|
+
|
|
3
|
+
This release adds quiet-pass evidence for thin preset/config-derived rules. The goal is better tuning guidance: maintainers can now see safe near-misses for many custom preset rules, configured sensitive-domain checks, and preset blocked commands instead of only seeing examples where those rules fire.
|
|
4
|
+
|
|
5
|
+
## Changes
|
|
6
|
+
|
|
7
|
+
- Added 22 quiet-pass fixtures covering safe near-misses for:
|
|
8
|
+
- preset blocked commands such as forced npm publish, Terraform destroy, Prisma reset, broad chmod, and break-system pip installs,
|
|
9
|
+
- configured sensitive-domain checks such as CORS, IAM, postinstall, session, webhook, eval, and public secret wording,
|
|
10
|
+
- custom stack rules across node, python, web, API, infra, AI, and security presets.
|
|
11
|
+
- Updated fixture-report regression coverage so thin custom/config-derived rules cannot silently return to zero quiet-pass coverage.
|
|
12
|
+
- Refreshed demo and fixture docs for the 112-fixture corpus.
|
|
13
|
+
|
|
14
|
+
## Public Interface Changes
|
|
15
|
+
|
|
16
|
+
- No CLI command, MCP tool, config schema, GitHub Action, release workflow, rule matching, or verdict behavior changed.
|
|
17
|
+
- Fixture evidence changes are data-only: `jester tune` and `fixtures:report` now have more safe near-miss evidence to report.
|
|
18
|
+
|
|
19
|
+
## Release Validation
|
|
20
|
+
|
|
21
|
+
```powershell
|
|
22
|
+
npm.cmd test
|
|
23
|
+
npm.cmd run demo:svg:check
|
|
24
|
+
npm.cmd run fixtures:report
|
|
25
|
+
npm.cmd run fixtures:report -- --json
|
|
26
|
+
npm.cmd run pack:dry
|
|
27
|
+
git diff --check
|
|
28
|
+
node .\dist\cli.js tune risky-domain --no-config
|
|
29
|
+
node .\dist\cli.js tune coverage --no-config
|
|
30
|
+
git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.58 quiet-pass precision fixtures"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Post-Release Smoke
|
|
34
|
+
|
|
35
|
+
```powershell
|
|
36
|
+
npm.cmd view memento-mori-jester version --silent
|
|
37
|
+
npx.cmd -y memento-mori-jester@latest doctor --no-config
|
|
38
|
+
npx.cmd -y memento-mori-jester@latest tune coverage --no-config
|
|
39
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Memento Mori Jester v0.1.59
|
|
2
|
+
|
|
3
|
+
This release completes the quiet-pass coverage pass for the fixture suite. After v0.1.58 covered thin custom and preset/config-derived rules, v0.1.59 adds safe near-misses for the remaining sparse built-in and structural rules.
|
|
4
|
+
|
|
5
|
+
## Changes
|
|
6
|
+
|
|
7
|
+
- Added 13 quiet-pass fixtures covering safe near-misses for:
|
|
8
|
+
- `missing-verification-step`
|
|
9
|
+
- `confidence-theater`
|
|
10
|
+
- `temporary-marker`
|
|
11
|
+
- `ts-ignore`
|
|
12
|
+
- `console-log`
|
|
13
|
+
- `large-removal`
|
|
14
|
+
- `wildcard-file-operation`
|
|
15
|
+
- `database-destruction`
|
|
16
|
+
- `destructive-git-history`
|
|
17
|
+
- `handwave-final`
|
|
18
|
+
- `pipe-to-shell`
|
|
19
|
+
- `recursive-force-delete`
|
|
20
|
+
- `untested-final`
|
|
21
|
+
- Updated fixture-report regression coverage so `rulesWithoutQuietPassCoverage` must stay empty.
|
|
22
|
+
- Refreshed demo and fixture docs for the 125-fixture corpus.
|
|
23
|
+
|
|
24
|
+
## Public Interface Changes
|
|
25
|
+
|
|
26
|
+
- No CLI command, MCP tool, config schema, GitHub Action, release workflow, rule matching, or verdict behavior changed.
|
|
27
|
+
- Fixture evidence changes are data-only: `jester tune` and `fixtures:report` now have safe near-miss evidence for every rule family.
|
|
28
|
+
|
|
29
|
+
## Release Validation
|
|
30
|
+
|
|
31
|
+
```powershell
|
|
32
|
+
npm.cmd test
|
|
33
|
+
npm.cmd run demo:svg:check
|
|
34
|
+
npm.cmd run fixtures:report
|
|
35
|
+
npm.cmd run fixtures:report -- --json
|
|
36
|
+
npm.cmd run pack:dry
|
|
37
|
+
git diff --check
|
|
38
|
+
node .\dist\cli.js tune risky-domain --no-config
|
|
39
|
+
node .\dist\cli.js tune coverage --no-config
|
|
40
|
+
git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.59 built-in quiet-pass fixtures"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Post-Release Smoke
|
|
44
|
+
|
|
45
|
+
```powershell
|
|
46
|
+
npm.cmd view memento-mori-jester version --silent
|
|
47
|
+
npx.cmd -y memento-mori-jester@latest doctor --no-config
|
|
48
|
+
npx.cmd -y memento-mori-jester@latest tune coverage --no-config
|
|
49
|
+
```
|
|
@@ -14,6 +14,8 @@ Maintainer triage guidance lives in [docs/MAINTAINER_TRIAGE.md](../../docs/MAINT
|
|
|
14
14
|
- API preset CORS, raw SQL, webhook, and migration-command risks.
|
|
15
15
|
- Infra preset public exposure, IAM wildcard, and destructive command risks.
|
|
16
16
|
- AI preset eval-skipping and model-output execution risks.
|
|
17
|
+
- Quiet-pass boundaries for thin custom, configured sensitive-domain, and preset blocked-command rules.
|
|
18
|
+
- Quiet-pass boundaries for built-in and structural rules such as missing verification, TypeScript suppressions, large removals, wildcard operations, destructive commands, and untested finals.
|
|
17
19
|
- Fixture metadata like `weight` and `edgeCase` to support precision-weighted tuning evidence.
|
|
18
20
|
|
|
19
21
|
## Local Check
|
|
@@ -1139,5 +1139,476 @@
|
|
|
1139
1139
|
"risky-domain",
|
|
1140
1140
|
"done-without-evidence"
|
|
1141
1141
|
]
|
|
1142
|
+
},
|
|
1143
|
+
{
|
|
1144
|
+
"id": "sec-chmod-narrow-command-pass",
|
|
1145
|
+
"preset": "security",
|
|
1146
|
+
"kind": "command",
|
|
1147
|
+
"description": "Narrow chmod commands should not trip security preset blocked-command rules.",
|
|
1148
|
+
"content": "chmod -R 755 ./public-assets",
|
|
1149
|
+
"expectedVerdict": "pass",
|
|
1150
|
+
"weight": 2,
|
|
1151
|
+
"expectedRuleIds": [],
|
|
1152
|
+
"absentRuleIds": [
|
|
1153
|
+
"blocked-command-chmod-r-777",
|
|
1154
|
+
"chmod-777",
|
|
1155
|
+
"configured-sensitive-domain-secrets"
|
|
1156
|
+
]
|
|
1157
|
+
},
|
|
1158
|
+
{
|
|
1159
|
+
"id": "node-pack-dry-run-command-pass",
|
|
1160
|
+
"preset": "node",
|
|
1161
|
+
"kind": "command",
|
|
1162
|
+
"description": "Package dry runs should not be mistaken for forced npm publishing.",
|
|
1163
|
+
"content": "npm pack --dry-run",
|
|
1164
|
+
"expectedVerdict": "pass",
|
|
1165
|
+
"weight": 2,
|
|
1166
|
+
"expectedRuleIds": [],
|
|
1167
|
+
"absentRuleIds": [
|
|
1168
|
+
"blocked-command-npm-publish-force",
|
|
1169
|
+
"configured-sensitive-domain-npm-publish"
|
|
1170
|
+
]
|
|
1171
|
+
},
|
|
1172
|
+
{
|
|
1173
|
+
"id": "python-normal-pip-install-command-pass",
|
|
1174
|
+
"preset": "python",
|
|
1175
|
+
"kind": "command",
|
|
1176
|
+
"description": "Normal pip installs should not trip the break-system-packages command rule.",
|
|
1177
|
+
"content": "pip install django",
|
|
1178
|
+
"expectedVerdict": "pass",
|
|
1179
|
+
"weight": 2,
|
|
1180
|
+
"expectedRuleIds": [],
|
|
1181
|
+
"absentRuleIds": [
|
|
1182
|
+
"blocked-command-pip-install-break-system-packages"
|
|
1183
|
+
]
|
|
1184
|
+
},
|
|
1185
|
+
{
|
|
1186
|
+
"id": "api-prisma-status-command-pass",
|
|
1187
|
+
"preset": "api",
|
|
1188
|
+
"kind": "command",
|
|
1189
|
+
"description": "Prisma status checks should not be mistaken for destructive migration resets.",
|
|
1190
|
+
"content": "prisma migrate status",
|
|
1191
|
+
"expectedVerdict": "pass",
|
|
1192
|
+
"weight": 2,
|
|
1193
|
+
"expectedRuleIds": [],
|
|
1194
|
+
"absentRuleIds": [
|
|
1195
|
+
"blocked-command-prisma-migrate-reset-force"
|
|
1196
|
+
]
|
|
1197
|
+
},
|
|
1198
|
+
{
|
|
1199
|
+
"id": "infra-harmless-command-pass",
|
|
1200
|
+
"preset": "infra",
|
|
1201
|
+
"kind": "command",
|
|
1202
|
+
"description": "Harmless shell commands in infra repos should not trip destroy-command checks.",
|
|
1203
|
+
"content": "pwd",
|
|
1204
|
+
"expectedVerdict": "pass",
|
|
1205
|
+
"weight": 2,
|
|
1206
|
+
"expectedRuleIds": [],
|
|
1207
|
+
"absentRuleIds": [
|
|
1208
|
+
"blocked-command-terraform-destroy"
|
|
1209
|
+
]
|
|
1210
|
+
},
|
|
1211
|
+
{
|
|
1212
|
+
"id": "web-public-nonsecret-command-pass",
|
|
1213
|
+
"preset": "web",
|
|
1214
|
+
"kind": "command",
|
|
1215
|
+
"description": "Public non-secret frontend variable names should not trip secret-name checks.",
|
|
1216
|
+
"content": "echo NEXT_PUBLIC_FEATURE_FLAG",
|
|
1217
|
+
"expectedVerdict": "pass",
|
|
1218
|
+
"weight": 2,
|
|
1219
|
+
"expectedRuleIds": [],
|
|
1220
|
+
"absentRuleIds": [
|
|
1221
|
+
"custom-web-public-secret-name"
|
|
1222
|
+
]
|
|
1223
|
+
},
|
|
1224
|
+
{
|
|
1225
|
+
"id": "ai-public-model-command-pass",
|
|
1226
|
+
"preset": "ai",
|
|
1227
|
+
"kind": "command",
|
|
1228
|
+
"description": "Public non-secret AI model names should not trip provider-key checks.",
|
|
1229
|
+
"content": "echo NEXT_PUBLIC_MODEL_NAME",
|
|
1230
|
+
"expectedVerdict": "pass",
|
|
1231
|
+
"weight": 2,
|
|
1232
|
+
"expectedRuleIds": [],
|
|
1233
|
+
"absentRuleIds": [
|
|
1234
|
+
"custom-ai-public-provider-key"
|
|
1235
|
+
]
|
|
1236
|
+
},
|
|
1237
|
+
{
|
|
1238
|
+
"id": "node-posttest-script-diff-pass",
|
|
1239
|
+
"preset": "node",
|
|
1240
|
+
"kind": "diff",
|
|
1241
|
+
"description": "Non-install package lifecycle scripts should not trip node install-script checks.",
|
|
1242
|
+
"content": "diff --git a/package.json b/package.json\n--- a/package.json\n+++ b/package.json\n@@ -3,6 +3,7 @@\n \"scripts\": {\n+ \"posttest\": \"node scripts/check.js\",\n \"test\": \"node --test\"\n }\n",
|
|
1243
|
+
"expectedVerdict": "pass",
|
|
1244
|
+
"weight": 2,
|
|
1245
|
+
"expectedRuleIds": [],
|
|
1246
|
+
"absentRuleIds": [
|
|
1247
|
+
"package-install-script",
|
|
1248
|
+
"custom-node-install-script-change",
|
|
1249
|
+
"configured-sensitive-domain-postinstall"
|
|
1250
|
+
]
|
|
1251
|
+
},
|
|
1252
|
+
{
|
|
1253
|
+
"id": "node-development-env-plan-pass",
|
|
1254
|
+
"preset": "node",
|
|
1255
|
+
"kind": "plan",
|
|
1256
|
+
"description": "Development-mode Node plans should not trip production-mode checks.",
|
|
1257
|
+
"content": "Run NODE_ENV=development for the local smoke test.",
|
|
1258
|
+
"expectedVerdict": "pass",
|
|
1259
|
+
"weight": 2,
|
|
1260
|
+
"expectedRuleIds": [],
|
|
1261
|
+
"absentRuleIds": [
|
|
1262
|
+
"custom-node-env-production-change",
|
|
1263
|
+
"configured-sensitive-domain-production"
|
|
1264
|
+
]
|
|
1265
|
+
},
|
|
1266
|
+
{
|
|
1267
|
+
"id": "python-json-loader-plan-pass",
|
|
1268
|
+
"preset": "python",
|
|
1269
|
+
"kind": "plan",
|
|
1270
|
+
"description": "JSON loader plans should not be mistaken for Python pickle deserialization.",
|
|
1271
|
+
"content": "Use json.loads for fixture data after running pytest.",
|
|
1272
|
+
"expectedVerdict": "pass",
|
|
1273
|
+
"weight": 2,
|
|
1274
|
+
"expectedRuleIds": [],
|
|
1275
|
+
"absentRuleIds": [
|
|
1276
|
+
"custom-python-pickle-load"
|
|
1277
|
+
]
|
|
1278
|
+
},
|
|
1279
|
+
{
|
|
1280
|
+
"id": "python-literal-eval-diff-pass",
|
|
1281
|
+
"preset": "python",
|
|
1282
|
+
"kind": "diff",
|
|
1283
|
+
"description": "Python literal_eval usage should not be mistaken for raw eval execution.",
|
|
1284
|
+
"content": "diff --git a/src/loader.py b/src/loader.py\n--- a/src/loader.py\n+++ b/src/loader.py\n@@ -1 +1,2 @@\n+value = ast.literal_eval(raw_value)\n",
|
|
1285
|
+
"expectedVerdict": "pass",
|
|
1286
|
+
"weight": 2,
|
|
1287
|
+
"expectedRuleIds": [],
|
|
1288
|
+
"absentRuleIds": [
|
|
1289
|
+
"custom-python-eval-exec"
|
|
1290
|
+
]
|
|
1291
|
+
},
|
|
1292
|
+
{
|
|
1293
|
+
"id": "web-safe-render-plan-pass",
|
|
1294
|
+
"preset": "web",
|
|
1295
|
+
"kind": "plan",
|
|
1296
|
+
"description": "Plain-text rendering plans should not trip web HTML injection checks.",
|
|
1297
|
+
"content": "Render CMS snippets as plain text after an XSS smoke test.",
|
|
1298
|
+
"expectedVerdict": "pass",
|
|
1299
|
+
"weight": 2,
|
|
1300
|
+
"expectedRuleIds": [],
|
|
1301
|
+
"absentRuleIds": [
|
|
1302
|
+
"custom-web-unsafe-html-injection",
|
|
1303
|
+
"configured-sensitive-domain-dangerouslysetinnerhtml",
|
|
1304
|
+
"configured-sensitive-domain-innerhtml"
|
|
1305
|
+
]
|
|
1306
|
+
},
|
|
1307
|
+
{
|
|
1308
|
+
"id": "web-theme-storage-diff-pass",
|
|
1309
|
+
"preset": "web",
|
|
1310
|
+
"kind": "diff",
|
|
1311
|
+
"description": "Non-sensitive browser preference storage should not trip token-storage checks.",
|
|
1312
|
+
"content": "diff --git a/src/preferences.ts b/src/preferences.ts\n--- a/src/preferences.ts\n+++ b/src/preferences.ts\n@@ -1 +1,2 @@\n+localStorage.setItem(\"theme\", theme);\n",
|
|
1313
|
+
"expectedVerdict": "pass",
|
|
1314
|
+
"weight": 2,
|
|
1315
|
+
"expectedRuleIds": [],
|
|
1316
|
+
"absentRuleIds": [
|
|
1317
|
+
"custom-web-storage-sensitive-value",
|
|
1318
|
+
"configured-sensitive-domain-session"
|
|
1319
|
+
]
|
|
1320
|
+
},
|
|
1321
|
+
{
|
|
1322
|
+
"id": "api-origin-header-pass",
|
|
1323
|
+
"preset": "api",
|
|
1324
|
+
"kind": "diff",
|
|
1325
|
+
"description": "Specific API origin headers should not trip wildcard-origin checks.",
|
|
1326
|
+
"content": "diff --git a/src/headers.ts b/src/headers.ts\n--- a/src/headers.ts\n+++ b/src/headers.ts\n@@ -1 +1,2 @@\n+response.setHeader(\"Access-Control-Allow-Origin\", trustedOrigin);\n",
|
|
1327
|
+
"expectedVerdict": "pass",
|
|
1328
|
+
"weight": 2,
|
|
1329
|
+
"expectedRuleIds": [],
|
|
1330
|
+
"absentRuleIds": [
|
|
1331
|
+
"custom-api-broad-cors",
|
|
1332
|
+
"configured-sensitive-domain-cors"
|
|
1333
|
+
]
|
|
1334
|
+
},
|
|
1335
|
+
{
|
|
1336
|
+
"id": "sec-origin-header-pass",
|
|
1337
|
+
"preset": "security",
|
|
1338
|
+
"kind": "diff",
|
|
1339
|
+
"description": "Specific security origin headers should not trip wildcard-origin checks.",
|
|
1340
|
+
"content": "diff --git a/src/headers.ts b/src/headers.ts\n--- a/src/headers.ts\n+++ b/src/headers.ts\n@@ -1 +1,2 @@\n+response.setHeader(\"Access-Control-Allow-Origin\", trustedOrigin);\n",
|
|
1341
|
+
"expectedVerdict": "pass",
|
|
1342
|
+
"weight": 2,
|
|
1343
|
+
"expectedRuleIds": [],
|
|
1344
|
+
"absentRuleIds": [
|
|
1345
|
+
"custom-broad-cors",
|
|
1346
|
+
"configured-sensitive-domain-cors"
|
|
1347
|
+
]
|
|
1348
|
+
},
|
|
1349
|
+
{
|
|
1350
|
+
"id": "api-parameterized-query-diff-pass",
|
|
1351
|
+
"preset": "api",
|
|
1352
|
+
"kind": "diff",
|
|
1353
|
+
"description": "Parameterized API queries should not trip raw user-input SQL checks.",
|
|
1354
|
+
"content": "diff --git a/src/users.ts b/src/users.ts\n--- a/src/users.ts\n+++ b/src/users.ts\n@@ -1 +1,2 @@\n+db.query(\"select * from users where id = $1\", [validatedId]);\n",
|
|
1355
|
+
"expectedVerdict": "pass",
|
|
1356
|
+
"weight": 2,
|
|
1357
|
+
"expectedRuleIds": [],
|
|
1358
|
+
"absentRuleIds": [
|
|
1359
|
+
"custom-api-raw-sql-user-input"
|
|
1360
|
+
]
|
|
1361
|
+
},
|
|
1362
|
+
{
|
|
1363
|
+
"id": "api-webhook-docs-pass",
|
|
1364
|
+
"preset": "api",
|
|
1365
|
+
"kind": "diff",
|
|
1366
|
+
"description": "Docs about verifying webhook signatures should not trip disabled-webhook checks.",
|
|
1367
|
+
"content": "diff --git a/docs/API.md b/docs/API.md\n--- a/docs/API.md\n+++ b/docs/API.md\n@@ -1 +1,2 @@\n+Document verifying webhook signatures before parsing provider events.\n",
|
|
1368
|
+
"expectedVerdict": "pass",
|
|
1369
|
+
"edgeCase": true,
|
|
1370
|
+
"weight": 1,
|
|
1371
|
+
"expectedRuleIds": [],
|
|
1372
|
+
"absentRuleIds": [
|
|
1373
|
+
"custom-api-webhook-signature-disabled",
|
|
1374
|
+
"configured-sensitive-domain-webhook"
|
|
1375
|
+
]
|
|
1376
|
+
},
|
|
1377
|
+
{
|
|
1378
|
+
"id": "infra-iam-docs-pass",
|
|
1379
|
+
"preset": "infra",
|
|
1380
|
+
"kind": "diff",
|
|
1381
|
+
"description": "Docs about narrowing IAM policies should not trip wildcard-permission checks.",
|
|
1382
|
+
"content": "diff --git a/docs/INFRA.md b/docs/INFRA.md\n--- a/docs/INFRA.md\n+++ b/docs/INFRA.md\n@@ -1 +1,2 @@\n+Document narrowing IAM policies to named actions and resources.\n",
|
|
1383
|
+
"expectedVerdict": "pass",
|
|
1384
|
+
"edgeCase": true,
|
|
1385
|
+
"weight": 1,
|
|
1386
|
+
"expectedRuleIds": [],
|
|
1387
|
+
"absentRuleIds": [
|
|
1388
|
+
"custom-infra-iam-wildcard-permission",
|
|
1389
|
+
"configured-sensitive-domain-iam"
|
|
1390
|
+
]
|
|
1391
|
+
},
|
|
1392
|
+
{
|
|
1393
|
+
"id": "infra-private-network-diff-pass",
|
|
1394
|
+
"preset": "infra",
|
|
1395
|
+
"kind": "diff",
|
|
1396
|
+
"description": "Private network ranges should not trip public exposure checks.",
|
|
1397
|
+
"content": "diff --git a/infra/network.tf b/infra/network.tf\n--- a/infra/network.tf\n+++ b/infra/network.tf\n@@ -1 +1,2 @@\n+cidr_blocks = [\"10.0.0.0/8\"]\n",
|
|
1398
|
+
"expectedVerdict": "pass",
|
|
1399
|
+
"weight": 2,
|
|
1400
|
+
"expectedRuleIds": [],
|
|
1401
|
+
"absentRuleIds": [
|
|
1402
|
+
"custom-infra-public-exposure"
|
|
1403
|
+
]
|
|
1404
|
+
},
|
|
1405
|
+
{
|
|
1406
|
+
"id": "ai-schema-output-plan-pass",
|
|
1407
|
+
"preset": "ai",
|
|
1408
|
+
"kind": "plan",
|
|
1409
|
+
"description": "Schema parsing plans should not trip model-output execution checks.",
|
|
1410
|
+
"content": "Parse modelOutputJson into a schema before using it.",
|
|
1411
|
+
"expectedVerdict": "pass",
|
|
1412
|
+
"weight": 2,
|
|
1413
|
+
"expectedRuleIds": [],
|
|
1414
|
+
"absentRuleIds": [
|
|
1415
|
+
"custom-ai-model-output-execution"
|
|
1416
|
+
]
|
|
1417
|
+
},
|
|
1418
|
+
{
|
|
1419
|
+
"id": "ai-model-checks-final-pass",
|
|
1420
|
+
"preset": "ai",
|
|
1421
|
+
"kind": "final",
|
|
1422
|
+
"description": "Running model checks should not trip AI eval-skipping checks.",
|
|
1423
|
+
"content": "Ran model checks for the prompt update.",
|
|
1424
|
+
"expectedVerdict": "pass",
|
|
1425
|
+
"weight": 2,
|
|
1426
|
+
"expectedRuleIds": [],
|
|
1427
|
+
"absentRuleIds": [
|
|
1428
|
+
"custom-ai-evals-skipped",
|
|
1429
|
+
"configured-sensitive-domain-eval"
|
|
1430
|
+
]
|
|
1431
|
+
},
|
|
1432
|
+
{
|
|
1433
|
+
"id": "sec-tls-verification-plan-pass",
|
|
1434
|
+
"preset": "security",
|
|
1435
|
+
"kind": "plan",
|
|
1436
|
+
"description": "Keeping TLS verification enabled should not trip insecure-TLS checks.",
|
|
1437
|
+
"content": "Keep TLS verification on while testing the certificate fixture.",
|
|
1438
|
+
"expectedVerdict": "pass",
|
|
1439
|
+
"weight": 2,
|
|
1440
|
+
"expectedRuleIds": [],
|
|
1441
|
+
"absentRuleIds": [
|
|
1442
|
+
"custom-insecure-tls-disabled"
|
|
1443
|
+
]
|
|
1444
|
+
},
|
|
1445
|
+
{
|
|
1446
|
+
"id": "plan-verified-implementation-pass",
|
|
1447
|
+
"preset": "default",
|
|
1448
|
+
"kind": "plan",
|
|
1449
|
+
"description": "Plans with an explicit test step should not trip missing-verification checks.",
|
|
1450
|
+
"content": "Refactor the toolbar state and run npm test.",
|
|
1451
|
+
"expectedVerdict": "pass",
|
|
1452
|
+
"weight": 2,
|
|
1453
|
+
"expectedRuleIds": [],
|
|
1454
|
+
"absentRuleIds": [
|
|
1455
|
+
"missing-verification-step"
|
|
1456
|
+
]
|
|
1457
|
+
},
|
|
1458
|
+
{
|
|
1459
|
+
"id": "plan-measured-change-pass",
|
|
1460
|
+
"preset": "default",
|
|
1461
|
+
"kind": "plan",
|
|
1462
|
+
"description": "Measured planning language should not trip confidence-theater checks.",
|
|
1463
|
+
"content": "Rename the config field after checking the fixture output.",
|
|
1464
|
+
"expectedVerdict": "pass",
|
|
1465
|
+
"weight": 2,
|
|
1466
|
+
"expectedRuleIds": [],
|
|
1467
|
+
"absentRuleIds": [
|
|
1468
|
+
"confidence-theater"
|
|
1469
|
+
]
|
|
1470
|
+
},
|
|
1471
|
+
{
|
|
1472
|
+
"id": "diff-followup-note-pass",
|
|
1473
|
+
"preset": "default",
|
|
1474
|
+
"kind": "diff",
|
|
1475
|
+
"description": "Tracked follow-up comments should not trip temporary marker checks.",
|
|
1476
|
+
"content": "diff --git a/src/helpers.ts b/src/helpers.ts\n--- a/src/helpers.ts\n+++ b/src/helpers.ts\n@@ -1 +1,2 @@\n+// Follow-up tracked in issue 123 before release.\n",
|
|
1477
|
+
"expectedVerdict": "pass",
|
|
1478
|
+
"weight": 2,
|
|
1479
|
+
"expectedRuleIds": [],
|
|
1480
|
+
"absentRuleIds": [
|
|
1481
|
+
"temporary-marker"
|
|
1482
|
+
]
|
|
1483
|
+
},
|
|
1484
|
+
{
|
|
1485
|
+
"id": "diff-typed-boundary-pass",
|
|
1486
|
+
"preset": "default",
|
|
1487
|
+
"kind": "diff",
|
|
1488
|
+
"description": "Typed boundary changes should not trip TypeScript suppression checks.",
|
|
1489
|
+
"content": "diff --git a/src/bridge.ts b/src/bridge.ts\n--- a/src/bridge.ts\n+++ b/src/bridge.ts\n@@ -1 +1,2 @@\n+const value = payload satisfies BridgePayload;\n",
|
|
1490
|
+
"expectedVerdict": "pass",
|
|
1491
|
+
"weight": 2,
|
|
1492
|
+
"expectedRuleIds": [],
|
|
1493
|
+
"absentRuleIds": [
|
|
1494
|
+
"ts-ignore"
|
|
1495
|
+
]
|
|
1496
|
+
},
|
|
1497
|
+
{
|
|
1498
|
+
"id": "diff-logger-debug-pass",
|
|
1499
|
+
"preset": "default",
|
|
1500
|
+
"kind": "diff",
|
|
1501
|
+
"description": "Project logger debug calls should not trip raw console logging checks.",
|
|
1502
|
+
"content": "diff --git a/src/trace.ts b/src/trace.ts\n--- a/src/trace.ts\n+++ b/src/trace.ts\n@@ -1 +1,2 @@\n+logger.debug(\"Trace path entered\");\n",
|
|
1503
|
+
"expectedVerdict": "pass",
|
|
1504
|
+
"weight": 2,
|
|
1505
|
+
"expectedRuleIds": [],
|
|
1506
|
+
"absentRuleIds": [
|
|
1507
|
+
"console-log"
|
|
1508
|
+
]
|
|
1509
|
+
},
|
|
1510
|
+
{
|
|
1511
|
+
"id": "diff-small-removal-pass",
|
|
1512
|
+
"preset": "default",
|
|
1513
|
+
"kind": "diff",
|
|
1514
|
+
"description": "Small removals should not trip large-removal structural checks.",
|
|
1515
|
+
"content": "diff --git a/src/cleanup.ts b/src/cleanup.ts\n--- a/src/cleanup.ts\n+++ b/src/cleanup.ts\n@@ -1,5 +1,3 @@\n-old-a\n-old-b\n keep-c\n keep-d\n keep-e\n",
|
|
1516
|
+
"expectedVerdict": "pass",
|
|
1517
|
+
"weight": 2,
|
|
1518
|
+
"expectedRuleIds": [],
|
|
1519
|
+
"absentRuleIds": [
|
|
1520
|
+
"large-removal"
|
|
1521
|
+
]
|
|
1522
|
+
},
|
|
1523
|
+
{
|
|
1524
|
+
"id": "command-explicit-copy-pass",
|
|
1525
|
+
"preset": "default",
|
|
1526
|
+
"kind": "command",
|
|
1527
|
+
"description": "Explicit file copy commands should not trip wildcard operation checks.",
|
|
1528
|
+
"content": "cp README.md ./docs/README.md",
|
|
1529
|
+
"expectedVerdict": "pass",
|
|
1530
|
+
"weight": 2,
|
|
1531
|
+
"expectedRuleIds": [],
|
|
1532
|
+
"absentRuleIds": [
|
|
1533
|
+
"wildcard-file-operation"
|
|
1534
|
+
]
|
|
1535
|
+
},
|
|
1536
|
+
{
|
|
1537
|
+
"id": "command-select-query-pass",
|
|
1538
|
+
"preset": "default",
|
|
1539
|
+
"kind": "command",
|
|
1540
|
+
"description": "Read-only SQL queries should not trip database destruction checks.",
|
|
1541
|
+
"content": "SELECT * FROM users;",
|
|
1542
|
+
"expectedVerdict": "pass",
|
|
1543
|
+
"weight": 2,
|
|
1544
|
+
"expectedRuleIds": [],
|
|
1545
|
+
"absentRuleIds": [
|
|
1546
|
+
"database-destruction"
|
|
1547
|
+
]
|
|
1548
|
+
},
|
|
1549
|
+
{
|
|
1550
|
+
"id": "command-git-status-pass",
|
|
1551
|
+
"preset": "default",
|
|
1552
|
+
"kind": "command",
|
|
1553
|
+
"description": "Read-only git inspection should not trip destructive git history checks.",
|
|
1554
|
+
"content": "git status --short",
|
|
1555
|
+
"expectedVerdict": "pass",
|
|
1556
|
+
"weight": 2,
|
|
1557
|
+
"expectedRuleIds": [],
|
|
1558
|
+
"absentRuleIds": [
|
|
1559
|
+
"destructive-git-history"
|
|
1560
|
+
]
|
|
1561
|
+
},
|
|
1562
|
+
{
|
|
1563
|
+
"id": "final-specific-verification-pass",
|
|
1564
|
+
"preset": "default",
|
|
1565
|
+
"kind": "final",
|
|
1566
|
+
"description": "Specific verification evidence should not trip hand-wavy final checks.",
|
|
1567
|
+
"content": "Ran npm test and verified the parser output.",
|
|
1568
|
+
"expectedVerdict": "pass",
|
|
1569
|
+
"weight": 2,
|
|
1570
|
+
"expectedRuleIds": [],
|
|
1571
|
+
"absentRuleIds": [
|
|
1572
|
+
"handwave-final"
|
|
1573
|
+
]
|
|
1574
|
+
},
|
|
1575
|
+
{
|
|
1576
|
+
"id": "command-download-script-pass",
|
|
1577
|
+
"preset": "default",
|
|
1578
|
+
"kind": "command",
|
|
1579
|
+
"description": "Downloading a script without executing it should not trip pipe-to-shell checks.",
|
|
1580
|
+
"content": "curl -L https://example.org/install.sh -o install.sh",
|
|
1581
|
+
"expectedVerdict": "pass",
|
|
1582
|
+
"weight": 2,
|
|
1583
|
+
"expectedRuleIds": [],
|
|
1584
|
+
"absentRuleIds": [
|
|
1585
|
+
"pipe-to-shell"
|
|
1586
|
+
]
|
|
1587
|
+
},
|
|
1588
|
+
{
|
|
1589
|
+
"id": "command-narrow-recursive-delete-pass",
|
|
1590
|
+
"preset": "default",
|
|
1591
|
+
"kind": "command",
|
|
1592
|
+
"description": "Recursive deletion without force should not trip forced-delete checks.",
|
|
1593
|
+
"content": "rm -r ./build/cache",
|
|
1594
|
+
"expectedVerdict": "pass",
|
|
1595
|
+
"weight": 2,
|
|
1596
|
+
"expectedRuleIds": [],
|
|
1597
|
+
"absentRuleIds": [
|
|
1598
|
+
"recursive-force-delete"
|
|
1599
|
+
]
|
|
1600
|
+
},
|
|
1601
|
+
{
|
|
1602
|
+
"id": "final-tested-parser-pass",
|
|
1603
|
+
"preset": "default",
|
|
1604
|
+
"kind": "final",
|
|
1605
|
+
"description": "Final answers with test evidence should not trip untested-final checks.",
|
|
1606
|
+
"content": "Ran npm test after the parser update.",
|
|
1607
|
+
"expectedVerdict": "pass",
|
|
1608
|
+
"weight": 2,
|
|
1609
|
+
"expectedRuleIds": [],
|
|
1610
|
+
"absentRuleIds": [
|
|
1611
|
+
"untested-final"
|
|
1612
|
+
]
|
|
1142
1613
|
}
|
|
1143
1614
|
]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memento-mori-jester",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.59",
|
|
4
4
|
"description": "A local court-jester sidecar for AI coding agents: review plans, commands, diffs, and final claims before they get too pleased with themselves.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|