memento-mori-jester 0.1.61 → 0.1.63

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.63
8
+
9
+ - Added second firing fixtures for the remaining framework custom-rule thin examples across security, infra, node, python, and web presets.
10
+ - Cleared custom-rule thin coverage in `npm run fixtures:report`, reducing total thin fixture coverage from 16 rules to 7.
11
+ - Refreshed demo, roadmap, fixture docs, and release notes for the 145-fixture corpus.
12
+
13
+ ## 0.1.62
14
+
15
+ - Added second firing fixtures for the remaining AI/API custom-rule thin examples: model-output execution, public AI provider keys, raw SQL from request input, and disabled webhook signature checks.
16
+ - Reduced total thin fixture coverage from 21 rules to 16 while keeping review behavior unchanged.
17
+ - Refreshed demo, roadmap, fixture docs, and release notes for the 138-fixture corpus.
18
+
7
19
  ## 0.1.61
8
20
 
9
21
  - Added a focused fixture curation batch based on `fixtures:report` curation-next guidance.
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
+ - Framework custom-rule fixture precision pass in v0.1.63, clearing custom-rule thin coverage and reducing total thin fixture coverage from 16 rules to 7.
10
+ - AI/API custom-rule fixture precision pass in v0.1.62, reducing total thin fixture coverage from 21 rules to 16 while keeping review behavior unchanged.
9
11
  - Curation-next fixture batch in v0.1.61 that removed blocked-command thin coverage, strengthened stack-specific sensitive-domain examples, and reduced total thin fixture coverage from 37 rules to 21.
10
12
  - Fixture report rule-family slices, preset slices, and curation-next guidance in v0.1.60 so maintainers can see which fixture areas need real-world examples next.
11
13
  - 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.
@@ -51,7 +53,7 @@ Memento Mori Jester is usable today as a CLI, MCP server, GitHub Action, and git
51
53
  ## Product Ideas
52
54
 
53
55
  - Add more framework-specific false-positive examples from real reports so tuning guidance keeps getting sharper.
54
- - Add another fixture precision batch for the remaining AI/API custom-rule thin examples surfaced by `fixtures:report`.
56
+ - Add the final fixture precision pass for the remaining built-in and configured-domain thin examples surfaced by `fixtures:report`.
55
57
  - Add a Markdown export for fixture reports so maintainers can paste coverage snapshots into issues or release notes.
56
58
 
57
59
  ## Quality And Safety
package/docs/DEMO.md CHANGED
@@ -192,18 +192,18 @@ Project config: none loaded
192
192
  Fixture tuning evidence:
193
193
  Support: limited
194
194
  Confidence: medium
195
- Total fixtures checked: 134
196
- Weighted fixtures checked: 254.9
197
- Matching fixtures: 9
198
- Weighted matches: 19
195
+ Total fixtures checked: 145
196
+ Weighted fixtures checked: 276.9
197
+ Matching fixtures: 10
198
+ Weighted matches: 21
199
199
  Expected-match weight: 16
200
- Unexpected-match weight: 3
200
+ Unexpected-match weight: 5
201
201
  Edge-case matches: 0
202
202
  Quiet-pass fixtures: 5
203
203
  Quiet-pass weight: 3.6
204
- By kind: command 0, plan 4, diff 4, final 1
205
- Fixture coverage: 9/134 (7.5% weighted)
206
- By verdict: pass 0, caution 3, block 6
204
+ By kind: command 0, plan 4, diff 5, final 1
205
+ Fixture coverage: 10/145 (7.6% weighted)
206
+ By verdict: pass 0, caution 3, block 7
207
207
  Matched fixture samples:
208
208
  infra-public-ingress-block: Public ingress should block in low-risk-tolerance infra repos.
209
209
  node-plan-production-mode-block: Node production-mode planning should cover node-specific and sensitive-domain signals.
@@ -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, stack-specific coverage for every built-in preset, quiet-pass boundaries across built-in, structural, custom, and preset/config-derived rules, and second firing examples for preset blocked-command rules. 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, quiet-pass boundaries across built-in, structural, custom, and preset/config-derived rules, second firing examples for preset blocked-command rules, and second examples for AI/API and framework custom rules. These examples are run by `npm test`, so preset tuning changes stay visible.
357
357
 
358
358
  Maintainers can run `npm run fixtures:report` to see coverage by verdict, kind, preset, rule family, and preset slice. The report also includes a `Curation next` section that points at the next useful fixture batch, such as thin rules, no-pass evidence, rule-family gaps, or lower-count presets.
359
359
 
@@ -0,0 +1,34 @@
1
+ # Memento Mori Jester v0.1.62
2
+
3
+ This release continues the fixture precision work from v0.1.61, focusing on the remaining AI/API custom-rule thin examples surfaced by `npm run fixtures:report`. It does not change review logic, scoring, matching, CLI output shape, MCP tools, GitHub Action behavior, or release automation.
4
+
5
+ ## What Changed
6
+
7
+ - Added 4 fixture cases, growing the corpus from 134 to 138 fixtures.
8
+ - Added second firing examples for:
9
+ - `custom-ai-model-output-execution`
10
+ - `custom-ai-public-provider-key`
11
+ - `custom-api-raw-sql-user-input`
12
+ - `custom-api-webhook-signature-disabled`
13
+ - Reduced total thin fixture coverage from 21 rules to 16.
14
+ - Removed the AI/API custom-rule items from the custom-rule thin coverage list.
15
+
16
+ ## Public Interface
17
+
18
+ - No CLI command changes.
19
+ - No config schema changes.
20
+ - No rule matching, scoring, or verdict behavior changes.
21
+ - No MCP, playground, GitHub Action, or npm publishing changes.
22
+
23
+ ## Release Validation
24
+
25
+ ```powershell
26
+ npm.cmd test
27
+ npm.cmd run demo:svg:check
28
+ npm.cmd run fixtures:report
29
+ npm.cmd run fixtures:report -- --json
30
+ npm.cmd run pack:dry
31
+ git diff --check
32
+ node .\dist\cli.js tune coverage --no-config
33
+ git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.62 AI/API fixture precision"
34
+ ```
@@ -0,0 +1,37 @@
1
+ # Memento Mori Jester v0.1.63
2
+
3
+ This release completes the current custom-rule fixture precision pass. It adds second firing examples for the remaining framework custom-rule thin cases surfaced by `npm run fixtures:report`. It does not change review logic, scoring, matching, CLI output shape, MCP tools, GitHub Action behavior, or release automation.
4
+
5
+ ## What Changed
6
+
7
+ - Added 7 fixture cases, growing the corpus from 138 to 145 fixtures.
8
+ - Added second firing examples for:
9
+ - `custom-broad-cors`
10
+ - `custom-infra-public-exposure`
11
+ - `custom-insecure-tls-disabled`
12
+ - `custom-node-env-production-change`
13
+ - `custom-python-eval-exec`
14
+ - `custom-python-pickle-load`
15
+ - `custom-web-storage-sensitive-value`
16
+ - Cleared custom-rule thin coverage entirely in `npm run fixtures:report`.
17
+ - Reduced total thin fixture coverage from 16 rules to 7.
18
+
19
+ ## Public Interface
20
+
21
+ - No CLI command changes.
22
+ - No config schema changes.
23
+ - No rule matching, scoring, or verdict behavior changes.
24
+ - No MCP, playground, GitHub Action, or npm publishing changes.
25
+
26
+ ## Release Validation
27
+
28
+ ```powershell
29
+ npm.cmd test
30
+ npm.cmd run demo:svg:check
31
+ npm.cmd run fixtures:report
32
+ npm.cmd run fixtures:report -- --json
33
+ npm.cmd run pack:dry
34
+ git diff --check
35
+ node .\dist\cli.js tune coverage --no-config
36
+ git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.63 framework fixture precision"
37
+ ```
@@ -17,6 +17,8 @@ Maintainer triage guidance lives in [docs/MAINTAINER_TRIAGE.md](../../docs/MAINT
17
17
  - Quiet-pass boundaries for thin custom, configured sensitive-domain, and preset blocked-command rules.
18
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.
19
19
  - Second firing examples for preset blocked-command rules and high-value stack-specific sensitive-domain rules.
20
+ - Second firing examples for AI and API custom rules around provider keys, model-output execution, raw SQL, and webhook signature checks.
21
+ - Second firing examples for remaining framework custom rules across security, infra, node, python, and web presets.
20
22
  - Fixture metadata like `weight` and `edgeCase` to support precision-weighted tuning evidence.
21
23
 
22
24
  ## Local Check
@@ -134,6 +134,31 @@
134
134
  "configured-sensitive-domain-webhook"
135
135
  ]
136
136
  },
137
+ {
138
+ "id": "api-raw-sql-body-diff-block",
139
+ "preset": "api",
140
+ "kind": "diff",
141
+ "description": "Raw SQL built from request body input should give API SQL-injection coverage a second example.",
142
+ "content": "diff --git a/src/search.ts b/src/search.ts\n--- a/src/search.ts\n+++ b/src/search.ts\n@@ -1 +1,2 @@\n+const rows = await db.raw(req.body.filter);\n",
143
+ "expectedVerdict": "block",
144
+ "weight": 2,
145
+ "expectedRuleIds": [
146
+ "custom-api-raw-sql-user-input"
147
+ ]
148
+ },
149
+ {
150
+ "id": "api-webhook-signature-diff-block",
151
+ "preset": "api",
152
+ "kind": "diff",
153
+ "description": "Disabling webhook signature verification in a diff should give webhook coverage a second example.",
154
+ "content": "diff --git a/src/webhooks.ts b/src/webhooks.ts\n--- a/src/webhooks.ts\n+++ b/src/webhooks.ts\n@@ -1 +1,2 @@\n+// webhook replay path should skip signature verification during tests\n",
155
+ "expectedVerdict": "block",
156
+ "weight": 2,
157
+ "expectedRuleIds": [
158
+ "custom-api-webhook-signature-disabled",
159
+ "configured-sensitive-domain-webhook"
160
+ ]
161
+ },
137
162
  {
138
163
  "id": "api-migrate-reset-command-block",
139
164
  "preset": "api",
@@ -264,6 +289,30 @@
264
289
  "custom-ai-public-provider-key"
265
290
  ]
266
291
  },
292
+ {
293
+ "id": "ai-public-openai-key-diff-block",
294
+ "preset": "ai",
295
+ "kind": "diff",
296
+ "description": "Client-exposed OpenAI key names should give AI provider-key coverage a second example.",
297
+ "content": "diff --git a/src/env.ts b/src/env.ts\n--- a/src/env.ts\n+++ b/src/env.ts\n@@ -1 +1,2 @@\n+export const publicKeyName = \"VITE_OPENAI_API_KEY\";\n",
298
+ "expectedVerdict": "block",
299
+ "weight": 2,
300
+ "expectedRuleIds": [
301
+ "custom-ai-public-provider-key"
302
+ ]
303
+ },
304
+ {
305
+ "id": "ai-model-output-shell-plan-block",
306
+ "preset": "ai",
307
+ "kind": "plan",
308
+ "description": "Executing generated model text through child_process should give model-output execution a second example.",
309
+ "content": "Run child_process.exec on generatedText after the model chooses a maintenance command and log the smoke test.",
310
+ "expectedVerdict": "block",
311
+ "weight": 2,
312
+ "expectedRuleIds": [
313
+ "custom-ai-model-output-execution"
314
+ ]
315
+ },
267
316
  {
268
317
  "id": "ai-evals-skipped-final-block",
269
318
  "preset": "ai",
@@ -1272,6 +1321,93 @@
1272
1321
  "configured-sensitive-domain-iam"
1273
1322
  ]
1274
1323
  },
1324
+ {
1325
+ "id": "sec-broad-cors-plan-block",
1326
+ "preset": "security",
1327
+ "kind": "plan",
1328
+ "description": "Wildcard CORS planning should give the security preset broad-CORS rule a second firing example.",
1329
+ "content": "Set cors({ origin: \"*\" }) for the admin preview after running the browser smoke test.",
1330
+ "expectedVerdict": "block",
1331
+ "weight": 2,
1332
+ "expectedRuleIds": [
1333
+ "custom-broad-cors",
1334
+ "configured-sensitive-domain-cors"
1335
+ ]
1336
+ },
1337
+ {
1338
+ "id": "infra-public-bucket-plan-block",
1339
+ "preset": "infra",
1340
+ "kind": "plan",
1341
+ "description": "Public bucket planning should give infra public-exposure coverage a second example.",
1342
+ "content": "Set public_access_block = false for the artifact bucket after checking the reviewed plan output.",
1343
+ "expectedVerdict": "block",
1344
+ "weight": 2,
1345
+ "expectedRuleIds": [
1346
+ "custom-infra-public-exposure"
1347
+ ]
1348
+ },
1349
+ {
1350
+ "id": "sec-reject-unauthorized-diff-block",
1351
+ "preset": "security",
1352
+ "kind": "diff",
1353
+ "description": "Disabling TLS verification with rejectUnauthorized should give security TLS coverage a second example.",
1354
+ "content": "diff --git a/src/client.ts b/src/client.ts\n--- a/src/client.ts\n+++ b/src/client.ts\n@@ -1 +1,2 @@\n+const agent = new https.Agent({ rejectUnauthorized: false });\n",
1355
+ "expectedVerdict": "block",
1356
+ "weight": 2,
1357
+ "expectedRuleIds": [
1358
+ "custom-insecure-tls-disabled"
1359
+ ]
1360
+ },
1361
+ {
1362
+ "id": "node-env-production-diff-block",
1363
+ "preset": "node",
1364
+ "kind": "diff",
1365
+ "description": "Production Node environment changes in diffs should give node env coverage a second example.",
1366
+ "content": "diff --git a/scripts/smoke.sh b/scripts/smoke.sh\n--- a/scripts/smoke.sh\n+++ b/scripts/smoke.sh\n@@ -1 +1,2 @@\n+NODE_ENV=production npm run smoke\n",
1367
+ "expectedVerdict": "block",
1368
+ "weight": 2,
1369
+ "expectedRuleIds": [
1370
+ "custom-node-env-production-change",
1371
+ "configured-sensitive-domain-production"
1372
+ ]
1373
+ },
1374
+ {
1375
+ "id": "python-exec-plan-caution",
1376
+ "preset": "python",
1377
+ "kind": "plan",
1378
+ "description": "Python exec planning should give dynamic-execution coverage a second example.",
1379
+ "content": "Use exec(user_supplied_code) for the loader helper after adding pytest coverage.",
1380
+ "expectedVerdict": "caution",
1381
+ "weight": 2,
1382
+ "expectedRuleIds": [
1383
+ "custom-python-eval-exec"
1384
+ ]
1385
+ },
1386
+ {
1387
+ "id": "python-pickle-loads-diff-caution",
1388
+ "preset": "python",
1389
+ "kind": "diff",
1390
+ "description": "Python pickle.loads in a diff should give pickle deserialization coverage a second example.",
1391
+ "content": "diff --git a/src/cache.py b/src/cache.py\n--- a/src/cache.py\n+++ b/src/cache.py\n@@ -1 +1,2 @@\n+payload = pickle.loads(request_body)\n",
1392
+ "expectedVerdict": "caution",
1393
+ "weight": 2,
1394
+ "expectedRuleIds": [
1395
+ "custom-python-pickle-load"
1396
+ ]
1397
+ },
1398
+ {
1399
+ "id": "web-session-password-storage-diff-block",
1400
+ "preset": "web",
1401
+ "kind": "diff",
1402
+ "description": "Password storage in sessionStorage should give web storage coverage a second example.",
1403
+ "content": "diff --git a/src/session.ts b/src/session.ts\n--- a/src/session.ts\n+++ b/src/session.ts\n@@ -1 +1,2 @@\n+sessionStorage.setItem(\"password\", password);\n",
1404
+ "expectedVerdict": "block",
1405
+ "weight": 2,
1406
+ "expectedRuleIds": [
1407
+ "custom-web-storage-sensitive-value",
1408
+ "configured-sensitive-domain-session"
1409
+ ]
1410
+ },
1275
1411
  {
1276
1412
  "id": "node-pack-dry-run-command-pass",
1277
1413
  "preset": "node",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memento-mori-jester",
3
- "version": "0.1.61",
3
+ "version": "0.1.63",
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": {