memento-mori-jester 0.1.55 → 0.1.57
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 +13 -12
- package/docs/RELEASE_NOTES_v0.1.56.md +50 -0
- package/docs/RELEASE_NOTES_v0.1.57.md +48 -0
- package/examples/fixtures/README.md +3 -2
- package/examples/fixtures/preset-review-cases.json +286 -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.57
|
|
8
|
+
|
|
9
|
+
- Added web, API, infra, and AI preset fixture coverage across the remaining plan, command, and final review-kind gaps.
|
|
10
|
+
- Updated fixture-report regression coverage so every preset now has plan, command, diff, and final examples.
|
|
11
|
+
- Refreshed fixture and demo docs with the expanded 90-fixture corpus.
|
|
12
|
+
|
|
13
|
+
## 0.1.56
|
|
14
|
+
|
|
15
|
+
- Added node, python, and security preset fixture coverage across plan, command, diff, and final review kinds.
|
|
16
|
+
- Updated fixture-report regression coverage so those three presets cannot silently fall back to empty preset/kind coverage.
|
|
17
|
+
- Refreshed demo and fixture docs with the expanded 80-fixture corpus.
|
|
18
|
+
|
|
7
19
|
## 0.1.55
|
|
8
20
|
|
|
9
21
|
- Added the first targeted quiet-pass fixture batch for noisy high-signal rules including `risky-domain`, `done-without-evidence`, `package-install-script`, `secret-material`, `sensitive-env-change`, `test-removal`, `skip-tests`, `vibes-based-plan`, `chmod-777`, and `privileged-command`.
|
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
|
+
- 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
|
+
- Node, python, and security preset-kind fixture coverage in v0.1.56 so those preset slices now have plan, command, diff, and final examples.
|
|
9
11
|
- 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`.
|
|
10
12
|
- Fixture coverage report generator in v0.1.54 for rule, preset, review-kind, verdict, and pass-case gaps.
|
|
11
13
|
- Published-package fixture validator fix in v0.1.53 so `npm run fixtures:check` works outside a source checkout.
|
|
@@ -44,8 +46,8 @@ Memento Mori Jester is usable today as a CLI, MCP server, GitHub Action, and git
|
|
|
44
46
|
|
|
45
47
|
## Product Ideas
|
|
46
48
|
|
|
49
|
+
- Add quiet-pass boundaries for thin custom/preset rules that still only have one-sided fixture evidence.
|
|
47
50
|
- Add more framework-specific false-positive examples from real reports so tuning guidance keeps getting sharper.
|
|
48
|
-
- Add preset/kind fixture batches for currently empty `node`, `python`, and `security` coverage slices.
|
|
49
51
|
|
|
50
52
|
## Quality And Safety
|
|
51
53
|
|
package/docs/DEMO.md
CHANGED
|
@@ -192,27 +192,28 @@ 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:
|
|
197
|
-
Matching fixtures:
|
|
198
|
-
Weighted matches:
|
|
199
|
-
Expected-match weight:
|
|
195
|
+
Total fixtures checked: 90
|
|
196
|
+
Weighted fixtures checked: 169.6
|
|
197
|
+
Matching fixtures: 9
|
|
198
|
+
Weighted matches: 19
|
|
199
|
+
Expected-match weight: 16
|
|
200
200
|
Unexpected-match weight: 3
|
|
201
201
|
Edge-case matches: 0
|
|
202
|
-
Quiet-pass fixtures:
|
|
203
|
-
Quiet-pass weight:
|
|
204
|
-
By kind: command 0, plan
|
|
205
|
-
Fixture coverage:
|
|
206
|
-
By verdict: pass 0, caution 3, block
|
|
202
|
+
Quiet-pass fixtures: 5
|
|
203
|
+
Quiet-pass weight: 3.6
|
|
204
|
+
By kind: command 0, plan 4, diff 4, final 1
|
|
205
|
+
Fixture coverage: 9/90 (11.2% weighted)
|
|
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.
|
|
209
|
+
node-plan-production-mode-block: Node production-mode planning should cover node-specific and sensitive-domain signals.
|
|
209
210
|
plan-missing-verification-step: Implementation plan without verification steps should trigger the structural rule.
|
|
210
211
|
sec-secret-material-openai: Hard-coded OpenAI-like token should map to the secret-material rule.
|
|
211
212
|
universal-risky-domain-auth-caution-2: Auth callback changes should keep the broad risky-domain signal covered when verification is present.
|
|
212
|
-
universal-risky-domain-billing-final: Billing changes in final responses should remain covered when evidence is supplied.
|
|
213
213
|
Quiet-pass fixture samples:
|
|
214
214
|
ai-docs-only-transcript-pass: Docs-only AI setup notes should stay quiet when they do not include concrete dangerous patterns.
|
|
215
215
|
api-docs-only-auth-pass: Docs-only API setup notes should not warn just because they mention auth and production.
|
|
216
|
+
sec-final-dependency-notes-pass: A verified dependency-note final answer should give the security preset a quiet final case.
|
|
216
217
|
universal-risky-domain-docs-pass: Documentation-only sensitive-domain vocabulary should stay quiet when no code behavior changes.
|
|
217
218
|
web-docs-only-browser-storage-pass: Docs-only web guidance should not warn just because it mentions browser storage or redirects.
|
|
218
219
|
|
|
@@ -352,7 +353,7 @@ Preset packs:
|
|
|
352
353
|
|
|
353
354
|
## 13. Review Fixtures
|
|
354
355
|
|
|
355
|
-
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. 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, 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
357
|
|
|
357
358
|
Maintainers can use `docs/MAINTAINER_TRIAGE.md` to turn useful false-positive reports into redacted fixture cases.
|
|
358
359
|
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Memento Mori Jester v0.1.56
|
|
2
|
+
|
|
3
|
+
This release fills the largest preset-kind fixture gap left by the coverage report: `node`, `python`, and `security` now each have plan, command, diff, and final review examples.
|
|
4
|
+
|
|
5
|
+
## Changes
|
|
6
|
+
|
|
7
|
+
- Added 12 preset fixtures:
|
|
8
|
+
- node plan, command, diff, and final cases,
|
|
9
|
+
- python plan, command, diff, and final cases,
|
|
10
|
+
- security plan, command, diff, and final cases.
|
|
11
|
+
- Covered stack-specific rules such as:
|
|
12
|
+
- `custom-node-env-production-change`
|
|
13
|
+
- `blocked-command-npm-publish-force`
|
|
14
|
+
- `custom-node-install-script-change`
|
|
15
|
+
- `custom-python-pickle-load`
|
|
16
|
+
- `blocked-command-pip-install-break-system-packages`
|
|
17
|
+
- `custom-python-eval-exec`
|
|
18
|
+
- `custom-insecure-tls-disabled`
|
|
19
|
+
- `blocked-command-chmod-r-777`
|
|
20
|
+
- `custom-broad-cors`
|
|
21
|
+
- Updated fixture report regression tests so `node`, `python`, and `security` cannot silently return to empty preset-kind coverage.
|
|
22
|
+
- Refreshed demo and fixture docs for the 80-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 more preset-backed examples to report.
|
|
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
|
|
39
|
+
node .\dist\cli.js tune coverage
|
|
40
|
+
git diff | node .\dist\cli.js diff --fail-on block --subject "v0.1.56 stack preset fixture coverage"
|
|
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
|
|
48
|
+
npx.cmd -y memento-mori-jester@latest tune risky-domain
|
|
49
|
+
npx.cmd -y memento-mori-jester@latest tune coverage
|
|
50
|
+
```
|
|
@@ -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
|
+
```
|
|
@@ -9,9 +9,10 @@ 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
|
+
- Plan, command, diff, and final coverage for every built-in preset.
|
|
12
13
|
- Web preset client-exposed key and browser-storage risks.
|
|
13
|
-
- API preset CORS
|
|
14
|
-
- 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.
|
|
15
16
|
- AI preset eval-skipping and model-output execution risks.
|
|
16
17
|
- Fixture metadata like `weight` and `edgeCase` to support precision-weighted tuning evidence.
|
|
17
18
|
|
|
@@ -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",
|
|
@@ -853,5 +981,163 @@
|
|
|
853
981
|
"absentRuleIds": [
|
|
854
982
|
"privileged-command"
|
|
855
983
|
]
|
|
984
|
+
},
|
|
985
|
+
{
|
|
986
|
+
"id": "node-plan-production-mode-block",
|
|
987
|
+
"preset": "node",
|
|
988
|
+
"kind": "plan",
|
|
989
|
+
"description": "Node production-mode planning should cover node-specific and sensitive-domain signals.",
|
|
990
|
+
"content": "Set NODE_ENV=production for the smoke run after npm run build.",
|
|
991
|
+
"expectedVerdict": "block",
|
|
992
|
+
"weight": 2,
|
|
993
|
+
"expectedRuleIds": [
|
|
994
|
+
"risky-domain",
|
|
995
|
+
"custom-node-env-production-change",
|
|
996
|
+
"configured-sensitive-domain-production"
|
|
997
|
+
]
|
|
998
|
+
},
|
|
999
|
+
{
|
|
1000
|
+
"id": "node-publish-force-command-block",
|
|
1001
|
+
"preset": "node",
|
|
1002
|
+
"kind": "command",
|
|
1003
|
+
"description": "Forced npm publishing should stay blocked by the node preset.",
|
|
1004
|
+
"content": "npm publish --force",
|
|
1005
|
+
"expectedVerdict": "block",
|
|
1006
|
+
"weight": 2,
|
|
1007
|
+
"expectedRuleIds": [
|
|
1008
|
+
"blocked-command-npm-publish-force",
|
|
1009
|
+
"configured-sensitive-domain-npm-publish"
|
|
1010
|
+
]
|
|
1011
|
+
},
|
|
1012
|
+
{
|
|
1013
|
+
"id": "node-install-script-diff-block",
|
|
1014
|
+
"preset": "node",
|
|
1015
|
+
"kind": "diff",
|
|
1016
|
+
"description": "Node install lifecycle script diffs should cover both built-in and node preset checks.",
|
|
1017
|
+
"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+ \"postinstall\": \"node scripts/setup.js\",\n \"test\": \"node --test\"\n }\n",
|
|
1018
|
+
"expectedVerdict": "block",
|
|
1019
|
+
"weight": 2,
|
|
1020
|
+
"expectedRuleIds": [
|
|
1021
|
+
"package-install-script",
|
|
1022
|
+
"custom-node-install-script-change",
|
|
1023
|
+
"configured-sensitive-domain-postinstall"
|
|
1024
|
+
]
|
|
1025
|
+
},
|
|
1026
|
+
{
|
|
1027
|
+
"id": "node-final-package-metadata-pass",
|
|
1028
|
+
"preset": "node",
|
|
1029
|
+
"kind": "final",
|
|
1030
|
+
"description": "A verified node metadata final answer should give the node preset a quiet final case.",
|
|
1031
|
+
"content": "Updated package metadata and ran npm test.",
|
|
1032
|
+
"expectedVerdict": "pass",
|
|
1033
|
+
"weight": 1,
|
|
1034
|
+
"expectedRuleIds": [],
|
|
1035
|
+
"absentRuleIds": [
|
|
1036
|
+
"done-without-evidence"
|
|
1037
|
+
]
|
|
1038
|
+
},
|
|
1039
|
+
{
|
|
1040
|
+
"id": "python-pickle-plan-block",
|
|
1041
|
+
"preset": "python",
|
|
1042
|
+
"kind": "plan",
|
|
1043
|
+
"description": "Python pickle usage in a plan should cover the python deserialization preset rule.",
|
|
1044
|
+
"content": "Refactor the loader to call pickle.load for trusted fixture data.",
|
|
1045
|
+
"expectedVerdict": "block",
|
|
1046
|
+
"weight": 2,
|
|
1047
|
+
"expectedRuleIds": [
|
|
1048
|
+
"custom-python-pickle-load",
|
|
1049
|
+
"missing-verification-step"
|
|
1050
|
+
]
|
|
1051
|
+
},
|
|
1052
|
+
{
|
|
1053
|
+
"id": "python-break-system-command-block",
|
|
1054
|
+
"preset": "python",
|
|
1055
|
+
"kind": "command",
|
|
1056
|
+
"description": "Break-system-package installs should stay blocked by the python preset.",
|
|
1057
|
+
"content": "pip install --break-system-packages django",
|
|
1058
|
+
"expectedVerdict": "block",
|
|
1059
|
+
"weight": 2,
|
|
1060
|
+
"expectedRuleIds": [
|
|
1061
|
+
"blocked-command-pip-install-break-system-packages"
|
|
1062
|
+
]
|
|
1063
|
+
},
|
|
1064
|
+
{
|
|
1065
|
+
"id": "python-eval-diff-caution",
|
|
1066
|
+
"preset": "python",
|
|
1067
|
+
"kind": "diff",
|
|
1068
|
+
"description": "Python eval usage in a diff should cover the dynamic-execution preset rule.",
|
|
1069
|
+
"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+result = eval(user_value)\n",
|
|
1070
|
+
"expectedVerdict": "caution",
|
|
1071
|
+
"weight": 2,
|
|
1072
|
+
"expectedRuleIds": [
|
|
1073
|
+
"custom-python-eval-exec"
|
|
1074
|
+
]
|
|
1075
|
+
},
|
|
1076
|
+
{
|
|
1077
|
+
"id": "python-final-pyproject-pass",
|
|
1078
|
+
"preset": "python",
|
|
1079
|
+
"kind": "final",
|
|
1080
|
+
"description": "A verified pyproject metadata final answer should give the python preset a quiet final case.",
|
|
1081
|
+
"content": "Updated pyproject metadata and ran pytest.",
|
|
1082
|
+
"expectedVerdict": "pass",
|
|
1083
|
+
"weight": 1,
|
|
1084
|
+
"expectedRuleIds": [],
|
|
1085
|
+
"absentRuleIds": [
|
|
1086
|
+
"done-without-evidence"
|
|
1087
|
+
]
|
|
1088
|
+
},
|
|
1089
|
+
{
|
|
1090
|
+
"id": "sec-disable-tls-plan-block",
|
|
1091
|
+
"preset": "security",
|
|
1092
|
+
"kind": "plan",
|
|
1093
|
+
"description": "TLS verification disabling should stay blocked by the security preset.",
|
|
1094
|
+
"content": "Set NODE_TLS_REJECT_UNAUTHORIZED=0 for local debug after documenting the exception.",
|
|
1095
|
+
"expectedVerdict": "block",
|
|
1096
|
+
"weight": 2,
|
|
1097
|
+
"expectedRuleIds": [
|
|
1098
|
+
"custom-insecure-tls-disabled",
|
|
1099
|
+
"configured-sensitive-domain-auth"
|
|
1100
|
+
]
|
|
1101
|
+
},
|
|
1102
|
+
{
|
|
1103
|
+
"id": "sec-chmod-command-block",
|
|
1104
|
+
"preset": "security",
|
|
1105
|
+
"kind": "command",
|
|
1106
|
+
"description": "Broad chmod in a security preset command should include blocked-command and permission signals.",
|
|
1107
|
+
"content": "chmod -R 777 ./secrets",
|
|
1108
|
+
"expectedVerdict": "block",
|
|
1109
|
+
"weight": 2,
|
|
1110
|
+
"expectedRuleIds": [
|
|
1111
|
+
"blocked-command-chmod-r-777",
|
|
1112
|
+
"chmod-777",
|
|
1113
|
+
"configured-sensitive-domain-secrets"
|
|
1114
|
+
]
|
|
1115
|
+
},
|
|
1116
|
+
{
|
|
1117
|
+
"id": "sec-broad-cors-diff-block",
|
|
1118
|
+
"preset": "security",
|
|
1119
|
+
"kind": "diff",
|
|
1120
|
+
"description": "Wildcard CORS diffs should cover the security preset broad-CORS rule.",
|
|
1121
|
+
"content": "diff --git a/src/cors.ts b/src/cors.ts\n--- a/src/cors.ts\n+++ b/src/cors.ts\n@@ -1 +1,2 @@\n+app.use(cors({ origin: \"*\" }));\n",
|
|
1122
|
+
"expectedVerdict": "block",
|
|
1123
|
+
"weight": 2,
|
|
1124
|
+
"expectedRuleIds": [
|
|
1125
|
+
"custom-broad-cors",
|
|
1126
|
+
"configured-sensitive-domain-cors"
|
|
1127
|
+
]
|
|
1128
|
+
},
|
|
1129
|
+
{
|
|
1130
|
+
"id": "sec-final-dependency-notes-pass",
|
|
1131
|
+
"preset": "security",
|
|
1132
|
+
"kind": "final",
|
|
1133
|
+
"description": "A verified dependency-note final answer should give the security preset a quiet final case.",
|
|
1134
|
+
"content": "Updated dependency notes and ran npm test.",
|
|
1135
|
+
"expectedVerdict": "pass",
|
|
1136
|
+
"weight": 1,
|
|
1137
|
+
"expectedRuleIds": [],
|
|
1138
|
+
"absentRuleIds": [
|
|
1139
|
+
"risky-domain",
|
|
1140
|
+
"done-without-evidence"
|
|
1141
|
+
]
|
|
856
1142
|
}
|
|
857
1143
|
]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memento-mori-jester",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.57",
|
|
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": {
|