memento-mori-jester 0.1.65 → 0.1.67
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.66.md +37 -0
- package/docs/RELEASE_NOTES_v0.1.67.md +38 -0
- package/examples/fixtures/README.md +1 -0
- package/examples/fixtures/preset-review-cases.json +172 -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.67
|
|
8
|
+
|
|
9
|
+
- Added six real-world quiet-pass fixtures for security, web, node, and python preset slices, growing the corpus to 166 fixtures.
|
|
10
|
+
- Strengthened safe near-miss evidence for static analysis commands, checksum commands, accessible frontend markup, static internal links, Node linting, and Python linting.
|
|
11
|
+
- Refreshed demo, roadmap, fixture docs, and release notes for the expanded preset curation batch.
|
|
12
|
+
|
|
13
|
+
## 0.1.66
|
|
14
|
+
|
|
15
|
+
- Added real-world preset fixtures for node, python, infra, and AI slices, growing the corpus to 160 fixtures.
|
|
16
|
+
- Added Kubernetes delete coverage for the infra preset, including a second firing and a read-only near-miss so thin and quiet-pass coverage stay clean.
|
|
17
|
+
- Refreshed demo, roadmap, fixture docs, and release notes for the expanded low-count preset coverage.
|
|
18
|
+
|
|
7
19
|
## 0.1.65
|
|
8
20
|
|
|
9
21
|
- Added matched-pass fixtures for low-severity `vibes-based-plan` and `handwave-final` rule boundaries.
|
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
|
+
- Security/web/node/python preset fixture curation in v0.1.67, adding real-world quiet-pass examples while keeping thin, quiet-pass, feasible pass-case, and preset-kind gaps at zero.
|
|
10
|
+
- Real-world low-count preset fixture batch in v0.1.66, adding node, python, infra, and AI examples while keeping thin, quiet-pass, and feasible pass-case gaps at zero.
|
|
9
11
|
- Feasible pass-case fixture curation in v0.1.65, adding matched-pass examples for low-severity tone/planning rules and stopping curation from asking for impossible pass cases on hard rules.
|
|
10
12
|
- Final thin-rule fixture precision pass in v0.1.64, clearing all remaining thin coverage gaps across built-in, structural, custom, configured sensitive-domain, and blocked-command rule families.
|
|
11
13
|
- 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.
|
|
@@ -54,7 +56,7 @@ Memento Mori Jester is usable today as a CLI, MCP server, GitHub Action, and git
|
|
|
54
56
|
|
|
55
57
|
## Product Ideas
|
|
56
58
|
|
|
57
|
-
- Collect real-world reports for the lowest-count preset slices: node, python,
|
|
59
|
+
- Collect real-world reports for the next lowest-count preset slices: AI first, then node, python, and security.
|
|
58
60
|
- Add more framework-specific false-positive examples from real reports so tuning guidance keeps getting sharper.
|
|
59
61
|
- Add a Markdown export for fixture reports so maintainers can paste coverage snapshots into issues or release notes.
|
|
60
62
|
|
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: 166
|
|
196
|
+
Weighted fixtures checked: 317.9
|
|
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/
|
|
205
|
+
Fixture coverage: 11/166 (7.2% 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,
|
|
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, and real-world low-count preset examples across node, python, web, infra, AI, and security slices. 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,37 @@
|
|
|
1
|
+
# Memento Mori Jester v0.1.66
|
|
2
|
+
|
|
3
|
+
This release follows the fixture report's real-world preset curation guidance. It adds practical examples for low-count node, python, infra, and AI slices while preserving the cleaned-up coverage baseline from v0.1.64 and v0.1.65.
|
|
4
|
+
|
|
5
|
+
## What Changed
|
|
6
|
+
|
|
7
|
+
- Added 6 fixture cases, growing the corpus from 154 to 160 fixtures.
|
|
8
|
+
- Added quiet real-world examples for:
|
|
9
|
+
- Node focused test commands.
|
|
10
|
+
- Python focused pytest commands.
|
|
11
|
+
- AI retrieved-context schema validation plans.
|
|
12
|
+
- Added infra Kubernetes delete coverage for:
|
|
13
|
+
- `blocked-command-kubectl-delete`
|
|
14
|
+
- `custom-infra-production-change`
|
|
15
|
+
- Added a read-only `kubectl get` near-miss so the new infra rules immediately have quiet-pass boundary evidence.
|
|
16
|
+
- Kept thin rule coverage, quiet-pass gaps, and feasible pass-case 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.66 low-count preset fixtures"
|
|
37
|
+
```
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Memento Mori Jester v0.1.67
|
|
2
|
+
|
|
3
|
+
This release continues the fixture-report curation track. It adds practical quiet-pass examples for the lowest preset slices after v0.1.66 while keeping review behavior unchanged.
|
|
4
|
+
|
|
5
|
+
## What Changed
|
|
6
|
+
|
|
7
|
+
- Added 6 fixture cases, growing the corpus from 160 to 166 fixtures.
|
|
8
|
+
- Added security preset quiet-pass examples for:
|
|
9
|
+
- Static analysis scan commands.
|
|
10
|
+
- Checksum verification commands.
|
|
11
|
+
- Added web preset quiet-pass examples for:
|
|
12
|
+
- Accessible button markup.
|
|
13
|
+
- Static internal route links.
|
|
14
|
+
- Added node and python quiet-pass examples for:
|
|
15
|
+
- Node lint commands.
|
|
16
|
+
- Python ruff checks.
|
|
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.67 preset quiet-pass fixtures"
|
|
38
|
+
```
|
|
@@ -21,6 +21,7 @@ Maintainer triage guidance lives in [docs/MAINTAINER_TRIAGE.md](../../docs/MAINT
|
|
|
21
21
|
- Second firing examples for AI and API custom rules around provider keys, model-output execution, raw SQL, and webhook signature checks.
|
|
22
22
|
- Second firing examples for remaining framework custom rules across security, infra, node, python, and web presets.
|
|
23
23
|
- Second firing examples for remaining built-in and configured sensitive-domain thin rules, leaving no thin coverage gaps.
|
|
24
|
+
- Real-world low-count preset examples for node, python, web, infra, AI, and security workflows.
|
|
24
25
|
- Fixture metadata like `weight` and `edgeCase` to support precision-weighted tuning evidence.
|
|
25
26
|
|
|
26
27
|
## Local Check
|
|
@@ -1377,6 +1377,46 @@
|
|
|
1377
1377
|
"blocked-command-terraform-destroy"
|
|
1378
1378
|
]
|
|
1379
1379
|
},
|
|
1380
|
+
{
|
|
1381
|
+
"id": "infra-kubectl-delete-command-block",
|
|
1382
|
+
"preset": "infra",
|
|
1383
|
+
"kind": "command",
|
|
1384
|
+
"description": "Kubernetes delete commands should block through the infra preset blocked-command path.",
|
|
1385
|
+
"content": "kubectl delete deployment checkout-api -n staging",
|
|
1386
|
+
"expectedVerdict": "block",
|
|
1387
|
+
"weight": 2,
|
|
1388
|
+
"expectedRuleIds": [
|
|
1389
|
+
"blocked-command-kubectl-delete",
|
|
1390
|
+
"custom-infra-production-change"
|
|
1391
|
+
]
|
|
1392
|
+
},
|
|
1393
|
+
{
|
|
1394
|
+
"id": "infra-kubectl-delete-job-command-block",
|
|
1395
|
+
"preset": "infra",
|
|
1396
|
+
"kind": "command",
|
|
1397
|
+
"description": "A second Kubernetes delete command should keep kubectl delete coverage from being thin.",
|
|
1398
|
+
"content": "kubectl delete job stale-worker -n staging",
|
|
1399
|
+
"expectedVerdict": "block",
|
|
1400
|
+
"weight": 2,
|
|
1401
|
+
"expectedRuleIds": [
|
|
1402
|
+
"blocked-command-kubectl-delete",
|
|
1403
|
+
"custom-infra-production-change"
|
|
1404
|
+
]
|
|
1405
|
+
},
|
|
1406
|
+
{
|
|
1407
|
+
"id": "infra-kubectl-get-command-pass",
|
|
1408
|
+
"preset": "infra",
|
|
1409
|
+
"kind": "command",
|
|
1410
|
+
"description": "Read-only Kubernetes inspection should not trip infra delete/apply checks.",
|
|
1411
|
+
"content": "kubectl get deployment checkout-api -n staging",
|
|
1412
|
+
"expectedVerdict": "pass",
|
|
1413
|
+
"weight": 2,
|
|
1414
|
+
"expectedRuleIds": [],
|
|
1415
|
+
"absentRuleIds": [
|
|
1416
|
+
"blocked-command-kubectl-delete",
|
|
1417
|
+
"custom-infra-production-change"
|
|
1418
|
+
]
|
|
1419
|
+
},
|
|
1380
1420
|
{
|
|
1381
1421
|
"id": "sec-chmod-recursive-secrets-command-block",
|
|
1382
1422
|
"preset": "security",
|
|
@@ -1626,6 +1666,20 @@
|
|
|
1626
1666
|
"configured-sensitive-domain-production"
|
|
1627
1667
|
]
|
|
1628
1668
|
},
|
|
1669
|
+
{
|
|
1670
|
+
"id": "node-test-run-command-pass",
|
|
1671
|
+
"preset": "node",
|
|
1672
|
+
"kind": "command",
|
|
1673
|
+
"description": "Focused Node test commands should give the node preset another realistic quiet command.",
|
|
1674
|
+
"content": "node --test test/cli.test.js",
|
|
1675
|
+
"expectedVerdict": "pass",
|
|
1676
|
+
"weight": 1,
|
|
1677
|
+
"expectedRuleIds": [],
|
|
1678
|
+
"absentRuleIds": [
|
|
1679
|
+
"blocked-command-npm-publish-force",
|
|
1680
|
+
"custom-node-install-script-change"
|
|
1681
|
+
]
|
|
1682
|
+
},
|
|
1629
1683
|
{
|
|
1630
1684
|
"id": "python-json-loader-plan-pass",
|
|
1631
1685
|
"preset": "python",
|
|
@@ -1652,6 +1706,20 @@
|
|
|
1652
1706
|
"custom-python-eval-exec"
|
|
1653
1707
|
]
|
|
1654
1708
|
},
|
|
1709
|
+
{
|
|
1710
|
+
"id": "python-pytest-command-pass",
|
|
1711
|
+
"preset": "python",
|
|
1712
|
+
"kind": "command",
|
|
1713
|
+
"description": "Focused pytest commands should give the python preset another realistic quiet command.",
|
|
1714
|
+
"content": "python -m pytest tests/test_loader.py",
|
|
1715
|
+
"expectedVerdict": "pass",
|
|
1716
|
+
"weight": 1,
|
|
1717
|
+
"expectedRuleIds": [],
|
|
1718
|
+
"absentRuleIds": [
|
|
1719
|
+
"blocked-command-pip-install-break-system-packages",
|
|
1720
|
+
"custom-python-eval-exec"
|
|
1721
|
+
]
|
|
1722
|
+
},
|
|
1655
1723
|
{
|
|
1656
1724
|
"id": "web-safe-render-plan-pass",
|
|
1657
1725
|
"preset": "web",
|
|
@@ -1792,6 +1860,20 @@
|
|
|
1792
1860
|
"configured-sensitive-domain-eval"
|
|
1793
1861
|
]
|
|
1794
1862
|
},
|
|
1863
|
+
{
|
|
1864
|
+
"id": "ai-retrieved-context-schema-plan-pass",
|
|
1865
|
+
"preset": "ai",
|
|
1866
|
+
"kind": "plan",
|
|
1867
|
+
"description": "Schema-checking retrieved context should give the AI preset another realistic quiet plan.",
|
|
1868
|
+
"content": "Validate retrieved context against a schema before allowlisted dispatch.",
|
|
1869
|
+
"expectedVerdict": "pass",
|
|
1870
|
+
"weight": 1,
|
|
1871
|
+
"expectedRuleIds": [],
|
|
1872
|
+
"absentRuleIds": [
|
|
1873
|
+
"custom-ai-user-controlled-tool-dispatch",
|
|
1874
|
+
"custom-ai-model-output-execution"
|
|
1875
|
+
]
|
|
1876
|
+
},
|
|
1795
1877
|
{
|
|
1796
1878
|
"id": "sec-tls-verification-plan-pass",
|
|
1797
1879
|
"preset": "security",
|
|
@@ -1973,5 +2055,95 @@
|
|
|
1973
2055
|
"absentRuleIds": [
|
|
1974
2056
|
"untested-final"
|
|
1975
2057
|
]
|
|
2058
|
+
},
|
|
2059
|
+
{
|
|
2060
|
+
"id": "sec-semgrep-scan-command-pass",
|
|
2061
|
+
"preset": "security",
|
|
2062
|
+
"kind": "command",
|
|
2063
|
+
"description": "Static analysis scan commands should not trip security preset danger checks.",
|
|
2064
|
+
"content": "semgrep scan --config p/ci --sarif --output semgrep.sarif",
|
|
2065
|
+
"expectedVerdict": "pass",
|
|
2066
|
+
"weight": 2,
|
|
2067
|
+
"expectedRuleIds": [],
|
|
2068
|
+
"absentRuleIds": [
|
|
2069
|
+
"blocked-command-chmod-r-777",
|
|
2070
|
+
"custom-broad-cors",
|
|
2071
|
+
"custom-insecure-tls-disabled"
|
|
2072
|
+
]
|
|
2073
|
+
},
|
|
2074
|
+
{
|
|
2075
|
+
"id": "sec-checksum-command-pass",
|
|
2076
|
+
"preset": "security",
|
|
2077
|
+
"kind": "command",
|
|
2078
|
+
"description": "Checksum verification commands should stay quiet in security preset repos.",
|
|
2079
|
+
"content": "shasum -a 256 dist/memento-mori-jester.tgz",
|
|
2080
|
+
"expectedVerdict": "pass",
|
|
2081
|
+
"weight": 2,
|
|
2082
|
+
"expectedRuleIds": [],
|
|
2083
|
+
"absentRuleIds": [
|
|
2084
|
+
"blocked-command-chmod-r-777",
|
|
2085
|
+
"custom-insecure-tls-disabled",
|
|
2086
|
+
"pipe-to-shell"
|
|
2087
|
+
]
|
|
2088
|
+
},
|
|
2089
|
+
{
|
|
2090
|
+
"id": "web-accessible-button-diff-pass",
|
|
2091
|
+
"preset": "web",
|
|
2092
|
+
"kind": "diff",
|
|
2093
|
+
"description": "Accessible button markup should not trip web HTML or storage risk checks.",
|
|
2094
|
+
"content": "diff --git a/src/Button.tsx b/src/Button.tsx\n--- a/src/Button.tsx\n+++ b/src/Button.tsx\n@@ -1 +1,2 @@\n+export function SaveButton() { return <button type=\"button\" aria-label=\"Save changes\">Save</button>; }\n",
|
|
2095
|
+
"expectedVerdict": "pass",
|
|
2096
|
+
"weight": 2,
|
|
2097
|
+
"expectedRuleIds": [],
|
|
2098
|
+
"absentRuleIds": [
|
|
2099
|
+
"custom-web-public-secret-name",
|
|
2100
|
+
"custom-web-storage-sensitive-value",
|
|
2101
|
+
"custom-web-unsafe-html-injection"
|
|
2102
|
+
]
|
|
2103
|
+
},
|
|
2104
|
+
{
|
|
2105
|
+
"id": "web-static-route-link-diff-pass",
|
|
2106
|
+
"preset": "web",
|
|
2107
|
+
"kind": "diff",
|
|
2108
|
+
"description": "Static internal route links should not look like open redirect changes.",
|
|
2109
|
+
"content": "diff --git a/src/Nav.tsx b/src/Nav.tsx\n--- a/src/Nav.tsx\n+++ b/src/Nav.tsx\n@@ -1 +1,2 @@\n+export const settingsHref = \"/settings/profile\";\n",
|
|
2110
|
+
"expectedVerdict": "pass",
|
|
2111
|
+
"weight": 2,
|
|
2112
|
+
"expectedRuleIds": [],
|
|
2113
|
+
"absentRuleIds": [
|
|
2114
|
+
"custom-web-open-redirect-shape",
|
|
2115
|
+
"custom-web-public-secret-name",
|
|
2116
|
+
"custom-web-storage-sensitive-value"
|
|
2117
|
+
]
|
|
2118
|
+
},
|
|
2119
|
+
{
|
|
2120
|
+
"id": "node-lint-command-pass",
|
|
2121
|
+
"preset": "node",
|
|
2122
|
+
"kind": "command",
|
|
2123
|
+
"description": "Node lint commands should stay quiet around install-script and publish checks.",
|
|
2124
|
+
"content": "npm run lint -- --max-warnings=0",
|
|
2125
|
+
"expectedVerdict": "pass",
|
|
2126
|
+
"weight": 2,
|
|
2127
|
+
"expectedRuleIds": [],
|
|
2128
|
+
"absentRuleIds": [
|
|
2129
|
+
"blocked-command-npm-publish-force",
|
|
2130
|
+
"custom-node-install-script-change",
|
|
2131
|
+
"custom-node-env-production-change"
|
|
2132
|
+
]
|
|
2133
|
+
},
|
|
2134
|
+
{
|
|
2135
|
+
"id": "python-ruff-check-command-pass",
|
|
2136
|
+
"preset": "python",
|
|
2137
|
+
"kind": "command",
|
|
2138
|
+
"description": "Python lint commands should not trip eval, pickle, or break-system package checks.",
|
|
2139
|
+
"content": "python -m ruff check src tests",
|
|
2140
|
+
"expectedVerdict": "pass",
|
|
2141
|
+
"weight": 2,
|
|
2142
|
+
"expectedRuleIds": [],
|
|
2143
|
+
"absentRuleIds": [
|
|
2144
|
+
"blocked-command-pip-install-break-system-packages",
|
|
2145
|
+
"custom-python-eval-exec",
|
|
2146
|
+
"custom-python-pickle-load"
|
|
2147
|
+
]
|
|
1976
2148
|
}
|
|
1977
2149
|
]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memento-mori-jester",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.67",
|
|
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": {
|