memento-mori-jester 0.1.72 → 0.1.74

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.74
8
+
9
+ - Added six API quiet-pass fixtures, growing the corpus to 208 fixtures.
10
+ - Strengthened safe near-miss evidence for schema parsing, query-builder filters, enabled rate limiting, read-only Prisma migration diffs, signed-webhook docs, and OpenAPI schema docs.
11
+ - Refreshed demo, roadmap, fixture docs, and release notes for the API curation batch.
12
+
13
+ ## 0.1.73
14
+
15
+ - Added six web and AI quiet-pass fixtures, growing the corpus to 202 fixtures.
16
+ - Strengthened safe near-miss evidence for safe text rendering, allowlisted target paths, public analytics IDs, model-check commands, tool allowlist checks, and public model-name config.
17
+ - Refreshed demo, roadmap, fixture docs, and release notes for the web/AI curation batch.
18
+
7
19
  ## 0.1.72
8
20
 
9
21
  - Added six Python and security quiet-pass fixtures, growing the corpus to 196 fixtures.
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
+ - API fixture curation in v0.1.74, adding six quiet-pass examples for schema parsing, query-builder filters, enabled rate limiting, read-only Prisma migration diffs, signed-webhook docs, and OpenAPI schema docs.
10
+ - Web/AI fixture curation in v0.1.73, adding six quiet-pass examples for safe text rendering, allowlisted target paths, public analytics IDs, model-check commands, tool allowlist checks, and public model-name config.
9
11
  - Python/security fixture curation in v0.1.72, adding six quiet-pass examples for Bandit, pip-audit, coverage/pytest, Trivy, npm audit, and TLS verification-enabled diffs.
10
12
  - Node preset fixture curation in v0.1.71, adding six quiet-pass examples for npm audit/outdated/ci, development-mode Node commands, package export maps, and workspace test scripts, plus a repo-local X demo video asset.
11
13
  - Infra preset fixture curation in v0.1.70, adding six quiet-pass operational examples for read-only Kubernetes, Docker, Terraform linting, and public-IP hardening changes.
@@ -61,7 +63,7 @@ Memento Mori Jester is usable today as a CLI, MCP server, GitHub Action, and git
61
63
 
62
64
  ## Product Ideas
63
65
 
64
- - Collect real-world reports for the next lowest-count preset slices: web, AI, API, then python.
66
+ - Collect real-world reports for the next lowest-count preset slices: python, security, web, then AI.
65
67
  - Add more framework-specific false-positive examples from real reports so tuning guidance keeps getting sharper.
66
68
  - Add a Markdown export for fixture reports so maintainers can paste coverage snapshots into issues or release notes.
67
69
 
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
196
- Weighted fixtures checked: 377.9
195
+ Total fixtures checked: 208
196
+ Weighted fixtures checked: 399.2
197
197
  Matching fixtures: 11
198
198
  Weighted matches: 23
199
199
  Expected-match weight: 18
@@ -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 5, diff 5, final 1
205
- Fixture coverage: 11/196 (6.1% weighted)
205
+ Fixture coverage: 11/208 (5.8% weighted)
206
206
  By verdict: pass 0, caution 3, block 8
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 matched-pass examples for low-severity rules, 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, second examples for AI/API, framework custom, built-in, and configured sensitive-domain rules, AI tool-dispatch examples with safe allowlist/schema boundaries, and real-world low-count preset examples across node, python, web, infra, AI, and security slices. Recent quiet-pass examples cover typechecks, prebuild scripts, mypy, dataclass parsing, CodeQL, Dependabot limits, form validation, accessibility copy, read-only Kubernetes inspection, Docker disk usage, Terraform linting, public-IP hardening changes, npm audit/outdated/ci, development-mode Node commands, package export maps, workspace test scripts, Bandit, pip-audit, coverage/pytest, Trivy filesystem scans, npm audit, and TLS verification-enabled diffs. 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 matched-pass examples for low-severity rules, 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, second examples for AI/API, framework custom, built-in, and configured sensitive-domain rules, AI tool-dispatch examples with safe allowlist/schema boundaries, and real-world low-count preset examples across node, python, web, infra, AI, and security slices. Recent quiet-pass examples cover typechecks, prebuild scripts, mypy, dataclass parsing, CodeQL, Dependabot limits, form validation, accessibility copy, read-only Kubernetes inspection, Docker disk usage, Terraform linting, public-IP hardening changes, npm audit/outdated/ci, development-mode Node commands, package export maps, workspace test scripts, Bandit, pip-audit, coverage/pytest, Trivy filesystem scans, npm audit, TLS verification-enabled diffs, safe text rendering, allowlisted target paths, public analytics IDs, model-check commands, tool allowlist checks, public model-name config, API schema parsing, query-builder filters, enabled rate limiting, read-only Prisma migration diffs, signed-webhook docs, and OpenAPI schema docs. 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, feasible pass-case evidence, rule-family gaps, or lower-count presets.
359
359
 
@@ -0,0 +1,38 @@
1
+ # Memento Mori Jester v0.1.73
2
+
3
+ This release follows the fixture report's web/AI curation guidance. It adds practical quiet-pass examples only; review behavior is unchanged.
4
+
5
+ ## What Changed
6
+
7
+ - Added 6 fixture cases, growing the corpus from 196 to 202 fixtures.
8
+ - Added web quiet-pass examples for:
9
+ - safe `textContent` rendering.
10
+ - allowlisted target path selection.
11
+ - public analytics identifiers.
12
+ - Added AI quiet-pass examples for:
13
+ - model-check commands.
14
+ - tool allowlist checks.
15
+ - public model-name config.
16
+ - Raised the web and AI preset slices from 15 to 18 fixtures each.
17
+ - Kept thin rule coverage, quiet-pass gaps, feasible pass-case gaps, and preset/kind gaps at zero.
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
+ node .\dist\cli.js tune risky-domain --json --no-config
37
+ git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.73 web and AI quiet-pass curation"
38
+ ```
@@ -0,0 +1,37 @@
1
+ # Memento Mori Jester v0.1.74
2
+
3
+ This release follows the fixture report's API curation guidance. It adds practical quiet-pass examples only; review behavior is unchanged.
4
+
5
+ ## What Changed
6
+
7
+ - Added 6 fixture cases, growing the corpus from 202 to 208 fixtures.
8
+ - Added API quiet-pass examples for:
9
+ - schema parsing request bodies.
10
+ - query-builder filters with validated IDs.
11
+ - enabled rate limiting.
12
+ - read-only Prisma migration diffs.
13
+ - signed-webhook documentation.
14
+ - OpenAPI schema documentation.
15
+ - Raised the API preset slice from 16 to 22 fixtures.
16
+ - Kept thin rule coverage, quiet-pass gaps, feasible pass-case gaps, and preset/kind gaps at zero.
17
+
18
+ ## Public Interface
19
+
20
+ - No CLI command changes.
21
+ - No config schema changes.
22
+ - No rule matching, scoring, or verdict behavior changes.
23
+ - No MCP, playground, GitHub Action, or npm publishing changes.
24
+
25
+ ## Release Validation
26
+
27
+ ```powershell
28
+ npm.cmd test
29
+ npm.cmd run demo:svg:check
30
+ npm.cmd run fixtures:report
31
+ npm.cmd run fixtures:report -- --json
32
+ npm.cmd run pack:dry
33
+ git diff --check
34
+ node .\dist\cli.js tune coverage --no-config
35
+ node .\dist\cli.js tune risky-domain --json --no-config
36
+ git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.74 API quiet-pass curation"
37
+ ```
@@ -27,6 +27,8 @@ Maintainer triage guidance lives in [docs/MAINTAINER_TRIAGE.md](../../docs/MAINT
27
27
  - Quiet-pass examples for read-only Kubernetes inspection, Docker disk usage, Terraform linting, and public-IP hardening changes.
28
28
  - Quiet-pass examples for npm audit/outdated/ci, development-mode Node commands, package export maps, and workspace test scripts.
29
29
  - Quiet-pass examples for Bandit, pip-audit, coverage/pytest, Trivy filesystem scans, npm audit, and TLS verification-enabled diffs.
30
+ - Quiet-pass examples for safe text rendering, allowlisted target paths, public analytics IDs, model-check commands, tool allowlist checks, and public model-name config.
31
+ - Quiet-pass examples for API schema parsing, query-builder filters, enabled rate limiting, read-only Prisma migration diffs, signed-webhook docs, and OpenAPI schema docs.
30
32
  - Fixture metadata like `weight` and `edgeCase` to support precision-weighted tuning evidence.
31
33
 
32
34
  ## Local Check
@@ -2572,5 +2572,170 @@
2572
2572
  "absentRuleIds": [
2573
2573
  "custom-insecure-tls-disabled"
2574
2574
  ]
2575
+ },
2576
+ {
2577
+ "id": "web-textcontent-render-diff-pass",
2578
+ "preset": "web",
2579
+ "kind": "diff",
2580
+ "description": "TextContent rendering should stay quiet around unsafe HTML injection checks.",
2581
+ "content": "diff --git a/src/render.ts b/src/render.ts\n--- a/src/render.ts\n+++ b/src/render.ts\n@@ -1 +1,2 @@\n+element.textContent = displayMessage;\n",
2582
+ "expectedVerdict": "pass",
2583
+ "weight": 2,
2584
+ "expectedRuleIds": [],
2585
+ "absentRuleIds": [
2586
+ "custom-web-unsafe-html-injection",
2587
+ "configured-sensitive-domain-dangerouslysetinnerhtml",
2588
+ "configured-sensitive-domain-innerhtml"
2589
+ ]
2590
+ },
2591
+ {
2592
+ "id": "web-allowlisted-target-path-diff-pass",
2593
+ "preset": "web",
2594
+ "kind": "diff",
2595
+ "description": "Allowlisted target paths should not look like open redirect-shaped changes.",
2596
+ "content": "diff --git a/src/navigation.ts b/src/navigation.ts\n--- a/src/navigation.ts\n+++ b/src/navigation.ts\n@@ -1 +1,2 @@\n+const targetPath = allowedPaths.has(candidatePath) ? candidatePath : \"/dashboard\";\n",
2597
+ "expectedVerdict": "pass",
2598
+ "weight": 2,
2599
+ "expectedRuleIds": [],
2600
+ "absentRuleIds": [
2601
+ "custom-web-open-redirect-shape"
2602
+ ]
2603
+ },
2604
+ {
2605
+ "id": "web-public-analytics-env-command-pass",
2606
+ "preset": "web",
2607
+ "kind": "command",
2608
+ "description": "Public analytics identifiers should not trip frontend secret-name checks.",
2609
+ "content": "echo NEXT_PUBLIC_ANALYTICS_ID",
2610
+ "expectedVerdict": "pass",
2611
+ "weight": 2,
2612
+ "expectedRuleIds": [],
2613
+ "absentRuleIds": [
2614
+ "custom-web-public-secret-name"
2615
+ ]
2616
+ },
2617
+ {
2618
+ "id": "ai-model-check-command-pass",
2619
+ "preset": "ai",
2620
+ "kind": "command",
2621
+ "description": "Model behavior check commands should not look like skipped AI safety checks.",
2622
+ "content": "npm run model-checks -- --scenario safe-tool-routing",
2623
+ "expectedVerdict": "pass",
2624
+ "weight": 2,
2625
+ "expectedRuleIds": [],
2626
+ "absentRuleIds": [
2627
+ "custom-ai-evals-skipped"
2628
+ ]
2629
+ },
2630
+ {
2631
+ "id": "ai-tool-allowlist-command-pass",
2632
+ "preset": "ai",
2633
+ "kind": "command",
2634
+ "description": "Tool allowlist checks should not trip user-controlled tool dispatch rules.",
2635
+ "content": "node scripts/check-tool-allowlist.mjs",
2636
+ "expectedVerdict": "pass",
2637
+ "weight": 2,
2638
+ "expectedRuleIds": [],
2639
+ "absentRuleIds": [
2640
+ "custom-ai-user-controlled-tool-dispatch"
2641
+ ]
2642
+ },
2643
+ {
2644
+ "id": "ai-public-model-env-diff-pass",
2645
+ "preset": "ai",
2646
+ "kind": "diff",
2647
+ "description": "Public model-name config should not be mistaken for client-exposed provider keys.",
2648
+ "content": "diff --git a/src/config.ts b/src/config.ts\n--- a/src/config.ts\n+++ b/src/config.ts\n@@ -1 +1,2 @@\n+export const NEXT_PUBLIC_OPENAI_MODEL = \"gpt-4.1-mini\";\n",
2649
+ "expectedVerdict": "pass",
2650
+ "weight": 2,
2651
+ "expectedRuleIds": [],
2652
+ "absentRuleIds": [
2653
+ "custom-ai-public-provider-key",
2654
+ "secret-material"
2655
+ ]
2656
+ },
2657
+ {
2658
+ "id": "api-schema-parse-diff-pass",
2659
+ "preset": "api",
2660
+ "kind": "diff",
2661
+ "description": "Schema parsing request bodies should stay quiet around raw SQL and auth-bypass checks.",
2662
+ "content": "diff --git a/src/routes/users.ts b/src/routes/users.ts\n--- a/src/routes/users.ts\n+++ b/src/routes/users.ts\n@@ -1 +1,2 @@\n+const input = CreateUserSchema.parse(req.body);\n",
2663
+ "expectedVerdict": "pass",
2664
+ "weight": 2,
2665
+ "expectedRuleIds": [],
2666
+ "absentRuleIds": [
2667
+ "custom-api-auth-bypass",
2668
+ "custom-api-raw-sql-user-input"
2669
+ ]
2670
+ },
2671
+ {
2672
+ "id": "api-query-builder-diff-pass",
2673
+ "preset": "api",
2674
+ "kind": "diff",
2675
+ "description": "Query-builder filters with validated identifiers should not trip raw request SQL checks.",
2676
+ "content": "diff --git a/src/routes/users.ts b/src/routes/users.ts\n--- a/src/routes/users.ts\n+++ b/src/routes/users.ts\n@@ -1 +1,2 @@\n+const user = await db.user.findUnique({ where: { id: validatedUserId } });\n",
2677
+ "expectedVerdict": "pass",
2678
+ "weight": 2,
2679
+ "expectedRuleIds": [],
2680
+ "absentRuleIds": [
2681
+ "custom-api-raw-sql-user-input"
2682
+ ]
2683
+ },
2684
+ {
2685
+ "id": "api-rate-limit-enabled-diff-pass",
2686
+ "preset": "api",
2687
+ "kind": "diff",
2688
+ "description": "Enabled API throttles should not look like rate-limit disabling.",
2689
+ "content": "diff --git a/src/middleware/limits.ts b/src/middleware/limits.ts\n--- a/src/middleware/limits.ts\n+++ b/src/middleware/limits.ts\n@@ -1 +1,2 @@\n+export const apiLimiter = rateLimit({ windowMs: 60000, max: 100 });\n",
2690
+ "expectedVerdict": "pass",
2691
+ "weight": 2,
2692
+ "expectedRuleIds": [],
2693
+ "absentRuleIds": [
2694
+ "custom-api-rate-limit-disabled",
2695
+ "configured-sensitive-domain-rate-limit"
2696
+ ]
2697
+ },
2698
+ {
2699
+ "id": "api-prisma-migrate-diff-command-pass",
2700
+ "preset": "api",
2701
+ "kind": "command",
2702
+ "description": "Read-only Prisma migration diff commands should not be mistaken for destructive resets.",
2703
+ "content": "prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script",
2704
+ "expectedVerdict": "pass",
2705
+ "weight": 2,
2706
+ "expectedRuleIds": [],
2707
+ "absentRuleIds": [
2708
+ "blocked-command-prisma-migrate-reset-force",
2709
+ "custom-api-destructive-migration"
2710
+ ]
2711
+ },
2712
+ {
2713
+ "id": "api-webhook-signature-docs-pass",
2714
+ "preset": "api",
2715
+ "kind": "diff",
2716
+ "description": "Docs about requiring signed webhooks should stay quiet around disabled-webhook checks.",
2717
+ "content": "diff --git a/docs/WEBHOOKS.md b/docs/WEBHOOKS.md\n--- a/docs/WEBHOOKS.md\n+++ b/docs/WEBHOOKS.md\n@@ -1 +1,2 @@\n+Require provider webhook signature verification before accepting event payloads.\n",
2718
+ "expectedVerdict": "pass",
2719
+ "edgeCase": true,
2720
+ "weight": 1,
2721
+ "expectedRuleIds": [],
2722
+ "absentRuleIds": [
2723
+ "custom-api-webhook-signature-disabled",
2724
+ "configured-sensitive-domain-webhook"
2725
+ ]
2726
+ },
2727
+ {
2728
+ "id": "api-openapi-schema-docs-pass",
2729
+ "preset": "api",
2730
+ "kind": "diff",
2731
+ "description": "Docs about OpenAPI schema validation should not trip broad API sensitive-domain noise.",
2732
+ "content": "diff --git a/docs/API_SCHEMA.md b/docs/API_SCHEMA.md\n--- a/docs/API_SCHEMA.md\n+++ b/docs/API_SCHEMA.md\n@@ -1 +1,2 @@\n+Document OpenAPI request schemas and validation examples for client integrations.\n",
2733
+ "expectedVerdict": "pass",
2734
+ "edgeCase": true,
2735
+ "weight": 1,
2736
+ "expectedRuleIds": [],
2737
+ "absentRuleIds": [
2738
+ "configured-sensitive-domain-openapi"
2739
+ ]
2575
2740
  }
2576
2741
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memento-mori-jester",
3
- "version": "0.1.72",
3
+ "version": "0.1.74",
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": {