memento-mori-jester 0.1.56 → 0.1.58

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 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.58
8
+
9
+ - Added quiet-pass fixtures for thin custom, configured sensitive-domain, and preset blocked-command rules.
10
+ - Updated fixture-report regression coverage so thin preset/config-derived rules cannot silently lose quiet-pass coverage.
11
+ - Refreshed demo and fixture docs with the expanded 112-fixture corpus.
12
+
13
+ ## 0.1.57
14
+
15
+ - Added web, API, infra, and AI preset fixture coverage across the remaining plan, command, and final review-kind gaps.
16
+ - Updated fixture-report regression coverage so every preset now has plan, command, diff, and final examples.
17
+ - Refreshed fixture and demo docs with the expanded 90-fixture corpus.
18
+
7
19
  ## 0.1.56
8
20
 
9
21
  - Added node, python, and security preset fixture coverage across plan, command, diff, and final review kinds.
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 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.
10
+ - 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.
9
11
  - Node, python, and security preset-kind fixture coverage in v0.1.56 so those preset slices now have plan, command, diff, and final examples.
10
12
  - 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`.
11
13
  - Fixture coverage report generator in v0.1.54 for rule, preset, review-kind, verdict, and pass-case gaps.
@@ -45,8 +47,8 @@ Memento Mori Jester is usable today as a CLI, MCP server, GitHub Action, and git
45
47
 
46
48
  ## Product Ideas
47
49
 
50
+ - Add quiet-pass boundaries for remaining sparse built-in and structural rules such as `missing-verification-step`, `confidence-theater`, `ts-ignore`, `large-removal`, and `wildcard-file-operation`.
48
51
  - Add more framework-specific false-positive examples from real reports so tuning guidance keeps getting sharper.
49
- - Add preset/kind fixture batches for the remaining web, api, infra, and ai coverage gaps.
50
52
 
51
53
  ## Quality And Safety
52
54
 
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: 80
196
- Weighted fixtures checked: 152.6
195
+ Total fixtures checked: 112
196
+ Weighted fixtures checked: 210.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/80 (12.5% weighted)
205
+ Fixture coverage: 9/112 (9.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, plus stack-specific coverage for node, python, and security preset surfaces. These examples are run by `npm test`, so preset tuning changes stay visible.
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 for thin custom/preset 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,48 @@
1
+ # Memento Mori Jester v0.1.57
2
+
3
+ This release completes the preset-kind fixture grid left after v0.1.56. Every built-in preset now has plan, command, diff, and final review examples in the fixture suite.
4
+
5
+ ## Changes
6
+
7
+ - Added 10 preset fixtures:
8
+ - web plan, command, and final cases,
9
+ - API plan, command, and final cases,
10
+ - infra plan and final cases,
11
+ - AI command and final cases.
12
+ - Covered stack-specific rules such as:
13
+ - `custom-web-unsafe-html-injection`
14
+ - `custom-web-public-secret-name`
15
+ - `custom-api-webhook-signature-disabled`
16
+ - `blocked-command-prisma-migrate-reset-force`
17
+ - `custom-infra-iam-wildcard-permission`
18
+ - `custom-ai-public-provider-key`
19
+ - `custom-ai-evals-skipped`
20
+ - Updated fixture report regression tests so any future preset-kind gap is caught directly.
21
+ - Refreshed demo and fixture docs for the 90-fixture corpus.
22
+
23
+ ## Public Interface Changes
24
+
25
+ - No CLI command, MCP tool, config schema, GitHub Action, release workflow, rule matching, or verdict behavior changed.
26
+ - Fixture evidence changes are data-only: `jester tune` and `fixtures:report` now have fuller preset-backed examples to report.
27
+
28
+ ## Release Validation
29
+
30
+ ```powershell
31
+ npm.cmd test
32
+ npm.cmd run demo:svg:check
33
+ npm.cmd run fixtures:report
34
+ npm.cmd run fixtures:report -- --json
35
+ npm.cmd run pack:dry
36
+ git diff --check
37
+ node .\dist\cli.js tune risky-domain --no-config
38
+ node .\dist\cli.js tune coverage --no-config
39
+ git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.57 remaining preset fixture coverage"
40
+ ```
41
+
42
+ ## Post-Release Smoke
43
+
44
+ ```powershell
45
+ npm.cmd view memento-mori-jester version --silent
46
+ npx.cmd -y memento-mori-jester@latest doctor --no-config
47
+ npx.cmd -y memento-mori-jester@latest tune coverage --no-config
48
+ ```
@@ -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
+ ```
@@ -9,11 +9,12 @@ Maintainer triage guidance lives in [docs/MAINTAINER_TRIAGE.md](../../docs/MAINT
9
9
  ## What They Cover
10
10
 
11
11
  - Documentation-only diffs that should stay quiet.
12
- - Node, Python, and security preset plan/command/diff/final coverage.
12
+ - Plan, command, diff, and final coverage for every built-in preset.
13
13
  - Web preset client-exposed key and browser-storage risks.
14
- - API preset CORS and raw SQL risks.
15
- - Infra preset public exposure risks.
14
+ - API preset CORS, raw SQL, webhook, and migration-command risks.
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.
17
18
  - Fixture metadata like `weight` and `edgeCase` to support precision-weighted tuning evidence.
18
19
 
19
20
  ## Local Check
@@ -42,6 +42,45 @@
42
42
  "configured-sensitive-domain-session"
43
43
  ]
44
44
  },
45
+ {
46
+ "id": "web-unsafe-html-plan-block",
47
+ "preset": "web",
48
+ "kind": "plan",
49
+ "description": "Unsafe HTML injection planning should cover the web preset plan surface.",
50
+ "content": "Add dangerouslySetInnerHTML for trusted CMS snippets after running an XSS smoke test.",
51
+ "expectedVerdict": "block",
52
+ "weight": 2,
53
+ "expectedRuleIds": [
54
+ "custom-web-unsafe-html-injection",
55
+ "configured-sensitive-domain-dangerouslysetinnerhtml",
56
+ "configured-sensitive-domain-innerhtml"
57
+ ]
58
+ },
59
+ {
60
+ "id": "web-public-secret-command-block",
61
+ "preset": "web",
62
+ "kind": "command",
63
+ "description": "Client-exposed public secret names should also block on command review surfaces.",
64
+ "content": "echo NEXT_PUBLIC_PAYMENT_SECRET_KEY",
65
+ "expectedVerdict": "block",
66
+ "weight": 2,
67
+ "expectedRuleIds": [
68
+ "custom-web-public-secret-name"
69
+ ]
70
+ },
71
+ {
72
+ "id": "web-final-route-copy-pass",
73
+ "preset": "web",
74
+ "kind": "final",
75
+ "description": "A verified web final answer should give the web preset a quiet final case.",
76
+ "content": "Updated route copy and ran npm test.",
77
+ "expectedVerdict": "pass",
78
+ "weight": 1,
79
+ "expectedRuleIds": [],
80
+ "absentRuleIds": [
81
+ "done-without-evidence"
82
+ ]
83
+ },
45
84
  {
46
85
  "id": "api-docs-only-auth-pass",
47
86
  "preset": "api",
@@ -82,6 +121,44 @@
82
121
  "custom-api-raw-sql-user-input"
83
122
  ]
84
123
  },
124
+ {
125
+ "id": "api-webhook-signature-plan-block",
126
+ "preset": "api",
127
+ "kind": "plan",
128
+ "description": "Webhook signature bypass planning should cover the API preset plan surface.",
129
+ "content": "Disable webhook signature verification for the replay endpoint after adding a provider replay smoke test.",
130
+ "expectedVerdict": "block",
131
+ "weight": 2,
132
+ "expectedRuleIds": [
133
+ "custom-api-webhook-signature-disabled",
134
+ "configured-sensitive-domain-webhook"
135
+ ]
136
+ },
137
+ {
138
+ "id": "api-migrate-reset-command-block",
139
+ "preset": "api",
140
+ "kind": "command",
141
+ "description": "Destructive Prisma reset commands should block through the API preset.",
142
+ "content": "prisma migrate reset --force",
143
+ "expectedVerdict": "block",
144
+ "weight": 2,
145
+ "expectedRuleIds": [
146
+ "blocked-command-prisma-migrate-reset-force"
147
+ ]
148
+ },
149
+ {
150
+ "id": "api-final-endpoint-notes-pass",
151
+ "preset": "api",
152
+ "kind": "final",
153
+ "description": "A verified API final answer should give the API preset a quiet final case.",
154
+ "content": "Updated endpoint notes and ran npm test.",
155
+ "expectedVerdict": "pass",
156
+ "weight": 1,
157
+ "expectedRuleIds": [],
158
+ "absentRuleIds": [
159
+ "done-without-evidence"
160
+ ]
161
+ },
85
162
  {
86
163
  "id": "infra-public-ingress-block",
87
164
  "preset": "infra",
@@ -107,6 +184,32 @@
107
184
  "blocked-command-terraform-destroy"
108
185
  ]
109
186
  },
187
+ {
188
+ "id": "infra-iam-wildcard-plan-block",
189
+ "preset": "infra",
190
+ "kind": "plan",
191
+ "description": "IAM wildcard planning should cover the infra preset plan surface.",
192
+ "content": "Change the IAM policy to allow Action * after reviewing the rollout plan and rollback note.",
193
+ "expectedVerdict": "block",
194
+ "weight": 2,
195
+ "expectedRuleIds": [
196
+ "custom-infra-iam-wildcard-permission",
197
+ "configured-sensitive-domain-iam"
198
+ ]
199
+ },
200
+ {
201
+ "id": "infra-final-chart-notes-pass",
202
+ "preset": "infra",
203
+ "kind": "final",
204
+ "description": "A verified infra final answer should give the infra preset a quiet final case.",
205
+ "content": "Updated chart notes and ran npm test.",
206
+ "expectedVerdict": "pass",
207
+ "weight": 1,
208
+ "expectedRuleIds": [],
209
+ "absentRuleIds": [
210
+ "done-without-evidence"
211
+ ]
212
+ },
110
213
  {
111
214
  "id": "ai-docs-only-transcript-pass",
112
215
  "preset": "ai",
@@ -149,6 +252,31 @@
149
252
  "custom-ai-model-output-execution"
150
253
  ]
151
254
  },
255
+ {
256
+ "id": "ai-public-key-command-block",
257
+ "preset": "ai",
258
+ "kind": "command",
259
+ "description": "Client-exposed AI provider key names should also block on command review surfaces.",
260
+ "content": "echo NEXT_PUBLIC_GEMINI_API_TOKEN",
261
+ "expectedVerdict": "block",
262
+ "weight": 2,
263
+ "expectedRuleIds": [
264
+ "custom-ai-public-provider-key"
265
+ ]
266
+ },
267
+ {
268
+ "id": "ai-evals-skipped-final-block",
269
+ "preset": "ai",
270
+ "kind": "final",
271
+ "description": "Skipping evals in final answers should cover the AI preset final surface.",
272
+ "content": "Skip evals for the prompt update after manual review.",
273
+ "expectedVerdict": "block",
274
+ "weight": 2,
275
+ "expectedRuleIds": [
276
+ "custom-ai-evals-skipped",
277
+ "configured-sensitive-domain-eval"
278
+ ]
279
+ },
152
280
  {
153
281
  "id": "sec-secret-material-openai",
154
282
  "preset": "default",
@@ -1011,5 +1139,307 @@
1011
1139
  "risky-domain",
1012
1140
  "done-without-evidence"
1013
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
+ ]
1014
1444
  }
1015
1445
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memento-mori-jester",
3
- "version": "0.1.56",
3
+ "version": "0.1.58",
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": {